[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59853] branches/soc-2013-ui_replay/source /blender: When an operator button is dragged the but-> opptr is copied to the drag event so that it can then be copied to in the drag&drop copy () functions.

Vincent Akkermans vincent at ack-err.net
Thu Sep 5 21:46:42 CEST 2013


Revision: 59853
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59853
Author:   ack-err
Date:     2013-09-05 19:46:41 +0000 (Thu, 05 Sep 2013)
Log Message:
-----------
When an operator button is dragged the but->opptr is copied to the drag event so that it can then be copied to in the drag&drop copy() functions.

Modified Paths:
--------------
    branches/soc-2013-ui_replay/source/blender/editors/interface/interface_handlers.c
    branches/soc-2013-ui_replay/source/blender/windowmanager/WM_api.h
    branches/soc-2013-ui_replay/source/blender/windowmanager/WM_types.h
    branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm.c
    branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_dragdrop.c
    branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_event_system.c
    branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_window.c

Modified: branches/soc-2013-ui_replay/source/blender/editors/interface/interface_handlers.c
===================================================================
--- branches/soc-2013-ui_replay/source/blender/editors/interface/interface_handlers.c	2013-09-05 18:58:29 UTC (rev 59852)
+++ branches/soc-2013-ui_replay/source/blender/editors/interface/interface_handlers.c	2013-09-05 19:46:41 UTC (rev 59853)
@@ -905,7 +905,7 @@
 		{
 			wmDrag *drag;
 
-			drag = WM_event_start_drag(C, but->icon, but->dragtype, but->dragpoin, ui_get_but_val(but));
+			drag = WM_event_start_drag(C, but->icon, but->dragtype, but->dragpoin, ui_get_but_val(but), but->opptr);
 			if (but->imb)
 				WM_event_drag_image(drag, but->imb, but->imb_scale, BLI_rctf_size_x(&but->rect), BLI_rctf_size_y(&but->rect));
 		}

Modified: branches/soc-2013-ui_replay/source/blender/windowmanager/WM_api.h
===================================================================
--- branches/soc-2013-ui_replay/source/blender/windowmanager/WM_api.h	2013-09-05 18:58:29 UTC (rev 59852)
+++ branches/soc-2013-ui_replay/source/blender/windowmanager/WM_api.h	2013-09-05 19:46:41 UTC (rev 59853)
@@ -330,7 +330,8 @@
 void		WM_operator_region_active_win_set(struct bContext *C);
 
 			/* drag and drop */
-struct wmDrag		*WM_event_start_drag(struct bContext *C, int icon, int type, void *poin, double value);
+struct wmDrag		*WM_event_start_drag(struct bContext *C, int icon, int type, void *poin, double value, struct PointerRNA *ptr);
+void				wm_drag_free(struct wmDrag *drag);
 void				WM_event_drag_image(struct wmDrag *, struct ImBuf *, float scale, int sx, int sy);
 
 struct wmDropBox	*WM_dropbox_add(ListBase *lb, const char *idname, int (*poll)(struct bContext *, struct wmDrag *, const struct wmEvent *event),

Modified: branches/soc-2013-ui_replay/source/blender/windowmanager/WM_types.h
===================================================================
--- branches/soc-2013-ui_replay/source/blender/windowmanager/WM_types.h	2013-09-05 18:58:29 UTC (rev 59852)
+++ branches/soc-2013-ui_replay/source/blender/windowmanager/WM_types.h	2013-09-05 19:46:41 UTC (rev 59853)
@@ -631,6 +631,7 @@
 	int sx, sy;
 	
 	char opname[200]; /* if set, draws operator name*/
+	PointerRNA *ptr;
 } wmDrag;
 
 /* dropboxes are like keymaps, part of the screen/area/region definition */

