feat: updated engine

This commit is contained in:
Sara Gerretsen 2026-07-10 17:04:34 +02:00
parent cbe99774ff
commit f4cf6b3999
6607 changed files with 910135 additions and 430025 deletions

View file

@ -30,11 +30,20 @@
#include "container.h"
#include "core/object/callable_mp.h"
#include "core/object/class_db.h"
#include "servers/display/accessibility_server.h"
void Container::_child_minsize_changed() {
update_minimum_size();
queue_sort();
}
void Container::_child_desired_size_changed() {
update_desired_size();
queue_sort();
}
void Container::add_child_notify(Node *p_child) {
Control::add_child_notify(p_child);
@ -45,6 +54,8 @@ void Container::add_child_notify(Node *p_child) {
control->connect(SceneStringName(size_flags_changed), callable_mp(this, &Container::queue_sort));
control->connect(SceneStringName(minimum_size_changed), callable_mp(this, &Container::_child_minsize_changed));
control->connect(SceneStringName(maximum_size_changed), callable_mp(this, &Container::_child_minsize_changed));
control->connect("_desired_size_changed", callable_mp(this, &Container::_child_desired_size_changed));
control->connect(SceneStringName(visibility_changed), callable_mp(this, &Container::_child_minsize_changed));
update_minimum_size();
@ -72,6 +83,8 @@ void Container::remove_child_notify(Node *p_child) {
control->disconnect(SceneStringName(size_flags_changed), callable_mp(this, &Container::queue_sort));
control->disconnect(SceneStringName(minimum_size_changed), callable_mp(this, &Container::_child_minsize_changed));
control->disconnect(SceneStringName(maximum_size_changed), callable_mp(this, &Container::_child_minsize_changed));
control->disconnect("_desired_size_changed", callable_mp(this, &Container::_child_desired_size_changed));
control->disconnect(SceneStringName(visibility_changed), callable_mp(this, &Container::_child_minsize_changed));
update_minimum_size();
@ -90,6 +103,7 @@ void Container::_sort_children() {
notification(NOTIFICATION_SORT_CHILDREN);
emit_signal(SceneStringName(sort_children));
pending_sort = false;
layout_pending_finish();
}
void Container::fit_child_in_rect(RequiredParam<Control> rp_child, const Rect2 &p_rect) {
@ -98,27 +112,39 @@ void Container::fit_child_in_rect(RequiredParam<Control> rp_child, const Rect2 &
bool rtl = is_layout_rtl();
Size2 minsize = p_child->get_combined_minimum_size();
Size2 desired_size = p_child->get_bound_desired_size();
Size2 maxsize = p_child->get_combined_maximum_size();
Rect2 r = p_rect;
BitField<SizeFlags> h_size_flags = p_child->get_h_size_flags();
BitField<SizeFlags> v_size_flags = p_child->get_v_size_flags();
if (!(p_child->get_h_size_flags().has_flag(SIZE_FILL))) {
r.size.x = minsize.width;
if (p_child->get_h_size_flags().has_flag(SIZE_SHRINK_END)) {
r.position.x += rtl ? 0 : (p_rect.size.width - minsize.width);
} else if (p_child->get_h_size_flags().has_flag(SIZE_SHRINK_CENTER)) {
r.position.x += Math::floor((p_rect.size.x - minsize.width) / 2);
if (!h_size_flags.has_flag(SIZE_FILL)) {
float final_width = minsize.width;
final_width = MAX(MIN(desired_size.width, r.size.width), final_width);
if (maxsize.width >= 0) {
final_width = MIN(final_width, maxsize.width);
}
r.size.x = final_width;
if (h_size_flags.has_flag(SIZE_SHRINK_END)) {
r.position.x += rtl ? 0 : (p_rect.size.width - final_width);
} else if (h_size_flags.has_flag(SIZE_SHRINK_CENTER)) {
r.position.x += Math::floor((p_rect.size.x - final_width) / 2);
} else {
r.position.x += rtl ? (p_rect.size.width - minsize.width) : 0;
r.position.x += rtl ? (p_rect.size.width - final_width) : 0;
}
}
if (!(p_child->get_v_size_flags().has_flag(SIZE_FILL))) {
r.size.y = minsize.y;
if (p_child->get_v_size_flags().has_flag(SIZE_SHRINK_END)) {
r.position.y += p_rect.size.height - minsize.height;
} else if (p_child->get_v_size_flags().has_flag(SIZE_SHRINK_CENTER)) {
r.position.y += Math::floor((p_rect.size.y - minsize.height) / 2);
} else {
r.position.y += 0;
if (!v_size_flags.has_flag(SIZE_FILL)) {
float final_height = minsize.y;
final_height = MAX(MIN(desired_size.y, r.size.y), final_height);
if (maxsize.height >= 0) {
final_height = MIN(final_height, maxsize.height);
}
r.size.y = final_height;
if (v_size_flags.has_flag(SIZE_SHRINK_END)) {
r.position.y += p_rect.size.height - final_height;
} else if (v_size_flags.has_flag(SIZE_SHRINK_CENTER)) {
r.position.y += Math::floor((p_rect.size.y - final_height) / 2);
}
}
@ -136,6 +162,7 @@ void Container::queue_sort() {
return;
}
layout_pending_start();
callable_mp(this, &Container::_sort_children).call_deferred();
pending_sort = true;
}
@ -188,7 +215,11 @@ void Container::_notification(int p_what) {
RID ae = get_accessibility_element();
ERR_FAIL_COND(ae.is_null());
DisplayServer::get_singleton()->accessibility_update_set_role(ae, DisplayServer::AccessibilityRole::ROLE_CONTAINER);
if (accessibility_region) {
AccessibilityServer::get_singleton()->update_set_role(ae, AccessibilityServerEnums::AccessibilityRole::ROLE_REGION);
} else {
AccessibilityServer::get_singleton()->update_set_role(ae, AccessibilityServerEnums::AccessibilityRole::ROLE_CONTAINER);
}
} break;
case NOTIFICATION_RESIZED:
@ -204,6 +235,18 @@ void Container::_notification(int p_what) {
}
}
void Container::set_accessibility_region(bool p_region) {
ERR_MAIN_THREAD_GUARD;
if (accessibility_region != p_region) {
accessibility_region = p_region;
queue_accessibility_update();
}
}
bool Container::is_accessibility_region() const {
return accessibility_region;
}
PackedStringArray Container::get_configuration_warnings() const {
PackedStringArray warnings = Control::get_configuration_warnings();
@ -217,6 +260,8 @@ PackedStringArray Container::get_configuration_warnings() const {
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);
ClassDB::bind_method(D_METHOD("set_accessibility_region", "region"), &Container::set_accessibility_region);
ClassDB::bind_method(D_METHOD("is_accessibility_region"), &Container::is_accessibility_region);
GDVIRTUAL_BIND(_get_allowed_size_flags_horizontal);
GDVIRTUAL_BIND(_get_allowed_size_flags_vertical);
@ -226,9 +271,13 @@ void Container::_bind_methods() {
ADD_SIGNAL(MethodInfo("pre_sort_children"));
ADD_SIGNAL(MethodInfo("sort_children"));
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "accessibility_region"), "set_accessibility_region", "is_accessibility_region");
}
Container::Container() {
// All containers should let mouse events pass by default.
set_mouse_filter(MOUSE_FILTER_PASS);
// All containers should contain their children within their maximum size by default.
set_propagate_maximum_size(true);
}