From 48f49deaa81a4b6f672687b0f86d30962b36efe3 Mon Sep 17 00:00:00 2001 From: YimingWu Date: Mon, 2 Jun 2025 16:44:25 +0200 Subject: [PATCH] Fix #139572: Grease Pencil: Support pasting strokes into multiple frames When multi-frame editing is enabled, users would expect to be able to paste strokes into multiple selected frames. This PR supports this by using `retrieve_editable_drawings` instead of `get_editable_drawing_at` to achieve such feature. Pull Request: https://projects.blender.org/blender/blender/pulls/139573 --- .../intern/grease_pencil_edit.cc | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc b/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc index c83b0ee2351..d17a04c0d96 100644 --- a/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc +++ b/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc @@ -2711,12 +2711,13 @@ static wmOperatorStatus grease_pencil_paste_strokes_exec(bContext *C, wmOperator return OPERATOR_CANCELLED; } - bke::greasepencil::Drawing *target_drawing = grease_pencil.get_editable_drawing_at( - *active_layer, scene.r.cfra); - BLI_assert(target_drawing != nullptr); - - paste_all_strokes_from_clipboard( - *bmain, *object, object_to_layer, keep_world_transform, paste_on_back, *target_drawing); + Vector drawing_infos = + ed::greasepencil::retrieve_editable_drawings_from_layer( + scene, grease_pencil, *active_layer); + for (const MutableDrawingInfo info : drawing_infos) { + paste_all_strokes_from_clipboard( + *bmain, *object, object_to_layer, keep_world_transform, paste_on_back, info.drawing); + } if (inserted_keyframe) { WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, nullptr); @@ -2776,18 +2777,19 @@ static wmOperatorStatus grease_pencil_paste_strokes_exec(bContext *C, wmOperator return OPERATOR_CANCELLED; } - bke::greasepencil::Drawing *target_drawing = grease_pencil.get_editable_drawing_at( - paste_layer, scene.r.cfra); - BLI_assert(target_drawing != nullptr); - - clipboard_paste_strokes_ex(*bmain, - *object, - curves_to_paste, - object_to_paste_layer, - clipboard.object_to_world, - keep_world_transform, - paste_on_back, - *target_drawing); + Vector drawing_infos = + ed::greasepencil::retrieve_editable_drawings_from_layer( + scene, grease_pencil, paste_layer); + for (const MutableDrawingInfo info : drawing_infos) { + clipboard_paste_strokes_ex(*bmain, + *object, + curves_to_paste, + object_to_paste_layer, + clipboard.object_to_world, + keep_world_transform, + paste_on_back, + info.drawing); + } if (inserted_keyframe) { WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, nullptr);