Avoid relayout with set_display helper

This commit is contained in:
Luke Street
2026-09-13 16:25:21 -06:00
parent 5627f72117
commit 65ee78ba75
8 changed files with 32 additions and 10 deletions
+1 -1
View File
@@ -13,7 +13,7 @@ void Component::update() {
}
bool Component::focus() {
if (disabled() || !mRoot->IsVisible(true)) {
if (disabled()) {
return false;
}
// Can we focus self?
+7 -2
View File
@@ -20,6 +20,7 @@
#include <SDL3/SDL_misc.h>
#include <borealis/http.hpp>
#include <tracy/Tracy.hpp>
#include <algorithm>
#include <array>
@@ -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;
+1 -1
View File
@@ -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();
}
+3
View File
@@ -25,6 +25,7 @@
#include <fmt/format.h>
#include <fmt/ranges.h>
#include <tracy/Tracy.hpp>
#include <algorithm>
#include <cstddef>
@@ -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<Rml::Property> previousBannerFilter;
if (auto* image = mContentRoot->QuerySelector("mod-header-image")) {
+6 -3
View File
@@ -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();
}
+3 -3
View File
@@ -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);
}
}
+10
View File
@@ -25,6 +25,7 @@
#include <aurora/rmlui.hpp>
#include <borealis/io.hpp>
#include <fmt/format.h>
#include <tracy/Tracy.hpp>
#include <algorithm>
#include <filesystem>
@@ -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<Rml::Input::KeyIdentifier>(
event.GetParameter<int>("key_identifier", Rml::Input::KI_UNKNOWN));
+1
View File
@@ -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;