Fix T46134: units degrees increment are too small
The user interface was ignoring the precision step size for degrees, making all rotation inputs drag by a 100th of a degree. Now use a 10th of a degree instead.
This commit is contained in:
parent
209ca1e746
commit
c4bcb6a479
Notes:
blender-bot
2023-02-14 08:39:22 +01:00
Referenced by issue #46134, units degrees increment changes are too small
|
@ -1040,6 +1040,8 @@ void UI_butstore_unregister(uiButStore *bs_handle, uiBut **but_p);
|
|||
|
||||
/* Float precision helpers */
|
||||
#define UI_PRECISION_FLOAT_MAX 7
|
||||
/* For float buttons the 'step' (or a1), is scaled */
|
||||
#define UI_PRECISION_FLOAT_SCALE 0.01f
|
||||
|
||||
/* Typical UI text */
|
||||
#define UI_FSTYLE_WIDGET (const uiFontStyle *)&(UI_style_get()->widget)
|
||||
|
|
|
@ -2087,14 +2087,32 @@ static void ui_get_but_string_unit(uiBut *but, char *str, int len_max, double va
|
|||
static float ui_get_but_step_unit(uiBut *but, float step_default)
|
||||
{
|
||||
int unit_type = RNA_SUBTYPE_UNIT_VALUE(UI_but_unit_type_get(but));
|
||||
double step;
|
||||
|
||||
step = bUnit_ClosestScalar(ui_get_but_scale_unit(but, step_default), but->block->unit->system, unit_type);
|
||||
const double step_orig = step_default * UI_PRECISION_FLOAT_SCALE;
|
||||
/* Scaling up 'step_origg ' here is a bit arbitrary, its just giving better scales from user POV */
|
||||
const double scale_step = ui_get_but_scale_unit(but, step_orig * 10);
|
||||
const double step = bUnit_ClosestScalar(scale_step, but->block->unit->system, unit_type);
|
||||
|
||||
/* -1 is an error value */
|
||||
if (step != -1.0) {
|
||||
const double scale_unit = ui_get_but_scale_unit(but, 1.0);
|
||||
const double step_unit = bUnit_ClosestScalar(scale_unit, but->block->unit->system, unit_type);
|
||||
double step_final;
|
||||
|
||||
BLI_assert(step > 0.0);
|
||||
return (float)(step / ui_get_but_scale_unit(but, 1.0));
|
||||
|
||||
step_final = (step / scale_unit) / UI_PRECISION_FLOAT_SCALE;
|
||||
|
||||
if (step == step_unit) {
|
||||
/* Logic here is to scale by the original 'step_orig'
|
||||
* only when the unit step matches the scaled step.
|
||||
*
|
||||
* This is needed for units that don't have a wide range of scales (degrees for eg.).
|
||||
* Without this we can't select between a single degree, or a 10th of a degree.
|
||||
*/
|
||||
step_final *= step_orig;
|
||||
}
|
||||
|
||||
return (float)step_final;
|
||||
}
|
||||
else {
|
||||
return step_default;
|
||||
|
|
|
@ -4291,7 +4291,7 @@ static int ui_do_but_NUM(bContext *C, uiBlock *block, uiBut *but, uiHandleButton
|
|||
if (mx < (but->rect.xmin + handlewidth)) {
|
||||
button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
|
||||
|
||||
tempf = (float)data->value - 0.01f * but->a1;
|
||||
tempf = (float)data->value - (UI_PRECISION_FLOAT_SCALE * but->a1);
|
||||
if (tempf < softmin) tempf = softmin;
|
||||
data->value = tempf;
|
||||
|
||||
|
@ -4300,7 +4300,7 @@ static int ui_do_but_NUM(bContext *C, uiBlock *block, uiBut *but, uiHandleButton
|
|||
else if (mx > but->rect.xmax - handlewidth) {
|
||||
button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
|
||||
|
||||
tempf = (float)data->value + 0.01f * but->a1;
|
||||
tempf = (float)data->value + (UI_PRECISION_FLOAT_SCALE * but->a1);
|
||||
if (tempf > softmax) tempf = softmax;
|
||||
data->value = tempf;
|
||||
|
||||
|
|
|
@ -643,8 +643,6 @@ static void TRANSFORM_OT_skin_resize(struct wmOperatorType *ot)
|
|||
|
||||
static void TRANSFORM_OT_trackball(struct wmOperatorType *ot)
|
||||
{
|
||||
PropertyRNA *prop;
|
||||
|
||||
/* identifiers */
|
||||
ot->name = "Trackball";
|
||||
ot->description = "Trackball style rotation of selected items";
|
||||
|
@ -659,16 +657,13 @@ static void TRANSFORM_OT_trackball(struct wmOperatorType *ot)
|
|||
ot->poll = ED_operator_screenactive;
|
||||
|
||||
/* Maybe we could use float_vector_xyz here too? */
|
||||
prop = RNA_def_float_vector(ot->srna, "value", 2, NULL, -FLT_MAX, FLT_MAX, "Angle", "", -FLT_MAX, FLT_MAX);
|
||||
RNA_def_property_subtype(prop, PROP_ANGLE);
|
||||
RNA_def_float_rotation(ot->srna, "value", 2, NULL, -FLT_MAX, FLT_MAX, "Angle", "", -FLT_MAX, FLT_MAX);
|
||||
|
||||
Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP | P_GPENCIL_EDIT);
|
||||
}
|
||||
|
||||
static void TRANSFORM_OT_rotate(struct wmOperatorType *ot)
|
||||
{
|
||||
PropertyRNA *prop;
|
||||
|
||||
/* identifiers */
|
||||
ot->name = "Rotate";
|
||||
ot->description = "Rotate selected items";
|
||||
|
@ -682,8 +677,7 @@ static void TRANSFORM_OT_rotate(struct wmOperatorType *ot)
|
|||
ot->cancel = transform_cancel;
|
||||
ot->poll = ED_operator_screenactive;
|
||||
|
||||
prop = RNA_def_float(ot->srna, "value", 0.0f, -FLT_MAX, FLT_MAX, "Angle", "", -M_PI * 2, M_PI * 2);
|
||||
RNA_def_property_subtype(prop, PROP_ANGLE);
|
||||
RNA_def_float_rotation(ot->srna, "value", 0, NULL, -FLT_MAX, FLT_MAX, "Angle", "", -M_PI * 2, M_PI * 2);
|
||||
|
||||
Transform_Properties(ot, P_AXIS | P_CONSTRAINT | P_PROPORTIONAL | P_MIRROR | P_GEO_SNAP | P_GPENCIL_EDIT);
|
||||
}
|
||||
|
|
|
@ -1314,8 +1314,10 @@ void RNA_def_property_ui_icon(PropertyRNA *prop, int icon, bool consecutive)
|
|||
/**
|
||||
* The values hare are a little confusing:
|
||||
*
|
||||
* \param step For floats this is (step / 100), why /100? - nobody knows.
|
||||
* for int's, whole values are used.
|
||||
* \param step: Used as the value to increase/decrease when clicking on number buttons,
|
||||
* \as well as scaling mouse input for click-dragging number buttons.
|
||||
* For floats this is (step * UI_PRECISION_FLOAT_SCALE), why? - nobody knows.
|
||||
* For ints, whole values are used.
|
||||
*
|
||||
* \param precision The number of zeros to show
|
||||
* (as a whole number - common range is 1 - 6), see PRECISION_FLOAT_MAX
|
||||
|
@ -2857,7 +2859,7 @@ PropertyRNA *RNA_def_float_rotation(StructOrFunctionRNA *cont_, const char *iden
|
|||
|
||||
ASSERT_SOFT_HARD_LIMITS;
|
||||
|
||||
prop = RNA_def_property(cont, identifier, PROP_FLOAT, (len != 0) ? PROP_EULER : PROP_ANGLE);
|
||||
prop = RNA_def_property(cont, identifier, PROP_FLOAT, (len >= 3) ? PROP_EULER : PROP_ANGLE);
|
||||
if (len != 0) {
|
||||
RNA_def_property_array(prop, len);
|
||||
if (default_value) RNA_def_property_float_array_default(prop, default_value);
|
||||
|
@ -2868,7 +2870,7 @@ PropertyRNA *RNA_def_float_rotation(StructOrFunctionRNA *cont_, const char *iden
|
|||
}
|
||||
if (hardmin != hardmax) RNA_def_property_range(prop, hardmin, hardmax);
|
||||
RNA_def_property_ui_text(prop, ui_name, ui_description);
|
||||
RNA_def_property_ui_range(prop, softmin, softmax, 1, 3);
|
||||
RNA_def_property_ui_range(prop, softmin, softmax, 10, 3);
|
||||
|
||||
return prop;
|
||||
}
|
||||
|
|
|
@ -1964,7 +1964,7 @@ static void rna_def_modifier_edgesplit(BlenderRNA *brna)
|
|||
|
||||
prop = RNA_def_property(srna, "split_angle", PROP_FLOAT, PROP_ANGLE);
|
||||
RNA_def_property_range(prop, 0.0f, DEG2RADF(180.0f));
|
||||
RNA_def_property_ui_range(prop, 0.0f, DEG2RADF(180.0f), 100, 2);
|
||||
RNA_def_property_ui_range(prop, 0.0f, DEG2RADF(180.0f), 10, 2);
|
||||
RNA_def_property_ui_text(prop, "Split Angle", "Angle above which to split edges");
|
||||
RNA_def_property_update(prop, 0, "rna_Modifier_update");
|
||||
|
||||
|
|
Loading…
Reference in New Issue