diff --git a/res/rml/mods.rcss b/res/rml/mods.rcss index 99aa33d236..6042e35c0f 100644 --- a/res/rml/mods.rcss +++ b/res/rml/mods.rcss @@ -121,6 +121,7 @@ mod-entry .mod-entry-desc { color: rgba(224, 219, 200, 65%); max-height: 2.6em; overflow: hidden; + white-space: pre-wrap; } mod-entry .mod-entry-sub { diff --git a/src/dusk/ui/logs_window.cpp b/src/dusk/ui/logs_window.cpp index 9fdd89e50d..fc9dad96ca 100644 --- a/src/dusk/ui/logs_window.cpp +++ b/src/dusk/ui/logs_window.cpp @@ -72,15 +72,10 @@ std::string format_time(int64_t timeMs) { return fmt::format("{}.{:03}", buffer.data(), timeMs % 1000); } -void append_text(Rml::ElementDocument* doc, Rml::Element* parent, const Rml::String& text) { - parent->AppendChild(doc->CreateTextNode(text)); -} - -Rml::Element* append_span(Rml::ElementDocument* doc, Rml::Element* parent, const char* className, - const Rml::String& text) { - auto span = doc->CreateElement("span"); +Rml::Element* append_span(Rml::Element* parent, const char* className, const Rml::String& text) { + auto span = parent->GetOwnerDocument()->CreateElement("span"); span->SetClass(className, true); - append_text(doc, span.get(), text); + append_text(span.get(), text); return parent->AppendChild(std::move(span)); } @@ -270,11 +265,11 @@ Rml::Element* LogsWindow::append_log_line(const mods::log::Line& line) { elem->SetClass(level_class(line.level), true); constexpr const char* kNbsp = "\xc2\xa0"; - append_span(mDocument, elem.get(), "log-time", format_time(line.timeMs)); - append_text(mDocument, elem.get(), kNbsp); - append_span(mDocument, elem.get(), "log-mod", fmt::format("[{}]", modId)); - append_text(mDocument, elem.get(), kNbsp); - append_span(mDocument, elem.get(), "log-msg", line.message); + append_span(elem.get(), "log-time", format_time(line.timeMs)); + append_text(elem.get(), kNbsp); + append_span(elem.get(), "log-mod", fmt::format("[{}]", modId)); + append_text(elem.get(), kNbsp); + append_span(elem.get(), "log-msg", line.message); return mLinesElem->AppendChild(std::move(elem)); } diff --git a/src/dusk/ui/pane.cpp b/src/dusk/ui/pane.cpp index 01eaf1194b..2a6f2a62c3 100644 --- a/src/dusk/ui/pane.cpp +++ b/src/dusk/ui/pane.cpp @@ -166,13 +166,13 @@ bool Pane::focus() { Rml::Element* Pane::add_section(const Rml::String& text) { auto* elem = append(mRoot, "div"); elem->SetClass("section-heading", true); - elem->SetInnerRML(escape(text)); + append_text(elem, text); return elem; } Rml::Element* Pane::add_text(const Rml::String& text) { auto* elem = append(mRoot, "div"); - elem->SetInnerRML(escape(text)); + append_text(elem, text); return elem; } diff --git a/src/dusk/ui/ui.cpp b/src/dusk/ui/ui.cpp index 032937a832..0777553681 100644 --- a/src/dusk/ui/ui.cpp +++ b/src/dusk/ui/ui.cpp @@ -31,9 +31,9 @@ void load_font(const char* filename, bool fallback = false) { } bool sInitialized = false; -std::vector > sDocumentStack; +std::vector> sDocumentStack; // Documents that don't participate in the focus stack -std::vector > sPassiveDocuments; +std::vector> sPassiveDocuments; struct ScopedStyles { DocumentScope scope; @@ -173,10 +173,12 @@ void handle_event(const SDL_Event& event) noexcept { const char* name = SDL_GetGamepadName(gamepad); Rml::String content = fmt::format("{}", name ? name : "[Unknown]"); Rml::String title = "Device Connected"; - if (const char* icon = connection_state_icon(SDL_GetGamepadConnectionState(gamepad))) { + if (const char* icon = + connection_state_icon(SDL_GetGamepadConnectionState(gamepad))) + { title = fmt::format( - "{} &#x{};", title, - icon); + "{} &#x{};", + title, icon); } int batteryLevel = -1; const auto powerState = SDL_GetGamepadPowerInfo(gamepad, &batteryLevel); @@ -382,6 +384,17 @@ Rml::Element* append(Rml::Element* parent, const Rml::String& tag) noexcept { return parent->AppendChild(doc->CreateElement(tag)); } +Rml::Element* append_text(Rml::Element* parent, const Rml::String& text) noexcept { + if (parent == nullptr) { + return nullptr; + } + auto* doc = parent->GetOwnerDocument(); + if (doc == nullptr) { + return nullptr; + } + return parent->AppendChild(doc->CreateTextNode(text)); +} + NavCommand map_nav_event(const Rml::Event& event) noexcept { const auto key = static_cast( event.GetParameter("key_identifier", Rml::Input::KI_UNKNOWN)); @@ -448,7 +461,7 @@ void push_toast(Toast toast) noexcept { sToasts.push_back(std::move(toast)); } -std::vector >& get_document_stack() noexcept { +std::vector>& get_document_stack() noexcept { return sDocumentStack; } diff --git a/src/dusk/ui/ui.hpp b/src/dusk/ui/ui.hpp index daf3c3ff03..bd993ea34d 100644 --- a/src/dusk/ui/ui.hpp +++ b/src/dusk/ui/ui.hpp @@ -96,6 +96,7 @@ Document* top_document() noexcept; std::filesystem::path resource_path(const std::filesystem::path& filename) noexcept; std::string escape(std::string_view str) noexcept; Rml::Element* append(Rml::Element* parent, const Rml::String& tag) noexcept; +Rml::Element* append_text(Rml::Element* parent, const Rml::String& text) noexcept; NavCommand map_nav_event(const Rml::Event& event) noexcept; Insets safe_area_insets(Rml::Context* context) noexcept;