forked from bartvdbraak/blender
Operator to duplicate the active Grease Pencil layer
TODO: this needs a proper "duplicate" icon, without the "ID" label
This commit is contained in:
parent
70b6c82fd3
commit
d5f3aee41f
@ -361,6 +361,8 @@ class GreasePencilDataPanel():
|
|||||||
|
|
||||||
gpl = context.active_gpencil_layer
|
gpl = context.active_gpencil_layer
|
||||||
if gpl:
|
if gpl:
|
||||||
|
sub.operator("gpencil.layer_duplicate", icon='COPY_ID', text="") # XXX: needs a dedicated icon
|
||||||
|
|
||||||
col.separator()
|
col.separator()
|
||||||
|
|
||||||
sub = col.column(align=True)
|
sub = col.column(align=True)
|
||||||
|
@ -219,6 +219,7 @@ bGPdata *ED_gpencil_data_get_active(const bContext *C)
|
|||||||
|
|
||||||
/* -------------------------------------------------------- */
|
/* -------------------------------------------------------- */
|
||||||
|
|
||||||
|
// XXX: this should be removed... We really shouldn't duplicate logic like this!
|
||||||
bGPdata *ED_gpencil_data_get_active_v3d(Scene *scene, View3D *v3d)
|
bGPdata *ED_gpencil_data_get_active_v3d(Scene *scene, View3D *v3d)
|
||||||
{
|
{
|
||||||
Base *base = scene->basact;
|
Base *base = scene->basact;
|
||||||
@ -483,6 +484,47 @@ void GPENCIL_OT_layer_move(wmOperatorType *ot)
|
|||||||
ot->prop = RNA_def_enum(ot->srna, "type", slot_move, 0, "Type", "");
|
ot->prop = RNA_def_enum(ot->srna, "type", slot_move, 0, "Type", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ********************* Duplicate Layer ************************** */
|
||||||
|
|
||||||
|
static int gp_layer_copy_exec(bContext *C, wmOperator *op)
|
||||||
|
{
|
||||||
|
bGPdata *gpd = ED_gpencil_data_get_active(C);
|
||||||
|
bGPDlayer *gpl = gpencil_layer_getactive(gpd);
|
||||||
|
bGPDlayer *new_layer;
|
||||||
|
|
||||||
|
/* sanity checks */
|
||||||
|
if (ELEM(NULL, gpd, gpl))
|
||||||
|
return OPERATOR_CANCELLED;
|
||||||
|
|
||||||
|
/* make copy of layer, and add it immediately after the existing layer */
|
||||||
|
new_layer = gpencil_layer_duplicate(gpl);
|
||||||
|
BLI_insertlinkafter(&gpd->layers, gpl, new_layer);
|
||||||
|
|
||||||
|
/* ensure new layer has a unique name, and is now the active layer */
|
||||||
|
BLI_uniquename(&gpd->layers, new_layer, DATA_("GP_Layer"), '.', offsetof(bGPDlayer, info), sizeof(new_layer->info));
|
||||||
|
gpencil_layer_setactive(gpd, new_layer);
|
||||||
|
|
||||||
|
/* notifiers */
|
||||||
|
WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
|
||||||
|
|
||||||
|
return OPERATOR_FINISHED;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GPENCIL_OT_layer_duplicate(wmOperatorType *ot)
|
||||||
|
{
|
||||||
|
/* identifiers */
|
||||||
|
ot->name = "Duplicate Layer";
|
||||||
|
ot->idname = "GPENCIL_OT_layer_duplicate";
|
||||||
|
ot->description = "Make a copy of the active Grease Pencil layer";
|
||||||
|
|
||||||
|
/* callbacks */
|
||||||
|
ot->exec = gp_layer_copy_exec;
|
||||||
|
ot->poll = gp_active_layer_poll;
|
||||||
|
|
||||||
|
/* flags */
|
||||||
|
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************ */
|
/* ************************************************ */
|
||||||
/* Stroke Editing Operators */
|
/* Stroke Editing Operators */
|
||||||
|
|
||||||
@ -630,6 +672,10 @@ void GPENCIL_OT_duplicate(wmOperatorType *ot)
|
|||||||
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ******************* Copy/Paste Strokes ************************* */
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
|
||||||
/* ******************* Delete Active Frame ************************ */
|
/* ******************* Delete Active Frame ************************ */
|
||||||
|
|
||||||
static int gp_actframe_delete_poll(bContext *C)
|
static int gp_actframe_delete_poll(bContext *C)
|
||||||
|
@ -134,6 +134,7 @@ void GPENCIL_OT_data_unlink(struct wmOperatorType *ot);
|
|||||||
void GPENCIL_OT_layer_add(struct wmOperatorType *ot);
|
void GPENCIL_OT_layer_add(struct wmOperatorType *ot);
|
||||||
void GPENCIL_OT_layer_remove(struct wmOperatorType *ot);
|
void GPENCIL_OT_layer_remove(struct wmOperatorType *ot);
|
||||||
void GPENCIL_OT_layer_move(struct wmOperatorType *ot);
|
void GPENCIL_OT_layer_move(struct wmOperatorType *ot);
|
||||||
|
void GPENCIL_OT_layer_duplicate(struct wmOperatorType *ot);
|
||||||
|
|
||||||
void GPENCIL_OT_active_frame_delete(struct wmOperatorType *ot);
|
void GPENCIL_OT_active_frame_delete(struct wmOperatorType *ot);
|
||||||
|
|
||||||
|
@ -233,6 +233,7 @@ void ED_operatortypes_gpencil(void)
|
|||||||
WM_operatortype_append(GPENCIL_OT_layer_add);
|
WM_operatortype_append(GPENCIL_OT_layer_add);
|
||||||
WM_operatortype_append(GPENCIL_OT_layer_remove);
|
WM_operatortype_append(GPENCIL_OT_layer_remove);
|
||||||
WM_operatortype_append(GPENCIL_OT_layer_move);
|
WM_operatortype_append(GPENCIL_OT_layer_move);
|
||||||
|
WM_operatortype_append(GPENCIL_OT_layer_duplicate);
|
||||||
|
|
||||||
WM_operatortype_append(GPENCIL_OT_active_frame_delete);
|
WM_operatortype_append(GPENCIL_OT_active_frame_delete);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user