From 4459a5f60db483bc3e63587b1c911ca98f415ec7 Mon Sep 17 00:00:00 2001 From: and3md Date: Wed, 22 Mar 2017 19:31:28 +0100 Subject: [PATCH] Ability to safe destroy widget later by event. --- src/dlangui/core/events.d | 14 ++++++++++++++ src/dlangui/platforms/common/platform.d | 8 +++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/dlangui/core/events.d b/src/dlangui/core/events.d index 3caa30de..f7c95a0b 100644 --- a/src/dlangui/core/events.d +++ b/src/dlangui/core/events.d @@ -1649,6 +1649,20 @@ class RunnableEvent : CustomEvent { } } +/// save destroy event +class SafeDestroyEvent : RunnableEvent { + Widget _widgetToDestroy; + this (Widget widgetToDestroy) + { + _widgetToDestroy = widgetToDestroy; + super(1,null, delegate void () { + if (_widgetToDestroy.parent) + _widgetToDestroy.parent.removeChild(_widgetToDestroy); + destroy(_widgetToDestroy); + }); + } +} + interface CustomEventTarget { /// post event to handle in UI thread (this method can be used from background thread) void postEvent(CustomEvent event); diff --git a/src/dlangui/platforms/common/platform.d b/src/dlangui/platforms/common/platform.d index 63629585..b41617a9 100644 --- a/src/dlangui/platforms/common/platform.d +++ b/src/dlangui/platforms/common/platform.d @@ -519,7 +519,13 @@ class Window : CustomEventTarget { destroy(_timerQueue); _eventList = null; } - + /// safe destroy widget + void safeWidgetDestroy(Widget widgetToDestroy) + { + SafeDestroyEvent ev = new SafeDestroyEvent(widgetToDestroy); + postEvent(ev); + } + private void animate(Widget root, long interval) { if (root is null) return;