diff --git a/examples/WidgetDemo/main.cpp b/examples/WidgetDemo/main.cpp index 616b2b37f..78e18a8aa 100644 --- a/examples/WidgetDemo/main.cpp +++ b/examples/WidgetDemo/main.cpp @@ -91,12 +91,15 @@ int main(int argc, char* argv[]) scrollBarWidget->SetPosition(1400.f, 800.f); scrollBarWidget->Resize({ 512.f, 256.f }); - /*Nz::TextAreaWidget* textAreaWidget2 = canvas2D.Add(); - textAreaWidget2->SetPosition(800.f, 700.f); - textAreaWidget2->SetText("Je suis un autre TextAreaWidget !"); - textAreaWidget2->Resize(Nz::Vector2f(500.f, textAreaWidget2->GetPreferredHeight())); + Nz::RichTextAreaWidget* textAreaWidget2 = canvas2D.Add(); + textAreaWidget2->EnableMultiline(true); + textAreaWidget2->SetPosition(1000.f, 200.f); textAreaWidget2->SetBackgroundColor(Nz::Color::White()); - textAreaWidget2->SetTextColor(Nz::Color::Black());*/ + textAreaWidget2->SetTextColor(Nz::Color::Black()); + + Nz::RichTextBuilder builder(textAreaWidget2); + builder << Nz::Color::Blue() << "Rich " << Nz::TextStyle::Bold << "text" << Nz::TextStyle_Regular << builder.CharacterSize(36) << Nz::Color::Black() << "\nAnd a even " << builder.CharacterSize(48) << Nz::Color::Red() << "bigger" << builder.CharacterSize(24) << Nz::Color::Black() << " text"; + textAreaWidget2->Resize(Nz::Vector2f(500.f, textAreaWidget2->GetPreferredHeight())); entt::handle viewer2D = world.CreateEntity(); { diff --git a/include/Nazara/Utility/RichTextBuilder.hpp b/include/Nazara/Utility/RichTextBuilder.hpp new file mode 100644 index 000000000..d3ac0f7e7 --- /dev/null +++ b/include/Nazara/Utility/RichTextBuilder.hpp @@ -0,0 +1,80 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_UTILITY_RICHTEXTBUILDER_HPP +#define NAZARA_UTILITY_RICHTEXTBUILDER_HPP + +#include +#include +#include +#include +#include + +namespace Nz +{ + class Font; + + template + class RichTextBuilder + { + public: + struct CharacterSizeWrapper; + struct CharacterSpacingOffsetWrapper; + struct LineSpacingOffsetWrapper; + struct OutlineColorWrapper; + struct OutlineThicknessWrapper; + + RichTextBuilder(T& richText); + RichTextBuilder(T* richText); + RichTextBuilder(const RichTextBuilder&) = delete; + RichTextBuilder(RichTextBuilder&&) = delete; + ~RichTextBuilder() = default; + + inline RichTextBuilder& AppendText(std::string_view text); + + inline RichTextBuilder& SetCharacterSize(unsigned int characterSize); + inline RichTextBuilder& SetCharacterSpacingOffset(float offset); + inline RichTextBuilder& SetLineSpacingOffset(float offset); + inline RichTextBuilder& SetTextColor(const Color& color); + inline RichTextBuilder& SetTextFont(const std::shared_ptr& font); + inline RichTextBuilder& SetTextOutlineColor(const Color& color); + inline RichTextBuilder& SetTextOutlineThickness(float thickness); + inline RichTextBuilder& SetTextStyle(TextStyleFlags style); + + RichTextBuilder& operator=(const RichTextBuilder&) = delete; + RichTextBuilder& operator=(RichTextBuilder&&) = delete; + + inline RichTextBuilder& operator<<(const Color& textColor); + inline RichTextBuilder& operator<<(const std::shared_ptr& font); + inline RichTextBuilder& operator<<(std::string_view str); + inline RichTextBuilder& operator<<(CharacterSizeWrapper characterSize); + inline RichTextBuilder& operator<<(CharacterSpacingOffsetWrapper characterSpacingOffset); + inline RichTextBuilder& operator<<(LineSpacingOffsetWrapper lineSpacing); + inline RichTextBuilder& operator<<(OutlineColorWrapper outlineColor); + inline RichTextBuilder& operator<<(OutlineThicknessWrapper outlineThickness); + inline RichTextBuilder& operator<<(TextStyleFlags textStyle); + + static inline CharacterSizeWrapper CharacterSize(unsigned int characterSize); + static inline CharacterSpacingOffsetWrapper CharacterSpacingOffset(unsigned int spacingOffset); + static inline LineSpacingOffsetWrapper LineSpacingOffset(float spacingOffset); + static inline OutlineColorWrapper OutlineColor(const Color& color); + static inline OutlineThicknessWrapper OutlineThickness(float thickness); + + struct CharacterSizeWrapper { unsigned int characterSize; }; + struct CharacterSpacingOffsetWrapper { float spacingOffset; }; + struct LineSpacingOffsetWrapper { float spacingOffset; }; + struct OutlineColorWrapper { const Color& color; }; + struct OutlineThicknessWrapper { float thickness; }; + + private: + T& m_richText; + }; + +} + +#include + +#endif // NAZARA_UTILITY_RICHTEXTBUILDER_HPP diff --git a/include/Nazara/Utility/RichTextBuilder.inl b/include/Nazara/Utility/RichTextBuilder.inl new file mode 100644 index 000000000..e4c261a47 --- /dev/null +++ b/include/Nazara/Utility/RichTextBuilder.inl @@ -0,0 +1,169 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include + +namespace Nz +{ + template + RichTextBuilder::RichTextBuilder(T& richText) : + m_richText(richText) + { + } + + template + RichTextBuilder::RichTextBuilder(T* richText) : + m_richText(*richText) + { + } + + template + RichTextBuilder& RichTextBuilder::AppendText(std::string_view text) + { + m_richText.AppendText(text); + return *this; + } + + template + RichTextBuilder& RichTextBuilder::SetCharacterSize(unsigned int characterSize) + { + m_richText.SetCharacterSize(characterSize); + return *this; + } + + template + RichTextBuilder& RichTextBuilder::SetCharacterSpacingOffset(float offset) + { + m_richText.SetCharacterSpacingOffset(offset); + return *this; + } + + template + RichTextBuilder& RichTextBuilder::SetLineSpacingOffset(float offset) + { + m_richText.SetLineSpacingOffset(offset); + return *this; + } + + template + RichTextBuilder& RichTextBuilder::SetTextColor(const Color& color) + { + m_richText.SetTextColor(color); + return *this; + } + + template + RichTextBuilder& RichTextBuilder::SetTextFont(const std::shared_ptr& font) + { + m_richText.SetTextFont(font); + return *this; + } + + template + RichTextBuilder& RichTextBuilder::SetTextOutlineColor(const Color& color) + { + m_richText.SetTextOutlineColor(color); + return *this; + } + + template + RichTextBuilder& RichTextBuilder::SetTextOutlineThickness(float thickness) + { + m_richText.SetTextOutlineThickness(thickness); + return *this; + } + + template + RichTextBuilder& RichTextBuilder::SetTextStyle(TextStyleFlags style) + { + m_richText.SetTextStyle(style); + return *this; + } + + template + RichTextBuilder& RichTextBuilder::operator<<(const Color& textColor) + { + return SetTextColor(textColor); + } + + template + RichTextBuilder& RichTextBuilder::operator<<(const std::shared_ptr& font) + { + return SetTextFont(font); + } + + template + RichTextBuilder& RichTextBuilder::operator<<(std::string_view str) + { + return AppendText(str); + } + + template + RichTextBuilder& RichTextBuilder::operator<<(CharacterSizeWrapper characterSize) + { + return SetCharacterSize(characterSize.characterSize); + } + + template + RichTextBuilder& RichTextBuilder::operator<<(CharacterSpacingOffsetWrapper characterSpacingOffset) + { + return SetCharacterSpacingOffset(characterSpacingOffset.spacingOffset); + } + + template + RichTextBuilder& RichTextBuilder::operator<<(LineSpacingOffsetWrapper lineSpacing) + { + return SetLineSpacingOffset(lineSpacing.spacingOffset); + } + + template + RichTextBuilder& RichTextBuilder::operator<<(OutlineColorWrapper outlineColor) + { + return SetTextOutlineColor(outlineColor.color); + } + + template + RichTextBuilder& RichTextBuilder::operator<<(OutlineThicknessWrapper outlineThickness) + { + return SetTextOutlineThickness(outlineThickness.thickness); + } + + template + RichTextBuilder& RichTextBuilder::operator<<(TextStyleFlags textStyle) + { + return SetTextStyle(textStyle); + } + + template + auto RichTextBuilder::CharacterSize(unsigned int characterSize) -> CharacterSizeWrapper + { + return { characterSize }; + } + + template + auto RichTextBuilder::CharacterSpacingOffset(unsigned int spacingOffset) -> CharacterSpacingOffsetWrapper + { + return { spacingOffset }; + } + + template + auto RichTextBuilder::LineSpacingOffset(float spacingOffset) -> LineSpacingOffsetWrapper + { + return { spacingOffset }; + } + + template + auto RichTextBuilder::OutlineColor(const Color& color) -> OutlineColorWrapper + { + return { color }; + } + + template + auto RichTextBuilder::OutlineThickness(float thickness) -> OutlineThicknessWrapper + { + return { thickness }; + } +} + +#include