diff --git a/src/dusk/ui/document.cpp b/src/dusk/ui/document.cpp index 105850673a..f6a73f8c42 100644 --- a/src/dusk/ui/document.cpp +++ b/src/dusk/ui/document.cpp @@ -64,6 +64,13 @@ 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::handle_nav_command(Rml::Event& event, NavCommand cmd) { return false; } diff --git a/src/dusk/ui/document.hpp b/src/dusk/ui/document.hpp index 26c641ef31..3827a147a1 100644 --- a/src/dusk/ui/document.hpp +++ b/src/dusk/ui/document.hpp @@ -24,6 +24,8 @@ public: listen(mDocument, event, std::move(callback), capture); } + bool can_destroy() const; + protected: virtual bool handle_nav_command(Rml::Event& event, NavCommand cmd); diff --git a/src/dusk/ui/popup.cpp b/src/dusk/ui/popup.cpp index 54b016dade..000025b4c2 100644 --- a/src/dusk/ui/popup.cpp +++ b/src/dusk/ui/popup.cpp @@ -19,11 +19,13 @@ Popup::Popup() : Document("res/rml/popup.rml"), mRoot(mDocument->GetElementById( // TODO }); mTabBar->add_tab("Editor", [] { push_document(std::make_unique()); }); - mTabBar->add_tab("Reset", [] { + mTabBar->add_tab("Reset", [this] { // TODO + mTabBar->set_active_tab(-1); }); - mTabBar->add_tab("Exit", [] { + mTabBar->add_tab("Exit", [this] { // TODO + mTabBar->set_active_tab(-1); }); // Hide document after transition completion diff --git a/src/dusk/ui/ui.cpp b/src/dusk/ui/ui.cpp index 40e5703798..bbd69558a2 100644 --- a/src/dusk/ui/ui.cpp +++ b/src/dusk/ui/ui.cpp @@ -18,7 +18,12 @@ void load_font(const char* filename, bool fallback = false) { } bool sInitialized = false; -std::vector > sDocuments; + +struct OpenDocument { + std::unique_ptr doc; + bool pendingDestroy = false; +}; +std::vector sDocuments; } // namespace @@ -52,7 +57,7 @@ Document& push_document(std::unique_ptr doc, bool show) noexcept { doc->hide(); } Document& ret = *doc; - sDocuments.push_back(std::move(doc)); + sDocuments.push_back({std::move(doc)}); if (show) { ret.show(); } @@ -60,23 +65,35 @@ Document& push_document(std::unique_ptr doc, bool show) noexcept { } void pop_document() noexcept { - sDocuments.pop_back(); + for (auto it = sDocuments.rbegin(); it != sDocuments.rend(); ++it) { + if (!it->pendingDestroy) { + it->doc->hide(); + it->pendingDestroy = true; + break; + } + } if (auto* doc = top_document()) { doc->show(); } } Document* top_document() noexcept { - if (sDocuments.empty()) { - return nullptr; + for (auto it = sDocuments.rbegin(); it != sDocuments.rend(); ++it) { + if (!it->pendingDestroy) { + return it->doc.get(); + } } - return sDocuments.back().get(); + return nullptr; } void update() noexcept { - for (const auto& doc : sDocuments) { - doc->update(); + for (size_t i = 0; i < sDocuments.size(); ++i) { + sDocuments[i].doc->update(); } + sDocuments.erase( + std::remove_if(sDocuments.begin(), sDocuments.end(), + [](const OpenDocument& doc) { return doc.pendingDestroy && doc.doc->can_destroy(); }), + sDocuments.end()); } std::filesystem::path resource_path(const std::filesystem::path& filename) noexcept {