summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--editor/gui/scene_tree_editor.cpp10
-rw-r--r--scene/gui/tree.cpp47
2 files changed, 29 insertions, 28 deletions
diff --git a/editor/gui/scene_tree_editor.cpp b/editor/gui/scene_tree_editor.cpp
index d1756df66c..2e12cbcaf5 100644
--- a/editor/gui/scene_tree_editor.cpp
+++ b/editor/gui/scene_tree_editor.cpp
@@ -1100,9 +1100,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 a5d12aecad..f9f7438576 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;
+ }
}
}