Skip to content

Commit

Permalink
Merge pull request #78009 from YuriSizov/gui-gently-massage-minimal-size
Browse files Browse the repository at this point in the history
Ensure that controls update all their sizing information when required
  • Loading branch information
akien-mga committed Jun 12, 2023
2 parents 35ff936 + ccaab0e commit 1b5620d
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 33 deletions.
2 changes: 0 additions & 2 deletions scene/gui/container.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,6 @@
#include "scene/scene_string_names.h"

void Container::_child_minsize_changed() {
//Size2 ms = get_combined_minimum_size();
//if (ms.width > get_size().width || ms.height > get_size().height) {
update_minimum_size();
queue_sort();
}
Expand Down
60 changes: 29 additions & 31 deletions scene/gui/control.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1579,12 +1579,28 @@ Vector2 Control::get_pivot_offset() const {

void Control::_update_minimum_size() {
if (!is_inside_tree()) {
data.updating_last_minimum_size = false;
return;
}

Control *invalidate = this;
Size2 minsize = get_combined_minimum_size();
data.updating_last_minimum_size = false;

if (minsize != data.last_minimum_size) {
data.last_minimum_size = minsize;
_size_changed();
emit_signal(SceneStringNames::get_singleton()->minimum_size_changed);
}
}

void Control::update_minimum_size() {
ERR_MAIN_THREAD_GUARD;
if (!is_inside_tree() || data.block_minimum_size_adjust) {
return;
}

// Invalidate cache upwards.
Control *invalidate = this;
while (invalidate && invalidate->data.minimum_size_valid) {
invalidate->data.minimum_size_valid = false;
if (invalidate->is_set_as_top_level()) {
Expand All @@ -1604,28 +1620,12 @@ void Control::_update_minimum_size() {
return;
}

Size2 minsize = get_combined_minimum_size();
data.updating_last_minimum_size = false;
if (minsize != data.last_minimum_size) {
data.last_minimum_size = minsize;
_size_changed();
emit_signal(SceneStringNames::get_singleton()->minimum_size_changed);
}
}

void Control::update_minimum_size() {
ERR_MAIN_THREAD_GUARD;
if (!is_inside_tree() || data.block_minimum_size_adjust) {
return;
}

if (data.updating_last_minimum_size) {
return;
}

data.updating_last_minimum_size = true;

MessageQueue::get_singleton()->push_call(this, "_update_minimum_size");
MessageQueue::get_singleton()->push_callable(callable_mp(this, &Control::_update_minimum_size));
}

void Control::set_block_minimum_size_adjust(bool p_block) {
Expand Down Expand Up @@ -1665,17 +1665,8 @@ void Control::_update_minimum_size_cache() {
minsize.x = MAX(minsize.x, data.custom_minimum_size.x);
minsize.y = MAX(minsize.y, data.custom_minimum_size.y);

bool size_changed = false;
if (data.minimum_size_cache != minsize) {
size_changed = true;
}

data.minimum_size_cache = minsize;
data.minimum_size_valid = true;

if (size_changed) {
update_minimum_size();
}
}

Size2 Control::get_combined_minimum_size() const {
Expand Down Expand Up @@ -3128,6 +3119,7 @@ void Control::_notification(int p_notification) {

case NOTIFICATION_POST_ENTER_TREE: {
data.is_rtl_dirty = true;
update_minimum_size();
_size_changed();
} break;

Expand Down Expand Up @@ -3243,10 +3235,13 @@ void Control::_notification(int p_notification) {

case NOTIFICATION_THEME_CHANGED: {
emit_signal(SceneStringNames::get_singleton()->theme_changed);

_invalidate_theme_cache();
_update_theme_item_cache();
update_minimum_size();
queue_redraw();

update_minimum_size();
_size_changed();
} break;

case NOTIFICATION_VISIBILITY_CHANGED: {
Expand All @@ -3255,25 +3250,28 @@ void Control::_notification(int p_notification) {
get_viewport()->_gui_hide_control(this);
}
} else {
_update_minimum_size();
update_minimum_size();
_size_changed();
}
} break;

case NOTIFICATION_TRANSLATION_CHANGED:
case NOTIFICATION_LAYOUT_DIRECTION_CHANGED: {
if (is_inside_tree()) {
data.is_rtl_dirty = true;

_invalidate_theme_cache();
_update_theme_item_cache();
queue_redraw();

update_minimum_size();
_size_changed();
}
} break;
}
}

void Control::_bind_methods() {
ClassDB::bind_method(D_METHOD("_update_minimum_size"), &Control::_update_minimum_size);

ClassDB::bind_method(D_METHOD("accept_event"), &Control::accept_event);
ClassDB::bind_method(D_METHOD("get_minimum_size"), &Control::get_minimum_size);
ClassDB::bind_method(D_METHOD("get_combined_minimum_size"), &Control::get_combined_minimum_size);
Expand Down

0 comments on commit 1b5620d

Please sign in to comment.