From bb3c8a06820511c7e9f88dcaf9db88ea677d6dfd Mon Sep 17 00:00:00 2001 From: Robert Yevdokimov <105675984+ryevdokimov@users.noreply.github.com> Date: Sat, 5 Apr 2025 10:25:44 +0400 Subject: [PATCH] Fix issues with `InputMap::load_from_project_settings()` when called in tool script --- core/input/input_map.cpp | 4 +++ doc/classes/InputMap.xml | 7 ++++ editor/scene/3d/node_3d_editor_plugin.cpp | 41 +++++++++++++---------- editor/scene/3d/node_3d_editor_plugin.h | 1 + 4 files changed, 35 insertions(+), 18 deletions(-) diff --git a/core/input/input_map.cpp b/core/input/input_map.cpp index 6d8ab34267f..3b1db681333 100644 --- a/core/input/input_map.cpp +++ b/core/input/input_map.cpp @@ -54,6 +54,8 @@ void InputMap::_bind_methods() { ClassDB::bind_method(D_METHOD("action_get_events", "action"), &InputMap::_action_get_events); ClassDB::bind_method(D_METHOD("event_is_action", "event", "action", "exact_match"), &InputMap::event_is_action, DEFVAL(false)); ClassDB::bind_method(D_METHOD("load_from_project_settings"), &InputMap::load_from_project_settings); + + ADD_SIGNAL(MethodInfo("project_settings_loaded")); } /** @@ -329,6 +331,8 @@ void InputMap::load_from_project_settings() { action_add_event(name, event); } } + + emit_signal("project_settings_loaded"); } struct _BuiltinActionDisplayName { diff --git a/doc/classes/InputMap.xml b/doc/classes/InputMap.xml index c4b9695a164..34c773a257d 100644 --- a/doc/classes/InputMap.xml +++ b/doc/classes/InputMap.xml @@ -117,4 +117,11 @@ + + + + Emitted when the [ProjectSettings] [InputMap] has been loaded. + + + diff --git a/editor/scene/3d/node_3d_editor_plugin.cpp b/editor/scene/3d/node_3d_editor_plugin.cpp index 350e090a2b2..95192968a6f 100644 --- a/editor/scene/3d/node_3d_editor_plugin.cpp +++ b/editor/scene/3d/node_3d_editor_plugin.cpp @@ -6162,6 +6162,27 @@ void Node3DEditorViewport::_add_advanced_debug_draw_mode_item(PopupMenu *p_popup display_submenu->set_item_metadata(-1, item_data); // Tooltip is assigned in NOTIFICATION_TRANSLATION_CHANGED. } +void Node3DEditorViewport::_load_viewport_inputs() { + // Registering with Key::NONE intentionally creates an empty Array. + register_shortcut_action("spatial_editor/viewport_orbit_modifier_1", TTRC("Viewport Orbit Modifier 1"), Key::NONE); + register_shortcut_action("spatial_editor/viewport_orbit_modifier_2", TTRC("Viewport Orbit Modifier 2"), Key::NONE); + register_shortcut_action("spatial_editor/viewport_orbit_snap_modifier_1", TTRC("Viewport Orbit Snap Modifier 1"), Key::ALT); + register_shortcut_action("spatial_editor/viewport_orbit_snap_modifier_2", TTRC("Viewport Orbit Snap Modifier 2"), Key::NONE); + register_shortcut_action("spatial_editor/viewport_pan_modifier_1", TTRC("Viewport Pan Modifier 1"), Key::SHIFT); + register_shortcut_action("spatial_editor/viewport_pan_modifier_2", TTRC("Viewport Pan Modifier 2"), Key::NONE); + register_shortcut_action("spatial_editor/viewport_zoom_modifier_1", TTRC("Viewport Zoom Modifier 1"), Key::CTRL); + register_shortcut_action("spatial_editor/viewport_zoom_modifier_2", TTRC("Viewport Zoom Modifier 2"), Key::NONE); + + register_shortcut_action("spatial_editor/freelook_left", TTRC("Freelook Left"), Key::A, true); + register_shortcut_action("spatial_editor/freelook_right", TTRC("Freelook Right"), Key::D, true); + register_shortcut_action("spatial_editor/freelook_forward", TTRC("Freelook Forward"), Key::W, true); + register_shortcut_action("spatial_editor/freelook_backwards", TTRC("Freelook Backwards"), Key::S, true); + register_shortcut_action("spatial_editor/freelook_up", TTRC("Freelook Up"), Key::E, true); + register_shortcut_action("spatial_editor/freelook_down", TTRC("Freelook Down"), Key::Q, true); + register_shortcut_action("spatial_editor/freelook_speed_modifier", TTRC("Freelook Speed Modifier"), Key::SHIFT); + register_shortcut_action("spatial_editor/freelook_slow_modifier", TTRC("Freelook Slow Modifier"), Key::ALT); +} + Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, int p_index) { cpu_time_history_index = 0; gpu_time_history_index = 0; @@ -6334,24 +6355,8 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, int p display_submenu->connect(SceneStringName(id_pressed), callable_mp(this, &Node3DEditorViewport::_menu_option)); view_display_menu->set_disable_shortcuts(true); - // Registering with Key::NONE intentionally creates an empty Array. - register_shortcut_action("spatial_editor/viewport_orbit_modifier_1", TTRC("Viewport Orbit Modifier 1"), Key::NONE); - register_shortcut_action("spatial_editor/viewport_orbit_modifier_2", TTRC("Viewport Orbit Modifier 2"), Key::NONE); - register_shortcut_action("spatial_editor/viewport_orbit_snap_modifier_1", TTRC("Viewport Orbit Snap Modifier 1"), Key::ALT); - register_shortcut_action("spatial_editor/viewport_orbit_snap_modifier_2", TTRC("Viewport Orbit Snap Modifier 2"), Key::NONE); - register_shortcut_action("spatial_editor/viewport_pan_modifier_1", TTRC("Viewport Pan Modifier 1"), Key::SHIFT); - register_shortcut_action("spatial_editor/viewport_pan_modifier_2", TTRC("Viewport Pan Modifier 2"), Key::NONE); - register_shortcut_action("spatial_editor/viewport_zoom_modifier_1", TTRC("Viewport Zoom Modifier 1"), Key::CTRL); - register_shortcut_action("spatial_editor/viewport_zoom_modifier_2", TTRC("Viewport Zoom Modifier 2"), Key::NONE); - - register_shortcut_action("spatial_editor/freelook_left", TTRC("Freelook Left"), Key::A, true); - register_shortcut_action("spatial_editor/freelook_right", TTRC("Freelook Right"), Key::D, true); - register_shortcut_action("spatial_editor/freelook_forward", TTRC("Freelook Forward"), Key::W, true); - register_shortcut_action("spatial_editor/freelook_backwards", TTRC("Freelook Backwards"), Key::S, true); - register_shortcut_action("spatial_editor/freelook_up", TTRC("Freelook Up"), Key::E, true); - register_shortcut_action("spatial_editor/freelook_down", TTRC("Freelook Down"), Key::Q, true); - register_shortcut_action("spatial_editor/freelook_speed_modifier", TTRC("Freelook Speed Modifier"), Key::SHIFT); - register_shortcut_action("spatial_editor/freelook_slow_modifier", TTRC("Freelook Slow Modifier"), Key::ALT); + _load_viewport_inputs(); + InputMap::get_singleton()->connect("project_settings_loaded", callable_mp(this, &Node3DEditorViewport::_load_viewport_inputs)); ED_SHORTCUT("spatial_editor/lock_transform_x", TTRC("Lock Transformation to X axis"), Key::X); ED_SHORTCUT("spatial_editor/lock_transform_y", TTRC("Lock Transformation to Y axis"), Key::Y); diff --git a/editor/scene/3d/node_3d_editor_plugin.h b/editor/scene/3d/node_3d_editor_plugin.h index 0f169cee6fe..406a30bf7a7 100644 --- a/editor/scene/3d/node_3d_editor_plugin.h +++ b/editor/scene/3d/node_3d_editor_plugin.h @@ -546,6 +546,7 @@ private: void update_transform_numeric(); void finish_transform(); + void _load_viewport_inputs(); void register_shortcut_action(const String &p_path, const String &p_name, Key p_keycode, bool p_physical = false); void shortcut_changed_callback(const Ref p_shortcut, const String &p_shortcut_path);