From 04d243699cbde40fe69472f4c4df38c36f7942ef Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Tue, 18 Nov 2025 17:31:23 +0800 Subject: Move delete later to platform::gui. --- src/ThemeBuilder/components/StyleRuleSetEditor.cpp | 19 +++++++++--------- src/ThemeBuilder/components/StyleRuleSetEditor.h | 6 +++--- .../conditions/CompoundConditionEditor.cpp | 6 +++--- .../conditions/CompoundConditionEditor.h | 2 +- .../components/stylers/CompoundStylerEditor.cpp | 6 +++--- .../components/stylers/CompoundStylerEditor.h | 4 ++-- src/platform/gui/UiApplication.cpp | 18 +++++++++++++++-- src/platform/gui/win/UiApplication.cpp | 6 ++++++ src/ui/CMakeLists.txt | 1 - src/ui/DeleteLater.cpp | 23 ---------------------- 10 files changed, 44 insertions(+), 47 deletions(-) delete mode 100644 src/ui/DeleteLater.cpp (limited to 'src') diff --git a/src/ThemeBuilder/components/StyleRuleSetEditor.cpp b/src/ThemeBuilder/components/StyleRuleSetEditor.cpp index fd159a44..9159e966 100644 --- a/src/ThemeBuilder/components/StyleRuleSetEditor.cpp +++ b/src/ThemeBuilder/components/StyleRuleSetEditor.cpp @@ -1,5 +1,5 @@ #include "StyleRuleSetEditor.h" -#include "cru/ui/DeleteLater.h" +#include "cru/platform/gui/DeleteLater.h" #include "cru/ui/ThemeManager.h" #include "cru/ui/controls/FlexLayout.h" #include "cru/ui/model/IListChangeNotify.h" @@ -49,11 +49,11 @@ void StyleRuleSetEditor::BindStyleRuleSet( } Index StyleRuleSetEditor::IndexOfRuleEditor(StyleRuleEditor* editor) { - auto iter = - std::find_if(style_rule_editors_.cbegin(), style_rule_editors_.cend(), - [editor](const ui::DeleteLaterPtr& p) { - return p.get() == editor; - }); + auto iter = std::find_if( + style_rule_editors_.cbegin(), style_rule_editors_.cend(), + [editor](const platform::gui::DeleteLaterPtr& p) { + return p.get() == editor; + }); return iter - style_rule_editors_.cbegin(); } @@ -66,7 +66,8 @@ void StyleRuleSetEditor::UpdateView( for (auto i = change->position; i < change->position + change->count; ++i) { const auto& rule = style_rule_set->GetStyleRule(i); - auto style_rule_editor = ui::MakeDeleteLater(); + auto style_rule_editor = + platform::gui::MakeDeleteLater(); style_rule_editor->SetValue(rule, false); style_rule_editor->RemoveEvent()->AddSpyOnlyHandler( [this, editor = style_rule_editor.get()] { @@ -80,8 +81,8 @@ void StyleRuleSetEditor::UpdateView( }); style_rule_editors_.insert(style_rule_editors_.cbegin() + i, std::move(style_rule_editor)); - rules_layout_.InsertChildAt(style_rule_editors_.back()->GetRootControl(), - i); + rules_layout_.InsertChildAt( + style_rule_editors_.back()->GetRootControl(), i); } break; } diff --git a/src/ThemeBuilder/components/StyleRuleSetEditor.h b/src/ThemeBuilder/components/StyleRuleSetEditor.h index 03148889..36ac8626 100644 --- a/src/ThemeBuilder/components/StyleRuleSetEditor.h +++ b/src/ThemeBuilder/components/StyleRuleSetEditor.h @@ -1,8 +1,8 @@ #pragma once #include "StyleRuleEditor.h" -#include "cru/ui/DeleteLater.h" +#include "cru/platform/gui/DeleteLater.h" #include "cru/ui/components/Component.h" -#include "cru/ui/controls/Button.h" +#include "cru/ui/controls/IconButton.h" #include "cru/ui/controls/Control.h" #include "cru/ui/controls/FlexLayout.h" #include "cru/ui/controls/ScrollView.h" @@ -36,7 +36,7 @@ class StyleRuleSetEditor : public ui::components::Component { ui::controls::ScrollView scroll_view_; ui::controls::FlexLayout container_; ui::controls::FlexLayout rules_layout_; - std::vector> style_rule_editors_; + std::vector> style_rule_editors_; ui::controls::IconButton add_button_; bool suppress_next_set_ = false; diff --git a/src/ThemeBuilder/components/conditions/CompoundConditionEditor.cpp b/src/ThemeBuilder/components/conditions/CompoundConditionEditor.cpp index d7324350..8501d7cd 100644 --- a/src/ThemeBuilder/components/conditions/CompoundConditionEditor.cpp +++ b/src/ThemeBuilder/components/conditions/CompoundConditionEditor.cpp @@ -7,7 +7,7 @@ #include "cru/base/ClonePtr.h" #include "cru/platform/Color.h" #include "cru/ui/Base.h" -#include "cru/ui/DeleteLater.h" +#include "cru/platform/gui/DeleteLater.h" #include "cru/ui/ThemeManager.h" #include "cru/ui/controls/FlexLayout.h" #include "cru/ui/style/Condition.h" @@ -69,7 +69,7 @@ CompoundConditionEditor::CompoundConditionEditor() { this->children_container_.RemoveChildAt(index); RaiseChangeEvent(); }); - children_.push_back(ui::ToDeleteLaterPtr(std::move(editor))); + children_.push_back(platform::gui::ToDeleteLaterPtr(std::move(editor))); children_container_.AddChild(children_.back()->GetRootControl()); RaiseChangeEvent(); } @@ -100,7 +100,7 @@ void CompoundConditionEditor::SetChildren( this->children_container_.RemoveChildAt(index); RaiseChangeEvent(); }); - children_.push_back(ui::ToDeleteLaterPtr(std::move(editor))); + children_.push_back(platform::gui::ToDeleteLaterPtr(std::move(editor))); children_container_.AddChild(children_.back()->GetRootControl()); } if (trigger_change) { diff --git a/src/ThemeBuilder/components/conditions/CompoundConditionEditor.h b/src/ThemeBuilder/components/conditions/CompoundConditionEditor.h index af632758..c0f0891a 100644 --- a/src/ThemeBuilder/components/conditions/CompoundConditionEditor.h +++ b/src/ThemeBuilder/components/conditions/CompoundConditionEditor.h @@ -23,7 +23,7 @@ class CompoundConditionEditor : public ConditionEditor { private: ui::components::PopupMenuIconButton add_child_button_; ui::controls::FlexLayout children_container_; - std::vector> children_; + std::vector> children_; }; class AndConditionEditor : public CompoundConditionEditor { diff --git a/src/ThemeBuilder/components/stylers/CompoundStylerEditor.cpp b/src/ThemeBuilder/components/stylers/CompoundStylerEditor.cpp index 90d19a68..698cc699 100644 --- a/src/ThemeBuilder/components/stylers/CompoundStylerEditor.cpp +++ b/src/ThemeBuilder/components/stylers/CompoundStylerEditor.cpp @@ -7,7 +7,7 @@ #include "PaddingStylerEditor.h" #include "PreferredSizeStylerEditor.h" #include "cru/base/ClonePtr.h" -#include "cru/ui/DeleteLater.h" +#include "cru/platform/gui/DeleteLater.h" #include "cru/ui/ThemeManager.h" #include "cru/ui/style/Styler.h" @@ -71,7 +71,7 @@ CompoundStylerEditor::CompoundStylerEditor() { this->children_container_.RemoveChildAt(index); RaiseChangeEvent(); }); - children_.push_back(ui::ToDeleteLaterPtr(std::move(editor))); + children_.push_back(platform::gui::ToDeleteLaterPtr(std::move(editor))); children_container_.AddChild(editor->GetRootControl()); RaiseChangeEvent(); } @@ -100,7 +100,7 @@ void CompoundStylerEditor::SetValue(ui::style::CompoundStyler* value, this->children_container_.RemoveChildAt(index); RaiseChangeEvent(); }); - children_.push_back(ui::ToDeleteLaterPtr(std::move(editor))); + children_.push_back(platform::gui::ToDeleteLaterPtr(std::move(editor))); children_container_.AddChild(children_.back()->GetRootControl()); } } diff --git a/src/ThemeBuilder/components/stylers/CompoundStylerEditor.h b/src/ThemeBuilder/components/stylers/CompoundStylerEditor.h index f9265fbf..454b3622 100644 --- a/src/ThemeBuilder/components/stylers/CompoundStylerEditor.h +++ b/src/ThemeBuilder/components/stylers/CompoundStylerEditor.h @@ -1,7 +1,7 @@ #pragma once #include "StylerEditor.h" #include "cru/base/ClonePtr.h" -#include "cru/ui/DeleteLater.h" +#include "cru/platform/gui/DeleteLater.h" #include "cru/ui/components/PopupButton.h" #include "cru/ui/controls/FlexLayout.h" #include "cru/ui/style/Styler.h" @@ -24,7 +24,7 @@ class CompoundStylerEditor : public StylerEditor { private: ui::controls::FlexLayout children_container_; - std::vector> children_; + std::vector> children_; ui::components::PopupMenuIconButton add_child_button_; }; } // namespace cru::theme_builder::components::stylers diff --git a/src/platform/gui/UiApplication.cpp b/src/platform/gui/UiApplication.cpp index f035224f..56570125 100644 --- a/src/platform/gui/UiApplication.cpp +++ b/src/platform/gui/UiApplication.cpp @@ -1,9 +1,23 @@ #include "cru/platform/gui/UiApplication.h" - #include "cru/base/Base.h" +#include + namespace cru::platform::gui { +void DeleteLaterPool::Add(Object* object) { pool_.push_back(object); } + +void DeleteLaterPool::Clean() { + std::unordered_set deleted; + for (auto object : pool_) { + if (!deleted.contains(object)) { + deleted.insert(object); + delete object; + } + } + pool_.clear(); +} + namespace { IUiApplication* instance = nullptr; } @@ -12,7 +26,7 @@ IUiApplication* IUiApplication::GetInstance() { return instance; } IUiApplication::IUiApplication() { if (instance) { - throw std::runtime_error("An ui application has already been created."); + throw Exception("A ui application has already been created."); } instance = this; diff --git a/src/platform/gui/win/UiApplication.cpp b/src/platform/gui/win/UiApplication.cpp index eb85ef90..e1c21d59 100644 --- a/src/platform/gui/win/UiApplication.cpp +++ b/src/platform/gui/win/UiApplication.cpp @@ -71,6 +71,8 @@ int WinUiApplication::Run() { break; } } + + delete_later_pool_.Clean(); } for (const auto& handler : quit_handlers_) handler(); @@ -103,6 +105,10 @@ long long WinUiApplication::SetInterval(std::chrono::milliseconds milliseconds, void WinUiApplication::CancelTimer(long long id) { timers_.Remove(id); } +void WinUiApplication::DeleteLater(Object* object) { + delete_later_pool_.Add(object); +} + std::vector WinUiApplication::GetAllWindow() { std::vector result; for (const auto w : windows_) { diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index e931b678..d2188e0b 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -1,5 +1,4 @@ add_library(CruUi - DeleteLater.cpp Helper.cpp ThemeManager.cpp ThemeResourceDictionary.cpp diff --git a/src/ui/DeleteLater.cpp b/src/ui/DeleteLater.cpp deleted file mode 100644 index 90b07b71..00000000 --- a/src/ui/DeleteLater.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "cru/ui/DeleteLater.h" - -#include "Helper.h" -#include "cru/base/log/Logger.h" -#include "cru/platform/gui/UiApplication.h" - -namespace cru::ui { - -DeleteLaterImpl::DeleteLaterImpl() : delete_later_scheduled_(false) {} - -DeleteLaterImpl::~DeleteLaterImpl() { - CRU_LOG_TAG_DEBUG("Delete later object being deleted {}.", - static_cast(this)); -} - -void DeleteLaterImpl::DeleteLater() { - if (!delete_later_scheduled_) { - CRU_LOG_TAG_DEBUG("Schedule delete later {}.", static_cast(this)); - GetUiApplication()->SetImmediate([this] { delete this; }); - delete_later_scheduled_ = true; - } -} -} // namespace cru::ui -- cgit v1.2.3