diff options
author | Julian Eisel <julian@blender.org> | 2021-02-18 18:33:00 +0300 |
---|---|---|
committer | Julian Eisel <julian@blender.org> | 2021-02-18 19:17:48 +0300 |
commit | 81ac0bf759d34e7de921784250d82540cb218718 (patch) | |
tree | a0f6d67d3dab6785731d849aba40510f379cdaf5 /source/blender/editors | |
parent | afa5da9ce02bcd46f70d250943a933afe6de1d59 (diff) |
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
e6f0b60c2e911). 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.
Diffstat (limited to 'source/blender/editors')
-rw-r--r-- | source/blender/editors/include/UI_interface.h | 1 | ||||
-rw-r--r-- | source/blender/editors/interface/interface.c | 3 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_ops.c | 13 |
3 files changed, 17 insertions, 0 deletions
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 75100326fac..bc013953b1e 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -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; diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 10cbc2dc5fa..711d67710ad 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -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; diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c index 05a2a6ef29b..540e98f542e 100644 --- a/source/blender/editors/interface/interface_ops.c +++ b/source/blender/editors/interface/interface_ops.c @@ -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], |