From cf8376ba1f359e8d5ae26b69be75755627429caf Mon Sep 17 00:00:00 2001 From: hakro Date: Sat, 21 Dec 2024 01:43:50 +0100 Subject: [PATCH] Add a context menu to quick open dialog --- editor/gui/editor_quick_open_dialog.cpp | 34 ++++++++++++++++++++++--- editor/gui/editor_quick_open_dialog.h | 8 ++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/editor/gui/editor_quick_open_dialog.cpp b/editor/gui/editor_quick_open_dialog.cpp index 86fa92f86225..8eca87f20788 100644 --- a/editor/gui/editor_quick_open_dialog.cpp +++ b/editor/gui/editor_quick_open_dialog.cpp @@ -30,12 +30,14 @@ #include "editor_quick_open_dialog.h" +#include "core/config/project_settings.h" #include "core/string/fuzzy_search.h" #include "editor/editor_file_system.h" #include "editor/editor_node.h" #include "editor/editor_resource_preview.h" #include "editor/editor_settings.h" #include "editor/editor_string_names.h" +#include "editor/filesystem_dock.h" #include "editor/themes/editor_scale.h" #include "scene/gui/center_container.h" #include "scene/gui/check_button.h" @@ -226,6 +228,13 @@ QuickOpenResultContainer::QuickOpenResultContainer() { grid->add_theme_constant_override("h_separation", 4); grid->hide(); scroll_container->add_child(grid); + + file_context_menu = memnew(PopupMenu); + file_context_menu->add_item(TTR("Show in FileSystem"), FILE_SHOW_IN_FILESYSTEM); + file_context_menu->add_item(TTR("Show in File Manager"), FILE_SHOW_IN_FILE_MANAGER); + file_context_menu->connect(SceneStringName(id_pressed), callable_mp(this, &QuickOpenResultContainer::_menu_option)); + file_context_menu->hide(); + scroll_container->add_child(file_context_menu); } } @@ -272,6 +281,18 @@ QuickOpenResultContainer::QuickOpenResultContainer() { } } +void QuickOpenResultContainer::_menu_option(int p_option) { + switch (p_option) { + case FILE_SHOW_IN_FILESYSTEM: { + FileSystemDock::get_singleton()->navigate_to_path(get_selected()); + } break; + case FILE_SHOW_IN_FILE_MANAGER: { + String dir = ProjectSettings::get_singleton()->globalize_path(get_selected()); + OS::get_singleton()->shell_show_in_file_manager(dir, true); + } break; + } +} + void QuickOpenResultContainer::_ensure_result_vector_capacity() { int target_size = EDITOR_GET("filesystem/quick_open_dialog/max_results"); int initial_size = result_items.size(); @@ -572,9 +593,16 @@ void QuickOpenResultContainer::_select_item(int p_index) { void QuickOpenResultContainer::_item_input(const Ref &p_ev, int p_index) { Ref mb = p_ev; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { - _select_item(p_index); - emit_signal(SNAME("result_clicked")); + if (mb.is_valid() && mb->is_pressed()) { + if (mb->get_button_index() == MouseButton::LEFT) { + _select_item(p_index); + emit_signal(SNAME("result_clicked")); + } else if (mb->get_button_index() == MouseButton::RIGHT) { + _select_item(p_index); + file_context_menu->set_position(result_items[p_index]->get_screen_position() + mb->get_position()); + file_context_menu->reset_size(); + file_context_menu->popup(); + } } } diff --git a/editor/gui/editor_quick_open_dialog.h b/editor/gui/editor_quick_open_dialog.h index 3b3f927527d7..027c7c379ceb 100644 --- a/editor/gui/editor_quick_open_dialog.h +++ b/editor/gui/editor_quick_open_dialog.h @@ -42,6 +42,7 @@ class LineEdit; class HFlowContainer; class MarginContainer; class PanelContainer; +class PopupMenu; class ScrollContainer; class StringName; class Texture2D; @@ -81,6 +82,11 @@ class HighlightedLabel : public Label { class QuickOpenResultContainer : public VBoxContainer { GDCLASS(QuickOpenResultContainer, VBoxContainer) + enum { + FILE_SHOW_IN_FILESYSTEM, + FILE_SHOW_IN_FILE_MANAGER + }; + public: void init(const Vector &p_base_types); void handle_search_box_input(const Ref &p_ie); @@ -124,6 +130,7 @@ class QuickOpenResultContainer : public VBoxContainer { ScrollContainer *scroll_container = nullptr; VBoxContainer *list = nullptr; HFlowContainer *grid = nullptr; + PopupMenu *file_context_menu = nullptr; PanelContainer *panel_container = nullptr; CenterContainer *no_results_container = nullptr; @@ -160,6 +167,7 @@ class QuickOpenResultContainer : public VBoxContainer { void _toggle_display_mode(); void _toggle_include_addons(bool p_pressed); void _toggle_fuzzy_search(bool p_pressed); + void _menu_option(int p_option); static void _bind_methods(); };