diff options
Diffstat (limited to 'source/blender/editors/interface/interface_regions.c')
-rw-r--r-- | source/blender/editors/interface/interface_regions.c | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index 5739ebebe64..49823d4e472 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -2709,8 +2709,18 @@ static float uiPieTitleWidth(const char *name, int icon) uiPieMenu *uiPieMenuBegin(struct bContext *C, const char *title, int icon, const wmEvent *event) { - uiStyle *style = UI_GetStyleDraw(); - uiPieMenu *pie = MEM_callocN(sizeof(uiPopupMenu), "pie menu"); + uiStyle *style; + uiPieMenu *pie; + short event_type; + + wmWindow *win = CTX_wm_window(C); + + /* allow respawning a pie from the last pie event */ + if (event->type == win->lock_pie_event && event->type != win->last_pie_event) + return NULL; + + style = UI_GetStyleDraw(); + pie = MEM_callocN(sizeof(uiPopupMenu), "pie menu"); pie->block_radial = uiBeginBlock(C, NULL, __func__, UI_EMBOSS); /* may be useful later to allow spawning pies @@ -2718,10 +2728,17 @@ uiPieMenu *uiPieMenuBegin(struct bContext *C, const char *title, int icon, const /* pie->block_radial->flag |= UI_BLOCK_POPUP_MEMORY; */ 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 (win->last_pie_event != EVENT_NONE) + event_type = win->last_pie_event; + else + event_type = event->type; + + pie->block_radial->pie_data.event = event_type; + win->lock_pie_event = event_type; /* if pie is spawned by a left click, it is always assumed to be click style */ - if (event->type == LEFTMOUSE) { + if (event_type == LEFTMOUSE) { pie->block_radial->flag |= UI_PIE_CLICK_STYLE; } @@ -2785,7 +2802,8 @@ void uiPieMenuInvoke(struct bContext *C, const char *idname, const wmEvent *even if (mt->poll && mt->poll(C, mt) == 0) return; - pie = uiPieMenuBegin(C, IFACE_(mt->label), ICON_NONE, event); + if (!(pie = uiPieMenuBegin(C, IFACE_(mt->label), ICON_NONE, event))) + return; layout = uiPieMenuLayout(pie); menu.layout = layout; @@ -2806,7 +2824,9 @@ void uiPieOperatorEnumInvoke(struct bContext *C, const char *title, const char * uiPieMenu *pie; uiLayout *layout; - pie = uiPieMenuBegin(C, IFACE_(title), ICON_NONE, event); + if (!(pie = uiPieMenuBegin(C, IFACE_(title), ICON_NONE, event))) + return; + layout = uiPieMenuLayout(pie); layout = uiLayoutRadial(layout); @@ -2836,7 +2856,9 @@ void uiPieEnumInvoke(struct bContext *C, const char *title, const char *path, return; } - pie = uiPieMenuBegin(C, IFACE_(title), ICON_NONE, event); + if (!(pie = uiPieMenuBegin(C, IFACE_(title), ICON_NONE, event))) + return; + layout = uiPieMenuLayout(pie); layout = uiLayoutRadial(layout); |