aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scene/2d/area_2d.cpp19
-rw-r--r--scene/2d/area_2d.h1
-rw-r--r--scene/gui/tree.cpp5
-rw-r--r--scene/gui/tree.h1
4 files changed, 19 insertions, 7 deletions
diff --git a/scene/2d/area_2d.cpp b/scene/2d/area_2d.cpp
index e14f8ee06..a9a2c3ea6 100644
--- a/scene/2d/area_2d.cpp
+++ b/scene/2d/area_2d.cpp
@@ -357,6 +357,10 @@ void Area2D::_clear_monitoring() {
Object *obj = ObjectDB::get_instance(E->key());
Node *node = obj ? obj->cast_to<Node>() : NULL;
ERR_CONTINUE(!node);
+
+ node->disconnect(SceneStringNames::get_singleton()->enter_tree,this,SceneStringNames::get_singleton()->_body_enter_tree);
+ node->disconnect(SceneStringNames::get_singleton()->exit_tree,this,SceneStringNames::get_singleton()->_body_exit_tree);
+
if (!E->get().in_tree)
continue;
@@ -367,8 +371,6 @@ void Area2D::_clear_monitoring() {
emit_signal(SceneStringNames::get_singleton()->body_exit,obj);
- node->disconnect(SceneStringNames::get_singleton()->enter_tree,this,SceneStringNames::get_singleton()->_body_enter_tree);
- node->disconnect(SceneStringNames::get_singleton()->exit_tree,this,SceneStringNames::get_singleton()->_body_exit_tree);
}
}
@@ -388,6 +390,9 @@ void Area2D::_clear_monitoring() {
continue;
//ERR_CONTINUE(!node);
+ node->disconnect(SceneStringNames::get_singleton()->enter_tree,this,SceneStringNames::get_singleton()->_area_enter_tree);
+ node->disconnect(SceneStringNames::get_singleton()->exit_tree,this,SceneStringNames::get_singleton()->_area_exit_tree);
+
if (!E->get().in_tree)
continue;
@@ -397,9 +402,6 @@ void Area2D::_clear_monitoring() {
}
emit_signal(SceneStringNames::get_singleton()->area_exit,obj);
-
- node->disconnect(SceneStringNames::get_singleton()->enter_tree,this,SceneStringNames::get_singleton()->_area_enter_tree);
- node->disconnect(SceneStringNames::get_singleton()->exit_tree,this,SceneStringNames::get_singleton()->_area_exit_tree);
}
}
@@ -411,8 +413,14 @@ void Area2D::_notification(int p_what) {
case NOTIFICATION_EXIT_TREE: {
+ monitoring_stored = monitoring;
+ set_enable_monitoring(false);
_clear_monitoring();
} break;
+ case NOTIFICATION_ENTER_TREE: {
+
+ set_enable_monitoring(monitoring_stored);
+ } break;
}
}
@@ -686,6 +694,7 @@ Area2D::Area2D() : CollisionObject2D(Physics2DServer::get_singleton()->area_crea
monitorable=false;
collision_mask=1;
layer_mask=1;
+ monitoring_stored = true;
set_enable_monitoring(true);
set_monitorable(true);
}
diff --git a/scene/2d/area_2d.h b/scene/2d/area_2d.h
index 9fa31abb6..a886bd7d9 100644
--- a/scene/2d/area_2d.h
+++ b/scene/2d/area_2d.h
@@ -58,6 +58,7 @@ private:
uint32_t layer_mask;
int priority;
bool monitoring;
+ bool monitoring_stored;
bool monitorable;
bool locked;
diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp
index 254fc6f2c..68de74dc4 100644
--- a/scene/gui/tree.cpp
+++ b/scene/gui/tree.cpp
@@ -833,7 +833,6 @@ void Tree::update_cache() {
cache.title_button_color = get_color("title_button_color");
v_scroll->set_custom_step(cache.font->get_height());
- cache.click_item=get_selected();
}
@@ -1581,6 +1580,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos,int x_ofs,int y_ofs,bool p_
cache.click_id=c.buttons[j].id;
cache.click_item=p_item;
cache.click_column=col;
+ cache.click_pos=get_global_mouse_pos()-get_global_pos();
update();
//emit_signal("button_pressed");
return -1;
@@ -2352,6 +2352,8 @@ void Tree::_input_event(InputEvent p_event) {
if (cache.click_type==Cache::CLICK_BUTTON) {
+ // make sure in case of wrong reference after reconstructing whole TreeItems
+ cache.click_item=get_item_at_pos(cache.click_pos);
emit_signal("button_pressed",cache.click_item,cache.click_column,cache.click_id);
}
@@ -2937,7 +2939,6 @@ void Tree::clear() {
selected_item=NULL;
edited_item=NULL;
popup_edited_item=NULL;
- selected_item=NULL;
update();
};
diff --git a/scene/gui/tree.h b/scene/gui/tree.h
index 547e5dab4..5ac6d4e89 100644
--- a/scene/gui/tree.h
+++ b/scene/gui/tree.h
@@ -405,6 +405,7 @@ friend class TreeItem;
TreeItem *click_item;
int click_column;
int hover_index;
+ Point2 click_pos;
} cache;