From 182484666bcc0f6b5908223d8f7365a535f6cd64 Mon Sep 17 00:00:00 2001 From: Chao Li Date: Tue, 8 Aug 2023 20:57:24 -0400 Subject: [PATCH 1/3] 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. --- .../grease_pencil/intern/grease_pencil_frames.cc | 14 ++++++++++++++ source/blender/editors/include/ED_grease_pencil.hh | 5 +++++ .../blender/editors/space_action/action_select.cc | 14 ++++++++++++-- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc b/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc index a69991174fa..2f29e1ab67a 100644 --- a/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc +++ b/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc @@ -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" @@ -108,6 +109,19 @@ void select_frames_region(KeyframeEditData *ked, } } +void select_frames_box(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) diff --git a/source/blender/editors/include/ED_grease_pencil.hh b/source/blender/editors/include/ED_grease_pencil.hh index c8cc02b6e0f..01a360c7db9 100644 --- a/source/blender/editors/include/ED_grease_pencil.hh +++ b/source/blender/editors/include/ED_grease_pencil.hh @@ -66,6 +66,11 @@ void select_frames_region(KeyframeEditData *ked, const short tool, const short select_mode); +void select_frames_box(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. */ diff --git a/source/blender/editors/space_action/action_select.cc b/source/blender/editors/space_action/action_select.cc index 842c0389145..bfa34999bff 100644 --- a/source/blender/editors/space_action/action_select.cc +++ b/source/blender/editors/space_action/action_select.cc @@ -428,6 +428,12 @@ static void box_select_elem( break; } #endif + case ANIMTYPE_GREASE_PENCIL_LAYER: { + blender::ed::greasepencil::select_frames_box( + static_cast(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(ale->data), xmin, xmax, sel_data->selectmode); @@ -1031,7 +1037,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_box( + static_cast(ale->data)->wrap(), min, max, SELECT_ADD); + ale->update |= ANIM_UPDATE_DEPS; break; case ANIMTYPE_GPLAYER: ED_gpencil_layer_frames_select_box( @@ -1481,7 +1489,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_box( + static_cast(ale->data)->wrap(), ked.f1, ked.f2, select_mode); + ale->update |= ANIM_UPDATE_DEPS; break; case ANIMTYPE_GPLAYER: ED_gpencil_layer_frames_select_box( -- 2.30.2 From abc262b852ef54a1b1f700fd49593989c6bdc4aa Mon Sep 17 00:00:00 2001 From: Chao Li Date: Tue, 15 Aug 2023 21:13:10 -0400 Subject: [PATCH 2/3] Rename select_frames_box to select_frames_range --- .../editors/grease_pencil/intern/grease_pencil_frames.cc | 8 ++++---- source/blender/editors/include/ED_grease_pencil.hh | 8 ++++---- source/blender/editors/space_action/action_select.cc | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc b/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc index 58b473f5110..efb089f8131 100644 --- a/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc +++ b/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc @@ -108,10 +108,10 @@ void select_frames_region(KeyframeEditData *ked, } } -void select_frames_box(bke::greasepencil::Layer &layer, - const float min, - const float max, - const short select_mode) +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()) { diff --git a/source/blender/editors/include/ED_grease_pencil.hh b/source/blender/editors/include/ED_grease_pencil.hh index 43c10bac03f..0732a213f2f 100644 --- a/source/blender/editors/include/ED_grease_pencil.hh +++ b/source/blender/editors/include/ED_grease_pencil.hh @@ -66,10 +66,10 @@ void select_frames_region(KeyframeEditData *ked, const short tool, const short select_mode); -void select_frames_box(bke::greasepencil::Layer &layer, - const float min, - const float max, - 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. diff --git a/source/blender/editors/space_action/action_select.cc b/source/blender/editors/space_action/action_select.cc index 9f6ec99330a..437227a66da 100644 --- a/source/blender/editors/space_action/action_select.cc +++ b/source/blender/editors/space_action/action_select.cc @@ -434,7 +434,7 @@ static void box_select_elem( } #endif case ANIMTYPE_GREASE_PENCIL_LAYER: { - blender::ed::greasepencil::select_frames_box( + blender::ed::greasepencil::select_frames_range( static_cast(ale->data)->wrap(), xmin, xmax, sel_data->selectmode); ale->update |= ANIM_UPDATE_DEPS; break; @@ -1057,7 +1057,7 @@ static void markers_selectkeys_between(bAnimContext *ac) LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) { switch (ale->type) { case ANIMTYPE_GREASE_PENCIL_LAYER: - blender::ed::greasepencil::select_frames_box( + blender::ed::greasepencil::select_frames_range( static_cast(ale->data)->wrap(), min, max, SELECT_ADD); ale->update |= ANIM_UPDATE_DEPS; break; @@ -1509,7 +1509,7 @@ 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: - blender::ed::greasepencil::select_frames_box( + blender::ed::greasepencil::select_frames_range( static_cast(ale->data)->wrap(), ked.f1, ked.f2, select_mode); ale->update |= ANIM_UPDATE_DEPS; break; -- 2.30.2 From bdf079bf687778e44af0e349296254570affdf84 Mon Sep 17 00:00:00 2001 From: Chao Li Date: Tue, 15 Aug 2023 22:11:01 -0400 Subject: [PATCH 3/3] ACTION_OT_select_box takes into consideration grease pencil summary channel --- source/blender/editors/space_action/action_select.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/blender/editors/space_action/action_select.cc b/source/blender/editors/space_action/action_select.cc index 437227a66da..cc8129a2c88 100644 --- a/source/blender/editors/space_action/action_select.cc +++ b/source/blender/editors/space_action/action_select.cc @@ -433,6 +433,15 @@ static void box_select_elem( break; } #endif + case ANIMTYPE_GREASE_PENCIL_DATABLOCK: { + GreasePencil *grease_pencil = static_cast(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(ale->data)->wrap(), xmin, xmax, sel_data->selectmode); -- 2.30.2