From 655b2b6c2cf382bec527d2a65bfd71dc83a044f6 Mon Sep 17 00:00:00 2001 From: Amelie Fondevilla Date: Thu, 3 Aug 2023 11:49:14 +0200 Subject: [PATCH] GPv3: Delete grease pencil frames Implementation of the delete frame operator for grease pencil channels. Changes in the GreasePencil::remove_frame_at function so that it returns a boolean. Pull Request: https://projects.blender.org/blender/blender/pulls/110746 --- source/blender/blenkernel/intern/grease_pencil.cc | 9 +++++---- .../grease_pencil/intern/grease_pencil_frames.cc | 13 +++++++++++++ source/blender/editors/include/ED_grease_pencil.h | 2 ++ source/blender/editors/space_action/action_edit.cc | 5 ++++- source/blender/makesdna/DNA_grease_pencil_types.h | 2 +- 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/source/blender/blenkernel/intern/grease_pencil.cc b/source/blender/blenkernel/intern/grease_pencil.cc index 4cdc0a355c6..9f936da609e 100644 --- a/source/blender/blenkernel/intern/grease_pencil.cc +++ b/source/blender/blenkernel/intern/grease_pencil.cc @@ -1481,30 +1481,31 @@ bool GreasePencil::insert_duplicate_frame(blender::bke::greasepencil::Layer &lay return true; } -void GreasePencil::remove_frame_at(blender::bke::greasepencil::Layer &layer, +bool GreasePencil::remove_frame_at(blender::bke::greasepencil::Layer &layer, const int frame_number) { using namespace blender::bke::greasepencil; if (!layer.frames().contains(frame_number)) { - return; + return false; } const GreasePencilFrame &frame_to_remove = layer.frames().lookup(frame_number); const int drawing_index_to_remove = frame_to_remove.drawing_index; if (!layer.remove_frame(frame_number)) { /* If removing the frame was not successful, return early. */ - return; + return false; } GreasePencilDrawingBase *drawing_base = this->drawings(drawing_index_to_remove); if (drawing_base->type != GP_DRAWING) { /* If the drawing is referenced from another object, we don't track it's users because we * cannot delete drawings from another object. Return early. */ - return; + return false; } Drawing &drawing = reinterpret_cast(drawing_base)->wrap(); drawing.remove_user(); if (!drawing.has_users()) { this->remove_drawing(drawing_index_to_remove); } + return true; } void GreasePencil::remove_drawing(const int index_to_remove) diff --git a/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc b/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc index 0d318cab415..d6ac0350e8b 100644 --- a/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc +++ b/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc @@ -26,6 +26,19 @@ namespace blender::ed::greasepencil { +bool remove_all_selected_frames(GreasePencil &grease_pencil, bke::greasepencil::Layer &layer) +{ + bool changed = false; + for (auto [frame_number, frame] : layer.frames().items()) { + if (!frame.is_selected()) { + continue; + } + changed |= grease_pencil.remove_frame_at(layer, frame_number); + } + + return changed; +} + static void select_frame(GreasePencilFrame &frame, const short select_mode) { switch (select_mode) { diff --git a/source/blender/editors/include/ED_grease_pencil.h b/source/blender/editors/include/ED_grease_pencil.h index d792e56c8ff..55640e97fcd 100644 --- a/source/blender/editors/include/ED_grease_pencil.h +++ b/source/blender/editors/include/ED_grease_pencil.h @@ -61,6 +61,8 @@ eAttrDomain ED_grease_pencil_selection_domain_get(struct bContext *C); namespace blender::ed::greasepencil { +bool remove_all_selected_frames(GreasePencil &grease_pencil, bke::greasepencil::Layer &layer); + void select_layer_channel(GreasePencil *grease_pencil, bke::greasepencil::Layer *layer); /** diff --git a/source/blender/editors/space_action/action_edit.cc b/source/blender/editors/space_action/action_edit.cc index c0c737ee128..abbaf09c60e 100644 --- a/source/blender/editors/space_action/action_edit.cc +++ b/source/blender/editors/space_action/action_edit.cc @@ -46,6 +46,7 @@ #include "ED_anim_api.h" #include "ED_gpencil_legacy.h" +#include "ED_grease_pencil.h" #include "ED_keyframes_edit.h" #include "ED_keyframing.h" #include "ED_markers.h" @@ -1086,7 +1087,9 @@ static bool delete_action_keys(bAnimContext *ac) changed = ED_gpencil_layer_frames_delete((bGPDlayer *)ale->data); } else if (ale->type == ANIMTYPE_GREASE_PENCIL_LAYER) { - /* GPv3: To be implemented. */ + changed = blender::ed::greasepencil::remove_all_selected_frames( + *reinterpret_cast(ale->id), + static_cast(ale->data)->wrap()); } else if (ale->type == ANIMTYPE_MASKLAYER) { changed = ED_masklayer_frames_delete((MaskLayer *)ale->data); diff --git a/source/blender/makesdna/DNA_grease_pencil_types.h b/source/blender/makesdna/DNA_grease_pencil_types.h index ca334286c66..092a7a9a94f 100644 --- a/source/blender/makesdna/DNA_grease_pencil_types.h +++ b/source/blender/makesdna/DNA_grease_pencil_types.h @@ -492,7 +492,7 @@ typedef struct GreasePencil { const int dst_frame_number, const bool do_instance); - void remove_frame_at(blender::bke::greasepencil::Layer &layer, int frame_number); + bool remove_frame_at(blender::bke::greasepencil::Layer &layer, int frame_number); void remove_drawing(int index);