Merge pull request #81177 from Calinou/filedialog-focus-path-shortcut

Add Ctrl + L / Cmd + Shift + G shortcut to focus path bar in FileDialog
This commit is contained in:
Rémi Verschelde 2024-03-05 09:55:36 +01:00
commit 9e13b90ce8
No known key found for this signature in database
GPG key ID: C3336907360768E1
14 changed files with 84 additions and 2 deletions

View file

@ -380,6 +380,10 @@ LineEdit *ActionMapEditor::get_search_box() const {
return action_list_search;
}
LineEdit *ActionMapEditor::get_path_box() const {
return add_edit;
}
InputEventConfigurationDialog *ActionMapEditor::get_configuration_dialog() {
return event_config_dialog;
}

View file

@ -118,6 +118,7 @@ protected:
public:
LineEdit *get_search_box() const;
LineEdit *get_path_box() const;
InputEventConfigurationDialog *get_configuration_dialog();
// Dictionary represents an Action with "events" (Array) and "deadzone" (float) items. Pass with no param to update list from cached action map.

View file

@ -587,6 +587,10 @@ void EditorAutoloadSettings::_script_created(Ref<Script> p_script) {
_autoload_add();
}
LineEdit *EditorAutoloadSettings::get_path_box() const {
return autoload_add_path;
}
Variant EditorAutoloadSettings::get_drag_data_fw(const Point2 &p_point, Control *p_control) {
if (autoload_cache.size() <= 1) {
return false;

View file

@ -108,6 +108,8 @@ public:
bool autoload_add(const String &p_name, const String &p_path);
void autoload_remove(const String &p_name);
LineEdit *get_path_box() const;
EditorAutoloadSettings();
~EditorAutoloadSettings();
};

View file

@ -2575,6 +2575,11 @@ void FileSystemDock::fix_dependencies(const String &p_for_file) {
deps_editor->edit(p_for_file);
}
void FileSystemDock::focus_on_path() {
current_path_line_edit->grab_focus();
current_path_line_edit->select_all();
}
void FileSystemDock::focus_on_filter() {
LineEdit *current_search_box = nullptr;
if (display_mode == DISPLAY_MODE_TREE_ONLY) {
@ -3398,6 +3403,8 @@ void FileSystemDock::_tree_gui_input(Ref<InputEvent> p_event) {
_tree_rmb_option(FILE_OPEN_EXTERNAL);
} else if (ED_IS_SHORTCUT("filesystem_dock/open_in_terminal", p_event)) {
_tree_rmb_option(FILE_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();
} else {

View file

@ -386,6 +386,7 @@ public:
String get_current_directory() const;
void navigate_to_path(const String &p_path);
void focus_on_path();
void focus_on_filter();
ScriptCreateDialog *get_script_create_dialog() const;

View file

@ -483,6 +483,10 @@ void GroupSettingsEditor::_show_rename_dialog() {
rename_group->grab_focus();
}
LineEdit *GroupSettingsEditor::get_name_box() const {
return group_name;
}
GroupSettingsEditor::GroupSettingsEditor() {
ProjectSettings::get_singleton()->add_hidden_prefix("global_group/");

View file

@ -90,6 +90,7 @@ protected:
static void _bind_methods();
public:
LineEdit *get_name_box() const;
void show_message(const String &p_message);
void remove_references(const StringName &p_name);

View file

@ -224,6 +224,7 @@ void EditorFileDialog::shortcut_input(const Ref<InputEvent> &p_event) {
}
if (ED_IS_SHORTCUT("file_dialog/focus_path", p_event)) {
dir->grab_focus();
dir->select_all();
handled = true;
}
if (ED_IS_SHORTCUT("file_dialog/move_favorite_up", p_event)) {
@ -1783,7 +1784,10 @@ EditorFileDialog::EditorFileDialog() {
ED_SHORTCUT("file_dialog/toggle_mode", TTR("Toggle Mode"), KeyModifierMask::ALT | Key::V);
ED_SHORTCUT("file_dialog/create_folder", TTR("Create Folder"), KeyModifierMask::CMD_OR_CTRL | Key::N);
ED_SHORTCUT("file_dialog/delete", TTR("Delete"), Key::KEY_DELETE);
ED_SHORTCUT("file_dialog/focus_path", TTR("Focus Path"), KeyModifierMask::CMD_OR_CTRL | Key::D);
ED_SHORTCUT("file_dialog/focus_path", TTR("Focus Path"), KeyModifierMask::CMD_OR_CTRL | Key::L);
// Allow both Cmd + L and Cmd + Shift + G to match Safari's and Finder's shortcuts respectively.
ED_SHORTCUT_OVERRIDE_ARRAY("file_dialog/focus_path", "macos",
{ int32_t(KeyModifierMask::META | Key::L), int32_t(KeyModifierMask::META | KeyModifierMask::SHIFT | Key::G) });
ED_SHORTCUT("file_dialog/move_favorite_up", TTR("Move Favorite Up"), KeyModifierMask::CMD_OR_CTRL | Key::UP);
ED_SHORTCUT("file_dialog/move_favorite_down", TTR("Move Favorite Down"), KeyModifierMask::CMD_OR_CTRL | Key::DOWN);

View file

@ -256,11 +256,16 @@ void ProjectSettingsEditor::shortcut_input(const Ref<InputEvent> &p_event) {
handled = true;
}
if (k->is_match(InputEventKey::create_reference(KeyModifierMask::CMD_OR_CTRL | Key::F))) {
if (ED_IS_SHORTCUT("editor/open_search", p_event)) {
_focus_current_search_box();
handled = true;
}
if (ED_IS_SHORTCUT("file_dialog/focus_path", p_event)) {
_focus_current_path_box();
handled = true;
}
if (handled) {
set_input_as_handled();
}
@ -347,6 +352,27 @@ void ProjectSettingsEditor::_focus_current_search_box() {
}
}
void ProjectSettingsEditor::_focus_current_path_box() {
Control *tab = tab_container->get_current_tab_control();
LineEdit *current_path_box = nullptr;
if (tab == general_editor) {
current_path_box = property_box;
} else if (tab == action_map_editor) {
current_path_box = action_map_editor->get_path_box();
} else if (tab == autoload_settings) {
current_path_box = autoload_settings->get_path_box();
} else if (tab == shaders_global_shader_uniforms_editor) {
current_path_box = shaders_global_shader_uniforms_editor->get_name_box();
} else if (tab == group_settings) {
current_path_box = group_settings->get_name_box();
}
if (current_path_box) {
current_path_box->grab_focus();
current_path_box->select_all();
}
}
void ProjectSettingsEditor::_editor_restart() {
ProjectSettings::get_singleton()->save();
EditorNode::get_singleton()->save_all_scenes();

View file

@ -97,6 +97,7 @@ class ProjectSettingsEditor : public AcceptDialog {
void _tabs_tab_changed(int p_tab);
void _focus_current_search_box();
void _focus_current_path_box();
void _editor_restart_request();
void _editor_restart();

View file

@ -356,6 +356,10 @@ String ShaderGlobalsEditor::_check_new_variable_name(const String &p_variable_na
return "";
}
LineEdit *ShaderGlobalsEditor::get_name_box() const {
return variable_name;
}
void ShaderGlobalsEditor::_variable_name_text_changed(const String &p_variable_name) {
const String &warning = _check_new_variable_name(p_variable_name.strip_edges());
variable_add->set_tooltip_text(warning);

View file

@ -61,6 +61,8 @@ protected:
void _notification(int p_what);
public:
LineEdit *get_name_box() const;
ShaderGlobalsEditor();
~ShaderGlobalsEditor();
};

View file

@ -263,6 +263,27 @@ void FileDialog::shortcut_input(const Ref<InputEvent> &p_event) {
case Key::BACKSPACE: {
_dir_submitted("..");
} break;
#ifdef MACOS_ENABLED
// Cmd + Shift + G (matches Finder's "Go To" shortcut).
case Key::G: {
if (k->is_command_or_control_pressed() && k->is_shift_pressed()) {
dir->grab_focus();
dir->select_all();
} else {
handled = false;
}
} break;
#endif
// Ctrl + L (matches most Windows/Linux file managers' "focus on path bar" shortcut,
// plus macOS Safari's "focus on address bar" shortcut).
case Key::L: {
if (k->is_command_or_control_pressed()) {
dir->grab_focus();
dir->select_all();
} else {
handled = false;
}
} break;
default: {
handled = false;
}