Просмотр исходного кода

Rewrite of the IDE's project closing system, motivated by issue #277

Ethan M 12 лет назад
Родитель
Сommit
573b9cea6f
2 измененных файлов с 47 добавлено и 19 удалено
  1. 2 0
      IDE/Contents/Include/PolycodeIDEApp.h
  2. 45 19
      IDE/Contents/Source/PolycodeIDEApp.cpp

+ 2 - 0
IDE/Contents/Include/PolycodeIDEApp.h

@@ -118,4 +118,6 @@ protected:
 
 
 	UIMenuBar *menuBar;
 	UIMenuBar *menuBar;
 	
 	
+private:
+	void cleanupProjectOnClose(bool save);
 };
 };

+ 45 - 19
IDE/Contents/Source/PolycodeIDEApp.cpp

@@ -268,25 +268,36 @@ void PolycodeIDEApp::closeFile() {
 
 
 void PolycodeIDEApp::closeProject() {
 void PolycodeIDEApp::closeProject() {
 	if(projectManager->getActiveProject()) {
 	if(projectManager->getActiveProject()) {
-		
-		bool hasEditors;		
-		do {
-			hasEditors = false;
-			for(int i=0; i < editorManager->openEditors.size(); i++) {
-				if(editorManager->openEditors[i]->parentProject == projectManager->getActiveProject()) {
-					if(removeEditor(editorManager->openEditors[i])) {
-						
-						return;
-					}
-					hasEditors = true;
-					break;
-				}
-			}
-		} while(hasEditors);
-		
-		frame->getProjectBrowser()->removeProject(projectManager->getActiveProject());		
-		projectManager->removeProject(projectManager->getActiveProject());
+		if (editorManager->hasUnsavedFilesForProject(projectManager->getActiveProject())) {
+			String name = projectManager->getActiveProject()->getProjectName();
+			frame->yesNoCancelPopup->setCaption("Project '" + name + "' has unsaved changes. Save all?");
+			frame->yesNoCancelPopup->action = "closeProject";
+			frame->showModal(frame->yesNoCancelPopup);
+		} else
+			cleanupProjectOnClose(false);
+	} else
+		PolycodeConsole::print("There are no active projects to close.");
+}
+
+// private function that removes editors and projects on project close
+void PolycodeIDEApp::cleanupProjectOnClose(bool save) {
+	PolycodeEditor *editor;
+	int i = 0;
+	while (i < editorManager->openEditors.size()) {
+		editor = editorManager->openEditors[i];
+		if(editor->parentProject == projectManager->getActiveProject()) {
+			if (save && editor->hasChanges())
+				editor->saveFile();
+			else
+				editor->setHasChanges(false);
+			
+			removeEditor(editor);
+			i--; // adjust for reduction in openEditors.size()
+		}
+		i++;
 	}
 	}
+	frame->getProjectBrowser()->removeProject(projectManager->getActiveProject());
+	projectManager->removeProject(projectManager->getActiveProject());
 }
 }
 
 
 void PolycodeIDEApp::newGroup() {
 void PolycodeIDEApp::newGroup() {
@@ -649,7 +660,22 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 				case UIEvent::CANCEL_EVENT:
 				case UIEvent::CANCEL_EVENT:
 				break;
 				break;
 			}
 			}
-		}			
+		}
+		
+		if (frame->yesNoCancelPopup->action == "closeProject") {
+			switch (event->getEventCode()) {
+				case UIEvent::YES_EVENT:
+					cleanupProjectOnClose(true);
+					break;
+				case UIEvent::NO_EVENT:
+					cleanupProjectOnClose(false);
+					break;
+				case UIEvent::CANCEL_EVENT:
+					break;
+			}
+			frame->yesNoCancelPopup->action = "";
+			frame->hideModal();
+		}
 	} else if(event->getDispatcher() == frame->yesNoPopup) {
 	} else if(event->getDispatcher() == frame->yesNoPopup) {
 		if(event->getEventType() == "UIEvent" && event->getEventCode() == UIEvent::CANCEL_EVENT) {
 		if(event->getEventType() == "UIEvent" && event->getEventCode() == UIEvent::CANCEL_EVENT) {
 			if(frame->yesNoPopup->action == "saveAndRun") {
 			if(frame->yesNoPopup->action == "saveAndRun") {