[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