[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