Fix T94316: Asset catalog tree scrolls away when renaming a catalog

The activation of the text button is a bit special, since it happens during
drawing, the layout isn't computed yet then. Comparable cases where the button
is added on top don't use the layout system, so this didn't become an issue
until now. Trigger a delayed call to `UI_but_ensure_in_view()`.
This commit is contained in:
Julian Eisel 2022-01-03 19:20:00 +01:00
parent 1b9e103a30
commit a42e972e1b
Notes: blender-bot 2023-10-18 15:23:11 +02:00
Referenced by issue #94316, Asset Browser: Window scrolls away when renaming a catalog
3 changed files with 17 additions and 2 deletions

View File

@ -2044,6 +2044,7 @@ uiLayout *UI_block_layout(uiBlock *block,
const struct uiStyle *style);
void UI_block_layout_set_current(uiBlock *block, uiLayout *layout);
void UI_block_layout_resolve(uiBlock *block, int *r_x, int *r_y);
bool UI_block_layout_needs_resolving(const uiBlock *block);
/**
* Used for property search when the layout process needs to be cancelled in order to avoid
* computing the locations for buttons, but the layout items created while adding the buttons

View File

@ -3495,8 +3495,17 @@ static void ui_textedit_begin(bContext *C, uiBut *but, uiHandleButtonData *data)
ui_but_update(but);
/* Popup blocks don't support moving after creation, so don't change the view for them. */
if (!data->searchbox) {
/* Make sure the edited button is in view. */
if (data->searchbox) {
/* Popup blocks don't support moving after creation, so don't change the view for them. */
}
else if (UI_block_layout_needs_resolving(but->block)) {
/* Layout isn't resolved yet (may happen when activating while drawing through
* #UI_but_active_only()), so can't move it into view yet. This causes
* #ui_but_update_view_for_active() to run after the layout is resolved. */
but->changed = true;
}
else {
UI_but_ensure_in_view(C, data->region, but);
}

View File

@ -5661,6 +5661,11 @@ void UI_block_layout_resolve(uiBlock *block, int *r_x, int *r_y)
}
}
bool UI_block_layout_needs_resolving(const uiBlock *block)
{
return !BLI_listbase_is_empty(&block->layouts);
}
void uiLayoutSetContextPointer(uiLayout *layout, const char *name, PointerRNA *ptr)
{
uiBlock *block = layout->root->block;