From 561e57df1386122714fae7b413be91e210b33b65 Mon Sep 17 00:00:00 2001 From: Gary Oberbrunner Date: Fri, 2 Mar 2018 14:32:22 -0500 Subject: [PATCH] Fix infinite loop in GridContainer layout I had a grid container and tried to set rect.min_height larger in the editor; that caused an infinite loop in GridContainer::_notification at line 118. The reason is max_index was being set to the *height* of the row, not the *index* of the row. So later when it tried to erase that row and try again, there was nothing to erase. I applied the same fix to the width code. --- scene/gui/grid_container.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scene/gui/grid_container.cpp b/scene/gui/grid_container.cpp index 9aac5137bca..2799131f7f4 100644 --- a/scene/gui/grid_container.cpp +++ b/scene/gui/grid_container.cpp @@ -36,10 +36,10 @@ void GridContainer::_notification(int p_what) { case NOTIFICATION_SORT_CHILDREN: { - Map col_minw; - Map row_minh; - Set col_expanded; - Set row_expanded; + Map col_minw; // max of min_width of all controls in each col (indexed by col) + Map row_minh; // max of min_height of all controls in each row (indexed by row) + Set col_expanded; // columns which have the SIZE_EXPAND flag set + Set row_expanded; // rows which have the SIZE_EXPAND flag set int hsep = get_constant("hseparation"); int vsep = get_constant("vseparation"); @@ -94,7 +94,7 @@ void GridContainer::_notification(int p_what) { int max_index = 0; for (Set::Element *E = col_expanded.front(); E; E = E->next()) { if (col_minw[E->get()] > col_minw[max_index]) { - max_index = col_minw[E->get()]; + max_index = E->get(); } if (can_fit && (remaining_space.width / col_expanded.size()) < col_minw[E->get()]) { can_fit = false; @@ -115,7 +115,7 @@ void GridContainer::_notification(int p_what) { int max_index = 0; for (Set::Element *E = row_expanded.front(); E; E = E->next()) { if (row_minh[E->get()] > row_minh[max_index]) { - max_index = row_minh[E->get()]; + max_index = E->get(); } if (can_fit && (remaining_space.height / row_expanded.size()) < row_minh[E->get()]) { can_fit = false;