Browse Source

Don't stop closing on unsaved script

(cherry picked from commit 8fe664fb4b9705969b7aae7fec14ae6db821b1b3)
kobewi 4 years ago
parent
commit
168292fa00
2 changed files with 22 additions and 23 deletions
  1. 20 23
      editor/plugins/script_editor_plugin.cpp
  2. 2 0
      editor/plugins/script_editor_plugin.h

+ 20 - 23
editor/plugins/script_editor_plugin.cpp

@@ -635,39 +635,35 @@ void ScriptEditor::_copy_script_path() {
 }
 }
 
 
 void ScriptEditor::_close_other_tabs() {
 void ScriptEditor::_close_other_tabs() {
-	int child_count = tab_container->get_child_count();
 	int current_idx = tab_container->get_current_tab();
 	int current_idx = tab_container->get_current_tab();
-	for (int i = child_count - 1; i >= 0; i--) {
-		if (i == current_idx) {
-			continue;
-		}
-
-		tab_container->set_current_tab(i);
-		ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
-
-		if (se) {
-			// Maybe there are unsaved changes
-			if (se->is_unsaved()) {
-				_ask_close_current_unsaved_tab(se);
-				continue;
-			}
+	for (int i = tab_container->get_child_count() - 1; i >= 0; i--) {
+		if (i != current_idx) {
+			script_close_queue.push_back(i);
 		}
 		}
-
-		_close_current_tab(false);
 	}
 	}
+	_queue_close_tabs();
 }
 }
 
 
 void ScriptEditor::_close_all_tabs() {
 void ScriptEditor::_close_all_tabs() {
-	int child_count = tab_container->get_child_count();
-	for (int i = child_count - 1; i >= 0; i--) {
-		tab_container->set_current_tab(i);
-		ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
+	for (int i = tab_container->get_child_count() - 1; i >= 0; i--) {
+		script_close_queue.push_back(i);
+	}
+	_queue_close_tabs();
+}
+
+void ScriptEditor::_queue_close_tabs() {
+	while (!script_close_queue.empty()) {
+		int idx = script_close_queue.front()->get();
+		script_close_queue.pop_front();
 
 
+		tab_container->set_current_tab(idx);
+		ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(idx));
 		if (se) {
 		if (se) {
-			// Maybe there are unsaved changes
+			// Maybe there are unsaved changes.
 			if (se->is_unsaved()) {
 			if (se->is_unsaved()) {
 				_ask_close_current_unsaved_tab(se);
 				_ask_close_current_unsaved_tab(se);
-				continue;
+				erase_tab_confirm->connect(SceneStringNames::get_singleton()->visibility_changed, this, "_queue_close_tabs", varray(), CONNECT_ONESHOT);
+				break;
 			}
 			}
 		}
 		}
 
 
@@ -3048,6 +3044,7 @@ void ScriptEditor::_bind_methods() {
 	ClassDB::bind_method("_close_docs_tab", &ScriptEditor::_close_docs_tab);
 	ClassDB::bind_method("_close_docs_tab", &ScriptEditor::_close_docs_tab);
 	ClassDB::bind_method("_close_all_tabs", &ScriptEditor::_close_all_tabs);
 	ClassDB::bind_method("_close_all_tabs", &ScriptEditor::_close_all_tabs);
 	ClassDB::bind_method("_close_other_tabs", &ScriptEditor::_close_other_tabs);
 	ClassDB::bind_method("_close_other_tabs", &ScriptEditor::_close_other_tabs);
+	ClassDB::bind_method("_queue_close_tabs", &ScriptEditor::_queue_close_tabs);
 	ClassDB::bind_method("_open_recent_script", &ScriptEditor::_open_recent_script);
 	ClassDB::bind_method("_open_recent_script", &ScriptEditor::_open_recent_script);
 	ClassDB::bind_method("_theme_option", &ScriptEditor::_theme_option);
 	ClassDB::bind_method("_theme_option", &ScriptEditor::_theme_option);
 	ClassDB::bind_method("_editor_play", &ScriptEditor::_editor_play);
 	ClassDB::bind_method("_editor_play", &ScriptEditor::_editor_play);

+ 2 - 0
editor/plugins/script_editor_plugin.h

@@ -262,6 +262,7 @@ class ScriptEditor : public PanelContainer {
 	int history_pos;
 	int history_pos;
 
 
 	List<String> previous_scripts;
 	List<String> previous_scripts;
+	List<int> script_close_queue;
 
 
 	void _tab_changed(int p_which);
 	void _tab_changed(int p_which);
 	void _menu_option(int p_option);
 	void _menu_option(int p_option);
@@ -294,6 +295,7 @@ class ScriptEditor : public PanelContainer {
 	void _close_docs_tab();
 	void _close_docs_tab();
 	void _close_other_tabs();
 	void _close_other_tabs();
 	void _close_all_tabs();
 	void _close_all_tabs();
+	void _queue_close_tabs();
 
 
 	void _copy_script_path();
 	void _copy_script_path();