GPv3: Select frames by column

Implementation of column-based operators : "Columns on selected keys", "Column on current frame", and "Columns on selected markers" for grease pencil frames in the dopesheet.

Pull Request: https://projects.blender.org/blender/blender/pulls/110523
This commit is contained in:
Amelie Fondevilla
2023-07-28 16:18:40 +02:00
committed by Amélie Fondevilla
parent 088d7a0bdd
commit f7130d98c4
3 changed files with 45 additions and 1 deletions

View File

@@ -70,6 +70,28 @@ bool layer_has_any_frame_selected(const bke::greasepencil::Layer *layer)
return false;
}
static void append_frame_to_key_edit_data(KeyframeEditData *ked,
const int frame_number,
const GreasePencilFrame &frame)
{
CfraElem *ce = MEM_cnew<CfraElem>(__func__);
ce->cfra = float(frame_number);
ce->sel = frame.is_selected();
BLI_addtail(&ked->list, ce);
}
void create_keyframe_edit_data_selected_frames_list(KeyframeEditData *ked,
const bke::greasepencil::Layer *layer)
{
BLI_assert(ked != nullptr);
for (const auto &[frame_number, frame] : layer->frames().items()) {
if (frame.is_selected()) {
append_frame_to_key_edit_data(ked, frame_number, frame);
}
}
}
static int insert_blank_frame_exec(bContext *C, wmOperator *op)
{
using namespace blender::bke::greasepencil;

View File

@@ -55,6 +55,8 @@ eAttrDomain ED_grease_pencil_selection_domain_get(struct bContext *C);
# include "BLI_generic_span.hh"
# include "BLI_math_matrix_types.hh"
# include "ED_keyframes_edit.h"
namespace blender::ed::greasepencil {
void select_layer_channel(GreasePencil *grease_pencil, bke::greasepencil::Layer *layer);
@@ -74,6 +76,9 @@ void select_all_frames(bke::greasepencil::Layer *layer, const short select_mode)
*/
bool layer_has_any_frame_selected(const bke::greasepencil::Layer *layer);
void create_keyframe_edit_data_selected_frames_list(KeyframeEditData *ked,
const bke::greasepencil::Layer *layer);
bool active_grease_pencil_poll(bContext *C);
bool editable_grease_pencil_poll(bContext *C);
bool editable_grease_pencil_point_selection_poll(bContext *C);

View File

@@ -1080,7 +1080,19 @@ static void columnselect_action_keys(bAnimContext *ac, short mode)
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, eAnimCont_Types(ac->datatype));
for (ale = static_cast<bAnimListElem *>(anim_data.first); ale; ale = ale->next) {
ED_gpencil_layer_make_cfra_list(static_cast<bGPDlayer *>(ale->data), &ked.list, true);
switch (ale->type) {
case ANIMTYPE_GPLAYER:
ED_gpencil_layer_make_cfra_list(
static_cast<bGPDlayer *>(ale->data), &ked.list, true);
break;
case ANIMTYPE_GREASE_PENCIL_LAYER:
blender::ed::greasepencil ::create_keyframe_edit_data_selected_frames_list(
&ked, static_cast<blender::bke::greasepencil::Layer *>(ale->data));
break;
default:
/* Invalid channel type. */
BLI_assert_unreachable();
}
}
}
else {
@@ -1146,6 +1158,11 @@ static void columnselect_action_keys(bAnimContext *ac, short mode)
ED_gpencil_select_frame(static_cast<bGPDlayer *>(ale->data), ce->cfra, SELECT_ADD);
ale->update |= ANIM_UPDATE_DEPS;
}
else if (ale->type == ANIMTYPE_GREASE_PENCIL_LAYER) {
blender::ed::greasepencil::select_frame_at(
static_cast<blender::bke::greasepencil::Layer *>(ale->data), ce->cfra, SELECT_ADD);
ale->update |= ANIM_UPDATE_DEPS;
}
else if (ale->type == ANIMTYPE_MASKLAYER) {
ED_mask_select_frame(static_cast<MaskLayer *>(ale->data), ce->cfra, SELECT_ADD);
}