[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