Fix #134843: Grease Pencil: Crash duplicating active keyframe

Crash in above operation when no drawing exists at current frame. This
is due to accessing value from a nullopt optional. Not fixed with extra
condition before calling `value()`. Also moved this logic into a lambda to
avoid duplicate code.

Pull Request: https://projects.blender.org/blender/blender/pulls/134910
This commit is contained in:
Pratik Borhade
2025-02-22 11:07:20 +01:00
committed by Pratik Borhade
parent dafff07ad9
commit 92d1764e30

View File

@@ -804,20 +804,26 @@ static int grease_pencil_frame_duplicate_exec(bContext *C, wmOperator *op)
const int current_frame = scene->r.cfra;
bool changed = false;
auto insert_duplicate_frame = [&](Layer &layer, std::optional<int> active_frame_number) {
if (!active_frame_number.has_value()) {
return false;
}
return grease_pencil.insert_duplicate_frame(
layer, active_frame_number.value(), current_frame, false);
};
if (only_active) {
if (!grease_pencil.has_active_layer()) {
return OPERATOR_CANCELLED;
}
Layer &active_layer = *grease_pencil.get_active_layer();
const std::optional<int> active_frame_number = active_layer.start_frame_at(current_frame);
changed |= grease_pencil.insert_duplicate_frame(
active_layer, active_frame_number.value(), current_frame, false);
changed |= insert_duplicate_frame(active_layer, active_frame_number);
}
else {
for (Layer *layer : grease_pencil.layers_for_write()) {
const std::optional<int> active_frame_number = layer->start_frame_at(current_frame);
changed |= grease_pencil.insert_duplicate_frame(
*layer, active_frame_number.value(), current_frame, false);
changed |= insert_duplicate_frame(*layer, active_frame_number);
}
}