Fix T79524: Button alignment broken in some cases

ad4928a171 disabled alignment for too many cases. Still try to avoid
aligning many items, to avoid thousands of redundant alignment
calculations. But now we're much more picky adding an sub-row with
alignment.
This commit is contained in:
Julian Eisel 2020-08-05 16:50:33 +02:00
parent 87062d4d67
commit adfde60831
Notes: blender-bot 2023-02-14 06:19:41 +01:00
Referenced by issue #79524, UI: Some buttons are not aligned
1 changed files with 15 additions and 12 deletions

View File

@ -937,7 +937,7 @@ static uiBut *ui_item_with_label(uiLayout *layout,
int h,
int flag)
{
uiLayout *sub;
uiLayout *sub = layout;
uiBut *but = NULL;
PropertyType type;
PropertySubType subtype;
@ -945,14 +945,20 @@ static uiBut *ui_item_with_label(uiLayout *layout,
#ifdef UI_PROP_DECORATE
uiLayout *layout_prop_decorate = NULL;
const bool use_prop_sep = ((layout->item.flag & UI_ITEM_PROP_SEP) != 0);
const bool use_prop_decorate = use_prop_sep && (layout->item.flag & UI_ITEM_PROP_DECORATE) &&
(layout->item.flag & UI_ITEM_PROP_DECORATE_NO_PAD) == 0;
#endif
/* Previously 'align' was enabled to make sure the label is spaced closely to the button.
* Set the space to zero instead as aligning a large number of labels can end up aligning
* thousands of buttons when displaying key-map search (a heavy operation), see: T78636. */
sub = uiLayoutRow(layout, false);
sub->space = 0;
UI_block_layout_set_current(block, sub);
UI_block_layout_set_current(block, layout);
/* Only add new row if more than 1 item will be added. */
if (name[0] || use_prop_decorate) {
/* Also avoid setting 'align' if possible. Set the space to zero instead as aligning a large
* number of labels can end up aligning thousands of buttons when displaying key-map search (a
* heavy operation), see: T78636. */
sub = uiLayoutRow(layout, layout->align);
sub->space = 0;
}
#ifdef UI_PROP_DECORATE
if (name[0]) {
@ -1050,11 +1056,8 @@ static uiBut *ui_item_with_label(uiLayout *layout,
#ifdef UI_PROP_DECORATE
/* Only for alignment. */
if (use_prop_sep) { /* Flag may have been unset meanwhile. */
if ((layout->item.flag & UI_ITEM_PROP_DECORATE) &&
(layout->item.flag & UI_ITEM_PROP_DECORATE_NO_PAD) == 0) {
uiItemL(layout_prop_decorate ? layout_prop_decorate : sub, NULL, ICON_BLANK1);
}
if (use_prop_decorate) { /* Note that sep flag may have been unset meanwhile. */
uiItemL(layout_prop_decorate ? layout_prop_decorate : sub, NULL, ICON_BLANK1);
}
#endif /* UI_PROP_DECORATE */