Browse Source

Merge pull request #93165 from passivestar/scenetree-shortcut-focus

Prevent node rename shortcut from stealing focus from controls
Rémi Verschelde 1 year ago
parent
commit
ef3443ef35
3 changed files with 13 additions and 2 deletions
  1. 4 0
      editor/gui/editor_spin_slider.cpp
  2. 2 0
      editor/gui/editor_spin_slider.h
  3. 7 2
      editor/scene_tree_dock.cpp

+ 4 - 0
editor/gui/editor_spin_slider.cpp

@@ -36,6 +36,10 @@
 #include "editor/editor_settings.h"
 #include "editor/themes/editor_scale.h"
 
+bool EditorSpinSlider::is_text_field() const {
+	return true;
+}
+
 String EditorSpinSlider::get_tooltip(const Point2 &p_pos) const {
 	if (!read_only && grabber->is_visible()) {
 		Key key = (OS::get_singleton()->has_feature("macos") || OS::get_singleton()->has_feature("web_macos") || OS::get_singleton()->has_feature("web_ios")) ? Key::META : Key::CTRL;

+ 2 - 0
editor/gui/editor_spin_slider.h

@@ -96,6 +96,8 @@ protected:
 	void _focus_entered();
 
 public:
+	virtual bool is_text_field() const override;
+
 	String get_tooltip(const Point2 &p_pos) const override;
 
 	String get_text_value() const;

+ 7 - 2
editor/scene_tree_dock.cpp

@@ -149,7 +149,8 @@ void SceneTreeDock::input(const Ref<InputEvent> &p_event) {
 void SceneTreeDock::shortcut_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
-	if (get_viewport()->gui_get_focus_owner() && get_viewport()->gui_get_focus_owner()->is_text_field()) {
+	Control *focus_owner = get_viewport()->gui_get_focus_owner();
+	if (focus_owner && focus_owner->is_text_field()) {
 		return;
 	}
 
@@ -158,7 +159,11 @@ void SceneTreeDock::shortcut_input(const Ref<InputEvent> &p_event) {
 	}
 
 	if (ED_IS_SHORTCUT("scene_tree/rename", p_event)) {
-		_tool_selected(TOOL_RENAME);
+		// Prevent renaming if a button is focused
+		// to avoid conflict with Enter shortcut on macOS
+		if (!focus_owner || !Object::cast_to<BaseButton>(focus_owner)) {
+			_tool_selected(TOOL_RENAME);
+		}
 #ifdef MODULE_REGEX_ENABLED
 	} else if (ED_IS_SHORTCUT("scene_tree/batch_rename", p_event)) {
 		_tool_selected(TOOL_BATCH_RENAME);