GPv3: Move to layer: Add popup for entering new layer name

In the `move_to_layer` operator, add a popup when moving to a new layer
to enter the new layers name.

This is consistent with GPv2.
This commit is contained in:
Falk David
2024-02-05 14:52:44 +01:00
parent d7127dea02
commit b37ee403b2

View File

@@ -1698,9 +1698,17 @@ static void GREASE_PENCIL_OT_stroke_reorder(wmOperatorType *ot)
/** \name Move To Layer Operator
* \{ */
static int grease_pencil_move_to_layer_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
const bool add_new_layer = RNA_boolean_get(op->ptr, "add_new_layer");
if (add_new_layer) {
return WM_operator_props_popup_confirm(C, op, event);
}
return OPERATOR_RUNNING_MODAL;
}
static int grease_pencil_move_to_layer_exec(bContext *C, wmOperator *op)
{
using namespace blender::bke;
using namespace bke::greasepencil;
const Scene *scene = CTX_data_scene(C);
bool changed = false;
@@ -1709,26 +1717,22 @@ static int grease_pencil_move_to_layer_exec(bContext *C, wmOperator *op)
GreasePencil &grease_pencil = *static_cast<GreasePencil *>(object->data);
int target_layer_name_length;
char *target_layer_name = nullptr;
char *target_layer_name = RNA_string_get_alloc(
op->ptr, "target_layer_name", nullptr, 0, &target_layer_name_length);
BLI_SCOPED_DEFER([&] { MEM_SAFE_FREE(target_layer_name); });
const bool add_new_layer = RNA_boolean_get(op->ptr, "add_new_layer");
if (add_new_layer) {
Layer &new_layer = grease_pencil.add_layer("Layer");
target_layer_name = BLI_strdup_null(new_layer.name().c_str());
}
else {
target_layer_name = RNA_string_get_alloc(
op->ptr, "target_layer_name", nullptr, 0, &target_layer_name_length);
grease_pencil.add_layer(target_layer_name);
}
TreeNode *target_node = grease_pencil.find_node_by_name(target_layer_name);
if (target_node == nullptr) {
if (target_node == nullptr || !target_node->is_layer()) {
BKE_reportf(op->reports, RPT_ERROR, "There is no layer '%s'", target_layer_name);
return OPERATOR_CANCELLED;
}
Layer *layer_dst = &target_node->as_layer();
if (layer_dst->is_locked()) {
Layer &layer_dst = target_node->as_layer();
if (layer_dst.is_locked()) {
BKE_reportf(op->reports, RPT_ERROR, "'%s' Layer is locked", target_layer_name);
return OPERATOR_CANCELLED;
}
@@ -1743,10 +1747,10 @@ static int grease_pencil_move_to_layer_exec(bContext *C, wmOperator *op)
continue;
}
if (!layer_dst->has_drawing_at(info.frame_number)) {
if (!layer_dst.has_drawing_at(info.frame_number)) {
/* Move geometry to a new drawing in target layer. */
grease_pencil.insert_blank_frame(*layer_dst, info.frame_number, 0, BEZT_KEYTYPE_KEYFRAME);
Drawing &drawing_dst = *grease_pencil.get_editable_drawing_at(*layer_dst, info.frame_number);
grease_pencil.insert_blank_frame(layer_dst, info.frame_number, 0, BEZT_KEYTYPE_KEYFRAME);
Drawing &drawing_dst = *grease_pencil.get_editable_drawing_at(layer_dst, info.frame_number);
drawing_dst.strokes_for_write() = bke::curves_copy_curve_selection(
curves_src, selected_strokes, {});
@@ -1754,21 +1758,22 @@ static int grease_pencil_move_to_layer_exec(bContext *C, wmOperator *op)
drawing_dst.tag_topology_changed();
}
else {
else if (Drawing *drawing_dst = grease_pencil.get_editable_drawing_at(layer_dst,
info.frame_number))
{
/* Append geometry to drawing in target layer. */
Drawing &drawing_dst = *grease_pencil.get_editable_drawing_at(*layer_dst, info.frame_number);
bke::CurvesGeometry selected_elems = curves_copy_curve_selection(
curves_src, selected_strokes, {});
Curves *selected_curves = bke::curves_new_nomain(std::move(selected_elems));
Curves *layer_curves = bke::curves_new_nomain(std::move(drawing_dst.strokes_for_write()));
std::array<GeometrySet, 2> geometry_sets{GeometrySet::from_curves(selected_curves),
GeometrySet::from_curves(layer_curves)};
GeometrySet joined = geometry::join_geometries(geometry_sets, {});
drawing_dst.strokes_for_write() = std::move(joined.get_curves_for_write()->geometry.wrap());
Curves *layer_curves = bke::curves_new_nomain(std::move(drawing_dst->strokes_for_write()));
std::array<bke::GeometrySet, 2> geometry_sets{bke::GeometrySet::from_curves(selected_curves),
bke::GeometrySet::from_curves(layer_curves)};
bke::GeometrySet joined = geometry::join_geometries(geometry_sets, {});
drawing_dst->strokes_for_write() = std::move(joined.get_curves_for_write()->geometry.wrap());
curves_src.remove_curves(selected_strokes, {});
drawing_dst.tag_topology_changed();
drawing_dst->tag_topology_changed();
}
info.drawing.tag_topology_changed();
@@ -1794,6 +1799,7 @@ static void GREASE_PENCIL_OT_move_to_layer(wmOperatorType *ot)
ot->description = "Move selected strokes to another layer";
/* callbacks. */
ot->invoke = grease_pencil_move_to_layer_invoke;
ot->exec = grease_pencil_move_to_layer_exec;
ot->poll = editable_grease_pencil_poll;
@@ -1802,7 +1808,7 @@ static void GREASE_PENCIL_OT_move_to_layer(wmOperatorType *ot)
prop = RNA_def_string(
ot->srna, "target_layer_name", "Layer", INT16_MAX, "Name", "Target Grease Pencil Layer");
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
prop = RNA_def_boolean(
ot->srna, "add_new_layer", false, "New Layer", "Move selection to a new layer");
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);