Skip to content

Commit 1672b69

Browse files
committed
Fix node can't be rotated by holding ctrl/command while in select mode
1 parent a3b42d8 commit 1672b69

File tree

1 file changed

+81
-19
lines changed

1 file changed

+81
-19
lines changed

editor/scene/3d/node_3d_editor_plugin.cpp

Lines changed: 81 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1988,16 +1988,49 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
19881988

19891989
bool node_selected = get_selected_count() > 0;
19901990

1991-
if (after != EditorPlugin::AFTER_GUI_INPUT_CUSTOM && !b->is_alt_pressed()) {
1991+
if (after != EditorPlugin::AFTER_GUI_INPUT_CUSTOM) {
19921992
// Single item selection.
19931993
clicked = _select_ray(b->get_position());
19941994

19951995
if (clicked.is_valid() && !editor_selection->is_selected(ObjectDB::get_instance<Node>(clicked))) {
1996-
selection_in_progress = true;
1997-
break;
1996+
if (!node_selected || (!b->is_alt_pressed() && !(spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT && b->is_command_or_control_pressed()))) {
1997+
selection_in_progress = true;
1998+
break;
1999+
}
19982000
}
19992001

20002002
if (clicked.is_null()) {
2003+
if (node_selected) {
2004+
TransformMode mode = TRANSFORM_NONE;
2005+
2006+
if (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT) {
2007+
if (b->is_command_or_control_pressed()) {
2008+
mode = TRANSFORM_ROTATE;
2009+
} else if (b->is_alt_pressed()) {
2010+
mode = TRANSFORM_TRANSLATE;
2011+
}
2012+
} else if (b->is_alt_pressed()) {
2013+
switch (spatial_editor->get_tool_mode()) {
2014+
case Node3DEditor::TOOL_MODE_ROTATE:
2015+
mode = TRANSFORM_ROTATE;
2016+
break;
2017+
case Node3DEditor::TOOL_MODE_MOVE:
2018+
mode = TRANSFORM_TRANSLATE;
2019+
break;
2020+
case Node3DEditor::TOOL_MODE_SCALE:
2021+
mode = TRANSFORM_SCALE;
2022+
break;
2023+
default:
2024+
break;
2025+
}
2026+
}
2027+
2028+
if (mode != TRANSFORM_NONE) {
2029+
begin_transform(mode, false);
2030+
break;
2031+
}
2032+
}
2033+
20012034
// Default to region select.
20022035
cursor.region_select = true;
20032036
cursor.region_begin = b->get_position();
@@ -2006,19 +2039,43 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
20062039
}
20072040
}
20082041

2009-
if (!clicked_wants_append && node_selected && ((spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT && b->is_command_or_control_pressed()) || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_ROTATE)) {
2010-
begin_transform(TRANSFORM_ROTATE, false);
2011-
break;
2012-
}
2013-
2014-
if (!clicked_wants_append && node_selected && spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_MOVE) {
2015-
begin_transform(TRANSFORM_TRANSLATE, false);
2016-
break;
2017-
}
2042+
if (clicked.is_valid() && !clicked_wants_append) {
2043+
bool is_clicked_node_selected = editor_selection->is_selected(ObjectDB::get_instance<Node>(clicked));
2044+
TransformMode mode = TRANSFORM_NONE;
2045+
2046+
switch (spatial_editor->get_tool_mode()) {
2047+
case Node3DEditor::TOOL_MODE_SELECT:
2048+
if (b->is_command_or_control_pressed() && node_selected) {
2049+
mode = TRANSFORM_ROTATE;
2050+
} else if (b->is_alt_pressed() && node_selected) {
2051+
mode = TRANSFORM_TRANSLATE;
2052+
} else if (is_clicked_node_selected) {
2053+
mode = TRANSFORM_TRANSLATE;
2054+
}
2055+
break;
2056+
case Node3DEditor::TOOL_MODE_ROTATE:
2057+
if (is_clicked_node_selected || (b->is_alt_pressed() && node_selected)) {
2058+
mode = TRANSFORM_ROTATE;
2059+
}
2060+
break;
2061+
case Node3DEditor::TOOL_MODE_MOVE:
2062+
if (is_clicked_node_selected || (b->is_alt_pressed() && node_selected)) {
2063+
mode = TRANSFORM_TRANSLATE;
2064+
}
2065+
break;
2066+
case Node3DEditor::TOOL_MODE_SCALE:
2067+
if (is_clicked_node_selected || (b->is_alt_pressed() && node_selected)) {
2068+
mode = TRANSFORM_SCALE;
2069+
}
2070+
break;
2071+
default:
2072+
break;
2073+
}
20182074

2019-
if (!clicked_wants_append && node_selected && spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SCALE) {
2020-
begin_transform(TRANSFORM_SCALE, false);
2021-
break;
2075+
if (mode != TRANSFORM_NONE) {
2076+
begin_transform(mode, false);
2077+
break;
2078+
}
20222079
}
20232080

20242081
surface->queue_redraw();
@@ -2046,7 +2103,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
20462103
if (after != EditorPlugin::AFTER_GUI_INPUT_CUSTOM) {
20472104
selection_in_progress = false;
20482105

2049-
if (clicked.is_valid()) {
2106+
if (clicked.is_valid() && _edit.mode == TRANSFORM_NONE) {
20502107
_select_clicked(false);
20512108
}
20522109

@@ -2178,9 +2235,14 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
21782235
}
21792236

21802237
if (clicked.is_valid() && movement_threshold_passed && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_MOVE)) {
2181-
_compute_edit(_edit.original_mouse_pos);
2182-
clicked = ObjectID();
2183-
_edit.mode = TRANSFORM_TRANSLATE;
2238+
bool is_select_mode = (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT);
2239+
bool is_clicked_selected = editor_selection->is_selected(ObjectDB::get_instance<Node>(clicked));
2240+
2241+
if (_edit.mode == TRANSFORM_NONE && (is_select_mode || is_clicked_selected)) {
2242+
_compute_edit(_edit.original_mouse_pos);
2243+
clicked = ObjectID();
2244+
_edit.mode = TRANSFORM_TRANSLATE;
2245+
}
21842246
}
21852247

21862248
if (_edit.mode == TRANSFORM_NONE || _edit.numeric_input != 0 || _edit.numeric_next_decimal != 0) {

0 commit comments

Comments
 (0)