Fix T46134: units degrees increment are too small
authorCampbell Barton <ideasman42@gmail.com>
Thu, 17 Sep 2015 11:50:40 +0000 (21:50 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 17 Sep 2015 12:09:18 +0000 (22:09 +1000)
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.

source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface.c
source/blender/editors/interface/interface_handlers.c
source/blender/editors/transform/transform_ops.c
source/blender/makesrna/intern/rna_define.c
source/blender/makesrna/intern/rna_modifier.c

index 5550c0651a65c4ceaa519a2b6563b2d3c8e30420..ba3e3a61aee9ff0a39395650511ee4aa775334d3 100644 (file)
@@ -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)
index e40e4f1a1dd9ddd67f119a17bd4ca452e8a48e57..5a70dc85530aee179621bd2fa69f5e66e0e6a6f5 100644 (file)
@@ -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;
index 995dc198cf3989bd94869b092b35993ce3acd8e8..fe5a503172569b6d0e31e266889ee44381cad63b 100644 (file)
@@ -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;
 
index 4c8eda447d492e83715c8c17a69bee154169dd08..c6d0d6cde2ea145c99b76957d3ed5582fd96988f 100644 (file)
@@ -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);
 }
index 95bd4bca8e66a766d9277780a9bc7315acb5066d..3b01305110ca39e1d7bcb338b36836f2a22b9701 100644 (file)
@@ -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;
 }
index ff8c4d027064214a46bee2a47017cd7c7300de3c..9a2dadcb7afe143f0bcc02f883eb94aaf7c69db9 100644 (file)
@@ -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");