PopupMenu: Fix minimum size for items with icons

This commit is contained in:
Haoyu Qiu
2025-11-04 16:22:19 +08:00
parent a6e7084b40
commit 7a3093c373

View File

@ -228,49 +228,42 @@ Size2 PopupMenu::_get_contents_minimum_size() const {
minsize.width += panel->get_offset(SIDE_LEFT) - panel->get_offset(SIDE_RIGHT);
minsize.height += panel->get_offset(SIDE_TOP) - panel->get_offset(SIDE_BOTTOM);
float max_w = 0.0;
float icon_w = 0.0;
int check_w = MAX(theme_cache.checked->get_width(), theme_cache.radio_checked->get_width()) + theme_cache.h_separation;
int accel_max_w = 0;
real_t body_max_w = 0.0; // Indentation, text, and submenu arrow.
real_t icon_max_w = 0.0;
real_t accel_max_w = 0.0;
bool has_check = false;
for (int i = 0; i < items.size(); i++) {
Size2 item_size;
_shape_item(i);
Size2 icon_size = _get_item_icon_size(i);
item_size.height = _get_item_height(i);
icon_w = MAX(icon_size.width, icon_w);
item_size.width += items[i].indent * theme_cache.indent;
icon_max_w = MAX(_get_item_icon_size(i).width, icon_max_w);
if (items[i].checkable_type && !items[i].separator) {
has_check = true;
}
item_size.width += items[i].text_buf->get_size().x;
item_size.height += theme_cache.v_separation;
if (items[i].accel != Key::NONE || (items[i].shortcut.is_valid() && items[i].shortcut->has_valid_event())) {
int accel_w = theme_cache.h_separation * 2;
accel_w += items[i].accel_text_buf->get_size().x;
real_t accel_w = theme_cache.h_separation * 2 + items[i].accel_text_buf->get_size().x;
accel_max_w = MAX(accel_w, accel_max_w);
}
real_t body_w = items[i].indent * theme_cache.indent + items[i].text_buf->get_size().x;
if (items[i].submenu) {
item_size.width += theme_cache.submenu->get_width();
body_w += theme_cache.submenu->get_width();
}
body_max_w = MAX(body_max_w, body_w);
max_w = MAX(max_w, item_size.width);
minsize.height += item_size.height;
minsize.height += _get_item_height(i) + theme_cache.v_separation;
}
int item_side_padding = theme_cache.item_start_padding + theme_cache.item_end_padding;
minsize.width += max_w + icon_w + accel_max_w + item_side_padding;
minsize.width += theme_cache.item_start_padding + body_max_w + accel_max_w + theme_cache.item_end_padding;
if (icon_max_w > 0) {
minsize.width += icon_max_w + theme_cache.h_separation;
}
if (has_check) {
minsize.width += check_w;
int check_w = MAX(theme_cache.checked->get_width(), theme_cache.radio_checked->get_width());
minsize.width += check_w + theme_cache.h_separation;
}
if (is_inside_tree()) {