UI: use proportional option while dragging buttons
authorCampbell Barton <ideasman42@gmail.com>
Sat, 8 Feb 2014 21:42:45 +0000 (08:42 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Sat, 8 Feb 2014 21:42:45 +0000 (08:42 +1100)
12 files changed:
source/blender/editors/interface/interface_handlers.c
source/blender/makesrna/intern/rna_curve.c
source/blender/makesrna/intern/rna_image.c
source/blender/makesrna/intern/rna_linestyle.c
source/blender/makesrna/intern/rna_mesh.c
source/blender/makesrna/intern/rna_meta.c
source/blender/makesrna/intern/rna_modifier.c
source/blender/makesrna/intern/rna_nodetree.c
source/blender/makesrna/intern/rna_object.c
source/blender/makesrna/intern/rna_pose.c
source/blender/makesrna/intern/rna_scene.c
source/blender/makesrna/intern/rna_texture.c

index f189af751b41432dd541a793c474853e30af2bfd..5c5db59fcd921ca5e60483ddde29958713fa2f84 100644 (file)
@@ -176,6 +176,8 @@ typedef struct uiHandleButtonMulti {
        LinkNode *mbuts;
        uiButStore *bs_mbuts;
 
+       bool is_proportional;
+
        /* before activating, we need to check gesture direction
         * accumulate signed cursor movement here so we can tell if this is a vertical motion or not. */
        float drag_dir[2];
@@ -937,12 +939,22 @@ static void ui_multibut_states_create(uiBut *but_active, uiHandleButtonData *dat
                        ui_multibut_add(data, but);
                }
        }
+
+       /* edit buttons proportionally to eachother
+        * note: if we mix buttons which are proportional and others which are not,
+        * this may work a bit strangely */
+       if (but_active->rnaprop) {
+               if ((data->origvalue != 0.0) && (RNA_property_flag(but_active->rnaprop) & PROP_PROPORTIONAL)) {
+                       data->multi_data.is_proportional = true;
+               }
+       }
 }
 
 static void ui_multibut_states_apply(bContext *C, uiHandleButtonData *data, uiBlock *block)
 {
        ARegion *ar = data->region;
        const double value_delta = data->value - data->origvalue;
+       const double value_scale = data->multi_data.is_proportional ? (data->value / data->origvalue) : 0.0;
        uiBut *but;
 
        BLI_assert(data->multi_data.init == BUTTON_MULTI_INIT_ENABLE);
@@ -965,7 +977,12 @@ static void ui_multibut_states_apply(bContext *C, uiHandleButtonData *data, uiBl
                                }
                                else {
                                        /* dragging (use delta) */
-                                       but->active->value = mbut_state->origvalue + value_delta;
+                                       if (data->multi_data.is_proportional) {
+                                               but->active->value = mbut_state->origvalue * value_scale;
+                                       }
+                                       else {
+                                               but->active->value = mbut_state->origvalue + value_delta;
+                                       }
                                }
                                ui_button_execute_end(C, ar, but, active_back);
                        }
