[Bf-blender-cvs] [882e6de] pie-menus: Threshold value for pie menus.

Antony Riakiotakis noreply at git.blender.org
Wed Jun 11 18:52:48 CEST 2014


Commit: 882e6de2fa50424f6af8b211867ce5398faa7d4e
Author: Antony Riakiotakis
Date:   Wed Jun 11 19:35:56 2014 +0300
https://developer.blender.org/rB882e6de2fa50424f6af8b211867ce5398faa7d4e

Threshold value for pie menus.

Require at least a small (adjustable in user preferences) distance from
the center of the menu before a selection can be made. Default is 5
pixels.

===================================================================

M	release/scripts/startup/bl_ui/space_userpref.py
M	source/blender/editors/interface/interface_handlers.c
M	source/blender/editors/interface/interface_intern.h
M	source/blender/editors/interface/interface_widgets.c
M	source/blender/editors/interface/resources.c
M	source/blender/makesdna/DNA_userdef_types.h
M	source/blender/makesrna/intern/rna_userdef.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index fa96ea3..97f10d6 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -222,6 +222,7 @@ class USERPREF_PT_interface(Panel):
         sub.prop(view, "pie_drag_timeout")
         sub.prop(view, "pie_initial_timeout")
         sub.prop(view, "pie_menu_radius")
+        sub.prop(view, "pie_menu_threshold")
         col.separator()
         col.separator()
         col.separator()
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 8bdd4d1..48f3823 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -6247,6 +6247,9 @@ static bool ui_but_isect_pie_seg(uiBlock *block, uiBut *but)
 	float angle_pie;
 	float vec[2];
 
