Browse Source

Adding Window Close event

Josh Engebretson 9 years ago
parent
commit
54490fbfc0

+ 10 - 0
Script/AtomicEditor/ui/modal/ModalOps.ts

@@ -53,6 +53,16 @@ class ModalOps extends Atomic.ScriptObject {
 
         this.dimmer = new Atomic.UIDimmer();
 
+        this.subscribeToEvent("WindowClosed", (e) => {
+            if (e.window == this.opWindow)
+            {
+                this.opWindow = null;
+                if (this.dimmer.parent) {
+                    this.dimmer.parent.removeChild(this.dimmer, false);
+                }
+            }
+        });
+
     }
 
     showCreateProject(projectTemplateDefinition: ProjectTemplates.ProjectTemplateDefinition) {

+ 11 - 0
Source/Atomic/UI/UI.cpp

@@ -861,6 +861,17 @@ bool UI::OnWidgetDying(tb::TBWidget *widget)
     return false;
 }
 
+void UI::OnWindowClose(tb::TBWindow *window)
+{
+    if (widgetWrap_.Contains(window))
+    {
+        UIWidget* widget = widgetWrap_[window];
+        VariantMap eventData;
+        eventData[WindowClosed::P_WINDOW] = widget;
+        widget->SendEvent(E_WINDOWCLOSED, eventData);
+    }
+}
+
 void UI::OnWidgetFocusChanged(TBWidget *widget, bool focused)
 {
     if (widgetWrap_.Contains(widget))

+ 1 - 0
Source/Atomic/UI/UI.h

@@ -134,6 +134,7 @@ private:
     bool OnWidgetDying(tb::TBWidget *widget);    
     void OnWidgetFocusChanged(tb::TBWidget *widget, bool focused);
     bool OnWidgetInvokeEvent(tb::TBWidget *widget, const tb::TBWidgetEvent &ev);
+    void OnWindowClose(tb::TBWindow *window);
 
 
     tb::TBWidget* rootWidget_;

+ 5 - 0
Source/Atomic/UI/UIEvents.h

@@ -109,6 +109,11 @@ ATOMIC_EVENT(E_UISHORTCUT, UIShortcut)
 
 }
 
+ATOMIC_EVENT(E_WINDOWCLOSED, WindowClosed)
+{
+    ATOMIC_PARAM(P_WINDOW, Window);               // UIWindow
+}
+
 ATOMIC_EVENT(E_UIWIDGETFOCUSCHANGED, UIWidgetFocusChanged)
 {
     ATOMIC_PARAM(P_WIDGET, Widget);             // UIWidget pointer

+ 2 - 2
Source/Atomic/UI/UIWidget.cpp

@@ -189,12 +189,12 @@ void UIWidget::ConvertEvent(UIWidget *handler, UIWidget* target, const tb::TBWid
 
 void UIWidget::OnDelete()
 {
-    UnsubscribeFromAllEvents();   
-
     VariantMap eventData;
     eventData[WidgetDeleted::P_WIDGET] = this;
     this->SendEvent(E_WIDGETDELETED, eventData);
 
+    UnsubscribeFromAllEvents();
+
     if (widget_)
     {
         // if we don't have a UI subsystem, we are exiting

+ 13 - 0
Source/ThirdParty/TurboBadger/tb_widgets_listener.cpp

@@ -4,6 +4,7 @@
 // ================================================================================
 
 #include "tb_widgets_listener.h"
+#include "tb_window.h"
 
 namespace tb {
 
@@ -85,6 +86,18 @@ bool TBWidgetListener::InvokeWidgetInvokeEvent(TBWidget *widget, const TBWidgetE
     return handled;
 }
 
+// ATOMIC BEGIN
+void TBWidgetListener::InvokeWindowClose(TBWindow *window)
+{
+    TBLinkListOf<TBWidgetListenerGlobalLink>::Iterator global_i = g_listeners.IterateForward();
+    TBLinkListOf<TBWidgetListener>::Iterator local_i = window->m_listeners.IterateForward();
+    while (TBWidgetListener *listener = local_i.GetAndStep())
+        listener->OnWindowClose(window);
+    while (TBWidgetListenerGlobalLink *link = global_i.GetAndStep())
+        static_cast<TBWidgetListener*>(link)->OnWindowClose(window);
+}
+// ATOMIC END
+
 // == TBWidgetSafePointer ===================================================================================
 
 void TBWidgetSafePointer::Set(TBWidget *widget)

+ 10 - 0
Source/ThirdParty/TurboBadger/tb_widgets_listener.h

@@ -59,6 +59,11 @@ public:
         to intercept events before they are handled, and block it (by returning true).
         Note, if returning true, other global listeners will still also be notified. */
     virtual bool OnWidgetInvokeEvent(TBWidget *widget, const TBWidgetEvent &ev) { return false; }
+
+    // ATOMIC BEGIN
+    virtual void OnWindowClose(TBWindow *window) {}
+    // ATOMIC END
+
 private:
     friend class TBWidget;
     friend class TBEditField;
@@ -68,6 +73,11 @@ private:
     static void InvokeWidgetRemove(TBWidget *parent, TBWidget *child);
     static void InvokeWidgetFocusChanged(TBWidget *widget, bool focused);
     static bool InvokeWidgetInvokeEvent(TBWidget *widget, const TBWidgetEvent &ev);
+
+    // ATOMIC BEGIN
+    friend class TBWindow;
+    static void InvokeWindowClose(TBWindow *window);
+    // ATOMIC END
 };
 
 /** TBWidgetSafePointer keeps a pointer to a widget that will be set to

+ 3 - 0
Source/ThirdParty/TurboBadger/tb_window.cpp

@@ -64,6 +64,9 @@ void TBWindow::ResizeToFitContent(RESIZE_FIT fit)
 
 void TBWindow::Close()
 {
+// ATOMIC BEGIN
+    TBWidgetListener::InvokeWindowClose(this);
+// ATOMIC END
     Die();
 }