GPv3: Frame delete operator (edit mode) #110938

Closed
casey-bianco-davis wants to merge 7 commits from casey-bianco-davis/blender:GPv3-delete-frame into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
3 changed files with 96 additions and 0 deletions

View File

@ -4568,6 +4568,9 @@ def km_grease_pencil_edit(params):
# Dissolve
("grease_pencil.dissolve", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
("grease_pencil.dissolve", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None),
# Delete all active frames
("grease_pencil.delete_frame", {"type": 'DEL', "value": 'PRESS', "shift": True},
{"properties": [("type", "ALL_FRAMES")]}),
])
return keymap

View File

@ -4814,6 +4814,12 @@ class VIEW3D_MT_edit_greasepencil_delete(Menu):
layout = self.layout
layout.operator_enum("grease_pencil.dissolve", "type")
layout.separator()
layout.operator("grease_pencil.delete_frame", text="Delete Active Keyframe (Active Layer)").type = 'ACTIVE_FRAME'
layout.operator("grease_pencil.delete_frame", text="Delete Active Keyframes (All Layers)").type = 'ALL_FRAMES'
# Edit Curve
# draw_curve is used by VIEW3D_MT_edit_curve and VIEW3D_MT_edit_surface
@ -8488,6 +8494,7 @@ classes = (
VIEW3D_MT_edit_greasepencil,
VIEW3D_MT_edit_greasepencil_delete,
VIEW3D_MT_edit_greasepencil_stroke,
VIEW3D_MT_edit_greasepencil_delete,
VIEW3D_MT_edit_curve,
VIEW3D_MT_edit_curve_ctrlpoints,
VIEW3D_MT_edit_curve_segments,

View File

@ -712,6 +712,91 @@ static void GREASE_PENCIL_OT_dissolve(wmOperatorType *ot)
/** \} */
/** \name Delete Frame Operator
* \{ */
enum class DeleteFrameMode {
/* delete active frame for the current layer */
ACTIVE_FRAME,
/* delete active frames for all layers */
ALL_FRAMES,
};
static const EnumPropertyItem prop_greasepencil_deleteframe_types[] = {
{int(DeleteFrameMode::ACTIVE_FRAME),
"ACTIVE_FRAME",
0,
"Active Frame",
"Deletes current frame in the active layer"},
{int(DeleteFrameMode::ALL_FRAMES),
"ALL_FRAMES",
0,
"All Active Frames",
"Delete active frames for all layers"},
{0, nullptr, 0, nullptr, nullptr},
};
static int grease_pencil_delete_frame_exec(bContext *C, wmOperator *op)
{
using namespace blender;
const Scene *scene = CTX_data_scene(C);
Object *object = CTX_data_active_object(C);
GreasePencil &grease_pencil = *static_cast<GreasePencil *>(object->data);
const int current_frame = scene->r.cfra;
const DeleteFrameMode mode = DeleteFrameMode(RNA_enum_get(op->ptr, "type"));
bool changed = false;
if (mode == DeleteFrameMode::ACTIVE_FRAME && grease_pencil.has_active_layer()) {
bke::greasepencil::Layer &layer = *grease_pencil.get_active_layer_for_write();
if (layer.is_editable()) {
changed |= grease_pencil.remove_frames(layer, {layer.frame_key_at(current_frame)});
}
}
else if (mode == DeleteFrameMode::ALL_FRAMES) {
for (bke::greasepencil::Layer *layer : grease_pencil.layers_for_write()) {
if (layer->is_editable()) {
changed |= grease_pencil.remove_frames(*layer, {layer->frame_key_at(current_frame)});
}
}
}
if (changed) {
DEG_id_tag_update(&grease_pencil.id, ID_RECALC_GEOMETRY);
WM_event_add_notifier(C, NC_GEOM | ND_DATA | NA_EDITED, &grease_pencil);
}
return OPERATOR_FINISHED;
}
static void GREASE_PENCIL_OT_delete_frame(wmOperatorType *ot)
{
PropertyRNA *prop;
/* Identifiers. */
ot->name = "Delete Frame";
ot->idname = "GREASE_PENCIL_OT_delete_frame";
ot->description = "Delete Grease Pencil Frame(s)";
/* Callbacks. */
ot->invoke = WM_menu_invoke;
ot->exec = grease_pencil_delete_frame_exec;
ot->poll = editable_grease_pencil_poll;
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* Simplify parameters. */
ot->prop = prop = RNA_def_enum(ot->srna,
"type",
prop_greasepencil_deleteframe_types,
0,
"Type",
"Method used for deleting Grease Pencil Frames");
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
/** \} */
} // namespace blender::ed::greasepencil
void ED_operatortypes_grease_pencil_edit()
@ -720,6 +805,7 @@ void ED_operatortypes_grease_pencil_edit()
WM_operatortype_append(GREASE_PENCIL_OT_stroke_smooth);
WM_operatortype_append(GREASE_PENCIL_OT_stroke_simplify);
WM_operatortype_append(GREASE_PENCIL_OT_dissolve);
WM_operatortype_append(GREASE_PENCIL_OT_delete_frame);
}
void ED_keymap_grease_pencil(wmKeyConfig *keyconf)