Browse Source

Merge pull request #100679 from hakro/quick_open_context_menu

Add a context menu to quick open dialog
Rémi Verschelde 7 months ago
parent
commit
e13facfa72
2 changed files with 39 additions and 3 deletions
  1. 31 3
      editor/gui/editor_quick_open_dialog.cpp
  2. 8 0
      editor/gui/editor_quick_open_dialog.h

+ 31 - 3
editor/gui/editor_quick_open_dialog.cpp

@@ -30,12 +30,14 @@
 
 
 #include "editor_quick_open_dialog.h"
 #include "editor_quick_open_dialog.h"
 
 
+#include "core/config/project_settings.h"
 #include "core/string/fuzzy_search.h"
 #include "core/string/fuzzy_search.h"
 #include "editor/editor_file_system.h"
 #include "editor/editor_file_system.h"
 #include "editor/editor_node.h"
 #include "editor/editor_node.h"
 #include "editor/editor_resource_preview.h"
 #include "editor/editor_resource_preview.h"
 #include "editor/editor_settings.h"
 #include "editor/editor_settings.h"
 #include "editor/editor_string_names.h"
 #include "editor/editor_string_names.h"
+#include "editor/filesystem_dock.h"
 #include "editor/themes/editor_scale.h"
 #include "editor/themes/editor_scale.h"
 #include "scene/gui/center_container.h"
 #include "scene/gui/center_container.h"
 #include "scene/gui/check_button.h"
 #include "scene/gui/check_button.h"
@@ -226,6 +228,13 @@ QuickOpenResultContainer::QuickOpenResultContainer() {
 			grid->add_theme_constant_override("h_separation", 4);
 			grid->add_theme_constant_override("h_separation", 4);
 			grid->hide();
 			grid->hide();
 			scroll_container->add_child(grid);
 			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() {
 void QuickOpenResultContainer::_ensure_result_vector_capacity() {
 	int target_size = EDITOR_GET("filesystem/quick_open_dialog/max_results");
 	int target_size = EDITOR_GET("filesystem/quick_open_dialog/max_results");
 	int initial_size = result_items.size();
 	int initial_size = result_items.size();
@@ -572,9 +593,16 @@ void QuickOpenResultContainer::_select_item(int p_index) {
 void QuickOpenResultContainer::_item_input(const Ref<InputEvent> &p_ev, int p_index) {
 void QuickOpenResultContainer::_item_input(const Ref<InputEvent> &p_ev, int p_index) {
 	Ref<InputEventMouseButton> mb = p_ev;
 	Ref<InputEventMouseButton> 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();
+		}
 	}
 	}
 }
 }
 
 

+ 8 - 0
editor/gui/editor_quick_open_dialog.h

@@ -42,6 +42,7 @@ class LineEdit;
 class HFlowContainer;
 class HFlowContainer;
 class MarginContainer;
 class MarginContainer;
 class PanelContainer;
 class PanelContainer;
+class PopupMenu;
 class ScrollContainer;
 class ScrollContainer;
 class StringName;
 class StringName;
 class Texture2D;
 class Texture2D;
@@ -81,6 +82,11 @@ protected:
 class QuickOpenResultContainer : public VBoxContainer {
 class QuickOpenResultContainer : public VBoxContainer {
 	GDCLASS(QuickOpenResultContainer, VBoxContainer)
 	GDCLASS(QuickOpenResultContainer, VBoxContainer)
 
 
+	enum {
+		FILE_SHOW_IN_FILESYSTEM,
+		FILE_SHOW_IN_FILE_MANAGER
+	};
+
 public:
 public:
 	void init(const Vector<StringName> &p_base_types);
 	void init(const Vector<StringName> &p_base_types);
 	void handle_search_box_input(const Ref<InputEvent> &p_ie);
 	void handle_search_box_input(const Ref<InputEvent> &p_ie);
@@ -124,6 +130,7 @@ private:
 	ScrollContainer *scroll_container = nullptr;
 	ScrollContainer *scroll_container = nullptr;
 	VBoxContainer *list = nullptr;
 	VBoxContainer *list = nullptr;
 	HFlowContainer *grid = nullptr;
 	HFlowContainer *grid = nullptr;
+	PopupMenu *file_context_menu = nullptr;
 
 
 	PanelContainer *panel_container = nullptr;
 	PanelContainer *panel_container = nullptr;
 	CenterContainer *no_results_container = nullptr;
 	CenterContainer *no_results_container = nullptr;
@@ -160,6 +167,7 @@ private:
 	void _toggle_display_mode();
 	void _toggle_display_mode();
 	void _toggle_include_addons(bool p_pressed);
 	void _toggle_include_addons(bool p_pressed);
 	void _toggle_fuzzy_search(bool p_pressed);
 	void _toggle_fuzzy_search(bool p_pressed);
+	void _menu_option(int p_option);
 
 
 	static void _bind_methods();
 	static void _bind_methods();
 };
 };