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.
This commit is contained in:
@@ -542,7 +542,7 @@ static bool but_copypaste_profile_alive = false;
|
|||||||
|
|
||||||
bool ui_but_is_editing(const uiBut *but)
|
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));
|
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)
|
static bool ui_rna_is_userdef(PointerRNA *ptr, PropertyRNA *prop)
|
||||||
{
|
{
|
||||||
/* Not very elegant, but ensures preference changes force re-save. */
|
/* Not very elegant, but ensures preference changes force re-save. */
|
||||||
bool tag = false;
|
|
||||||
if (prop && !(RNA_property_flag(prop) & PROP_NO_DEG_UPDATE)) {
|
if (!prop) {
|
||||||
StructRNA *base = RNA_struct_base(ptr->type);
|
return false;
|
||||||
if (base == NULL) {
|
|
||||||
base = ptr->type;
|
|
||||||
}
|
|
||||||
if (ELEM(base,
|
|
||||||
&RNA_AddonPreferences,
|
|
||||||
&RNA_KeyConfigPreferences,
|
|
||||||
&RNA_KeyMapItem,
|
|
||||||
&RNA_UserAssetLibrary)) {
|
|
||||||
tag = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return tag;
|
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 ELEM(base,
|
||||||
|
&RNA_AddonPreferences,
|
||||||
|
&RNA_KeyConfigPreferences,
|
||||||
|
&RNA_KeyMapItem,
|
||||||
|
&RNA_UserAssetLibrary);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UI_but_is_userdef(const uiBut *but)
|
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() */
|
/* typically call ui_apply_but_undo(), ui_apply_but_autokey() */
|
||||||
static void ui_apply_but_undo(uiBut *but)
|
static void ui_apply_but_undo(uiBut *but)
|
||||||
{
|
{
|
||||||
if (but->flag & UI_BUT_UNDO) {
|
if (!(but->flag & UI_BUT_UNDO)) {
|
||||||
const char *str = NULL;
|
return;
|
||||||
size_t str_len_clip = SIZE_MAX - 1;
|
}
|
||||||
bool skip_undo = false;
|
|
||||||
|
|
||||||
/* define which string to use for undo */
|
const char *str = NULL;
|
||||||
if (but->type == UI_BTYPE_MENU) {
|
size_t str_len_clip = SIZE_MAX - 1;
|
||||||
str = but->drawstr;
|
bool skip_undo = false;
|
||||||
str_len_clip = ui_but_drawstr_len_without_sep_char(but);
|
|
||||||
}
|
/* define which string to use for undo */
|
||||||
else if (but->drawstr[0]) {
|
if (but->type == UI_BTYPE_MENU) {
|
||||||
str = but->drawstr;
|
str = but->drawstr;
|
||||||
str_len_clip = ui_but_drawstr_len_without_sep_char(but);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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 {
|
else {
|
||||||
str = but->tip;
|
ID *id = but->rnapoin.owner_id;
|
||||||
str_len_clip = ui_but_tip_len_only_first_line(but);
|
if (!ED_undo_is_legacy_compatible_for_property(but->block->evil_C, id)) {
|
||||||
}
|
|
||||||
|
|
||||||
/* 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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 == 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;
|
skip_undo = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
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 */
|
/* try autokey */
|
||||||
ui_but_anim_autokey(C, but, scene, scene->r.cfra);
|
ui_but_anim_autokey(C, but, scene, scene->r.cfra);
|
||||||
|
|
||||||
|
if (!but->rnaprop) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RNA_property_subtype(but->rnaprop) == PROP_PASSWORD) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* make a little report about what we've done! */
|
/* make a little report about what we've done! */
|
||||||
if (but->rnaprop) {
|
char *buf = WM_prop_pystring_assign(C, &but->rnapoin, but->rnaprop, but->rnaindex);
|
||||||
char *buf;
|
if (buf) {
|
||||||
|
BKE_report(CTX_wm_reports(C), RPT_PROPERTY, buf);
|
||||||
|
MEM_freeN(buf);
|
||||||
|
|
||||||
if (RNA_property_subtype(but->rnaprop) == PROP_PASSWORD) {
|
WM_event_add_notifier(C, NC_SPACE | ND_SPACE_INFO_REPORT, NULL);
|
||||||
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);
|
|
||||||
|
|
||||||
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) {
|
LISTBASE_FOREACH (uiBut *, but, &block->buttons) {
|
||||||
/* NOTE: ctrl is always true here because (at least for now)
|
/* 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. */
|
* 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_but_is_interactive(but, true)) {
|
||||||
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) {
|
|
||||||
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 (!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) {
|
if (changed) {
|
||||||
/* apply now, not on release (or if handlers are canceled for whatever reason) */
|
/* apply now, not on release (or if handlers are canceled for whatever reason) */
|
||||||
ui_apply_but_funcs_after(C);
|
ui_apply_but_funcs_after(C);
|
||||||
|
Reference in New Issue
Block a user