Skip to content

Commit 02ce56e

Browse files
committed
PopupMenu: Fix minimum size for items with icons
1 parent 90659c1 commit 02ce56e

File tree

1 file changed

+20
-25
lines changed

1 file changed

+20
-25
lines changed

scene/gui/popup_menu.cpp

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -228,49 +228,44 @@ Size2 PopupMenu::_get_contents_minimum_size() const {
228228
minsize.width += panel->get_offset(SIDE_LEFT) - panel->get_offset(SIDE_RIGHT);
229229
minsize.height += panel->get_offset(SIDE_TOP) - panel->get_offset(SIDE_BOTTOM);
230230

231-
float max_w = 0.0;
232-
float icon_w = 0.0;
233-
int check_w = MAX(theme_cache.checked->get_width(), theme_cache.radio_checked->get_width()) + theme_cache.h_separation;
234-
int accel_max_w = 0;
231+
real_t body_max_w = 0.0; // Indentation, text, and submenu arrow.
232+
real_t icon_max_w = 0.0;
233+
real_t accel_max_w = 0.0;
235234
bool has_check = false;
236235

237236
for (int i = 0; i < items.size(); i++) {
238-
Size2 item_size;
239-
_shape_item(i);
237+
const Item &item = items[i];
240238

241-
Size2 icon_size = _get_item_icon_size(i);
242-
item_size.height = _get_item_height(i);
243-
icon_w = MAX(icon_size.width, icon_w);
239+
_shape_item(i);
244240

245-
item_size.width += items[i].indent * theme_cache.indent;
241+
icon_max_w = MAX(_get_item_icon_size(i).width, icon_max_w);
246242

247-
if (items[i].checkable_type && !items[i].separator) {
243+
if (item.checkable_type && !item.separator) {
248244
has_check = true;
249245
}
250246

251-
item_size.width += items[i].text_buf->get_size().x;
252-
item_size.height += theme_cache.v_separation;
253-
254-
if (items[i].accel != Key::NONE || (items[i].shortcut.is_valid() && items[i].shortcut->has_valid_event())) {
255-
int accel_w = theme_cache.h_separation * 2;
256-
accel_w += items[i].accel_text_buf->get_size().x;
247+
if (item.accel != Key::NONE || (item.shortcut.is_valid() && item.shortcut->has_valid_event())) {
248+
real_t accel_w = theme_cache.h_separation * 2 + item.accel_text_buf->get_size().x;
257249
accel_max_w = MAX(accel_w, accel_max_w);
258250
}
259251

260-
if (items[i].submenu) {
261-
item_size.width += theme_cache.submenu->get_width();
252+
real_t body_w = item.indent * theme_cache.indent + item.text_buf->get_size().x;
253+
if (item.submenu) {
254+
body_w += theme_cache.submenu->get_width();
262255
}
256+
body_max_w = MAX(body_max_w, body_w);
263257

264-
max_w = MAX(max_w, item_size.width);
265-
266-
minsize.height += item_size.height;
258+
minsize.height += _get_item_height(i) + theme_cache.v_separation;
267259
}
268260

269-
int item_side_padding = theme_cache.item_start_padding + theme_cache.item_end_padding;
270-
minsize.width += max_w + icon_w + accel_max_w + item_side_padding;
261+
minsize.width += theme_cache.item_start_padding + body_max_w + accel_max_w + theme_cache.item_end_padding;
271262

263+
if (icon_max_w > 0) {
264+
minsize.width += icon_max_w + theme_cache.h_separation;
265+
}
272266
if (has_check) {
273-
minsize.width += check_w;
267+
int check_w = MAX(theme_cache.checked->get_width(), theme_cache.radio_checked->get_width());
268+
minsize.width += check_w + theme_cache.h_separation;
274269
}
275270

276271
if (is_inside_tree()) {

0 commit comments

Comments
 (0)