+	if (block->pie_data.flags & UI_PIE_INVALID_DIR)
+		return false;
+
 	switch (but->pie_dir) {
 		case UI_RADIAL_E:
 			angle_pie = 0.0;
@@ -7792,6 +7795,7 @@ static void ui_block_calculate_pie_segment(uiBlock *block, const float mx, const
 {
 	float seg1[2];
 	float seg2[2];
+	float len;
 
 	if (block->pie_data.flags & UI_PIE_INITIAL_DIRECTION) {
 		copy_v2_v2(seg1, block->pie_data.pie_center_init);
@@ -7803,7 +7807,13 @@ static void ui_block_calculate_pie_segment(uiBlock *block, const float mx, const
 	seg2[0] = mx - seg1[0];
 	seg2[1] = my - seg1[1];
 
-	normalize_v2_v2(block->pie_data.pie_dir, seg2);
+	len = normalize_v2_v2(block->pie_data.pie_dir, seg2);
+
+	/* ten pixels for now, a bit arbitrary */
+	if (len < U.pie_menu_threshold)
+		block->pie_data.flags |= UI_PIE_INVALID_DIR;
+	else
+		block->pie_data.flags &= ~UI_PIE_INVALID_DIR;
 }
 
 static int ui_handle_menu_event(
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 38dbe6c..7f5e01f 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -162,6 +162,7 @@ typedef enum RadialDirection {
 #define UI_PIE_DEGREES_RANGE_LARGE (1 << 0) /* pie menu item collision is detected at 90 degrees */
 #define UI_PIE_INITIAL_DIRECTION   (1 << 1) /* use initial center of pie menu to calculate direction */
 #define UI_PIE_3_ITEMS             (1 << 2) /* pie menu has only 3 items, careful when centering */
+#define UI_PIE_INVALID_DIR         (1 << 3) /* mouse not far enough from center position  */
 
 typedef struct uiLinkLine {  /* only for draw/edit */
 	struct uiLinkLine *next, *prev;
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 8fce9ce..c6087b4 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -3735,13 +3735,15 @@ void ui_draw_pie_center(uiBlock *block)
 	glColor4ubv((GLubyte *)btheme->tui.wcol_pie_menu.outline);
 	glutil_draw_lined_arc(0.0, (float)(M_PI * 2.0), pie_radius_internal, 40);
 
-	glColor4ub(255, 255, 0, btheme->tui.wcol_pie_menu.inner[3]);
-	glBegin(GL_TRIANGLE_FAN);
-	glVertex2f(pie_dir[0] * pie_radius_internal + pie_dir[1] * 5.0, pie_dir[1] * pie_radius_internal - pie_dir[0] * 5.0);
-	glVertex2f(pie_dir[0] * (pie_radius_internal - 10.0f), pie_dir[1] * (pie_radius_internal - 10.0f));
-	glVertex2f(pie_dir[0] * pie_radius_internal - pie_dir[1] * 5.0, pie_dir[1] * pie_radius_internal + pie_dir[0] * 5.0);
-	glVertex2f(pie_dir[0] * (pie_radius_internal + 10.0f), pie_dir[1] * (pie_radius_internal + 10.0f));
-	glEnd();
+	if (!(block->pie_data.flags & UI_PIE_INVALID_DIR)) {
+		glColor4ub(255, 255, 0, btheme->tui.wcol_pie_menu.inner[3]);
+		glBegin(GL_TRIANGLE_FAN);
+		glVertex2f(pie_dir[0] * pie_radius_internal + pie_dir[1] * 5.0, pie_dir[1] * pie_radius_internal - pie_dir[0] * 5.0);
+		glVertex2f(pie_dir[0] * (pie_radius_internal - 10.0f), pie_dir[1] * (pie_radius_internal - 10.0f));
+		glVertex2f(pie_dir[0] * pie_radius_internal - pie_dir[1] * 5.0, pie_dir[1] * pie_radius_internal + pie_dir[0] * 5.0);
+		glVertex2f(pie_dir[0] * (pie_radius_internal + 10.0f), pie_dir[1] * (pie_radius_internal + 10.0f));
+		glEnd();
+	}
 
 	glDisable(GL_BLEND);
 	glPopMatrix();
diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c
index 2d2f6f2..6955b1f 100644
--- a/source/blender/editors/interface/resources.c
+++ b/source/blender/editors/interface/resources.c
@@ -2446,15 +2446,17 @@ void init_userdef_do_versions(void)
 			10, -10
 		};
 
+		if (U.pie_menu_radius == 0)
+			U.pie_menu_radius = 150;
+
+		if (U.pie_menu_threshold == 0)
+			U.pie_menu_threshold = 5;
 
 		for (btheme = U.themes.first; btheme; btheme = btheme->next) {
 			btheme->tui.wcol_pie_menu = wcol_pie_menu;
 		}
 	}
 
-	if (U.pie_menu_radius == 0)
-		U.pie_menu_radius = 150;
-
 	if (U.pixelsize == 0.0f)
 		U.pixelsize = 1.0f;
 	
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index 09016c5..6e652ac 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -532,7 +532,8 @@ typedef struct UserDef {
 	short pie_initial_timeout;  /* direction in the pie menu will always be calculated from the initial position
 	                             * within this time limit */
 
-	int pie_menu_radius;        /* pie menu radius */
+	short pie_menu_radius;        /* pie menu radius */
+	short pie_menu_threshold;     /* pie menu distance from center before a direction is set */
 
 	struct WalkNavigation walk_navigation;
 } UserDef;
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index 4e32133..baa7cd5 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -3214,6 +3214,10 @@ static void rna_def_userdef_view(BlenderRNA *brna)
 	RNA_def_property_range(prop, 0, 1000);
 	RNA_def_property_ui_text(prop, "Radius", "Pie menu size in pixels");
 
+	prop = RNA_def_property(srna, "pie_menu_threshold", PROP_INT, PROP_PIXEL);
+	RNA_def_property_range(prop, 0, 1000);
+	RNA_def_property_ui_text(prop, "Threshold", "Distance from center needed before a selection can be made");
+
 	prop = RNA_def_property(srna, "use_quit_dialog", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_QUIT_PROMPT);
 	RNA_def_property_ui_text(prop, "Prompt Quit",




More information about the Bf-blender-cvs mailing list