RNA: display exact integer values without fraction if step is integer.

Display exact integer values of a floating point fields without
a fraction if the step is also an exact integer. This is intended
for cases when the value can technically be fractional, but most
commonly is supposed to be integer.

This handling is not applied if the field has any unit except frames,
because integer values aren't special for quantities like length.

The fraction is discarded in the normal display mode and when copying
the value to clipboard, but not when editing to remind the user that
the field allows fractions.

Differential Revision: https://developer.blender.org/D13753
This commit is contained in:
Alexander Gavrilov 2021-12-26 18:09:19 +03:00
parent 6952228386
commit 0d7b3ed39c
Notes: blender-bot 2023-09-13 04:07:41 +02:00
Referenced by issue #112309, python - max property precision is showing unused digits.
5 changed files with 54 additions and 7 deletions

View File

@ -661,8 +661,43 @@ static float ui_but_get_float_precision(uiBut *but)
return but->a2;
}
static float ui_but_get_float_step_size(uiBut *but)
{
if (but->type == UI_BTYPE_NUM) {
return ((uiButNumber *)but)->step_size;
}
return but->a1;
}
static bool ui_but_hide_fraction(uiBut *but, double value)
{
/* Hide the fraction if both the value and the step are exact integers. */
if (floor(value) == value) {
const float step = ui_but_get_float_step_size(but) * UI_PRECISION_FLOAT_SCALE;
if (floorf(step) == step) {
/* Don't hide if it has any unit except frame count. */
switch (UI_but_unit_type_get(but)) {
case PROP_UNIT_NONE:
case PROP_UNIT_TIME:
return true;
default:
return false;
}
}
}
return false;
}
static int ui_but_calc_float_precision(uiBut *but, double value)
{
if (ui_but_hide_fraction(but, value)) {
return 0;
}
int prec = (int)ui_but_get_float_precision(but);
/* first check for various special cases:
@ -2813,8 +2848,14 @@ void ui_but_string_get_ex(uiBut *but,
}
if (ui_but_is_float(but)) {
int prec = (float_precision == -1) ? ui_but_calc_float_precision(but, value) :
float_precision;
int prec = float_precision;
if (float_precision == -1) {
prec = ui_but_calc_float_precision(but, value);
}
else if (!use_exp_float && ui_but_hide_fraction(but, value)) {
prec = 0;
}
if (ui_but_is_unit(but)) {
ui_get_but_string_unit(but, str, maxlen, value, false, prec);

View File

@ -907,7 +907,7 @@ static void rna_def_action(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_float_sdna(prop, NULL, "frame_start");
RNA_def_property_float_funcs(prop, NULL, "rna_Action_start_frame_set", NULL);
RNA_def_property_ui_range(prop, MINFRAME, MAXFRAME, 100, 0);
RNA_def_property_ui_range(prop, MINFRAME, MAXFRAME, 100, 2);
RNA_def_property_ui_text(
prop, "Start Frame", "The start frame of the manually set intended playback range");
RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
@ -916,7 +916,7 @@ static void rna_def_action(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_float_sdna(prop, NULL, "frame_end");
RNA_def_property_float_funcs(prop, NULL, "rna_Action_end_frame_set", NULL);
RNA_def_property_ui_range(prop, MINFRAME, MAXFRAME, 100, 0);
RNA_def_property_ui_range(prop, MINFRAME, MAXFRAME, 100, 2);
RNA_def_property_ui_text(
prop, "End Frame", "The end frame of the manually set intended playback range");
RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);

View File

@ -3117,7 +3117,11 @@ static void rna_def_number_property(StructRNA *srna, PropertyType type)
prop = RNA_def_property(srna, "precision", PROP_INT, PROP_UNSIGNED);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_int_funcs(prop, "rna_FloatProperty_precision_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Precision", "Number of digits after the dot used by buttons");
RNA_def_property_ui_text(prop,
"Precision",
"Number of digits after the dot used by buttons. Fraction is "
"automatically hidden for exact integer values of fields with unit "
"'NONE' or 'TIME' (frame count) and step divisible by 100.");
}
}

View File

@ -672,7 +672,7 @@ static void rna_def_paint(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Cavity Mask", "Mask painting according to mesh geometry cavity");
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
prop = RNA_def_property(srna, "tile_offset", PROP_FLOAT, PROP_XYZ);
prop = RNA_def_property(srna, "tile_offset", PROP_FLOAT, PROP_XYZ_LENGTH);
RNA_def_property_float_sdna(prop, NULL, "tile_offset");
RNA_def_property_array(prop, 3);
RNA_def_property_range(prop, 0.01, FLT_MAX);

View File

@ -2609,7 +2609,9 @@ static int bpy_prop_arg_parse_tag_defines(PyObject *o, void *p)
" :type step: int\n"
#define BPY_PROPDEF_FLOAT_PREC_DOC \
" :arg precision: Maximum number of decimal digits to display, in [0, 6].\n" \
" :arg precision: Maximum number of decimal digits to display, in [0, 6]. Fraction is " \
"automatically hidden for exact integer values of fields with unit 'NONE' or 'TIME' (frame " \
"count) and step divisible by 100.\n" \
" :type precision: int\n"
#define BPY_PROPDEF_UPDATE_DOC \