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.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) {
     showCreateProject(projectTemplateDefinition: ProjectTemplates.ProjectTemplateDefinition) {

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

@@ -861,6 +861,17 @@ bool UI::OnWidgetDying(tb::TBWidget *widget)
     return false;
     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)
 void UI::OnWidgetFocusChanged(TBWidget *widget, bool focused)
 {
 {
     if (widgetWrap_.Contains(widget))
     if (widgetWrap_.Contains(widget))

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

@@ -134,6 +134,7 @@ private:
     bool OnWidgetDying(tb::TBWidget *widget);    
     bool OnWidgetDying(tb::TBWidget *widget);    
     void OnWidgetFocusChanged(tb::TBWidget *widget, bool focused);
     void OnWidgetFocusChanged(tb::TBWidget *widget, bool focused);
     bool OnWidgetInvokeEvent(tb::TBWidget *widget, const tb::TBWidgetEvent &ev);
     bool OnWidgetInvokeEvent(tb::TBWidget *widget, const tb::TBWidgetEvent &ev);
+    void OnWindowClose(tb::TBWindow *window);
 
 
 
 
     tb::TBWidget* rootWidget_;
     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_EVENT(E_UIWIDGETFOCUSCHANGED, UIWidgetFocusChanged)
 {
 {
     ATOMIC_PARAM(P_WIDGET, Widget);             // UIWidget pointer
     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()
 void UIWidget::OnDelete()
 {
 {
-    UnsubscribeFromAllEvents();   
-
     VariantMap eventData;
     VariantMap eventData;
     eventData[WidgetDeleted::P_WIDGET] = this;
     eventData[WidgetDeleted::P_WIDGET] = this;
     this->SendEvent(E_WIDGETDELETED, eventData);
     this->SendEvent(E_WIDGETDELETED, eventData);
 
 
+    UnsubscribeFromAllEvents();
+
     if (widget_)
     if (widget_)
     {
     {
         // if we don't have a UI subsystem, we are exiting
         // 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_widgets_listener.h"
+#include "tb_window.h"
 
 
 namespace tb {
 namespace tb {
 
 
@@ -85,6 +86,18 @@ bool TBWidgetListener::InvokeWidgetInvokeEvent(TBWidget *widget, const TBWidgetE
     return handled;
     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 ===================================================================================
 // == TBWidgetSafePointer ===================================================================================
 
 
 void TBWidgetSafePointer::Set(TBWidget *widget)
 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).
         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. */
         Note, if returning true, other global listeners will still also be notified. */
     virtual bool OnWidgetInvokeEvent(TBWidget *widget, const TBWidgetEvent &ev) { return false; }
     virtual bool OnWidgetInvokeEvent(TBWidget *widget, const TBWidgetEvent &ev) { return false; }
+
+    // ATOMIC BEGIN
+    virtual void OnWindowClose(TBWindow *window) {}
+    // ATOMIC END
+
 private:
 private:
     friend class TBWidget;
     friend class TBWidget;
     friend class TBEditField;
     friend class TBEditField;
@@ -68,6 +73,11 @@ private:
     static void InvokeWidgetRemove(TBWidget *parent, TBWidget *child);
     static void InvokeWidgetRemove(TBWidget *parent, TBWidget *child);
     static void InvokeWidgetFocusChanged(TBWidget *widget, bool focused);
     static void InvokeWidgetFocusChanged(TBWidget *widget, bool focused);
     static bool InvokeWidgetInvokeEvent(TBWidget *widget, const TBWidgetEvent &ev);
     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
 /** 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()
 void TBWindow::Close()
 {
 {
+// ATOMIC BEGIN
+    TBWidgetListener::InvokeWindowClose(this);
+// ATOMIC END
     Die();
     Die();
 }
 }