[Bf-blender-cvs] [4349505] pie-menus: Pie Menu goodies

Antony Riakiotakis noreply at git.blender.org
Fri Jun 6 02:08:08 CEST 2014


Commit: 4349505c6e5e1f29b2158947f64a3af88ff09337
Author: Antony Riakiotakis
Date:   Fri Jun 6 03:07:49 2014 +0300
https://developer.blender.org/rB4349505c6e5e1f29b2158947f64a3af88ff09337

Pie Menu goodies

* Support custom pie menu radius
* Recenter timeout: This feature makes it so whenever user activates the
pie menu at the edge of the current screen, the code still uses the
initial mouse position to calculate the drag direction for a certain
timeout.

The recenter and drag timeout feature were directly infuenced by the pie
menu add-on by Dan Eicher, Sean Olson and Patrick Moore. Thanks a lot!

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

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_layout.c
M	source/blender/editors/interface/interface_regions.c
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 eea02d2..ffc2218 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -220,6 +220,7 @@ class USERPREF_PT_interface(Panel):
         col.label(text="Pie Menus:")
         col.prop(view, "pie_drag_timeout")
         col.prop(view, "pie_initial_timeout")
+        col.prop(view, "pie_menu_radius")
         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 d4e233e..0abb405 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -7781,8 +7781,13 @@ static void ui_block_calculate_pie_segment(uiBlock *block, const float mx, const
 	float seg1[2];
 	float seg2[2];
 
-	seg1[0] = BLI_rctf_cent_x(&block->rect);
-	seg1[1] = BLI_rctf_cent_y(&block->rect);
+	if (block->pie_data.flags & UI_PIE_INITIAL_DIRECTION) {
+		copy_v2_v2(seg1, block->pie_data.pie_center_init);
+	}
+	else {
+		seg1[0] = BLI_rctf_cent_x(&block->rect);
+		seg1[1] = BLI_rctf_cent_y(&block->rect);
+	}
 
 	seg2[0] = mx - seg1[0];
 	seg2[1] = my - seg1[1];
@@ -8326,6 +8331,18 @@ static int ui_handler_pie(bContext *C, const wmEvent *event, void *userdata)
 	ar = menu->region;
 	block = ar->uiblocks.first;
 
+	/* add menu timer, this is used to evaluate the time that is needed for
+	 * calculating collision from final/initial position or if pie menu is drag-style
+	 * or press and release style */
+	time_diff = PIL_check_seconds_timer() - menu->towardstime;
+
+	/* deactivate initial direction after a while */
+	if (time_diff > 0.1 * U.pie_initial_timeout) {
+		block->pie_data.flags &= ~UI_PIE_INITIAL_DIRECTION;
+		/* force redraw */
+		ED_region_tag_redraw(ar);
+	}
+
 	mx = event->x;
 	my = event->y;
 
@@ -8333,11 +8350,6 @@ static int ui_handler_pie(bContext *C, const wmEvent *event, void *userdata)
 
 	ui_block_calculate_pie_segment(block, mx, my);
 
-	/* add menu timer, this is used to evaluate the time that is needed for
-	 * calculating collision from final/initial position or if pie menu is drag-style
-	 * or press and release style */
-	time_diff = PIL_check_seconds_timer() - menu->towardstime;
-
 	if (event->type == block->pie_data.event) {
 		if (event->val != KM_RELEASE) {
 			ui_handle_menu_button(C, event, menu);
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 61f8ce8..97609a6 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -160,7 +160,7 @@ typedef enum RadialDirection {
 
 /* PieMenuData->flags */
 #define UI_PIE_DEGREES_RANGE_LARGE (1 << 0) /* pie menu item collision is detected at 90 degrees */
-#define UI_PIE_VALID_DIRECTION     (1 << 1) /* pie menu direction has been initialized */
+#define UI_PIE_INITIAL_DIRECTION     (1 << 1) /* use initial center of pie menu to calculate direction */
 
 typedef struct uiLinkLine {  /* only for draw/edit */
 	struct uiLinkLine *next, *prev;
@@ -294,6 +294,7 @@ struct uiBut {
 struct PieMenuData {
 	int num_pie_items; /* number of pie items, useful to determine collision based on how pie items are distributed */
 	float pie_dir[2];
+	float pie_center_init[2];
 	int flags;
 	int event; /* initial event used to fire the pie menu, store here so we can query for release */
 };
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index ecb8852..516a007 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -2237,7 +2237,7 @@ static void ui_litem_layout_radial(uiLayout *litem)
 	 * also the old code at http://developer.blender.org/T5103
 	 */
 
-	int pie_radius = 150;
+	int pie_radius = U.pie_menu_radius;
 
 	x = litem->x;
 	y = litem->y;
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index fb2ef46..7008a55 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -1597,8 +1597,13 @@ uiPopupBlockHandle *ui_popup_block_create(bContext *C, ARegion *butregion, uiBut
 			if (block->rect.ymin < 0 ) y_offset -= block->rect.ymin;
 			if (block->rect.ymax > ar_h) y_offset += ar_h - block->rect.ymax;
 
-			if ((x_offset != 0) || (y_offset != 0))
+			/* if we are offsetting set up initial data for timeout functionality */
+			if ((x_offset != 0) || (y_offset != 0)) {
+				block->pie_data.pie_center_init[0] = BLI_rctf_cent_x(&block->rect);
+				block->pie_data.pie_center_init[1] = BLI_rctf_cent_y(&block->rect);
 				ui_block_translate(block, x_offset, y_offset);
+				block->pie_data.flags |= UI_PIE_INITIAL_DIRECTION;
+			}
 		}
 	}
 	else {
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 6a0217e..38ec50f 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -3676,6 +3676,7 @@ void ui_draw_pie_center(uiBlock *block)
 	bTheme *btheme = UI_GetTheme();
 	float cx = BLI_rctf_cent_x(&block->rect);
 	float cy = BLI_rctf_cent_y(&block->rect);
+
 	float *pie_dir = block->pie_data.pie_dir;
 
 	float pie_radius_internal = UI_UNIT_Y;
diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c
index daf28bc..77c3445 100644
--- a/source/blender/editors/interface/resources.c
+++ b/source/blender/editors/interface/resources.c
@@ -2430,6 +2430,9 @@ void init_userdef_do_versions(void)
 		}
 	}
 
+	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 45b4dca..66f0b89 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -527,11 +527,13 @@ typedef struct UserDef {
 	float fcu_inactive_alpha;	/* opacity of inactive F-Curves in F-Curve Editor */
 	float pixelsize;			/* private, set by GHOST, to multiply DPI with */
 
-	int pie_drag_timeout;     /* if keeping a pie menu spawn button pressed after this time, it turns into
+	short pie_drag_timeout;     /* if keeping a pie menu spawn button pressed after this time, it turns into
 	                             * a drag/release pie menu */
-	int pie_initial_timeout;  /* direction in the pie menu will always be calculated from the initial position
+	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 */
+
 	struct WalkNavigation walk_navigation;
 } UserDef;
 
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index 9cf6550..e55c02e 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -3197,13 +3197,17 @@ static void rna_def_userdef_view(BlenderRNA *brna)
 
 	/* pie menus */
 	prop = RNA_def_property(srna, "pie_drag_timeout", PROP_INT, PROP_NONE);
-	RNA_def_property_range(prop, 0.00f, 40.0f);
+	RNA_def_property_range(prop, 0, 100);
 	RNA_def_property_ui_text(prop, "Drag Timeout", "Pie Menus turn to drag style after this amount of time (in  1/10ths of sec)");
 
 	prop = RNA_def_property(srna, "pie_initial_timeout", PROP_INT, PROP_NONE);
-	RNA_def_property_range(prop, 0.00f, 40.0f);
+	RNA_def_property_range(prop, 0, 100);
 	RNA_def_property_ui_text(prop, "Recenter Timeout", "Pie Menus will use the mouse position as center for this amount of time (in  1/10ths of sec)");
 
+	prop = RNA_def_property(srna, "pie_menu_radius", PROP_INT, PROP_NONE);
+	RNA_def_property_range(prop, 0, 1000);
+	RNA_def_property_ui_text(prop, "Radius", "Pie Menus will use the mouse position as center for this amount of time (in  1/10ths of sec)");
+
 	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