From 16fd5fa656af41c519d9e1633a4a7fb5e09904f3 Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Mon, 23 May 2022 11:34:51 +0200 Subject: Cleanup: Early-exit in button handling code, minor cleanups This should decrease cognitive load because: - Intention is more explicit - Shorter visual scope of branches (no need to search for matching closing brackets and `else` blocks) - Visually less busy code because condition-checks and code that "actually does things" are separated, with less indentation - Avoids chaining together a bunch of conditions to a single `if` Also: Use `const`, correct comment placement, whitespace improvements. --- .../blender/editors/interface/interface_handlers.c | 197 +++++++++++---------- 1 file changed, 103 insertions(+), 94 deletions(-) (limited to 'source/blender/editors/interface/interface_handlers.c') diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index f28f9e4ce0b..a7dfff2edb4 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -542,7 +542,7 @@ static bool but_copypaste_profile_alive = false; bool ui_but_is_editing(const uiBut *but) { - uiHandleButtonData *data = but->active; + const uiHandleButtonData *data = but->active; return (data && ELEM(data->state, BUTTON_STATE_TEXT_EDITING, BUTTON_STATE_NUM_EDITING)); } @@ -660,21 +660,23 @@ static bool ui_but_dragedit_update_mval(uiHandleButtonData *data, int mx) static bool ui_rna_is_userdef(PointerRNA *ptr, PropertyRNA *prop) { /* Not very elegant, but ensures preference changes force re-save. */ - bool tag = false; - if (prop && !(RNA_property_flag(prop) & PROP_NO_DEG_UPDATE)) { - StructRNA *base = RNA_struct_base(ptr->type); - if (base == NULL) { - base = ptr->type; - } - if (ELEM(base, - &RNA_AddonPreferences, - &RNA_KeyConfigPreferences, - &RNA_KeyMapItem, - &RNA_UserAssetLibrary)) { - tag = true; - } + + if (!prop) { + return false; + } + if (RNA_property_flag(prop) & PROP_NO_DEG_UPDATE) { + return false; + } + + StructRNA *base = RNA_struct_base(ptr->type); + if (base == NULL) { + base = ptr->type; } - return tag; + return ELEM(base, + &RNA_AddonPreferences, + &RNA_KeyConfigPreferences, + &RNA_KeyMapItem, + &RNA_UserAssetLibrary); } bool UI_but_is_userdef(const uiBut *but) @@ -900,64 +902,66 @@ static void ui_apply_but_func(bContext *C, uiBut *but) /* typically call ui_apply_but_undo(), ui_apply_but_autokey() */ static void ui_apply_but_undo(uiBut *but) { - if (but->flag & UI_BUT_UNDO) { - const char *str = NULL; - size_t str_len_clip = SIZE_MAX - 1; - bool skip_undo = false; + if (!(but->flag & UI_BUT_UNDO)) { + return; + } - /* define which string to use for undo */ - if (but->type == UI_BTYPE_MENU) { - str = but->drawstr; - str_len_clip = ui_but_drawstr_len_without_sep_char(but); - } - else if (but->drawstr[0]) { - str = but->drawstr; - str_len_clip = ui_but_drawstr_len_without_sep_char(but); - } - else { - str = but->tip; - str_len_clip = ui_but_tip_len_only_first_line(but); - } + const char *str = NULL; + size_t str_len_clip = SIZE_MAX - 1; + bool skip_undo = false; - /* fallback, else we don't get an undo! */ - if (str == NULL || str[0] == '\0' || str_len_clip == 0) { - str = "Unknown Action"; - str_len_clip = strlen(str); - } + /* define which string to use for undo */ + if (but->type == UI_BTYPE_MENU) { + str = but->drawstr; + str_len_clip = ui_but_drawstr_len_without_sep_char(but); + } + else if (but->drawstr[0]) { + str = but->drawstr; + str_len_clip = ui_but_drawstr_len_without_sep_char(but); + } + else { + str = but->tip; + str_len_clip = ui_but_tip_len_only_first_line(but); + } - /* Optionally override undo when undo system doesn't support storing properties. */ - if (but->rnapoin.owner_id) { - /* Exception for renaming ID data, we always need undo pushes in this case, - * because undo systems track data by their ID, see: T67002. */ - /* Exception for active shape-key, since changing this in edit-mode updates - * the shape key from object mode data. */ - if (ELEM(but->rnaprop, &rna_ID_name, &rna_Object_active_shape_key_index)) { - /* pass */ - } - else { - ID *id = but->rnapoin.owner_id; - if (!ED_undo_is_legacy_compatible_for_property(but->block->evil_C, id)) { - skip_undo = true; - } - } - } + /* fallback, else we don't get an undo! */ + if (str == NULL || str[0] == '\0' || str_len_clip == 0) { + str = "Unknown Action"; + str_len_clip = strlen(str); + } - if (skip_undo == false) { - /* XXX: disable all undo pushes from UI changes from sculpt mode as they cause memfile undo - * steps to be written which cause lag: T71434. */ - if (BKE_paintmode_get_active_from_context(but->block->evil_C) == PAINT_MODE_SCULPT) { + /* Optionally override undo when undo system doesn't support storing properties. */ + if (but->rnapoin.owner_id) { + /* Exception for renaming ID data, we always need undo pushes in this case, + * because undo systems track data by their ID, see: T67002. */ + /* Exception for active shape-key, since changing this in edit-mode updates + * the shape key from object mode data. */ + if (ELEM(but->rnaprop, &rna_ID_name, &rna_Object_active_shape_key_index)) { + /* pass */ + } + else { + ID *id = but->rnapoin.owner_id; + if (!ED_undo_is_legacy_compatible_for_property(but->block->evil_C, id)) { skip_undo = true; } } + } - if (skip_undo) { - str = ""; + if (skip_undo == false) { + /* XXX: disable all undo pushes from UI changes from sculpt mode as they cause memfile undo + * steps to be written which cause lag: T71434. */ + if (BKE_paintmode_get_active_from_context(but->block->evil_C) == PAINT_MODE_SCULPT) { + skip_undo = true; } + } - /* delayed, after all other funcs run, popups are closed, etc */ - uiAfterFunc *after = ui_afterfunc_new(); - BLI_strncpy(after->undostr, str, min_zz(str_len_clip + 1, sizeof(after->undostr))); + if (skip_undo) { + str = ""; } + + /* delayed, after all other funcs run, popups are closed, etc */ + uiAfterFunc *after = ui_afterfunc_new(); + BLI_strncpy(after->undostr, str, min_zz(str_len_clip + 1, sizeof(after->undostr))); } static void ui_apply_but_autokey(bContext *C, uiBut *but) @@ -967,21 +971,21 @@ static void ui_apply_but_autokey(bContext *C, uiBut *but) /* try autokey */ ui_but_anim_autokey(C, but, scene, scene->r.cfra); - /* make a little report about what we've done! */ - if (but->rnaprop) { - char *buf; + if (!but->rnaprop) { + return; + } - if (RNA_property_subtype(but->rnaprop) == PROP_PASSWORD) { - return; - } + if (RNA_property_subtype(but->rnaprop) == PROP_PASSWORD) { + return; + } - buf = WM_prop_pystring_assign(C, &but->rnapoin, but->rnaprop, but->rnaindex); - if (buf) { - BKE_report(CTX_wm_reports(C), RPT_PROPERTY, buf); - MEM_freeN(buf); + /* make a little report about what we've done! */ + char *buf = WM_prop_pystring_assign(C, &but->rnapoin, but->rnaprop, but->rnaindex); + if (buf) { + BKE_report(CTX_wm_reports(C), RPT_PROPERTY, buf); + MEM_freeN(buf); - WM_event_add_notifier(C, NC_SPACE | ND_SPACE_INFO_REPORT, NULL); - } + WM_event_add_notifier(C, NC_SPACE | ND_SPACE_INFO_REPORT, NULL); } } @@ -1631,29 +1635,34 @@ static bool ui_drag_toggle_set_xy_xy( LISTBASE_FOREACH (uiBut *, but, &block->buttons) { /* NOTE: ctrl is always true here because (at least for now) * we always want to consider text control in this case, even when not embossed. */ - if (ui_but_is_interactive(but, true)) { - if (BLI_rctf_isect_segment(&but->rect, xy_a_block, xy_b_block)) { - - /* execute the button */ - if (ui_drag_toggle_but_is_supported(but)) { - /* is it pressed? */ - const int pushed_state_but = ui_drag_toggle_but_pushed_state(but); - if (pushed_state_but != pushed_state) { - UI_but_execute(C, region, but); - if (do_check) { - ui_but_update_edited(but); - } - if (U.runtime.is_dirty == false) { - ui_but_update_preferences_dirty(but); - } - changed = true; - } - } - /* done */ - } + + if (!ui_but_is_interactive(but, true)) { + continue; + } + if (!BLI_rctf_isect_segment(&but->rect, xy_a_block, xy_b_block)) { + continue; + } + if (!ui_drag_toggle_but_is_supported(but)) { + continue; + } + /* is it pressed? */ + const int pushed_state_but = ui_drag_toggle_but_pushed_state(but); + if (pushed_state_but == pushed_state) { + continue; + } + + /* execute the button */ + UI_but_execute(C, region, but); + if (do_check) { + ui_but_update_edited(but); + } + if (U.runtime.is_dirty == false) { + ui_but_update_preferences_dirty(but); } + changed = true; } } + if (changed) { /* apply now, not on release (or if handlers are canceled for whatever reason) */ ui_apply_but_funcs_after(C); -- cgit v1.2.3