diff --git a/src/dusk/ui/component.cpp b/src/dusk/ui/component.cpp index 6ddb01672d..ae49f7a8c3 100644 --- a/src/dusk/ui/component.cpp +++ b/src/dusk/ui/component.cpp @@ -13,7 +13,7 @@ void Component::update() { } bool Component::focus() { - if (disabled() || !mRoot->IsVisible(true)) { + if (disabled()) { return false; } // Can we focus self? diff --git a/src/dusk/ui/mod_browser.cpp b/src/dusk/ui/mod_browser.cpp index deb1b597a5..2d9fd6c8fb 100644 --- a/src/dusk/ui/mod_browser.cpp +++ b/src/dusk/ui/mod_browser.cpp @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -324,6 +325,7 @@ public: } void update() override { + ZoneScopedN("Mod browser detail update"); if (mFetch && mFetch.ready()) { try { if (auto result = mFetch.try_take()) { @@ -572,8 +574,9 @@ public: } if (mProgress != nullptr) { mProgress->SetAttribute("value", progress); - mProgress->SetProperty( - "display", state == "idle" || state == "installed" ? "none" : "block"); + set_display(mProgress, state == "idle" || state == "installed" ? + Rml::Style::Display::None : + Rml::Style::Display::Block); } set_disabled(disabled); Button::update(); @@ -1092,6 +1095,7 @@ void ModBrowser::cycle_sort() { } void ModBrowser::update() { + ZoneScopedN("Mod browser update"); const auto loaderGeneration = mods::ModLoader::instance().generation(); if (loaderGeneration != mLoaderGeneration) { mLoaderGeneration = loaderGeneration; @@ -1111,6 +1115,7 @@ void ModBrowser::update() { mFetch = {}; } if (mRebuildRequested) { + ZoneScopedN("Mod browser rebuild"); mRebuildRequested = false; auto* viewport = mContentRoot->QuerySelector("catalog-viewport"); const float scrollTop = viewport ? viewport->GetScrollTop() : 0; diff --git a/src/dusk/ui/mod_updates.cpp b/src/dusk/ui/mod_updates.cpp index ced4b8f60b..a2298bca51 100644 --- a/src/dusk/ui/mod_updates.cpp +++ b/src/dusk/ui/mod_updates.cpp @@ -61,7 +61,7 @@ public: mAllLabel = label; } mAll->set_disabled(count == 0); - mAll->root()->SetProperty("display", count ? "flex" : "none"); + set_display(mAll->root(), count ? Rml::Style::Display::Flex : Rml::Style::Display::None); mCheck->set_disabled(mods::updates::state() == mods::updates::State::Checking); Component::update(); } diff --git a/src/dusk/ui/mods_window.cpp b/src/dusk/ui/mods_window.cpp index 31b69d0ad3..9de6162317 100644 --- a/src/dusk/ui/mods_window.cpp +++ b/src/dusk/ui/mods_window.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -597,6 +598,7 @@ void ModsWindow::mark_current_entry() { } void ModsWindow::update() { + ZoneScopedN("Mod manager update"); auto& loader = mods::ModLoader::instance(); bool dirty = loader.generation() != mLoaderGeneration; if (dirty) { @@ -630,6 +632,7 @@ void ModsWindow::update() { dirty |= queueItems != mQueueItems; if (dirty) { mContextMenu.dismiss(); + ZoneScopedN("Mod manager rebuild"); const auto previousModId = mSelectedModId; std::optional previousBannerFilter; if (auto* image = mContentRoot->QuerySelector("mod-header-image")) { diff --git a/src/dusk/ui/online_mods.cpp b/src/dusk/ui/online_mods.cpp index a977a1534b..4b931a20cb 100644 --- a/src/dusk/ui/online_mods.cpp +++ b/src/dusk/ui/online_mods.cpp @@ -111,12 +111,14 @@ public: const bool canPause = (!item->local && item->state == State::Queued) || item->state == State::Downloading || item->state == State::Paused || item->state == State::Retrying || failed; - mPause->root()->SetProperty("display", canPause ? "flex" : "none"); + set_display( + mPause->root(), canPause ? Rml::Style::Display::Flex : Rml::Style::Display::None); mPause->set_icon(failed ? "refresh" : item->state == State::Paused ? "play_arrow" : "pause"); mPause->set_label(failed ? "Retry" : item->state == State::Paused ? "Resume" : "Pause"); - mCancel->root()->SetProperty("display", item->state == State::Handoff ? "none" : "flex"); + set_display(mCancel->root(), + item->state == State::Handoff ? Rml::Style::Display::None : Rml::Style::Display::Flex); mCancel->set_label(failed ? "Dismiss" : is_completed(item->state) ? "Clear" : "Cancel"); Component::update(); } @@ -161,7 +163,8 @@ public: } mResume = !canPause && canResume; mPause->set_text(mResume ? "Resume all" : "Pause all"); - mPause->root()->SetProperty("display", canPause || canResume ? "block" : "none"); + set_display(mPause->root(), + canPause || canResume ? Rml::Style::Display::Block : Rml::Style::Display::None); Component::update(); } diff --git a/src/dusk/ui/package_row.cpp b/src/dusk/ui/package_row.cpp index e3849c9e5d..f2ffa014af 100644 --- a/src/dusk/ui/package_row.cpp +++ b/src/dusk/ui/package_row.cpp @@ -84,14 +84,14 @@ void PackageRow::set_package(std::string name, std::string version, std::string mRoot->SetClassNames(stateClass); set_text_content(mName, name); set_text_content(mVersion, fmt::format("v{}", version)); - mVersion->SetProperty("display", version.empty() ? "none" : "block"); + set_display(mVersion, version.empty() ? Rml::Style::Display::None : Rml::Style::Display::Block); set_text_content(mState, status); set_text_content(mDetail, detail); if (progress) { - mProgress->SetProperty("display", "block"); + set_display(mProgress, Rml::Style::Display::Block); mProgress->SetAttribute("value", *progress); } else { - mProgress->SetProperty("display", "none"); + set_display(mProgress, Rml::Style::Display::None); } } diff --git a/src/dusk/ui/ui.cpp b/src/dusk/ui/ui.cpp index 0b7c24624b..c4111be749 100644 --- a/src/dusk/ui/ui.cpp +++ b/src/dusk/ui/ui.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -442,6 +443,7 @@ Document* top_document() noexcept { } void update() noexcept { + ZoneScopedN("Dusk UI update"); mods::queue::update(); mods::updates::update(); if (!aurora::rmlui::is_initialized()) { @@ -593,6 +595,14 @@ void set_text_content(Rml::Element* parent, const Rml::String& text) noexcept { } } +void set_display(Rml::Element* element, Rml::Style::Display display) noexcept { + const Rml::Property value{display}; + const auto* current = element->GetLocalProperty(Rml::PropertyId::Display); + if (current == nullptr || *current != value) { + element->SetProperty(Rml::PropertyId::Display, value); + } +} + NavCommand map_nav_event(const Rml::Event& event) noexcept { const auto key = static_cast( event.GetParameter("key_identifier", Rml::Input::KI_UNKNOWN)); diff --git a/src/dusk/ui/ui.hpp b/src/dusk/ui/ui.hpp index fd4ac730c2..3478134d4c 100644 --- a/src/dusk/ui/ui.hpp +++ b/src/dusk/ui/ui.hpp @@ -129,6 +129,7 @@ Rml::Element* append_text_element( Rml::Element* parent, const Rml::String& tag, const Rml::String& text) noexcept; void clear_children(Rml::Element* parent) noexcept; void set_text_content(Rml::Element* parent, const Rml::String& text) noexcept; +void set_display(Rml::Element* element, Rml::Style::Display display) noexcept; NavCommand map_nav_event(const Rml::Event& event) noexcept; Insets safe_area_insets(Rml::Context* context) noexcept;