UI: New option to display factors as percentages
The option can be changed in the Preferences in `Interface -> Editors -> Factor Display Type`. Reviewers: campbellbarton, brecht, billreynish Differential Revision: https://developer.blender.org/D4462
This commit is contained in:
parent
17e0565cc5
commit
107c94c338
|
@ -215,6 +215,7 @@ class USERPREF_PT_interface_editors(PreferencePanel, Panel):
|
|||
flow.prop(view, "show_layout_ui", text="Corner Splitting")
|
||||
flow.prop(view, "color_picker_type")
|
||||
flow.row().prop(view, "header_align")
|
||||
flow.prop(view, "factor_display_type")
|
||||
|
||||
|
||||
class USERPREF_PT_interface_menus(Panel):
|
||||
|
|
|
@ -2425,12 +2425,27 @@ void ui_but_string_get_ex(uiBut *but, char *str, const size_t maxlen, const int
|
|||
|
||||
value = ui_but_value_get(but);
|
||||
|
||||
PropertySubType subtype = PROP_NONE;
|
||||
if (but->rnaprop) {
|
||||
subtype = RNA_property_subtype(but->rnaprop);
|
||||
}
|
||||
|
||||
if (ui_but_is_float(but)) {
|
||||
int prec = (float_precision == -1) ? ui_but_calc_float_precision(but, value) : float_precision;
|
||||
|
||||
if (ui_but_is_unit(but)) {
|
||||
ui_get_but_string_unit(but, str, maxlen, value, false, float_precision);
|
||||
ui_get_but_string_unit(but, str, maxlen, value, false, prec);
|
||||
}
|
||||
else if (subtype == PROP_FACTOR) {
|
||||
if (U.factor_display_type == USER_FACTOR_AS_FACTOR) {
|
||||
BLI_snprintf(str, maxlen, "%.*f", prec, value);
|
||||
}
|
||||
else {
|
||||
BLI_snprintf(str, maxlen, "%.*f", MAX2(0, prec - 2), value * 100);
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
int prec = (float_precision == -1) ? ui_but_calc_float_precision(but, value) : float_precision;
|
||||
if (use_exp_float) {
|
||||
const int int_digits_num = integer_digits_f(value);
|
||||
if (int_digits_num < -6 || int_digits_num > 12) {
|
||||
|
@ -2528,44 +2543,80 @@ static bool ui_set_but_string_eval_num_unit(bContext *C, uiBut *but, const char
|
|||
return user_string_to_number(C, str, unit, type, r_value);
|
||||
}
|
||||
|
||||
static bool ui_number_from_string(bContext *C, const char *str, double *r_value)
|
||||
{
|
||||
#ifdef WITH_PYTHON
|
||||
return BPY_execute_string_as_number(C, NULL, str, true, r_value);
|
||||
#else
|
||||
*r_value = atof(str);
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
static bool ui_number_from_string_factor(bContext *C, const char *str, double *r_value)
|
||||
{
|
||||
int len = strlen(str);
|
||||
if (BLI_strn_endswith(str, "%", len)) {
|
||||
char *str_new = BLI_strdupn(str, len - 1);
|
||||
bool success = ui_number_from_string(C, str_new, r_value);
|
||||
MEM_freeN(str_new);
|
||||
*r_value /= 100.0;
|
||||
return success;
|
||||
}
|
||||
else {
|
||||
if (!ui_number_from_string(C, str, r_value)) {
|
||||
return false;
|
||||
}
|
||||
if (U.factor_display_type == USER_FACTOR_AS_PERCENTAGE) {
|
||||
*r_value /= 100.0;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
static bool ui_number_from_string_percentage(bContext *C, const char *str, double *r_value)
|
||||
{
|
||||
int len = strlen(str);
|
||||
if (BLI_strn_endswith(str, "%", len)) {
|
||||
char *str_new = BLI_strdupn(str, len - 1);
|
||||
bool success = ui_number_from_string(C, str_new, r_value);
|
||||
MEM_freeN(str_new);
|
||||
return success;
|
||||
}
|
||||
else {
|
||||
return ui_number_from_string(C, str, r_value);
|
||||
}
|
||||
}
|
||||
|
||||
bool ui_but_string_set_eval_num(bContext *C, uiBut *but, const char *str, double *r_value)
|
||||
{
|
||||
bool ok = false;
|
||||
|
||||
#ifdef WITH_PYTHON
|
||||
|
||||
if (str[0] != '\0') {
|
||||
bool is_unit_but = (ui_but_is_float(but) && ui_but_is_unit(but));
|
||||
/* only enable verbose if we won't run again with units */
|
||||
if (BPY_execute_string_as_number(C, NULL, str, is_unit_but == false, r_value)) {
|
||||
/* if the value parsed ok without unit conversion
|
||||
* this button may still need a unit multiplier */
|
||||
if (is_unit_but) {
|
||||
char str_new[128];
|
||||
|
||||
BLI_snprintf(str_new, sizeof(str_new), "%f", *r_value);
|
||||
ok = ui_set_but_string_eval_num_unit(C, but, str_new, r_value);
|
||||
}
|
||||
else {
|
||||
ok = true; /* parse normal string via py (no unit conversion needed) */
|
||||
}
|
||||
}
|
||||
else if (is_unit_but) {
|
||||
/* parse failed, this is a unit but so run replacements and parse again */
|
||||
ok = ui_set_but_string_eval_num_unit(C, but, str, r_value);
|
||||
}
|
||||
if (str[0] == '\0') {
|
||||
*r_value = 0.0;
|
||||
return true;
|
||||
}
|
||||
|
||||
#else /* WITH_PYTHON */
|
||||
PropertySubType subtype = PROP_NONE;
|
||||
if (but->rnaprop) {
|
||||
subtype = RNA_property_subtype(but->rnaprop);
|
||||
}
|
||||
|
||||
*r_value = atof(str);
|
||||
ok = true;
|
||||
|
||||
UNUSED_VARS(C, but);
|
||||
|
||||
#endif /* WITH_PYTHON */
|
||||
|
||||
return ok;
|
||||
if (ui_but_is_float(but)) {
|
||||
if (ui_but_is_unit(but)) {
|
||||
return ui_set_but_string_eval_num_unit(C, but, str, r_value);
|
||||
}
|
||||
else if (subtype == PROP_FACTOR) {
|
||||
return ui_number_from_string_factor(C, str, r_value);
|
||||
}
|
||||
else if (subtype == PROP_PERCENTAGE) {
|
||||
return ui_number_from_string_percentage(C, str, r_value);
|
||||
}
|
||||
else {
|
||||
return ui_number_from_string(C, str, r_value);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return ui_number_from_string(C, str, r_value);
|
||||
}
|
||||
}
|
||||
|
||||
/* just the assignment/free part */
|
||||
|
@ -3094,6 +3145,16 @@ static void ui_but_build_drawstr_float(uiBut *but, double value)
|
|||
int prec = ui_but_calc_float_precision(but, value);
|
||||
STR_CONCATF(but->drawstr, slen, "%.*f px", prec, value);
|
||||
}
|
||||
else if (subtype == PROP_FACTOR) {
|
||||
int precision = ui_but_calc_float_precision(but, value);
|
||||
|
||||
if (U.factor_display_type == USER_FACTOR_AS_FACTOR) {
|
||||
STR_CONCATF(but->drawstr, slen, "%.*f", precision, value);
|
||||
}
|
||||
else {
|
||||
STR_CONCATF(but->drawstr, slen, "%.*f %%", MAX2(0, precision - 2), value * 100);
|
||||
}
|
||||
}
|
||||
else if (ui_but_is_unit(but)) {
|
||||
char new_str[sizeof(but->drawstr)];
|
||||
ui_get_but_string_unit(but, new_str, sizeof(new_str), value, true, -1);
|
||||
|
|
|
@ -757,7 +757,9 @@ typedef struct UserDef {
|
|||
/** #eMultiSample_Type, amount of samples for Grease Pencil. */
|
||||
short gpencil_multisamples;
|
||||
|
||||
char _pad5[4];
|
||||
char factor_display_type;
|
||||
|
||||
char _pad5[3];
|
||||
} UserDef;
|
||||
|
||||
/* from blenkernel blender.c */
|
||||
|
@ -1111,6 +1113,12 @@ typedef enum eOpensubdiv_Computee_Type {
|
|||
USER_OPENSUBDIV_COMPUTE_GLSL_COMPUTE = 6,
|
||||
} eOpensubdiv_Computee_Type;
|
||||
|
||||
/** #UserDef.factor_display_type */
|
||||
typedef enum eUserpref_FactorDisplay {
|
||||
USER_FACTOR_AS_FACTOR = 0,
|
||||
USER_FACTOR_AS_PERCENTAGE = 1,
|
||||
} eUserpref_FactorDisplay;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -3775,6 +3775,17 @@ static void rna_def_userdef_view(BlenderRNA *brna)
|
|||
"Show the frames per second screen refresh rate, while animation is played back");
|
||||
RNA_def_property_update(prop, 0, "rna_userdef_update");
|
||||
|
||||
static const EnumPropertyItem factor_display_items[] = {
|
||||
{USER_FACTOR_AS_FACTOR, "FACTOR", 0, "Factor", "Display factors as values between 0 and 1"},
|
||||
{USER_FACTOR_AS_PERCENTAGE, "PERCENTAGE", 0, "Percentage", "Display factors as percentages"},
|
||||
{0, NULL, 0, NULL, NULL},
|
||||
};
|
||||
|
||||
prop = RNA_def_property(srna, "factor_display_type", PROP_ENUM, PROP_NONE);
|
||||
RNA_def_property_enum_items(prop, factor_display_items);
|
||||
RNA_def_property_ui_text(prop, "Factor Display Type", "How factor values are displayed");
|
||||
RNA_def_property_update(prop, 0, "rna_userdef_update");
|
||||
|
||||
/* Weight Paint */
|
||||
|
||||
prop = RNA_def_property(srna, "use_weight_color_range", PROP_BOOLEAN, PROP_NONE);
|
||||
|
|
Loading…
Reference in New Issue