From 1c0ebc85dd8002e3763e858d71c10b8b72727fff Mon Sep 17 00:00:00 2001 From: PouleyKetchoupp Date: Tue, 5 Oct 2021 13:09:01 -0700 Subject: [PATCH] Add pre-sort signal and notification in Container Allows processing before children are sorted, useful for custom containers inherited from existing ones like BoxContainer. --- doc/classes/Container.xml | 10 +++++++++- scene/gui/container.cpp | 6 ++++++ scene/gui/container.h | 3 ++- scene/scene_string_names.cpp | 1 + scene/scene_string_names.h | 1 + 5 files changed, 19 insertions(+), 2 deletions(-) diff --git a/doc/classes/Container.xml b/doc/classes/Container.xml index e78eb8d2599..24e73534d31 100644 --- a/doc/classes/Container.xml +++ b/doc/classes/Container.xml @@ -29,6 +29,11 @@ + + + Emitted when children are going to be sorted. + + Emitted when sorting the children is needed. @@ -36,7 +41,10 @@ - + + Notification just before children are going to be sorted, in case there's something to process beforehand. + + Notification for when sorting the children, it must be obeyed immediately. diff --git a/scene/gui/container.cpp b/scene/gui/container.cpp index 11941529cd0..a1bd82f6f77 100644 --- a/scene/gui/container.cpp +++ b/scene/gui/container.cpp @@ -87,6 +87,9 @@ void Container::_sort_children() { return; } + notification(NOTIFICATION_PRE_SORT_CHILDREN); + emit_signal(SceneStringNames::get_singleton()->pre_sort_children); + notification(NOTIFICATION_SORT_CHILDREN); emit_signal(SceneStringNames::get_singleton()->sort_children); pending_sort = false; @@ -174,7 +177,10 @@ void Container::_bind_methods() { ClassDB::bind_method(D_METHOD("queue_sort"), &Container::queue_sort); ClassDB::bind_method(D_METHOD("fit_child_in_rect", "child", "rect"), &Container::fit_child_in_rect); + BIND_CONSTANT(NOTIFICATION_PRE_SORT_CHILDREN); BIND_CONSTANT(NOTIFICATION_SORT_CHILDREN); + + ADD_SIGNAL(MethodInfo("pre_sort_children")); ADD_SIGNAL(MethodInfo("sort_children")); } diff --git a/scene/gui/container.h b/scene/gui/container.h index bce3085f0c4..f3ae9485569 100644 --- a/scene/gui/container.h +++ b/scene/gui/container.h @@ -51,7 +51,8 @@ protected: public: enum { - NOTIFICATION_SORT_CHILDREN = 50 + NOTIFICATION_PRE_SORT_CHILDREN = 50, + NOTIFICATION_SORT_CHILDREN = 51, }; void fit_child_in_rect(Control *p_child, const Rect2 &p_rect); diff --git a/scene/scene_string_names.cpp b/scene/scene_string_names.cpp index b283749ffa5..29e5dd60563 100644 --- a/scene/scene_string_names.cpp +++ b/scene/scene_string_names.cpp @@ -73,6 +73,7 @@ SceneStringNames::SceneStringNames() { focus_entered = StaticCString::create("focus_entered"); focus_exited = StaticCString::create("focus_exited"); + pre_sort_children = StaticCString::create("pre_sort_children"); sort_children = StaticCString::create("sort_children"); body_shape_entered = StaticCString::create("body_shape_entered"); diff --git a/scene/scene_string_names.h b/scene/scene_string_names.h index 2923351eabd..5e3195952e7 100644 --- a/scene/scene_string_names.h +++ b/scene/scene_string_names.h @@ -89,6 +89,7 @@ public: StringName focus_entered; StringName focus_exited; + StringName pre_sort_children; StringName sort_children; StringName finished;