diff --git a/source/blender/editors/interface/interface.cc b/source/blender/editors/interface/interface.cc index b776f464888..652afbaecff 100644 --- a/source/blender/editors/interface/interface.cc +++ b/source/blender/editors/interface/interface.cc @@ -2612,10 +2612,7 @@ double ui_but_value_get(uiBut *but) bool ui_but_value_set(uiBut *but, double value) { - if (ui_but_value_get(but) == value) { - /* Value did not change. */ - return false; - } + bool changed = false; /* Value is a HSV value: convert to RGB. */ if (but->rnaprop) { @@ -2624,38 +2621,59 @@ bool ui_but_value_set(uiBut *but, double value) if (RNA_property_editable(&but->rnapoin, prop)) { switch (RNA_property_type(prop)) { case PROP_BOOLEAN: + if (ui_but_value_get(but) == value) { + break; + } if (RNA_property_array_check(prop)) { RNA_property_boolean_set_index(&but->rnapoin, prop, but->rnaindex, value); } else { RNA_property_boolean_set(&but->rnapoin, prop, value); } + changed = true; break; case PROP_INT: + if (ui_but_value_get(but) == value) { + break; + } if (RNA_property_array_check(prop)) { RNA_property_int_set_index(&but->rnapoin, prop, but->rnaindex, int(value)); } else { RNA_property_int_set(&but->rnapoin, prop, int(value)); } + changed = true; break; case PROP_FLOAT: + if (ui_but_value_get(but) == value) { + break; + } if (RNA_property_array_check(prop)) { RNA_property_float_set_index(&but->rnapoin, prop, but->rnaindex, value); } else { RNA_property_float_set(&but->rnapoin, prop, value); } + changed = true; break; case PROP_ENUM: if (RNA_property_flag(prop) & PROP_ENUM_FLAG) { int ivalue = int(value); /* toggle for enum/flag buttons */ - ivalue ^= RNA_property_enum_get(&but->rnapoin, prop); + const int ivalue_prev = RNA_property_enum_get(&but->rnapoin, prop); + ivalue ^= ivalue_prev; + if (ivalue_prev == ivalue) { + break; + } RNA_property_enum_set(&but->rnapoin, prop, ivalue); + changed = true; } else { + if (ui_but_value_get(but) == value) { + break; + } RNA_property_enum_set(&but->rnapoin, prop, value); + changed = true; } break; default: @@ -2690,27 +2708,38 @@ bool ui_but_value_set(uiBut *but, double value) value = fval; } - /* then set value with possible edit override */ + if ((ui_but_value_get(but) == value) && + /* Extra check to ensure the edited value matches. */ + (but->editval == nullptr || (*but->editval == value))) + { + /* Pass. */ + } if (but->editval) { + /* then set value with possible edit override */ value = *but->editval = value; + changed = true; } else if (but->pointype == UI_BUT_POIN_CHAR) { value = *((char *)but->poin) = char(value); + changed = true; } else if (but->pointype == UI_BUT_POIN_SHORT) { value = *((short *)but->poin) = short(value); + changed = true; } else if (but->pointype == UI_BUT_POIN_INT) { value = *((int *)but->poin) = int(value); + changed = true; } else if (but->pointype == UI_BUT_POIN_FLOAT) { value = *((float *)but->poin) = float(value); + changed = true; } } ui_but_update_select_flag(but, &value); - return true; + return changed; } int ui_but_string_get_maxncpy(uiBut *but)