From 87b4143f3b2e37a9dcae7bbe85aa1a45803d65a0 Mon Sep 17 00:00:00 2001 From: Dawid Marzec Date: Fri, 6 Jan 2023 20:19:34 +0100 Subject: [PATCH] Fix cursor behaviour in Tree while holding CTRL (cherry picked from commit 9abbdea95e8ba345ba539782e8aa3c597a99c6d3) --- editor/gui/scene_tree_editor.cpp | 10 +++++-- scene/gui/tree.cpp | 47 ++++++++++++++------------------ 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/editor/gui/scene_tree_editor.cpp b/editor/gui/scene_tree_editor.cpp index d8c6ff54cce..41f81a3f600 100644 --- a/editor/gui/scene_tree_editor.cpp +++ b/editor/gui/scene_tree_editor.cpp @@ -1114,9 +1114,15 @@ void SceneTreeEditor::_update_selection(TreeItem *item) { } if (editor_selection->is_selected(n)) { - item->select(0); + if (!item->is_selected(0)) { + item->select(0); + } } else { - item->deselect(0); + if (item->is_selected(0)) { + TreeItem *previous_cursor_item = tree->get_selected(); + item->deselect(0); + previous_cursor_item->set_as_cursor(0); + } } TreeItem *c = item->get_first_child(); diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index a5d12aecadf..f9f7438576a 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -2868,21 +2868,17 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, int return -1; } - if (select_mode == SELECT_MULTI && p_mod->is_command_or_control_pressed() && c.selectable) { - if (!c.selected || p_button == MouseButton::RIGHT) { - p_item->select(col); - emit_signal(SNAME("multi_selected"), p_item, col, true); - emit_signal(SNAME("item_mouse_selected"), get_local_mouse_position(), p_button); - - //p_item->selected_signal.call(col); + if (c.selectable) { + if (select_mode == SELECT_MULTI && p_mod->is_command_or_control_pressed()) { + if (c.selected && p_button == MouseButton::LEFT) { + p_item->deselect(col); + emit_signal(SNAME("multi_selected"), p_item, col, false); + } else { + p_item->select(col); + emit_signal(SNAME("multi_selected"), p_item, col, true); + emit_signal(SNAME("item_mouse_selected"), get_local_mouse_position(), p_button); + } } else { - p_item->deselect(col); - emit_signal(SNAME("multi_selected"), p_item, col, false); - //p_item->deselected_signal.call(col); - } - - } else { - if (c.selectable) { if (select_mode == SELECT_MULTI && p_mod->is_shift_pressed() && selected_item && selected_item != p_item) { bool inrange = false; @@ -2902,12 +2898,6 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, int emit_signal(SNAME("item_mouse_selected"), get_local_mouse_position(), p_button); } } - - /* - if (!c.selected && select_mode==SELECT_MULTI) { - emit_signal(SNAME("multi_selected"),p_item,col,true); - } - */ queue_redraw(); } } @@ -4400,9 +4390,7 @@ void Tree::item_selected(int p_column, TreeItem *p_item) { //emit_signal(SNAME("multi_selected"),p_item,p_column,true); - NO this is for TreeItem::select selected_col = p_column; - if (!selected_item) { - selected_item = p_item; - } + selected_item = p_item; } else { select_single_item(p_item, root, p_column); } @@ -4410,11 +4398,18 @@ void Tree::item_selected(int p_column, TreeItem *p_item) { } void Tree::item_deselected(int p_column, TreeItem *p_item) { - if (selected_item == p_item) { + if (select_mode == SELECT_SINGLE && selected_item == p_item && selected_col == p_column) { selected_item = nullptr; - - if (selected_col == p_column) { + selected_col = -1; + } else { + if (select_mode == SELECT_ROW && selected_item == p_item) { + selected_item = nullptr; selected_col = -1; + } else { + if (select_mode == SELECT_MULTI) { + selected_item = p_item; + selected_col = p_column; + } } }