[Bf-blender-cvs] [dc77502] pie-menus: Experimental:
Antony Riakiotakis
noreply at git.blender.org
Tue Jun 24 22:29:53 CEST 2014
Commit: dc775028041abdec249918ec745d6518a1e8f6ad
Author: Antony Riakiotakis
Date: Tue Jun 24 23:29:40 2014 +0300
https://developer.blender.org/rBdc775028041abdec249918ec745d6518a1e8f6ad
Experimental:
Add timer wm operator that spawns pie menus after a certain time.
For now this timeout is the same as the drag timeout, should probably be
a separate option
===================================================================
M source/blender/windowmanager/intern/wm_operators.c
===================================================================
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 925a5c0..84dc904 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -2057,7 +2057,7 @@ static int wm_call_pie_menu_invoke(bContext *C, wmOperator *op, const wmEvent *e
uiPieMenuInvoke(C, idname, event->type);
- return OPERATOR_FINISHED;
+ return OPERATOR_CANCELLED;
}
static void WM_OT_call_pie_menu(wmOperatorType *ot)
@@ -2074,6 +2074,73 @@ static void WM_OT_call_pie_menu(wmOperatorType *ot)
RNA_def_string(ot->srna, "name", NULL, BKE_ST_MAXNAME, "Name", "Name of the pie menu");
}
+typedef struct PieTimerData {
+ wmTimer *timer;
+ wmEvent event;
+} PieTimerData;
+
+
+static int wm_call_pie_menu_timer_invoke(bContext *C, wmOperator *op, const wmEvent *event)
+{
+ wmWindowManager *wm = CTX_wm_manager(C);
+ wmWindow *win = CTX_wm_window(C);
+ PieTimerData *data = MEM_callocN(sizeof(PieTimerData), "pie timer");
+
+ data->timer = WM_event_add_timer(wm, win, TIMER, 0.05);
+ /* copy event, it will be used to spawn pie menu */
+ data->event = *event;
+
+ op->customdata = data;
+
+ WM_event_add_modal_handler(C, op);
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+static int wm_call_pie_menu_timer_modal(bContext *C, wmOperator *op, const wmEvent *event)
+{
+ PieTimerData *data = op->customdata;
+
+ if (event->type == data->event.type && event->val == KM_RELEASE) {
+ WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), data->timer);
+ MEM_freeN(data);
+ return OPERATOR_FINISHED;
+ }
+
+ if (event->type == TIMER) {
+ if (data->timer->duration > U.pie_drag_timeout) {
+ char idname[BKE_ST_MAXNAME];
+ RNA_string_get(op->ptr, "name", idname);
+
+ uiPieMenuInvoke(C, idname, data->event.type);
+
+ WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), data->timer);
+ MEM_freeN(data);
+
+ return OPERATOR_CANCELLED;
+ }
+ }
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+static void WM_OT_call_pie_menu_timer(wmOperatorType *ot)
+{
+ ot->name = "Call Pie Menu";
+ ot->idname = "WM_OT_call_pie_menu_timer";
+ ot->description = "Call (draw) a pre-defined pie menu or cancel";
+
+ ot->invoke = wm_call_pie_menu_timer_invoke;
+ ot->modal = wm_call_pie_menu_timer_modal;
+ ot->poll = WM_operator_winactive;
+
+ ot->flag = OPTYPE_INTERNAL;
+
+ RNA_def_string(ot->srna, "name", NULL, BKE_ST_MAXNAME, "Name", "Name of the pie menu");
+}
+
+
+
/* ************ window / screen operator definitions ************** */
/* this poll functions is needed in place of WM_operator_winactive
@@ -4464,6 +4531,7 @@ void wm_operatortype_init(void)
WM_operatortype_append(WM_OT_search_menu);
WM_operatortype_append(WM_OT_call_menu);
WM_operatortype_append(WM_OT_call_pie_menu);
+ WM_operatortype_append(WM_OT_call_pie_menu_timer);
WM_operatortype_append(WM_OT_radial_control);
#if defined(WIN32)
WM_operatortype_append(WM_OT_console_toggle);
More information about the Bf-blender-cvs
mailing list