1
0
mirror of https://github.com/godotengine/godot.git synced 2026-01-06 19:41:11 +00:00

Fix set_as_toplevel event propagation to child

In certain conditions events did not get propagated to Control childs of
Node2D nodes when setting a parent of the Node2D to toplevel.

This patch makes sure that such Control nodes become root control in the
viewport.
This commit is contained in:
Markus Sauermann
2022-10-16 19:41:42 +02:00
parent 3a59c833f1
commit 13b87c13c7
4 changed files with 29 additions and 0 deletions

View File

@@ -679,6 +679,12 @@ Transform2D Control::get_transform() const {
return xform;
}
void Control::_toplevel_changed_on_parent() {
// Update root control status.
_notification(NOTIFICATION_EXIT_CANVAS);
_notification(NOTIFICATION_ENTER_CANVAS);
}
/// Anchors and offsets.
void Control::_set_anchor(Side p_side, real_t p_anchor) {

View File

@@ -288,6 +288,9 @@ private:
void _update_minimum_size();
void _size_changed();
void _toplevel_changed() override{}; // Controls don't need to do anything, only other CanvasItems.
void _toplevel_changed_on_parent() override;
void _clear_size_warning();
// Input events.

View File

@@ -401,11 +401,28 @@ void CanvasItem::set_as_top_level(bool p_top_level) {
_exit_canvas();
top_level = p_top_level;
_toplevel_changed();
_enter_canvas();
_notify_transform();
}
void CanvasItem::_toplevel_changed() {
// Inform children that toplevel status has changed on a parent.
int childs = get_child_count();
for (int i = 0; i < childs; i++) {
CanvasItem *child = Object::cast_to<CanvasItem>(get_child(i));
if (child) {
child->_toplevel_changed_on_parent();
}
}
}
void CanvasItem::_toplevel_changed_on_parent() {
// Inform children that toplevel status has changed on a parent.
_toplevel_changed();
}
bool CanvasItem::is_set_as_top_level() const {
return top_level;
}

View File

@@ -110,6 +110,9 @@ private:
void _propagate_visibility_changed(bool p_parent_visible_in_tree);
void _handle_visibility_change(bool p_visible);
virtual void _toplevel_changed();
virtual void _toplevel_changed_on_parent();
void _redraw_callback();
void _enter_canvas();