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

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


Commit: 8d838f02e2f2c0ce2870563044422a6974836bac
Author: Antony Riakiotakis
Date:   Fri Jun 6 02:17:07 2014 +0300
https://developer.blender.org/rB8d838f02e2f2c0ce2870563044422a6974836bac

Pie Menu goodies:

* Add right click cancel to pie menus.
* Add drag style timeout. If the button used to spawn the menu is
released before the time out then leftclick will be used to confirm the
menu.

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

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_regions.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 bc478ed..eea02d2 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -217,6 +217,10 @@ class USERPREF_PT_interface(Panel):
         sub.prop(view, "open_sublevel_delay", text="Sub Level")
 
         col.separator()
+        col.label(text="Pie Menus:")
+        col.prop(view, "pie_drag_timeout")
+        col.prop(view, "pie_initial_timeout")
+        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 0016c1c..d4e233e 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -8291,14 +8291,28 @@ static int ui_handle_menu_return_submenu(bContext *C, const wmEvent *event, uiPo
 }
 
 
+static void ui_pie_menu_apply (bContext *C, uiPopupBlockHandle *menu)
+{
+	uiBut *but = ui_but_find_activated(menu->region);
+
+	if (but) {
+		ui_apply_button(C, but->block, but, but->active, false);
+		button_activate_exit((bContext *)C, but, but->active, false, true);
+		menu->menuretval = UI_RETURN_OK;
+	}
+	else {
+		menu->menuretval = UI_RETURN_CANCEL;
+	}
+}
+
 /* two types of pie menus, one with operator + enum, other with regular callbacks */
 static int ui_handler_pie(bContext *C, const wmEvent *event, void *userdata)
 {
 	ARegion *ar;
 	uiBlock *block;
-	uiBut *but;
 	int mx, my;
 	uiPopupBlockHandle *menu = userdata;
+	double time_diff;
 
 	/* we block all events, this is modal interaction, except for drop events which is described below */
 	int retval = WM_UI_HANDLER_BREAK;
@@ -8319,56 +8333,54 @@ static int ui_handler_pie(bContext *C, const wmEvent *event, void *userdata)
 
 	ui_block_calculate_pie_segment(block, mx, my);
 
-	/* add menu scroll 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 */
-	if (menu->scrolltimer == NULL)
-		menu->scrolltimer =
-		        WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, MENU_SCROLL_INTERVAL);
+	/* 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;
 
-	switch (event->type) {
-		case MOUSEMOVE:
-			/* mouse move should always refresh the area for pie menus */
+	if (event->type == block->pie_data.event) {
+		if (event->val != KM_RELEASE) {
 			ui_handle_menu_button(C, event, menu);
-			ED_region_tag_redraw(ar);
-			break;
 
-		case TIMER:
-			if (event->customdata == menu->scrolltimer) {
-				ui_menu_scroll(ar, block, my, NULL);
+			/* why redraw here? It's simple, we are getting many double click events here.
+			 * Those operate like mouse move events almost */
+			ED_region_tag_redraw(ar);
+		}
+		else {
+			if (time_diff > U.pie_drag_timeout * 0.1) {
+				ui_pie_menu_apply(C, menu);
 			}
-			ui_handle_menu_button(C, event, menu);
-			break;
-
-		case LEFTMOUSE:
-			ui_handle_menu_button(C, event, menu);
-			menu->menuretval = 0;
-			break;
-
-		default:
-			if (event->type == block->pie_data.event) {
-				if (event->val != KM_RELEASE) {
-					ui_handle_menu_button(C, event, menu);
+			else {
+				menu->is_click_style = true;
+			}
+		}
+	}
+	else {
+		switch (event->type) {
+			case MOUSEMOVE:
+				/* mouse move should always refresh the area for pie menus */
+				ui_handle_menu_button(C, event, menu);
+				ED_region_tag_redraw(ar);
+				break;
 
-					ED_region_tag_redraw(ar);
+			case LEFTMOUSE:
+				if (menu->is_click_style) {
+					ui_pie_menu_apply(C, menu);
 				}
 				else {
-					but = ui_but_find_activated(ar);
-
-					if (but) {
-						ui_apply_button(C, but->block, but, but->active, false);
-						button_activate_exit((bContext *)C, but, but->active, false, true);
-						menu->menuretval = UI_RETURN_OK;
-					}
-					else {
-						menu->menuretval = UI_RETURN_CANCEL;
-					}
+					ui_handle_menu_button(C, event, menu);
+					menu->menuretval = 0;
 				}
-			}
-			else {
+				break;
+
+			case RIGHTMOUSE:
+				menu->menuretval = UI_RETURN_CANCEL;
+				break;
+
+			default:
 				ui_handle_menu_button(C, event, menu);
-			}
-			break;
+				break;
+		}
 	}
 
 	/* free if done, does not free handle itself */
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 29cb1ae..61f8ce8 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -488,6 +488,9 @@ struct uiPopupBlockHandle {
 	/* menu direction */
 	int direction;
 
+	/* pie menus */
+	bool is_click_style; /* button released before timeout, this is a click style menu */
+
 /* #ifdef USE_DRAG_POPUP */
 	bool is_grab;
 	int     grab_xy_prev[2];
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 56bcea6..fb2ef46 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -43,6 +43,8 @@
 #include "BLI_utildefines.h"
 #include "BLI_ghash.h"
 
+#include "PIL_time.h"
+
 #include "BKE_context.h"
 #include "BKE_screen.h"
 #include "BKE_report.h"
@@ -2511,6 +2513,7 @@ void uiPieMenuEnd(bContext *C, uiPieMenu *pie)
 
 	menu = ui_popup_block_create(C, NULL, NULL, NULL, ui_block_func_PIE, pie);
 	menu->popup = true;
+	menu->towardstime = PIL_check_seconds_timer();
 
 	/* change to pie version! */
 	UI_add_pie_handlers(C, &window->modalhandlers, menu);
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index 4f5670d..45b4dca 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -527,6 +527,11 @@ 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
+	                             * a drag/release pie menu */
+	int pie_initial_timeout;  /* direction in the pie menu will always be calculated from the initial position
+	                             * within this time limit */
+
 	struct WalkNavigation walk_navigation;
 } UserDef;
 
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index 7c101fb..9cf6550 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -3195,6 +3195,15 @@ static void rna_def_userdef_view(BlenderRNA *brna)
 	RNA_def_property_ui_text(prop, "Sub Level Menu Open Delay",
 	                         "Time delay in 1/10 seconds before automatically opening sub level menus");
 
+	/* 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_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_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, "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