diff --git a/editor/scene/editor_scene_tabs.cpp b/editor/scene/editor_scene_tabs.cpp index 76dc181bd55..605e2e6a410 100644 --- a/editor/scene/editor_scene_tabs.cpp +++ b/editor/scene/editor_scene_tabs.cpp @@ -42,6 +42,7 @@ #include "editor/themes/editor_scale.h" #include "scene/gui/box_container.h" #include "scene/gui/button.h" +#include "scene/gui/menu_button.h" #include "scene/gui/panel.h" #include "scene/gui/panel_container.h" #include "scene/gui/popup_menu.h" @@ -54,6 +55,8 @@ void EditorSceneTabs::_notification(int p_what) { tabbar_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("tabbar_background"), SNAME("TabContainer"))); scene_tabs->add_theme_constant_override("icon_max_width", get_theme_constant(SNAME("class_icon_size"), EditorStringName(Editor))); + scene_list->set_button_icon(get_editor_theme_icon(SNAME("GuiTabMenuHl"))); + scene_tab_add->set_button_icon(get_editor_theme_icon(SNAME("Add"))); scene_tab_add->add_theme_color_override("icon_normal_color", Color(0.6f, 0.6f, 0.6f, 0.8f)); @@ -227,6 +230,16 @@ void EditorSceneTabs::_custom_menu_option(int p_option) { } } +void EditorSceneTabs::_update_scene_list() { + PopupMenu *popup = scene_list->get_popup(); + popup->clear(); + + for (int i = 0; i < scene_tabs->get_tab_count(); i++) { + popup->add_item(scene_tabs->get_tab_title(i), i); + popup->set_item_icon(i, scene_tabs->get_tab_icon(i)); + } +} + void EditorSceneTabs::update_scene_tabs() { static bool menu_initialized = false; tab_preview_panel->hide(); @@ -443,6 +456,15 @@ EditorSceneTabs::EditorSceneTabs() { scene_tab_add_ph->set_custom_minimum_size(scene_tab_add->get_minimum_size()); tabbar_container->add_child(scene_tab_add_ph); + scene_list = memnew(MenuButton); + scene_list->set_flat(false); + scene_list->set_accessibility_name(TTRC("Show Opened Scenes List")); + scene_list->set_shortcut(ED_SHORTCUT("editor/show_opened_scenes_list", TTRC("Show Opened Scenes List"), KeyModifierMask::ALT | Key::T)); + scene_list->get_popup()->set_auto_translate_mode(AUTO_TRANSLATE_MODE_DISABLED); + scene_list->get_popup()->connect("about_to_popup", callable_mp(this, &EditorSceneTabs::_update_scene_list)); + scene_list->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &EditorSceneTabs::_scene_tab_changed)); + tabbar_container->add_child(scene_list); + // On-hover tab preview. Control *tab_preview_anchor = memnew(Control); diff --git a/editor/scene/editor_scene_tabs.h b/editor/scene/editor_scene_tabs.h index ab885480b85..910c29e97e9 100644 --- a/editor/scene/editor_scene_tabs.h +++ b/editor/scene/editor_scene_tabs.h @@ -34,6 +34,7 @@ class Button; class HBoxContainer; +class MenuButton; class Panel; class PanelContainer; class PopupMenu; @@ -59,6 +60,7 @@ private: TabBar *scene_tabs = nullptr; PopupMenu *scene_tabs_context_menu = nullptr; + MenuButton *scene_list = nullptr; Button *scene_tab_add = nullptr; Control *scene_tab_add_ph = nullptr; @@ -79,6 +81,7 @@ private: void _reposition_active_tab(int p_to_index); void _update_context_menu(); void _custom_menu_option(int p_option); + void _update_scene_list(); void _tab_preview_done(const String &p_path, const Ref &p_preview, const Ref &p_small_preview, int p_tab);