From f148e0ebc1c85ca8c53001b58f634ad5ea38e84c Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sat, 2 May 2026 12:10:14 -0600 Subject: [PATCH] UI: Rework Document close handling again --- src/dusk/ui/document.cpp | 15 ++++------- src/dusk/ui/document.hpp | 18 ++++++++++++-- src/dusk/ui/overlay.cpp | 16 ++++++------ src/dusk/ui/overlay.hpp | 3 +-- src/dusk/ui/popup.cpp | 24 ++++++------------ src/dusk/ui/popup.hpp | 5 +--- src/dusk/ui/prelaunch.cpp | 26 +++++++++++--------- src/dusk/ui/prelaunch.hpp | 2 +- src/dusk/ui/ui.cpp | 52 ++++++++++----------------------------- src/dusk/ui/ui.hpp | 3 +-- src/dusk/ui/window.cpp | 13 ++++------ src/dusk/ui/window.hpp | 3 +-- 12 files changed, 76 insertions(+), 104 deletions(-) diff --git a/src/dusk/ui/document.cpp b/src/dusk/ui/document.cpp index c9eb66f50a..bd9696591e 100644 --- a/src/dusk/ui/document.cpp +++ b/src/dusk/ui/document.cpp @@ -35,7 +35,6 @@ Document::Document(const Rml::String& source) : mDocument(load_document(source)) listen(Rml::EventId::Mouseover, blockUnlessVisible, true); listen(Rml::EventId::Click, blockUnlessVisible, true); listen(Rml::EventId::Scroll, blockUnlessVisible, true); - listen(Rml::EventId::Focus, blockUnlessVisible, true); listen(Rml::EventId::Keydown, [this](Rml::Event& event) { const auto cmd = map_nav_event(event); @@ -65,10 +64,13 @@ void Document::show() { } } -void Document::hide() { +void Document::hide(bool close) { if (mDocument != nullptr) { mDocument->Hide(); } + if (close) { + mClosed = true; + } } void Document::update() {} @@ -89,13 +91,6 @@ void Document::listen(Rml::Element* element, Rml::EventId event, std::make_unique(element, event, std::move(callback), capture)); } -bool Document::can_destroy() const { - if (mDocument == nullptr) { - return true; - } - return *mDocument->GetProperty(Rml::PropertyId::Visibility) == Rml::Style::Visibility::Hidden; -} - bool Document::visible() const { if (mDocument == nullptr) { return false; @@ -105,7 +100,7 @@ bool Document::visible() const { bool Document::handle_nav_command(Rml::Event& event, NavCommand cmd) { if (cmd == NavCommand::Menu) { - toggle_top_document(); + toggle(); return true; } return false; diff --git a/src/dusk/ui/document.hpp b/src/dusk/ui/document.hpp index f9670abbbd..e1ec173aa4 100644 --- a/src/dusk/ui/document.hpp +++ b/src/dusk/ui/document.hpp @@ -14,7 +14,7 @@ public: Document& operator=(const Document&) = delete; virtual void show(); - virtual void hide(); + virtual void hide(bool close); virtual void update(); virtual bool focus(); virtual bool visible() const; @@ -24,14 +24,28 @@ public: void listen(Rml::EventId event, ScopedEventListener::Callback callback, bool capture = false) { listen(mDocument, event, std::move(callback), capture); } + void toggle() { + if (visible()) { + hide(false); + } else { + show(); + } + } + void pop() { + hide(true); + show_top_document(); + } - bool can_destroy() const; + bool pending_close() const { return mPendingClose; } + bool closed() const { return mClosed; } protected: virtual bool handle_nav_command(Rml::Event& event, NavCommand cmd); Rml::ElementDocument* mDocument; std::vector > mListeners; + bool mPendingClose = false; + bool mClosed = false; }; } // namespace dusk::ui diff --git a/src/dusk/ui/overlay.cpp b/src/dusk/ui/overlay.cpp index 9661b4226d..e97af576b5 100644 --- a/src/dusk/ui/overlay.cpp +++ b/src/dusk/ui/overlay.cpp @@ -208,7 +208,7 @@ Overlay::Overlay(OverlayProps props) if (auto* footer = mDocument->GetElementById("footer")) { auto& returnButton = add_component