Browse Source

Defer activated signal after tree has been traversed.

Juan Linietsky 6 years ago
parent
commit
6af8b7c955
2 changed files with 17 additions and 1 deletions
  1. 15 1
      scene/gui/tree.cpp
  2. 2 0
      scene/gui/tree.h

+ 15 - 1
scene/gui/tree.cpp

@@ -1602,6 +1602,7 @@ void Tree::_range_click_timeout() {
 		mb.instance();
 		mb.instance();
 		;
 		;
 
 
+		propagate_mouse_activated = false; //done from outside, so signal handler cant clear the tree in the middle of emit(which is a common case)
 		blocked++;
 		blocked++;
 		propagate_mouse_event(pos + cache.offset, 0, 0, false, root, BUTTON_LEFT, mb);
 		propagate_mouse_event(pos + cache.offset, 0, 0, false, root, BUTTON_LEFT, mb);
 		blocked--;
 		blocked--;
@@ -1615,6 +1616,11 @@ void Tree::_range_click_timeout() {
 		if (!click_handled)
 		if (!click_handled)
 			range_click_timer->stop();
 			range_click_timer->stop();
 
 
+		if (propagate_mouse_activated) {
+			emit_signal("item_activated");
+			propagate_mouse_activated = false;
+		}
+
 	} else {
 	} else {
 		range_click_timer->stop();
 		range_click_timer->stop();
 	}
 	}
@@ -1723,7 +1729,8 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool
 
 
 			if (p_doubleclick && (!c.editable || c.mode == TreeItem::CELL_MODE_CUSTOM || c.mode == TreeItem::CELL_MODE_ICON /*|| c.mode==TreeItem::CELL_MODE_CHECK*/)) { //it's confusing for check
 			if (p_doubleclick && (!c.editable || c.mode == TreeItem::CELL_MODE_CUSTOM || c.mode == TreeItem::CELL_MODE_ICON /*|| c.mode==TreeItem::CELL_MODE_CHECK*/)) { //it's confusing for check
 
 
-				emit_signal("item_activated");
+				propagate_mouse_activated = true;
+
 				incr_search.clear();
 				incr_search.clear();
 				return -1;
 				return -1;
 			}
 			}
@@ -2591,6 +2598,7 @@ void Tree::_gui_input(Ref<InputEvent> p_event) {
 
 
 				click_handled = false;
 				click_handled = false;
 				pressing_for_editor = false;
 				pressing_for_editor = false;
+				propagate_mouse_activated = false;
 
 
 				blocked++;
 				blocked++;
 				propagate_mouse_event(pos + cache.offset, 0, 0, b->is_doubleclick(), root, b->get_button_index(), b);
 				propagate_mouse_event(pos + cache.offset, 0, 0, b->is_doubleclick(), root, b->get_button_index(), b);
@@ -2628,6 +2636,11 @@ void Tree::_gui_input(Ref<InputEvent> p_event) {
 					}
 					}
 				}
 				}
 
 
+				if (propagate_mouse_activated) {
+					emit_signal("item_activated");
+					propagate_mouse_activated = false;
+				}
+
 			} break;
 			} break;
 			case BUTTON_WHEEL_UP: {
 			case BUTTON_WHEEL_UP: {
 
 
@@ -3945,6 +3958,7 @@ Tree::Tree() {
 	cache.hover_cell = -1;
 	cache.hover_cell = -1;
 
 
 	allow_reselect = false;
 	allow_reselect = false;
+	propagate_mouse_activated = false;
 }
 }
 
 
 Tree::~Tree() {
 Tree::~Tree() {

+ 2 - 0
scene/gui/tree.h

@@ -329,6 +329,8 @@ private:
 	bool range_drag_enabled;
 	bool range_drag_enabled;
 	Vector2 range_drag_capture_pos;
 	Vector2 range_drag_capture_pos;
 
 
+	bool propagate_mouse_activated;
+
 	//TreeItem *cursor_item;
 	//TreeItem *cursor_item;
 	//int cursor_column;
 	//int cursor_column;