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:
committed by
Falk David
parent
ee96947abc
commit
655b2b6c2c
@@ -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)
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user