[Bf-blender-cvs] [9643f78] pie-menus: Pie menus:
Antony Riakiotakis
noreply at git.blender.org
Wed Jul 30 13:01:56 CEST 2014
Commit: 9643f78cfe3c3cddadb1605d35a39354e12e5afe
Author: Antony Riakiotakis
Date: Wed Jul 30 13:01:45 2014 +0200
Branches: pie-menus
https://developer.blender.org/rB9643f78cfe3c3cddadb1605d35a39354e12e5afe
Pie menus:
Numeric input support.
After a bit of thought, I chose a scheme based on directions, starting
from top and going clockwise. We count empty positions too, so each
number from 1-8 is bound to a specific direction. There are no text
indicators on the menu items yet for the numbers.
===================================================================
M source/blender/editors/interface/interface_handlers.c
===================================================================
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 7d493cb..f20821f 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -8528,7 +8528,7 @@ static bool ui_pie_menu_supported_apply(uiBut *but) {
}
-static int ui_pie_menu_apply(bContext *C, uiPopupBlockHandle *menu, uiBut *but, const wmEvent *event, bool force_close, bool click_style)
+static int ui_pie_menu_apply(bContext *C, uiPopupBlockHandle *menu, uiBut *but, bool force_close, bool click_style)
{
int retval = WM_UI_HANDLER_BREAK;
@@ -8536,11 +8536,13 @@ static int ui_pie_menu_apply(bContext *C, uiPopupBlockHandle *menu, uiBut *but,
if (but->type == MENU) {
/* forcing the pie menu to close will not handle menus */
if (!force_close) {
- wmEvent e = *event;
- e.type = LEFTMOUSE;
- e.val = KM_PRESS;
+ uiBut *active_but = ui_but_find_activated(menu->region);
- retval = ui_handle_menu_button(C, &e, menu);
+ if (active_but)
+ button_activate_exit(C, active_but, active_but->active, false, false);
+
+ button_activate_init(C, menu->region, but, BUTTON_ACTIVATE_OPEN);
+ return retval;
}
else {
menu->menuretval = UI_RETURN_CANCEL;
@@ -8565,7 +8567,37 @@ static int ui_pie_menu_apply(bContext *C, uiPopupBlockHandle *menu, uiBut *but,
return retval;
}
-/* two types of pie menus, one with operator + enum, other with regular callbacks */
+static uiBut *ui_pie_dir_activate(uiBlock *block, const wmEvent *event, RadialDirection dir)
+{
+ uiBut *but;
+
+ if ((block->flag & UI_BLOCK_NUMSELECT) && event->val == KM_PRESS) {
+ for (but = block->buttons.first; but; but = but->next) {
+ if (but->pie_dir == dir && !ELEM(but->type, SEPR, SEPRLINE)) {
+ return but;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+static int ui_pie_button_activate(bContext *C, uiBut *but, uiPopupBlockHandle *menu, bool is_click_style)
+{
+ uiBut *active_but;
+
+ if (but == NULL)
+ return WM_UI_HANDLER_BREAK;
+
+ active_but = ui_but_find_activated(menu->region);
+
+ if (active_but)
+ button_activate_exit(C, active_but, active_but->active, false, false);
+
+ button_activate_init(C, menu->region, but, BUTTON_ACTIVATE_OVER);
+ return ui_pie_menu_apply(C, menu, but, false, is_click_style);
+}
+
static int ui_handler_pie(bContext *C, const wmEvent *event, uiPopupBlockHandle *menu)
{
ARegion *ar;
@@ -8673,7 +8705,7 @@ static int ui_handler_pie(bContext *C, const wmEvent *event, uiPopupBlockHandle
else if (!is_click_style) {
uiBut *but = ui_but_find_activated(menu->region);
- retval = ui_pie_menu_apply(C, menu, but, event, true, is_click_style);
+ retval = ui_pie_menu_apply(C, menu, but, true, is_click_style);
}
}
}
@@ -8688,7 +8720,7 @@ static int ui_handler_pie(bContext *C, const wmEvent *event, uiPopupBlockHandle
case LEFTMOUSE:
if (event->val == KM_PRESS) {
uiBut *but = ui_but_find_activated(menu->region);
- retval = ui_pie_menu_apply(C, menu, but, event, false, is_click_style);
+ retval = ui_pie_menu_apply(C, menu, but, false, is_click_style);
}
break;
@@ -8731,20 +8763,46 @@ static int ui_handler_pie(bContext *C, const wmEvent *event, uiPopupBlockHandle
{
for (but = block->buttons.first; but; but = but->next) {
if (but->menu_key == event->type) {
- uiBut *active_but = ui_but_find_activated(menu->region);
-
- if (active_but)
- button_activate_exit(C, active_but, active_but->active, false, false);
-
- button_activate_init((bContext *)C, ar, but, BUTTON_ACTIVATE_OVER);
- retval = ui_pie_menu_apply(C, menu, but, event, false, is_click_style);
- break;
+ ui_pie_button_activate(C, but, menu, is_click_style);
}
}
}
break;
}
+ case ONEKEY: case PAD1:
+ but = ui_pie_dir_activate(block, event, UI_RADIAL_N);
+ retval = ui_pie_button_activate(C, but, menu, is_click_style);
+ break;
+ case TWOKEY: case PAD2:
+ but = ui_pie_dir_activate(block, event, UI_RADIAL_NE);
+ retval = ui_pie_button_activate(C, but, menu, is_click_style);
+ break;
+ case THREEKEY: case PAD3:
+ but = ui_pie_dir_activate(block, event, UI_RADIAL_E);
+ retval = ui_pie_button_activate(C, but, menu, is_click_style);
+ break;
+ case FOURKEY: case PAD4:
+ but = ui_pie_dir_activate(block, event, UI_RADIAL_SE);
+ retval = ui_pie_button_activate(C, but, menu, is_click_style);
+ break;
+ case FIVEKEY: case PAD5:
+ but = ui_pie_dir_activate(block, event, UI_RADIAL_S);
+ retval = ui_pie_button_activate(C, but, menu, is_click_style);
+ break;
+ case SIXKEY: case PAD6:
+ but = ui_pie_dir_activate(block, event, UI_RADIAL_SW);
+ retval = ui_pie_button_activate(C, but, menu, is_click_style);
+ break;
+ case SEVENKEY: case PAD7:
+ but = ui_pie_dir_activate(block, event, UI_RADIAL_W);
+ retval = ui_pie_button_activate(C, but, menu, is_click_style);
+ break;
+ case EIGHTKEY: case PAD8:
+ but = ui_pie_dir_activate(block, event, UI_RADIAL_NW);
+ retval = ui_pie_button_activate(C, but, menu, is_click_style);
+ break;
+
default:
retval = ui_handle_menu_button(C, event, menu);
break;
More information about the Bf-blender-cvs
mailing list