GPv3: Select box grease pencil frames

Adapt the `ACTION_OT_select_leftright`, `ACTION_OT_select_box` and `ACTION_OT_select_column` operators to take into account grease pencil layer channels. These operators call `actkeys_select_leftright`, `box_select_elem`, and `markers_selectkeys_between`, respectively. In these three functions, grease pencil layer channels are considered now. This resolves #110522.

Pull Request: https://projects.blender.org/blender/blender/pulls/110939
This commit is contained in:
Chao Li 2023-08-16 11:44:15 +02:00 committed by Amélie Fondevilla
parent 007b7d0353
commit 27eb6d48d3
3 changed files with 40 additions and 2 deletions

@ -8,6 +8,7 @@
#include "BLI_map.hh"
#include "BLI_math_vector_types.hh"
#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_grease_pencil.hh"
@ -107,6 +108,19 @@ void select_frames_region(KeyframeEditData *ked,
}
}
void select_frames_range(bke::greasepencil::Layer &layer,
const float min,
const float max,
const short select_mode)
{
/* Only select those frames which are in bounds. */
for (auto [frame_number, frame] : layer.frames_for_write().items()) {
if (IN_RANGE(float(frame_number), min, max)) {
select_frame(frame, select_mode);
}
}
}
static void append_frame_to_key_edit_data(KeyframeEditData *ked,
const int frame_number,
const GreasePencilFrame &frame)

@ -66,6 +66,11 @@ void select_frames_region(KeyframeEditData *ked,
const short tool,
const short select_mode);
void select_frames_range(bke::greasepencil::Layer &layer,
const float min,
const float max,
const short select_mode);
/**
* Returns true if any frame of the \a layer is selected.
*/

@ -433,6 +433,21 @@ static void box_select_elem(
break;
}
#endif
case ANIMTYPE_GREASE_PENCIL_DATABLOCK: {
GreasePencil *grease_pencil = static_cast<GreasePencil *>(ale->data);
for (blender::bke::greasepencil::Layer *layer : grease_pencil->layers_for_write()) {
blender::ed::greasepencil::select_frames_range(
layer->wrap(), xmin, xmax, sel_data->selectmode);
}
ale->update |= ANIM_UPDATE_DEPS;
break;
}
case ANIMTYPE_GREASE_PENCIL_LAYER: {
blender::ed::greasepencil::select_frames_range(
static_cast<GreasePencilLayer *>(ale->data)->wrap(), xmin, xmax, sel_data->selectmode);
ale->update |= ANIM_UPDATE_DEPS;
break;
}
case ANIMTYPE_GPLAYER: {
ED_gpencil_layer_frames_select_box(
static_cast<bGPDlayer *>(ale->data), xmin, xmax, sel_data->selectmode);
@ -1051,7 +1066,9 @@ static void markers_selectkeys_between(bAnimContext *ac)
LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) {
switch (ale->type) {
case ANIMTYPE_GREASE_PENCIL_LAYER:
/* GPv3: To be implemented. */
blender::ed::greasepencil::select_frames_range(
static_cast<GreasePencilLayer *>(ale->data)->wrap(), min, max, SELECT_ADD);
ale->update |= ANIM_UPDATE_DEPS;
break;
case ANIMTYPE_GPLAYER:
ED_gpencil_layer_frames_select_box(
@ -1501,7 +1518,9 @@ static void actkeys_select_leftright(bAnimContext *ac, short leftright, short se
LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) {
switch (ale->type) {
case ANIMTYPE_GREASE_PENCIL_LAYER:
/* GPv3: To be implemented. */
blender::ed::greasepencil::select_frames_range(
static_cast<GreasePencilLayer *>(ale->data)->wrap(), ked.f1, ked.f2, select_mode);
ale->update |= ANIM_UPDATE_DEPS;
break;
case ANIMTYPE_GPLAYER:
ED_gpencil_layer_frames_select_box(