diff options
Diffstat (limited to 'src/platform/gui')
| -rw-r--r-- | src/platform/gui/UiApplication.cpp | 18 | ||||
| -rw-r--r-- | src/platform/gui/win/UiApplication.cpp | 6 |
2 files changed, 22 insertions, 2 deletions
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 <unordered_set> + namespace cru::platform::gui { +void DeleteLaterPool::Add(Object* object) { pool_.push_back(object); } + +void DeleteLaterPool::Clean() { + std::unordered_set<Object*> 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<INativeWindow*> WinUiApplication::GetAllWindow() { std::vector<INativeWindow*> result; for (const auto w : windows_) { |
