[Bf-blender-cvs] [d274c64d22d] master: WM: add support for drag events

Campbell Barton noreply at git.blender.org
Thu Jun 7 17:08:10 CEST 2018


Commit: d274c64d22da51473839d87618ba0dc0a0f1fa42
Author: Campbell Barton
Date:   Thu Jun 7 17:05:49 2018 +0200
Branches: master
https://developer.blender.org/rBd274c64d22da51473839d87618ba0dc0a0f1fa42

WM: add support for drag events

This allows for a single key to be mapped to both release and drag,
useful for pie menus to share a key with a different action.

===================================================================

M	source/blender/editors/interface/interface_region_menu_pie.c
M	source/blender/makesrna/intern/rna_wm.c
M	source/blender/windowmanager/WM_types.h
M	source/blender/windowmanager/intern/wm_event_system.c

===================================================================

diff --git a/source/blender/editors/interface/interface_region_menu_pie.c b/source/blender/editors/interface/interface_region_menu_pie.c
index 37a603d967f..41001d65d82 100644
--- a/source/blender/editors/interface/interface_region_menu_pie.c
+++ b/source/blender/editors/interface/interface_region_menu_pie.c
@@ -150,8 +150,16 @@ uiPieMenu *UI_pie_menu_begin(struct bContext *C, const char *title, int icon, co
 	}
 
 	pie->layout = UI_block_layout(pie->block_radial, UI_LAYOUT_VERTICAL, UI_LAYOUT_PIEMENU, 0, 0, 200, 0, 0, style);
-	pie->mx = event->x;
-	pie->my = event->y;
+
+	/* Open from where we started dragging. */
+	if (event->val == KM_CLICK_DRAG) {
+		pie->mx = event->prevclickx;
+		pie->my = event->prevclicky;
+	}
+	else {
+		pie->mx = event->x;
+		pie->my = event->y;
+	}
 
 	/* create title button */
 	if (title[0]) {
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index b71eca3d850..71e3a0493a3 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -51,6 +51,7 @@ static const EnumPropertyItem event_keymouse_value_items[] = {
 	{KM_RELEASE, "RELEASE", 0, "Release", ""},
 	{KM_CLICK, "CLICK", 0, "Click", ""},
 	{KM_DBL_CLICK, "DOUBLE_CLICK", 0, "Double Click", ""},
+	{KM_CLICK_DRAG, "CLICK_DRAG", 0, "Click Drag", ""},
 	{0, NULL, 0, NULL, NULL}
 };
 
@@ -389,6 +390,7 @@ const EnumPropertyItem rna_enum_event_value_items[] = {
 	{KM_RELEASE, "RELEASE", 0, "Release", ""},
 	{KM_CLICK, "CLICK", 0, "Click", ""},
 	{KM_DBL_CLICK, "DOUBLE_CLICK", 0, "Double Click", ""},
+	{KM_CLICK_DRAG, "CLICK_DRAG", 0, "Click Drag", ""},
 	{EVT_GESTURE_N, "NORTH", 0, "North", ""},
 	{EVT_GESTURE_NE, "NORTH_EAST", 0, "North-East", ""},
 	{EVT_GESTURE_E, "EAST", 0, "East", ""},
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index 298c5184ced..8c53f5389e3 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -188,6 +188,7 @@ enum {
 #define KM_RELEASE	2
 #define KM_CLICK	3
 #define KM_DBL_CLICK	4
+#define KM_CLICK_DRAG	5
 
 
 /* ************** UI Handler ***************** */
@@ -462,6 +463,7 @@ typedef struct wmEvent {
 
 	/* set in case a KM_PRESS went by unhandled */
 	char check_click;
+	char check_drag;
 	char is_motion_absolute;
 
 	/* keymap item, set by handler (weak?) */
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 83bad28ce02..f820a0a1b8d 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -2221,8 +2221,30 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
 	if (CTX_wm_window(C) == NULL)
 		return action;
 
-	if (!ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE, EVENT_NONE) && !ISTIMER(event->type)) {
+	if (ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE)) {
+		if (event->check_drag) {
+			wmWindow *win = CTX_wm_window(C);
+			if ((abs(event->x - win->eventstate->prevclickx)) >= U.tweak_threshold ||
+			    (abs(event->y - win->eventstate->prevclicky)) >= U.tweak_threshold)
+			{
+				short val = event->val;
+				short type = event->type;
+				event->val = KM_CLICK_DRAG;
+				event->type = win->eventstate->type;
+
+				CLOG_INFO(WM_LOG_HANDLERS, 1, "handling PRESS_DRAG");
+
+				action |= wm_handlers_do_intern(C, event, handlers);
 
+				event->val = val;
+				event->type = type;
+
+				win->eventstate->check_click = 0;
+				win->eventstate->check_drag = 0;
+			}
+		}
+	}
+	else if (!ELEM(event->type, EVENT_NONE) && !ISTIMER(event->type)) {
 		/* test for CLICK events */
 		if (wm_action_not_handled(action)) {
 			wmWindow *win = CTX_wm_window(C);
@@ -2232,6 +2254,7 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
 
 			if (win && event->val == KM_PRESS) {
 				win->eventstate->check_click = true;
+				win->eventstate->check_drag = true;
 			}
 
 			if (win && win->eventstate->prevtype == event->type) {
@@ -2253,6 +2276,7 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
 					}
 					else {
 						win->eventstate->check_click = 0;
+						win->eventstate->check_drag = 0;
 					}
 				}
 				else if (event->val == KM_DBL_CLICK) {



More information about the Bf-blender-cvs mailing list