Browse Source

Merge pull request #413 from rsredsq/RED-EDITOR-411

Check for unsaved changes before closing whole project or editor
JoshEngebretson 10 years ago
parent
commit
7925022951

+ 42 - 9
Script/AtomicEditor/editor/Editor.ts

@@ -20,6 +20,9 @@ class Editor extends Atomic.ScriptObject {
 
 
     static instance: Editor;
     static instance: Editor;
 
 
+    projectCloseRequested: boolean;
+    exitRequested: boolean;
+
     constructor() {
     constructor() {
 
 
         super();
         super();
@@ -27,6 +30,8 @@ class Editor extends Atomic.ScriptObject {
         // limit the framerate to limit CPU usage
         // limit the framerate to limit CPU usage
         Atomic.getEngine().maxFps = 60;
         Atomic.getEngine().maxFps = 60;
 
 
+        Atomic.getEngine().autoExit = false;
+
         Editor.instance = this;
         Editor.instance = this;
 
 
         this.initUI();
         this.initUI();
@@ -47,7 +52,7 @@ class Editor extends Atomic.ScriptObject {
             Atomic.graphics.windowTitle = "AtomicEditor";
             Atomic.graphics.windowTitle = "AtomicEditor";
             this.handleProjectUnloaded(data)
             this.handleProjectUnloaded(data)
         });
         });
-        this.subscribeToEvent(EditorEvents.Quit, (data) => this.handleEditorEventQuit(data));
+
         this.subscribeToEvent("ExitRequested", (data) => this.handleExitRequested(data));
         this.subscribeToEvent("ExitRequested", (data) => this.handleExitRequested(data));
 
 
         this.subscribeToEvent("ProjectLoaded", (data) => {
         this.subscribeToEvent("ProjectLoaded", (data) => {
@@ -55,6 +60,14 @@ class Editor extends Atomic.ScriptObject {
             Preferences.getInstance().registerRecentProject(data.projectPath);
             Preferences.getInstance().registerRecentProject(data.projectPath);
         });
         });
 
 
+        this.subscribeToEvent("EditorResourceCloseCanceled", (data) => {
+            //if user canceled closing the resource, then user has changes that he doesn't want to lose
+            //so cancel exit/project close request and unsubscribe from event to avoid closing all the editors again
+            this.exitRequested = false;
+            this.projectCloseRequested = false;
+            this.unsubscribeFromEvent(EditorEvents.EditorResourceClose);
+        });
+
         this.parseArguments();
         this.parseArguments();
     }
     }
 
 
@@ -82,7 +95,29 @@ class Editor extends Atomic.ScriptObject {
         return system.loadProject(event.path);
         return system.loadProject(event.path);
     }
     }
 
 
