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:
committed by
Amélie Fondevilla
parent
088d7a0bdd
commit
f7130d98c4
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user