Fix failing "Edit Source" (asserts) while number slider was visible

E.g. steps to reproduce:
* Enter Vertex Paint mode
* In the tool settings, right-click > "Edit Source"

When creating a number slider via `layout.prop(..., slider=True)`, the UI code
would reallocate the number button to be a number-slider button. That's because
we now actually have different button data-structures for these (see
e6f0b60c2e). The edit source code stored data based on the button pointers,
which didn't get updated after changing the type. The fix just adds this
updating.
This commit is contained in:
Julian Eisel 2021-02-18 16:33:00 +01:00
parent afa5da9ce0
commit 81ac0bf759
3 changed files with 17 additions and 0 deletions

View File

@ -2545,6 +2545,7 @@ void UI_template_fix_linking(void);
/* UI_OT_editsource helpers */
bool UI_editsource_enable_check(void);
void UI_editsource_active_but_test(uiBut *but);
void UI_editsource_but_replace(const uiBut *old_but, uiBut *new_but);
/* UI_butstore_ helpers */
typedef struct uiButStore uiButStore;

View File

@ -3948,6 +3948,9 @@ uiBut *ui_but_change_type(uiBut *but, eButType new_type)
UNUSED_VARS_NDEBUG(found_layout);
ui_button_group_replace_but_ptr(uiLayoutGetBlock(but->layout), old_but_ptr, but);
}
if (UI_editsource_enable_check()) {
UI_editsource_but_replace(old_but_ptr, but);
}
}
return but;

View File

@ -1296,6 +1296,19 @@ void UI_editsource_active_but_test(uiBut *but)
BLI_ghash_insert(ui_editsource_info->hash, but, but_store);
}
/**
* Remove the editsource data for \a old_but and reinsert it for \a new_but. Use when the button
* was reallocated, e.g. to have a new type (#ui_but_change_type()).
*/
void UI_editsource_but_replace(const uiBut *old_but, uiBut *new_but)
{
uiEditSourceButStore *but_store = BLI_ghash_lookup(ui_editsource_info->hash, old_but);
if (but_store) {
BLI_ghash_remove(ui_editsource_info->hash, old_but, NULL, NULL);
BLI_ghash_insert(ui_editsource_info->hash, new_but, but_store);
}
}
static int editsource_text_edit(bContext *C,
wmOperator *op,
const char filepath[FILE_MAX],