[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