+    closeAllResourceEditors() {
+        var editor = EditorUI.getCurrentResourceEditor();
+        if (!editor) {
+          if (this.exitRequested) {
+              this.exit();
+          } else if (this.projectCloseRequested) {
+              this.closeProject();
+          }
+          return;
+        }
+        //wait when we close resource editor to check another resource editor for unsaved changes and close it
+        this.subscribeToEvent(EditorEvents.EditorResourceClose, (data) => {
+            this.closeAllResourceEditors();
+        });
+        editor.requestClose();
+    }
+
     handleEditorCloseProject(event) {
     handleEditorCloseProject(event) {
+        this.projectCloseRequested = true;
+        this.closeAllResourceEditors();
+    }
+
+    closeProject() {
         var system = ToolCore.getToolSystem();
         var system = ToolCore.getToolSystem();
 
 
         if (system.project) {
         if (system.project) {
@@ -90,7 +125,6 @@ class Editor extends Atomic.ScriptObject {
             system.closeProject();
             system.closeProject();
 
 
         }
         }
-
     }
     }
 
 
     handleProjectUnloaded(event) {
     handleProjectUnloaded(event) {
@@ -123,15 +157,14 @@ class Editor extends Atomic.ScriptObject {
 
 
     // event handling
     // event handling
     handleExitRequested(data) {
     handleExitRequested(data) {
-        Preferences.getInstance().write();
-        EditorUI.shutdown();
-
+        this.exitRequested = true;
+        this.closeAllResourceEditors();
     }
     }
 
 
-    handleEditorEventQuit(data) {
-
-        this.sendEvent("ExitRequested");
-
+    exit() {
+        Preferences.getInstance().write();
+        EditorUI.shutdown();
+        Atomic.getEngine().exit();
     }
     }
 
 
 
 

+ 2 - 4
Script/AtomicEditor/editor/EditorEvents.ts

@@ -5,8 +5,6 @@
 // license information: https://github.com/AtomicGameEngine/AtomicGameEngine
 // license information: https://github.com/AtomicGameEngine/AtomicGameEngine
 //
 //
 
 
-export const Quit = "EditorEventQuit";
-
 export const ModalError = "ModalError";
 export const ModalError = "ModalError";
 export interface ModalErrorEvent {
 export interface ModalErrorEvent {
 
 
@@ -62,8 +60,8 @@ export interface SaveResourceEvent {
 
 
 }
 }
 
 
-export const CloseResource = "EditorCloseResource";
-export interface CloseResourceEvent {
+export const EditorResourceClose = "EditorResourceClose";
+export interface EditorCloseResourceEvent {
 
 
   editor:Editor.ResourceEditor;
   editor:Editor.ResourceEditor;
   navigateToAvailableResource:boolean;
   navigateToAvailableResource:boolean;

+ 3 - 3
Script/AtomicEditor/ui/frames/ResourceFrame.ts

@@ -135,7 +135,7 @@ class ResourceFrame extends ScriptWidget {
 
 
     }
     }
 
 
-    handleCloseResource(ev: EditorEvents.CloseResourceEvent) {
+    handleCloseResource(ev: EditorEvents.EditorCloseResourceEvent) {
         this.wasClosed = false;
         this.wasClosed = false;
         var editor = ev.editor;
         var editor = ev.editor;
         var navigate = ev.navigateToAvailableResource;
         var navigate = ev.navigateToAvailableResource;
@@ -219,7 +219,7 @@ class ResourceFrame extends ScriptWidget {
         // on exit close all open editors
         // on exit close all open editors
         for (var path in this.editors) {
         for (var path in this.editors) {
 
 
-            this.sendEvent(EditorEvents.CloseResource, { editor: this.editors[path], navigateToAvailableResource: false });
+            this.sendEvent(EditorEvents.EditorResourceClose, { editor: this.editors[path], navigateToAvailableResource: false });
 
 
         }
         }
 
 
@@ -251,7 +251,7 @@ class ResourceFrame extends ScriptWidget {
         this.subscribeToEvent(EditorEvents.EditResource, (data) => this.handleEditResource(data));
         this.subscribeToEvent(EditorEvents.EditResource, (data) => this.handleEditResource(data));
         this.subscribeToEvent(EditorEvents.SaveResource, (data) => this.handleSaveResource(data));
         this.subscribeToEvent(EditorEvents.SaveResource, (data) => this.handleSaveResource(data));
         this.subscribeToEvent(EditorEvents.SaveAllResources, (data) => this.handleSaveAllResources(data));
         this.subscribeToEvent(EditorEvents.SaveAllResources, (data) => this.handleSaveAllResources(data));
-        this.subscribeToEvent(EditorEvents.CloseResource, (ev: EditorEvents.CloseResourceEvent) => this.handleCloseResource(ev));
+        this.subscribeToEvent(EditorEvents.EditorResourceClose, (ev: EditorEvents.EditorCloseResourceEvent) => this.handleCloseResource(ev));
 
 
         this.subscribeToEvent(UIEvents.ResourceEditorChanged, (data) => this.handleResourceEditorChanged(data));
         this.subscribeToEvent(UIEvents.ResourceEditorChanged, (data) => this.handleResourceEditorChanged(data));
 
 

+ 1 - 1
Script/AtomicEditor/ui/frames/menus/MainFrameMenu.ts

@@ -46,7 +46,7 @@ class MainFrameMenu extends Atomic.ScriptObject {
 
 
             if (refid == "quit") {
             if (refid == "quit") {
 
 
-                Atomic.ui.requestExit();
+                this.sendEvent("ExitRequested");
                 return true;
                 return true;
 
 
             }
             }

+ 1 - 1
Script/AtomicEditor/ui/modal/license/ActivationWindow.ts

@@ -63,7 +63,7 @@ class ActivationWindow extends ModalWindow {
 
 
             if (id == "quit") {
             if (id == "quit") {
 
 
-                this.sendEvent(EditorEvents.Quit);
+                this.sendEvent("ExitRequested");
                 return true;
                 return true;
 
 
             } else if (id == "get_key") {
             } else if (id == "get_key") {

+ 1 - 1
Script/AtomicEditor/ui/modal/license/EULAWindow.ts

@@ -52,7 +52,7 @@ class EULAWindow extends ModalWindow {
 
 
             if (id == "quit") {
             if (id == "quit") {
 
 
-                this.sendEvent(EditorEvents.Quit);
+                this.sendEvent("ExitRequested");
                 return true;
                 return true;
 
 
             } else if (id == "ok") {
             } else if (id == "ok") {

+ 5 - 0
Script/Packages/Atomic/Core.json

@@ -10,6 +10,11 @@
 			"SendEvent" : ["StringHash"]
 			"SendEvent" : ["StringHash"]
 		}
 		}
 	},
 	},
+	"overloads" : {
+		"Object" : {
+			"UnsubscribeFromEvent" : ["StringHash"]
+		}
+	},
 	"typescript_decl" : {
 	"typescript_decl" : {
 
 
 		"Object" : [
 		"Object" : [

+ 1 - 1
Source/Atomic/UI/UI.cpp

@@ -150,7 +150,7 @@ void UI::HandleExitRequested(StringHash eventType, VariantMap& eventData)
 
 
 void UI::Shutdown()
 void UI::Shutdown()
 {
 {
-    SetInputDisabled(true);
+
 }
 }
 
 
 void UI::Initialize(const String& languageFile)
 void UI::Initialize(const String& languageFile)

+ 0 - 6
Source/AtomicEditor/Application/AEEditorApp.cpp

@@ -55,7 +55,6 @@ void AEEditorApp::Start()
     ui->Initialize("AtomicEditor/resources/language/lng_en.tb.txt");
     ui->Initialize("AtomicEditor/resources/language/lng_en.tb.txt");
 
 
     SubscribeToEvent(E_JSERROR, HANDLER(AEEditorApp, HandleJSError));
     SubscribeToEvent(E_JSERROR, HANDLER(AEEditorApp, HandleJSError));
-    SubscribeToEvent(E_EXITREQUESTED, HANDLER(AEEditorApp, HandleExitRequested));
 
 
     jsapi_init_editor(vm_);
     jsapi_init_editor(vm_);
 
 
@@ -118,11 +117,6 @@ void AEEditorApp::Stop()
     AEEditorCommon::Stop();
     AEEditorCommon::Stop();
 }
 }
 
 
-void AEEditorApp::HandleExitRequested(StringHash eventType, VariantMap& eventData)
-{
-
-}
-
 void AEEditorApp::HandleJSError(StringHash eventType, VariantMap& eventData)
 void AEEditorApp::HandleJSError(StringHash eventType, VariantMap& eventData)
 {
 {
     using namespace JSError;
     using namespace JSError;

+ 8 - 5
Source/AtomicEditor/Editors/ResourceEditor.cpp

@@ -12,6 +12,8 @@
 
 
 #include <TurboBadger/tb_message_window.h>
 #include <TurboBadger/tb_message_window.h>
 
 
+#include "ResourceEditorEvents.h"
+
 #include "ResourceEditor.h"
 #include "ResourceEditor.h"
 
 
 //#include "../UI/UIMainFrame.h"
 //#include "../UI/UIMainFrame.h"
@@ -47,7 +49,7 @@ public:
         }
         }
         else
         else
         {
         {
-            editor_->Close();
+            editor_->Close(container_->GetNumPages()>1);
             return true;
             return true;
         }
         }
     }
     }
@@ -61,10 +63,11 @@ public:
                 if (ev.ref_id == TBIDC("TBMessageWindow.ok"))
                 if (ev.ref_id == TBIDC("TBMessageWindow.ok"))
                 {
                 {
                     container_->OnEvent(ev);
                     container_->OnEvent(ev);
-                    editor_->Close();
+                    editor_->Close(container_->GetNumPages()>1);
                 }
                 }
                 else
                 else
                 {
                 {
+                    editor_->SendEvent(E_EDITORRESOURCECLOSECANCELED);
                     SetFocus(WIDGET_FOCUS_REASON_UNKNOWN);
                     SetFocus(WIDGET_FOCUS_REASON_UNKNOWN);
                 }
                 }
                 return true;
                 return true;
@@ -160,9 +163,9 @@ void ResourceEditor::Close(bool navigateToAvailableResource)
     ((TBTabContainer*)container_->GetInternalWidget())->GetTabLayout()->RemoveChild(editorTabLayout_);
     ((TBTabContainer*)container_->GetInternalWidget())->GetTabLayout()->RemoveChild(editorTabLayout_);
 
 
     VariantMap data;
     VariantMap data;
-    data["Editor"] = this;
-    data["NavigateToAvailableResource"] = navigateToAvailableResource;
-    SendEvent("EditorCloseResource", data);
+    data[EditorResourceClose::P_EDITOR] = this;
+    data[EditorResourceClose::P_NAVIGATE] = navigateToAvailableResource;
+    SendEvent(E_EDITORRESOURCECLOSE, data);
 }
 }
 
 
 void ResourceEditor::InvokeShortcut(const String& shortcut)
 void ResourceEditor::InvokeShortcut(const String& shortcut)

+ 26 - 0
Source/AtomicEditor/Editors/ResourceEditorEvents.h

@@ -0,0 +1,26 @@
+//
+// Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
+// LICENSE: Atomic Game Engine Editor and Tools EULA
+// Please see LICENSE_ATOMIC_EDITOR_AND_TOOLS.md in repository root for
+// license information: https://github.com/AtomicGameEngine/AtomicGameEngine
+//
+
+#pragma once
+
+#include <Atomic/Core/Object.h>
+
+namespace AtomicEditor
+{
+
+EVENT(E_EDITORRESOURCECLOSE, EditorResourceClose)
+{
+PARAM(P_EDITOR, Editor);            // ResourceEditor
+PARAM(P_NAVIGATE, NavigateToAvailableResource); // bool
+}
+
+EVENT(E_EDITORRESOURCECLOSECANCELED, EditorResourceCloseCanceled)
+{
+
+}
+
+}