aboutsummaryrefslogtreecommitdiff
path: root/include/cru/ui
diff options
context:
space:
mode:
Diffstat (limited to 'include/cru/ui')
-rw-r--r--include/cru/ui/DeleteLater.h25
-rw-r--r--include/cru/ui/components/Component.h5
-rw-r--r--include/cru/ui/controls/Control.h5
3 files changed, 33 insertions, 2 deletions
diff --git a/include/cru/ui/DeleteLater.h b/include/cru/ui/DeleteLater.h
new file mode 100644
index 00000000..84c0e1c2
--- /dev/null
+++ b/include/cru/ui/DeleteLater.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include <memory>
+#include <utility>
+
+namespace cru::ui {
+class DeleteLaterImpl {
+ public:
+ virtual ~DeleteLaterImpl();
+ void DeleteLater();
+};
+
+template <typename T>
+struct DeleteLaterDeleter {
+ void operator()(T* p) const { p->DeleteLater(); }
+};
+
+template <typename T>
+using DeleteLaterPtr = std::unique_ptr<T, DeleteLaterDeleter<T>>;
+
+template <typename T, typename... Args>
+DeleteLaterPtr<T> CreateDeleteLaterPtr(Args&&... args) {
+ return DeleteLaterPtr<T>(new T(std::forward<Args>(args)...));
+}
+} // namespace cru::ui
diff --git a/include/cru/ui/components/Component.h b/include/cru/ui/components/Component.h
index 34add594..2625f445 100644
--- a/include/cru/ui/components/Component.h
+++ b/include/cru/ui/components/Component.h
@@ -1,5 +1,6 @@
#pragma once
#include "../Base.h"
+#include "../DeleteLater.h"
#include "cru/common/SelfResolvable.h"
namespace cru::ui::components {
@@ -8,7 +9,9 @@ namespace cru::ui::components {
* \remarks Component should respect children's Component::IsDeleteByParent
* value and decide whether to delete it.
*/
-class CRU_UI_API Component : public Object, public SelfResolvable<Component> {
+class CRU_UI_API Component : public Object,
+ public SelfResolvable<Component>,
+ public DeleteLaterImpl {
public:
Component() = default;
diff --git a/include/cru/ui/controls/Control.h b/include/cru/ui/controls/Control.h
index 158a1578..8c9f11d3 100644
--- a/include/cru/ui/controls/Control.h
+++ b/include/cru/ui/controls/Control.h
@@ -1,5 +1,6 @@
#pragma once
#include "../Base.h"
+#include "../DeleteLater.h"
#include "../events/UiEvents.h"
#include "../render/RenderObject.h"
#include "../style/StyleRuleSet.h"
@@ -17,7 +18,9 @@ namespace cru::ui::controls {
* - RemoveChild(Control* child)
* The last two methods are totally for convenient control tree management.
*/
-class CRU_UI_API Control : public Object, public SelfResolvable<Control> {
+class CRU_UI_API Control : public Object,
+ public SelfResolvable<Control>,
+ public DeleteLaterImpl {
friend class RootControl;
protected: