[Bf-blender-cvs] [84b7035] pie-menus: Pie menus:

Antony Riakiotakis noreply at git.blender.org
Fri Jul 25 15:06:30 CEST 2014


Commit: 84b70352270af03c1384f50e2c414f6ba87db853
Author: Antony Riakiotakis
Date:   Fri Jul 25 15:06:15 2014 +0200
Branches: pie-menus
https://developer.blender.org/rB84b70352270af03c1384f50e2c414f6ba87db853

Pie menus:

* Click and close for drag style pie menus to work better
* Pie menus now handle letter events for quick selecting items
* Double buttons do not enforce click style (left the code in just in
case, but deactivated the argument for now)

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

M	source/blender/editors/interface/interface.c
M	source/blender/editors/interface/interface_handlers.c
M	source/blender/editors/interface/interface_intern.h
M	source/blender/editors/interface/interface_regions.c

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

diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index a7be9b7..9f957a4 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -1264,7 +1264,7 @@ void uiDrawBlock(const bContext *C, uiBlock *block)
 	int multisample_enabled;
 	
 	/* early exit if cancelled */
-	if (block->flag & UI_BLOCK_RADIAL && block->pie_data.flags & UI_PIE_CANCELLED)
+	if ((block->flag & UI_BLOCK_RADIAL) && (block->pie_data.flags & UI_PIE_FINISHED))
 		return;
 
 	/* get menu region or area region */
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index f1a5c96..0972b32 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -8512,7 +8512,7 @@ static int ui_handle_menu_return_submenu(bContext *C, const wmEvent *event, uiPo
 		    !((block->pie_data.flags & UI_PIE_CLICK_STYLE) || U.pie_interaction_type == USER_UI_PIE_CLICK))
 		{
 			menu->menuretval = 0;
-			block->pie_data.flags |= UI_PIE_CANCELLED;
+			block->pie_data.flags |= UI_PIE_FINISHED;
 		}
 
 		return WM_UI_HANDLER_CONTINUE;
@@ -8528,16 +8528,14 @@ static bool ui_pie_menu_supported_apply(uiBut *but) {
 }
 
 
-static int ui_pie_menu_apply(bContext *C, uiPopupBlockHandle *menu, const wmEvent *event, bool force)
+static int ui_pie_menu_apply(bContext *C, uiPopupBlockHandle *menu, uiBut *but, const wmEvent *event, bool force_close, bool click_style)
 {
 	int retval = WM_UI_HANDLER_BREAK;
 
-	uiBut *but = ui_but_find_activated(menu->region);
-
 	if (but && ui_pie_menu_supported_apply(but)) {
 		if (but->type == MENU) {
 			/* forcing the pie menu to close will not handle menus */
-			if (!force) {
+			if (!force_close) {
 				wmEvent e = *event;
 				e.type = LEFTMOUSE;
 				e.val = KM_PRESS;
@@ -8552,7 +8550,12 @@ static int ui_pie_menu_apply(bContext *C, uiPopupBlockHandle *menu, const wmEven
 			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;
+			if (!(click_style || force_close)) {
+				but->block->pie_data.flags |= UI_PIE_FINISHED;
+				menu->menuretval = 0;
+			}
+			else
+				menu->menuretval = UI_RETURN_OK;
 		}
 	}
 	else {
@@ -8567,6 +8570,7 @@ static int ui_handler_pie(bContext *C, const wmEvent *event, uiPopupBlockHandle
 {
 	ARegion *ar;
 	uiBlock *block;
+	uiBut *but;
 	int mx, my;
 	double duration;
 	bool is_click_style;
@@ -8636,7 +8640,7 @@ static int ui_handler_pie(bContext *C, const wmEvent *event, uiPopupBlockHandle
 
 	ui_block_calculate_pie_segment(block, mx, my);
 
-	if (block->pie_data.flags & UI_PIE_CANCELLED) {
+	if (block->pie_data.flags & UI_PIE_FINISHED) {
 		if ((event->type == block->pie_data.event && event->val == KM_RELEASE) ||
 		    event->type == RIGHTMOUSE ||
 		    event->type == ESCKEY)
@@ -8657,7 +8661,9 @@ static int ui_handler_pie(bContext *C, const wmEvent *event, uiPopupBlockHandle
 		}
 		else {
 			if (!is_click_style) {
-				retval = ui_pie_menu_apply(C, menu, event, true);
+				uiBut *but = ui_but_find_activated(menu->region);
+
+				retval = ui_pie_menu_apply(C, menu, but, event, true, is_click_style);
 			}
 		}
 	}
@@ -8671,12 +8677,8 @@ static int ui_handler_pie(bContext *C, const wmEvent *event, uiPopupBlockHandle
 
 			case LEFTMOUSE:
 				if (event->val == KM_PRESS) {
-					if (is_click_style) {
-						retval = ui_pie_menu_apply(C, menu, event, false);
-					}
-					else {
-						retval = ui_handle_menu_button(C, event, menu);
-					}
+					uiBut *but = ui_but_find_activated(menu->region);
+					retval = ui_pie_menu_apply(C, menu, but, event, false, is_click_style);
 				}
 				break;
 
@@ -8685,6 +8687,49 @@ static int ui_handler_pie(bContext *C, const wmEvent *event, uiPopupBlockHandle
 				menu->menuretval = UI_RETURN_CANCEL;
 				break;
 
+			case AKEY:
+			case BKEY:
+			case CKEY:
+			case DKEY:
+			case EKEY:
+			case FKEY:
+			case GKEY:
+			case HKEY:
+			case IKEY:
+			case JKEY:
+			case KKEY:
+			case LKEY:
+			case MKEY:
+			case NKEY:
+			case OKEY:
+			case PKEY:
+			case QKEY:
+			case RKEY:
+			case SKEY:
+			case TKEY:
+			case UKEY:
+			case VKEY:
+			case WKEY:
+			case XKEY:
+			case YKEY:
+			case ZKEY:
+			{
+				if ((event->val  == KM_PRESS || event->val == KM_DBL_CLICK) &&
+				    (event->shift == 0) &&
+				    (event->ctrl  == 0) &&
+				    (event->oskey == 0))
+				{
+					for (but = block->buttons.first; but; but = but->next) {
+						if (but->menu_key == event->type) {
+							button_activate_init((bContext *)C, ar, but, BUTTON_STATE_HIGHLIGHT);
+							retval = ui_pie_menu_apply(C, menu, but, event, false, is_click_style);
+							break;
+						}
+					}
+				}
+				break;
+			}
+
 			default:
 				retval = ui_handle_menu_button(C, event, menu);
 				break;
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 1cf97c0..982de7b 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -163,7 +163,7 @@ typedef enum RadialDirection {
 #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  */
-#define UI_PIE_CANCELLED           (1 << 4) /* pie menu cancelled but we still wait for a release event  */
+#define UI_PIE_FINISHED            (1 << 4) /* pie menu finished but we still wait for a release event  */
 #define UI_PIE_CLICK_STYLE         (1 << 5) /* pie menu changed to click style, click to confirm  */
 #define UI_PIE_ANIMATION_FINISHED  (1 << 6) /* pie animation finished, do not calculate any more motio  */
 
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index ee41774..37c521d 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -2662,7 +2662,7 @@ static float uiPieTitleWidth(const char *name, int icon)
 		        (UI_UNIT_X * (1.50f + (icon ? 0.25f : 0.0f)));
 }
 
-struct uiPieMenu *uiPieMenuBegin(struct bContext *C, const char *title, int icon, const wmEvent *event, bool force_hold)
+struct uiPieMenu *uiPieMenuBegin(struct bContext *C, const char *title, int icon, const wmEvent *event, bool UNUSED(force_click))
 {
 	uiStyle *style = UI_GetStyleDraw();
 	uiPieMenu *pie = MEM_callocN(sizeof(uiPopupMenu), "pie menu");
@@ -2674,8 +2674,10 @@ struct uiPieMenu *uiPieMenuBegin(struct bContext *C, const char *title, int icon
 	pie->block_radial->puphash = ui_popup_menu_hash(title);
 	pie->block_radial->flag |= UI_BLOCK_RADIAL;
 	pie->block_radial->pie_data.event = event->type;
-	if (force_hold)
-		pie->block_radial->pie_data.flags |= UI_PIE_CLICK_STYLE;
+	/*
+	 *  if (force_click)
+	 *  pie->block_radial->pie_data.flags |= UI_PIE_CLICK_STYLE;
+	*/
 
 	pie->layout = uiBlockLayout(pie->block_radial, UI_LAYOUT_VERTICAL, UI_LAYOUT_PIEMENU, 0, 0, 200, 0, 0, style);
 	pie->mx = event->x;




More information about the Bf-blender-cvs mailing list