GPv3: Frame delete operator (edit mode) #110938
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue