Fixes for GPencil Copy and Paste

* Fix "Attempt to free NULL pointer" when copying strokes for the first time

* Fix poll callback on "paste" operator, so that it is possible to paste
  strokes when there are no editable strokes visible.
This commit is contained in:
Joshua Leung
2016-05-09 19:41:48 +12:00
parent d6555d936c
commit 3ce3163379

View File

@@ -296,12 +296,13 @@ void ED_gpencil_strokes_copybuf_free(void)
for (gps = gp_strokes_copypastebuf.first; gps; gps = gpsn) { for (gps = gp_strokes_copypastebuf.first; gps; gps = gpsn) {
gpsn = gps->next; gpsn = gps->next;
MEM_freeN(gps->points); if (gps->points) MEM_freeN(gps->points);
MEM_freeN(gps->triangles); if (gps->triangles) MEM_freeN(gps->triangles);
BLI_freelinkN(&gp_strokes_copypastebuf, gps); BLI_freelinkN(&gp_strokes_copypastebuf, gps);
} }
BLI_listbase_clear(&gp_strokes_copypastebuf); gp_strokes_copypastebuf.first = gp_strokes_copypastebuf.last = NULL;
} }
/* --------------------- */ /* --------------------- */
@@ -386,6 +387,14 @@ void GPENCIL_OT_copy(wmOperatorType *ot)
/* --------------------- */ /* --------------------- */
/* Paste selected strokes */ /* Paste selected strokes */
static int gp_strokes_paste_poll(bContext *C)
{
/* 1) Must have GP layer to paste to...
* 2) Copy buffer must at least have something (though it may be the wrong sort...)
*/
return (CTX_data_active_gpencil_layer(C) != NULL) && (!BLI_listbase_is_empty(&gp_strokes_copypastebuf));
}
static int gp_strokes_paste_exec(bContext *C, wmOperator *op) static int gp_strokes_paste_exec(bContext *C, wmOperator *op)
{ {
Scene *scene = CTX_data_scene(C); Scene *scene = CTX_data_scene(C);
@@ -490,7 +499,7 @@ void GPENCIL_OT_paste(wmOperatorType *ot)
/* callbacks */ /* callbacks */
ot->exec = gp_strokes_paste_exec; ot->exec = gp_strokes_paste_exec;
ot->poll = gp_stroke_edit_poll; ot->poll = gp_strokes_paste_poll;
/* flags */ /* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;