From b42b0554eae0e89b737ec55d642d0fc831b954d1 Mon Sep 17 00:00:00 2001 From: Antony Riakiotakis Date: Thu, 14 Aug 2014 14:17:39 +0200 Subject: Pie menus: If user drags away from initial position, menu changes to drag style and returning to that position won't remake the menu click-style. Allows to use the threshold indicator to cancel the pie. --- source/blender/editors/interface/interface_handlers.c | 11 +++++++++-- source/blender/editors/interface/interface_intern.h | 2 +- source/blender/editors/interface/interface_layout.c | 3 --- 3 files changed, 10 insertions(+), 6 deletions(-) (limited to 'source/blender') diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 765a27acf40..ac4da00833f 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -8704,13 +8704,16 @@ static int ui_handler_pie(bContext *C, const wmEvent *event, uiPopupBlockHandle if (event->val != KM_RELEASE) { ui_handle_menu_button(C, event, menu); + if (len_squared_v2v2(event_xy, block->pie_data.pie_center_init) > PIE_CLICK_THRESHOLD_SQ) { + block->pie_data.flags |= UI_PIE_DRAG_STYLE; + } /* 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 { /* distance from initial point */ - if (len_squared_v2v2(event_xy, block->pie_data.pie_center_init) < PIE_CLICK_THRESHOLD_SQ) { + if (!(block->pie_data.flags & UI_PIE_DRAG_STYLE)) { block->pie_data.flags |= UI_PIE_CLICK_STYLE; } else if (!is_click_style) { @@ -8726,8 +8729,12 @@ static int ui_handler_pie(bContext *C, const wmEvent *event, uiPopupBlockHandle switch (event->type) { case MOUSEMOVE: - /* mouse move should always refresh the area for pie menus */ + if (len_squared_v2v2(event_xy, block->pie_data.pie_center_init) > PIE_CLICK_THRESHOLD_SQ) { + block->pie_data.flags |= UI_PIE_DRAG_STYLE; + } ui_handle_menu_button(C, event, menu); + + /* mouse move should always refresh the area for pie menus */ ED_region_tag_redraw(ar); break; diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 15cf14ae6ef..cdc611a60f4 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -166,7 +166,7 @@ extern const short ui_radial_dir_to_angle[8]; enum { UI_PIE_DEGREES_RANGE_LARGE = (1 << 0), /* pie menu item collision is detected at 90 degrees */ UI_PIE_INITIAL_DIRECTION = (1 << 1), /* use initial center of pie menu to calculate direction */ - UI_PIE_3_ITEMS = (1 << 2), /* pie menu has only 3 items, careful when centering */ + UI_PIE_DRAG_STYLE = (1 << 2), /* pie menu is drag style */ UI_PIE_INVALID_DIR = (1 << 3), /* mouse not far enough from center position */ UI_PIE_FINISHED = (1 << 4), /* pie menu finished but we still wait for a release event */ UI_PIE_CLICK_STYLE = (1 << 5), /* pie menu changed to click style, click to confirm */ diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index ac9110873ff..27af550b173 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -2171,9 +2171,6 @@ static void ui_litem_layout_radial(uiLayout *litem) if (totitems < 5) litem->root->block->pie_data.flags |= UI_PIE_DEGREES_RANGE_LARGE; - if (totitems == 3) - litem->root->block->pie_data.flags |= UI_PIE_3_ITEMS; - for (item = litem->items.first; item; item = item->next) { /* not all button types are drawn in a radial menu, do filtering here */ if (ui_item_is_radial_displayable(item)) { -- cgit v1.2.3