From 8cdb1768a4f78331c299a49206543958f764a2b9 Mon Sep 17 00:00:00 2001 From: KaiN Date: Thu, 17 Apr 2025 19:37:55 +0200 Subject: [PATCH] Add EditorInterface::close_scene() Co-authored-by: Tomasz Chabora --- doc/classes/EditorInterface.xml | 6 ++++++ editor/editor_interface.cpp | 5 +++++ editor/editor_interface.h | 1 + editor/editor_node.cpp | 13 +++++++++++++ editor/editor_node.h | 2 ++ 5 files changed, 27 insertions(+) diff --git a/doc/classes/EditorInterface.xml b/doc/classes/EditorInterface.xml index 26828882bff..2d547d522e6 100644 --- a/doc/classes/EditorInterface.xml +++ b/doc/classes/EditorInterface.xml @@ -19,6 +19,12 @@ + + + + Closes the currently active scene, discarding any pending changes in the process. Returns [constant OK] on success or [constant ERR_DOES_NOT_EXIST] if there is no scene to close. + + diff --git a/editor/editor_interface.cpp b/editor/editor_interface.cpp index 013a59cffe0..082b0ed3c96 100644 --- a/editor/editor_interface.cpp +++ b/editor/editor_interface.cpp @@ -713,6 +713,10 @@ void EditorInterface::save_all_scenes() { EditorNode::get_singleton()->save_all_scenes(); } +Error EditorInterface::close_scene() { + return EditorNode::get_singleton()->close_scene() ? OK : ERR_DOES_NOT_EXIST; +} + // Scene playback. void EditorInterface::play_main_scene() { @@ -845,6 +849,7 @@ void EditorInterface::_bind_methods() { ClassDB::bind_method(D_METHOD("save_scene"), &EditorInterface::save_scene); ClassDB::bind_method(D_METHOD("save_scene_as", "path", "with_preview"), &EditorInterface::save_scene_as, DEFVAL(true)); ClassDB::bind_method(D_METHOD("save_all_scenes"), &EditorInterface::save_all_scenes); + ClassDB::bind_method(D_METHOD("close_scene"), &EditorInterface::close_scene); ClassDB::bind_method(D_METHOD("mark_scene_as_unsaved"), &EditorInterface::mark_scene_as_unsaved); diff --git a/editor/editor_interface.h b/editor/editor_interface.h index 5bf3ab48524..3b95eb0e7d7 100644 --- a/editor/editor_interface.h +++ b/editor/editor_interface.h @@ -177,6 +177,7 @@ public: void save_scene_as(const String &p_scene, bool p_with_preview = true); void mark_scene_as_unsaved(); void save_all_scenes(); + Error close_scene(); // Scene playback. diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 8049547815d..9d65bc8f189 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -4974,6 +4974,19 @@ bool EditorNode::_find_scene_in_use(Node *p_node, const String &p_path) const { return false; } +bool EditorNode::close_scene() { + int tab_index = editor_data.get_edited_scene(); + if (tab_index == 0 && get_edited_scene() == nullptr && editor_data.get_scene_path(tab_index).is_empty()) { + return false; + } + + tab_closing_idx = tab_index; + current_menu_option = SCENE_CLOSE; + _discard_changes(); + changing_scene = false; + return true; +} + bool EditorNode::is_scene_in_use(const String &p_path) { Node *es = get_edited_scene(); if (es) { diff --git a/editor/editor_node.h b/editor/editor_node.h index 163075d0d27..58571f1a66e 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -943,6 +943,8 @@ public: } } + bool close_scene(); + bool is_scene_in_use(const String &p_path); void save_editor_layout_delayed();