Modified: branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm.c
===================================================================
--- branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm.c	2013-09-05 18:58:29 UTC (rev 59852)
+++ branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm.c	2013-09-05 19:46:41 UTC (rev 59853)
@@ -441,6 +441,7 @@
 {
 	wmWindow *win;
 	wmKeyConfig *keyconf;
+	wmDrag *drag;
 
 	if (wm->autosavetimer)
 		wm_autosave_timer_ended(wm);
@@ -465,6 +466,10 @@
 	BLI_freelistN(&wm->queue);
 	
 	BLI_freelistN(&wm->paintcursors);
+	
+	while ((drag = BLI_pophead(&wm->drags))) {
+		wm_drag_free(drag);
+	}
 	BLI_freelistN(&wm->drags);
 	
 	wm_reports_free(wm);

Modified: branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_dragdrop.c
===================================================================
--- branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_dragdrop.c	2013-09-05 18:58:29 UTC (rev 59852)
+++ branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_dragdrop.c	2013-09-05 19:46:41 UTC (rev 59853)
@@ -147,7 +147,7 @@
 /* *********************************** */
 
 /* note that the pointer should be valid allocated and not on stack */
-wmDrag *WM_event_start_drag(struct bContext *C, int icon, int type, void *poin, double value)
+wmDrag *WM_event_start_drag(struct bContext *C, int icon, int type, void *poin, double value, PointerRNA *ptr)
 {
 	wmWindowManager *wm = CTX_wm_manager(C);
 	wmDrag *drag = MEM_callocN(sizeof(struct wmDrag), "new drag");
@@ -160,6 +160,14 @@
 	drag->type = type;
 	if (type == WM_DRAG_PATH)
 		BLI_strncpy(drag->path, poin, FILE_MAX);
+	else if (type == WM_DRAG_OP) {
+		/* the PointerRNA should be copied */
+		if (ptr && ptr->data) {
+			drag->ptr = MEM_callocN(sizeof(PointerRNA), "PointerRNA for dragging");
+			drag->ptr->data = IDP_CopyProperty(ptr->data);
+		}
+		drag->poin = poin;
+	}
 	else
 		drag->poin = poin;
 	drag->value = value;
@@ -167,6 +175,18 @@
 	return drag;
 }
 
+/* N.B. this doesn't free drag itself */
+void wm_drag_free(wmDrag *drag)
+{
+	if (drag->ptr) {
+		if (drag->type == WM_DRAG_OP) {
+			IDP_FreeProperty(drag->ptr->data);
+			MEM_freeN(drag->ptr->data);
+		}
+		MEM_freeN(drag->ptr);
+	}
+}
+
 void WM_event_drag_image(wmDrag *drag, ImBuf *imb, float scale, int sx, int sy)
 {
 	drag->imb = imb;

Modified: branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_event_system.c	2013-09-05 18:58:29 UTC (rev 59852)
+++ branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_event_system.c	2013-09-05 19:46:41 UTC (rev 59853)
@@ -109,8 +109,16 @@
 	if (event->customdata) {
 		if (event->customdatafree) {
 			/* note: pointer to listbase struct elsewhere */
-			if (event->custom == EVT_DATA_LISTBASE)
+			if (event->custom == EVT_DATA_LISTBASE) {
+				if (event->type == EVT_DROP) {
+					ListBase *lb = (ListBase *)event->customdata;
+					wmDrag *drag;
+					for (drag = lb->first; drag; drag = drag->next) {
+						wm_drag_free(drag);
+					}
+				}
 				BLI_freelistN(event->customdata);
+			}
 			else
 				MEM_freeN(event->customdata);
 		}
@@ -1934,22 +1942,25 @@
 									
 									drop->copy(C, event, drag, drop);
 									
-									/* free the drags before calling operator */
-									BLI_freelistN(event->customdata);
 									event->customdata = NULL;
 									event->custom = 0;
 									
 									WM_operator_name_call(C, drop->ot->idname, drop->opcontext, drop->ptr);
 									action |= WM_HANDLER_BREAK;
-									
+																		
 									/* XXX fileread case */
 									if (CTX_wm_window(C) == NULL)
 										return action;
 									
-									/* escape from drag loop, got freed */
+									/* escape from drag loop... */
 									break;
 								}
 							}
+							/* and free all the drags */
+							for (drag = lb->first; drag; drag = drag->next) {
+								wm_drag_free(drag);
+							}
+							BLI_freelistN(lb);
 						}
 					}
 				}
@@ -2133,18 +2144,34 @@
 	if (event->type == MOUSEMOVE)
 		win->screen->do_draw_drag = TRUE;
 	else if (event->type == ESCKEY) {
+		wmDrag *drag;
+		for (drag = wm->drags.first; drag; drag = drag->next) {
+			wm_drag_free(drag);
+		}
 		BLI_freelistN(&wm->drags);
 		win->screen->do_draw_drag = TRUE;
 	}
 	else if (event->type == LEFTMOUSE && event->val == KM_RELEASE) {
-		event->type = EVT_DROP;
 		
 		/* create customdata, first free existing */
 		if (event->customdata) {
-			if (event->customdatafree)
-				MEM_freeN(event->customdata);
+			if (event->customdatafree) {
+				if (event->custom == EVT_DATA_LISTBASE) {
+					if (event->type == EVT_DROP) {
+						ListBase *lb = (ListBase *)event->customdata;
+						wmDrag *drag;
+						for (drag = lb->first; drag; drag = drag->next) {
+							wm_drag_free(drag);
+						}
+					}
+					BLI_freelistN(event->customdata);
+				}
+				else
+					MEM_freeN(event->customdata);
+			}
 		}
 		
+		event->type = EVT_DROP;
 		event->custom = EVT_DATA_LISTBASE;
 		event->customdata = &wm->drags;
 		event->customdatafree = 1;

Modified: branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_window.c
===================================================================
--- branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_window.c	2013-09-05 18:58:29 UTC (rev 59852)
+++ branches/soc-2013-ui_replay/source/blender/windowmanager/intern/wm_window.c	2013-09-05 19:46:41 UTC (rev 59853)
@@ -992,7 +992,7 @@
 						/* try to get icon type from extension */
 						icon = ED_file_extension_icon((char *)stra->strings[a]);
 						
-						WM_event_start_drag(C, icon, WM_DRAG_PATH, stra->strings[a], 0.0);
+						WM_event_start_drag(C, icon, WM_DRAG_PATH, stra->strings[a], 0.0, NULL);
 						/* void poin should point to string, it makes a copy */
 						break; /* only one drop element supported now */
 					}




More information about the Bf-blender-cvs mailing list