From 5dd4267a0b9b1af4a6f394ce04802d8bfacc38c6 Mon Sep 17 00:00:00 2001 From: kobewi Date: Sat, 3 May 2025 01:12:26 +0200 Subject: [PATCH] Unify shortcut handling in FileSystem dock --- editor/filesystem_dock.cpp | 101 ++++++++++++++++++++----------------- editor/filesystem_dock.h | 6 +++ 2 files changed, 60 insertions(+), 47 deletions(-) diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index 92385613881..0ee006eea93 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -2096,6 +2096,12 @@ Vector FileSystemDock::_remove_self_included_paths(Vector select } void FileSystemDock::_tree_rmb_option(int p_option) { + if (p_option > FILE_MENU_MAX) { + // Extra options don't need paths. + _file_option(p_option, {}); + return; + } + Vector selected_strings = _tree_get_selected(false); // Execute the current option. @@ -2118,8 +2124,14 @@ void FileSystemDock::_tree_rmb_option(int p_option) { } void FileSystemDock::_file_list_rmb_option(int p_option) { - Vector selected_id = files->get_selected_items(); Vector selected; + if (p_option > FILE_MENU_MAX) { + // Extra options don't need paths. + _file_option(p_option, selected); + return; + } + + Vector selected_id = files->get_selected_items(); for (int i = 0; i < selected_id.size(); i++) { selected.push_back(files->get_item_metadata(selected_id[i])); } @@ -2573,6 +2585,13 @@ void FileSystemDock::_file_option(int p_option, const Vector &p_selected ScriptEditor::get_singleton()->open_text_file_create_dialog(dir); } break; + case EXTRA_FOCUS_PATH: { + focus_on_filter(); + } break; + case EXTRA_FOCUS_FILTER: { + focus_on_filter(); + } break; + default: { if (p_option >= EditorContextMenuPlugin::BASE_ID) { if (!EditorContextMenuPluginManager::get_singleton()->activate_custom_option(EditorContextMenuPlugin::CONTEXT_SLOT_FILESYSTEM, p_option, p_selected)) { @@ -2602,6 +2621,33 @@ void FileSystemDock::_file_option(int p_option, const Vector &p_selected } } +int FileSystemDock::_get_menu_option_from_key(const Ref &p_key) { + if (ED_IS_SHORTCUT("filesystem_dock/duplicate", p_key)) { + return FILE_MENU_DUPLICATE; + } else if (ED_IS_SHORTCUT("filesystem_dock/copy_path", p_key)) { + return FILE_MENU_COPY_PATH; + } else if (ED_IS_SHORTCUT("filesystem_dock/copy_absolute_path", p_key)) { + return FILE_MENU_COPY_ABSOLUTE_PATH; + } else if (ED_IS_SHORTCUT("filesystem_dock/copy_uid", p_key)) { + return FILE_MENU_COPY_UID; + } else if (ED_IS_SHORTCUT("filesystem_dock/delete", p_key)) { + return FILE_MENU_REMOVE; + } else if (ED_IS_SHORTCUT("filesystem_dock/rename", p_key)) { + return FILE_MENU_RENAME; + } else if (ED_IS_SHORTCUT("filesystem_dock/show_in_explorer", p_key)) { + return FILE_MENU_SHOW_IN_EXPLORER; + } else if (ED_IS_SHORTCUT("filesystem_dock/open_in_external_program", p_key)) { + return FILE_MENU_OPEN_EXTERNAL; + } else if (ED_IS_SHORTCUT("filesystem_dock/open_in_terminal", p_key)) { + return FILE_MENU_OPEN_IN_TERMINAL; + } else if (ED_IS_SHORTCUT("file_dialog/focus_path", p_key)) { + return EXTRA_FOCUS_PATH; + } else if (ED_IS_SHORTCUT("editor/open_search", p_key)) { + return EXTRA_FOCUS_FILTER; + } + return -1; +} + void FileSystemDock::_resource_created() { String fpath = current_path; if (!fpath.ends_with("/")) { @@ -3609,8 +3655,6 @@ void FileSystemDock::_reselect_items_selected_on_drag_begin(bool reset) { } void FileSystemDock::_tree_gui_input(Ref p_event) { - Ref key = p_event; - Ref mm = p_event; if (mm.is_valid()) { TreeItem *item = tree->get_item_at_position(mm->get_position()); @@ -3639,29 +3683,11 @@ void FileSystemDock::_tree_gui_input(Ref p_event) { } } + Ref key = p_event; if (key.is_valid() && key->is_pressed() && !key->is_echo()) { - if (ED_IS_SHORTCUT("filesystem_dock/duplicate", p_event)) { - _tree_rmb_option(FILE_MENU_DUPLICATE); - } else if (ED_IS_SHORTCUT("filesystem_dock/copy_path", p_event)) { - _tree_rmb_option(FILE_MENU_COPY_PATH); - } else if (ED_IS_SHORTCUT("filesystem_dock/copy_absolute_path", p_event)) { - _tree_rmb_option(FILE_MENU_COPY_ABSOLUTE_PATH); - } else if (ED_IS_SHORTCUT("filesystem_dock/copy_uid", p_event)) { - _tree_rmb_option(FILE_MENU_COPY_UID); - } else if (ED_IS_SHORTCUT("filesystem_dock/delete", p_event)) { - _tree_rmb_option(FILE_MENU_REMOVE); - } else if (ED_IS_SHORTCUT("filesystem_dock/rename", p_event)) { - _tree_rmb_option(FILE_MENU_RENAME); - } else if (ED_IS_SHORTCUT("filesystem_dock/show_in_explorer", p_event)) { - _tree_rmb_option(FILE_MENU_SHOW_IN_EXPLORER); - } else if (ED_IS_SHORTCUT("filesystem_dock/open_in_external_program", p_event)) { - _tree_rmb_option(FILE_MENU_OPEN_EXTERNAL); - } else if (ED_IS_SHORTCUT("filesystem_dock/open_in_terminal", p_event)) { - _tree_rmb_option(FILE_MENU_OPEN_IN_TERMINAL); - } else if (ED_IS_SHORTCUT("file_dialog/focus_path", p_event)) { - focus_on_path(); - } else if (ED_IS_SHORTCUT("editor/open_search", p_event)) { - focus_on_filter(); + int option_id = _get_menu_option_from_key(key); + if (option_id > -1) { + _tree_rmb_option(option_id); } else { Callable custom_callback = EditorContextMenuPluginManager::get_singleton()->match_custom_shortcut(EditorContextMenuPlugin::CONTEXT_SLOT_FILESYSTEM, p_event); if (!custom_callback.is_valid()) { @@ -3723,28 +3749,9 @@ void FileSystemDock::_file_list_gui_input(Ref p_event) { Ref key = p_event; if (key.is_valid() && key->is_pressed() && !key->is_echo()) { - if (ED_IS_SHORTCUT("filesystem_dock/duplicate", p_event)) { - _file_list_rmb_option(FILE_MENU_DUPLICATE); - } else if (ED_IS_SHORTCUT("filesystem_dock/copy_path", p_event)) { - _file_list_rmb_option(FILE_MENU_COPY_PATH); - } else if (ED_IS_SHORTCUT("filesystem_dock/copy_absolute_path", p_event)) { - _file_list_rmb_option(FILE_MENU_COPY_ABSOLUTE_PATH); - } else if (ED_IS_SHORTCUT("filesystem_dock/copy_uid", p_event)) { - _file_list_rmb_option(FILE_MENU_COPY_UID); - } else if (ED_IS_SHORTCUT("filesystem_dock/delete", p_event)) { - _file_list_rmb_option(FILE_MENU_REMOVE); - } else if (ED_IS_SHORTCUT("filesystem_dock/rename", p_event)) { - _file_list_rmb_option(FILE_MENU_RENAME); - } else if (ED_IS_SHORTCUT("filesystem_dock/show_in_explorer", p_event)) { - _file_list_rmb_option(FILE_MENU_SHOW_IN_EXPLORER); - } else if (ED_IS_SHORTCUT("filesystem_dock/open_in_external_program", p_event)) { - _file_list_rmb_option(FILE_MENU_OPEN_EXTERNAL); - } else if (ED_IS_SHORTCUT("filesystem_dock/open_in_terminal", p_event)) { - _file_list_rmb_option(FILE_MENU_OPEN_IN_TERMINAL); - } else if (ED_IS_SHORTCUT("file_dialog/focus_path", p_event)) { - focus_on_path(); - } else if (ED_IS_SHORTCUT("editor/open_search", p_event)) { - focus_on_filter(); + int option_id = _get_menu_option_from_key(key); + if (option_id > -1) { + _file_list_rmb_option(option_id); } else { Callable custom_callback = EditorContextMenuPluginManager::get_singleton()->match_custom_shortcut(EditorContextMenuPlugin::CONTEXT_SLOT_FILESYSTEM, p_event); if (!custom_callback.is_valid()) { diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h index bfa3560b84d..19a70f78d97 100644 --- a/editor/filesystem_dock.h +++ b/editor/filesystem_dock.h @@ -129,6 +129,11 @@ private: FILE_MENU_NEW_FOLDER, FILE_MENU_NEW_SCRIPT, FILE_MENU_NEW_SCENE, + FILE_MENU_MAX, + // Extra shortcuts that don't exist in the menu. + EXTRA_FOCUS_PATH, + EXTRA_FOCUS_FILTER, + CONVERT_BASE_ID = 1000, }; @@ -301,6 +306,7 @@ private: void _file_list_rmb_option(int p_option); void _generic_rmb_option_selected(int p_option); void _file_option(int p_option, const Vector &p_selected); + int _get_menu_option_from_key(const Ref &p_key); void _fw_history(); void _bw_history();