diff --git a/doc/classes/EditorInterface.xml b/doc/classes/EditorInterface.xml
index 26828882bf..2d547d522e 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 013a59cffe..082b0ed3c9 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 5bf3ab4852..3b95eb0e7d 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 7f109aefbb..ff716bb8bc 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -4993,6 +4993,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 7b494c7314..613a574f0b 100644
--- a/editor/editor_node.h
+++ b/editor/editor_node.h
@@ -944,6 +944,8 @@ public:
}
}
+ bool close_scene();
+
bool is_scene_in_use(const String &p_path);
void save_editor_layout_delayed();