index 8bcd5888b2edee6f46d097f46eef11915f6c4c37..ff2d69ca05e1339881182b3e5e66b9a5591733c7 100644 (file)
@@ -1465,6 +1465,7 @@ static void rna_def_curve(BlenderRNA *brna)
        
        prop = RNA_def_property(srna, "texspace_size", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_array(prop, 3);
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_ui_text(prop, "Texture Space Size", "Texture space size");
        RNA_def_property_editable_func(prop, "rna_Curve_texspace_editable");
        RNA_def_property_float_funcs(prop, "rna_Curve_texspace_size_get", "rna_Curve_texspace_size_set", NULL);
index 407c5571b4c20a047ecb0445cce64ab623bd13a4..99f427a9ab6bd204f3d2f656b3fd143db6768dc4 100644 (file)
@@ -569,6 +569,7 @@ static void rna_def_image(BlenderRNA *brna)
        
        prop = RNA_def_property(srna, "generated_width", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "gen_x");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_range(prop, 1, 65536);
        RNA_def_property_ui_text(prop, "Generated Width", "Generated image width");
        RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_Image_generated_update");
@@ -576,6 +577,7 @@ static void rna_def_image(BlenderRNA *brna)
        
        prop = RNA_def_property(srna, "generated_height", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "gen_y");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_range(prop, 1, 65536);
        RNA_def_property_ui_text(prop, "Generated Height", "Generated image height");
        RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_Image_generated_update");
index 03319a9ccf8614aae7e92f10df5b2d6a07ef4271..e03a3352bac9a38a82c4e100562f988bb3eb466d 100644 (file)
@@ -848,11 +848,13 @@ static void rna_def_linestyle_modifiers(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "scale_x", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "scale_x");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_ui_text(prop, "Scale X", "Scaling factor that is applied along the X axis");
        RNA_def_property_update(prop, NC_LINESTYLE, NULL);
 
        prop = RNA_def_property(srna, "scale_y", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "scale_y");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_ui_text(prop, "Scale Y", "Scaling factor that is applied along the Y axis");
        RNA_def_property_update(prop, NC_LINESTYLE, NULL);
 
index 6e1b39e9ea75e536287a7af77d1a60633b687300..5d4f3e68d5b308a7a6df2068d9fd45c5c775cd0e 100644 (file)
@@ -2486,6 +2486,7 @@ void rna_def_texmat_common(StructRNA *srna, const char *texspace_editable)
 
        prop = RNA_def_property(srna, "texspace_size", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_float_sdna(prop, NULL, "size");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_ui_text(prop, "Texture Space Size", "Texture space size");
        RNA_def_property_float_funcs(prop, "rna_Mesh_texspace_size_get", NULL, NULL);
        RNA_def_property_editable_func(prop, texspace_editable);
index 6bf7c8926e8c9993f6261bd2854c0d42ef9db2ed..2627e6285380edfd48d195d9ca469d64ec886230 100644 (file)
@@ -219,18 +219,21 @@ static void rna_def_metaelement(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "size_x", PROP_FLOAT, PROP_DISTANCE);
        RNA_def_property_float_sdna(prop, NULL, "expx");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_range(prop, 0.0f, 20.0f);
        RNA_def_property_ui_text(prop, "Size X", "Size of element, use of components depends on element type");
        RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
 
        prop = RNA_def_property(srna, "size_y", PROP_FLOAT, PROP_DISTANCE);
        RNA_def_property_float_sdna(prop, NULL, "expy");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_range(prop, 0.0f, 20.0f);
        RNA_def_property_ui_text(prop, "Size Y", "Size of element, use of components depends on element type");
        RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
 
        prop = RNA_def_property(srna, "size_z", PROP_FLOAT, PROP_DISTANCE);
        RNA_def_property_float_sdna(prop, NULL, "expz");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_range(prop, 0.0f, 20.0f);
        RNA_def_property_ui_text(prop, "Size Z", "Size of element, use of components depends on element type");
        RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
@@ -353,6 +356,7 @@ static void rna_def_metaball(BlenderRNA *brna)
        
        prop = RNA_def_property(srna, "texspace_size", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_array(prop, 3);
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_ui_text(prop, "Texture Space Size", "Texture space size");
        RNA_def_property_editable_func(prop, "rna_Meta_texspace_editable");
        RNA_def_property_float_funcs(prop, "rna_Meta_texspace_size_get", "rna_Meta_texspace_size_set", NULL);
index f175d609026dbbc6a919767c2880be4346a56b5a..91b522032aefeb7e08a3fdeb73bec0a133e82e8a 100644 (file)
@@ -1756,6 +1756,7 @@ static void rna_def_modifier_uvproject(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "aspect_x", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "aspectx");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_range(prop, 1, FLT_MAX);
        RNA_def_property_ui_range(prop, 1, 1000, 1, 3);
        RNA_def_property_ui_text(prop, "Horizontal Aspect Ratio", "");
@@ -1763,6 +1764,7 @@ static void rna_def_modifier_uvproject(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "aspect_y", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "aspecty");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_range(prop, 1, FLT_MAX);
        RNA_def_property_ui_range(prop, 1, 1000, 1, 3);
        RNA_def_property_ui_text(prop, "Vertical Aspect Ratio", "");
@@ -1770,6 +1772,7 @@ static void rna_def_modifier_uvproject(BlenderRNA *brna)
        
        prop = RNA_def_property(srna, "scale_x", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "scalex");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_range(prop, 0, FLT_MAX);
        RNA_def_property_ui_range(prop, 0, 1000, 1, 3);
        RNA_def_property_ui_text(prop, "Horizontal Scale", "");
@@ -1777,6 +1780,7 @@ static void rna_def_modifier_uvproject(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "scale_y", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "scaley");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_range(prop, 0, FLT_MAX);
        RNA_def_property_ui_range(prop, 0, 1000, 1, 3);
        RNA_def_property_ui_text(prop, "Vertical Scale", "");
index 63a51071c565cb272788509290f7cc75b10fd792..57713e7a037711e458c1cc584e9400d999598397 100644 (file)
@@ -3232,6 +3232,7 @@ static void def_sh_mapping(StructRNA *srna)
        
        prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_float_sdna(prop, NULL, "size");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_ui_text(prop, "Scale", "");
        RNA_def_property_update(prop, 0, "rna_Mapping_Node_update");
        
index c8ade9366fb1315350247208cef7b0dc1d2045f1..066b6f6654e2ad2db4d9c1c15eb49a1dedd6a2f5 100644 (file)
@@ -2300,6 +2300,7 @@ static void rna_def_object(BlenderRNA *brna)
        
        prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_float_sdna(prop, NULL, "size");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_editable_array_func(prop, "rna_Object_scale_editable");
        RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, 3);
        RNA_def_property_float_array_default(prop, default_scale);
@@ -2346,6 +2347,7 @@ static void rna_def_object(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "delta_scale", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_float_sdna(prop, NULL, "dscale");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, 3);
        RNA_def_property_float_array_default(prop, default_scale);
        RNA_def_property_ui_text(prop, "Delta Scale", "Extra scaling added to the scale of the object");
index 4ece8a25e73b70eb9326c6b8fe8ed272d5b061cc..4050b9b2df3e4f3c7fb9a1067e7b2b74964d8fb5 100644 (file)
@@ -797,6 +797,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_float_sdna(prop, NULL, "size");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_editable_array_func(prop, "rna_PoseChannel_scale_editable");
        RNA_def_property_float_array_default(prop, default_scale);
        RNA_def_property_ui_text(prop, "Scale", "");
index 07ab0d906fd8e10274b9db020f5073736399e1dc..939eceed6475d2658f8237637482db47429183bf 100644 (file)
@@ -4152,6 +4152,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "resolution_x", PROP_INT, PROP_PIXEL);
        RNA_def_property_int_sdna(prop, NULL, "xsch");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_range(prop, 4, 65536);
        RNA_def_property_ui_text(prop, "Resolution X", "Number of horizontal pixels in the rendered image");
@@ -4159,6 +4160,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
        
        prop = RNA_def_property(srna, "resolution_y", PROP_INT, PROP_PIXEL);
        RNA_def_property_int_sdna(prop, NULL, "ysch");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_range(prop, 4, 65536);
        RNA_def_property_ui_text(prop, "Resolution Y", "Number of vertical pixels in the rendered image");
@@ -4188,6 +4190,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
        
        prop = RNA_def_property(srna, "pixel_aspect_x", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "xasp");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_range(prop, 1.0f, 200.0f);
        RNA_def_property_ui_text(prop, "Pixel Aspect X",
@@ -4196,6 +4199,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
        
        prop = RNA_def_property(srna, "pixel_aspect_y", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "yasp");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_range(prop, 1.0f, 200.0f);
        RNA_def_property_ui_text(prop, "Pixel Aspect Y",
index b0e1ed04790a3bdcf77d3c9b961756cc1493ee33..0d327d6da0a8a2287b0e613a9cbff71fc4436a0d 100644 (file)
@@ -538,6 +538,7 @@ static void rna_def_texmapping(BlenderRNA *brna)
        
        prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_float_sdna(prop, NULL, "size");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_ui_text(prop, "Scale", "");
        RNA_def_property_update(prop, 0, "rna_Texture_mapping_update");
        
@@ -674,6 +675,7 @@ static void rna_def_mtex(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_float_sdna(prop, NULL, "size");
+       RNA_def_property_flag(prop, PROP_PROPORTIONAL);
        RNA_def_property_ui_range(prop, -100, 100, 10, 2);
        RNA_def_property_ui_text(prop, "Size", "Set scaling for the texture's X, Y and Z sizes");
        RNA_def_property_update(prop, 0, "rna_TextureSlot_brush_update");