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
This commit is contained in:
Amelie Fondevilla
2023-08-03 11:49:14 +02:00
committed by Falk David
parent ee96947abc
commit 655b2b6c2c
5 changed files with 25 additions and 6 deletions

View File

@@ -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<GreasePencilDrawing *>(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)

View File

@@ -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) {

View File

@@ -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);
/**

View File

@@ -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<GreasePencil *>(ale->id),
static_cast<GreasePencilLayer *>(ale->data)->wrap());
}
else if (ale->type == ANIMTYPE_MASKLAYER) {
changed = ED_masklayer_frames_delete((MaskLayer *)ale->data);

View File

@@ -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);