diff options
Diffstat (limited to 'source/blender/editors/object/object_data_transfer.c')
-rw-r--r-- | source/blender/editors/object/object_data_transfer.c | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/source/blender/editors/object/object_data_transfer.c b/source/blender/editors/object/object_data_transfer.c index 0b604a73977..95e1204e122 100644 --- a/source/blender/editors/object/object_data_transfer.c +++ b/source/blender/editors/object/object_data_transfer.c @@ -183,7 +183,8 @@ static EnumPropertyItem *dt_layers_select_src_itemf( } /* Note: DT_layers_select_dst_items enum is from rna_modifier.c */ -static EnumPropertyItem *dt_layers_select_dst_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free) +static EnumPropertyItem *dt_layers_select_dst_itemf( + bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free) { EnumPropertyItem *item = NULL; int totitem = 0; @@ -208,6 +209,26 @@ static EnumPropertyItem *dt_layers_select_dst_itemf(bContext *C, PointerRNA *ptr return item; } +static EnumPropertyItem *dt_layers_select_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *prop, bool *r_free) +{ + const bool reverse_transfer = RNA_boolean_get(ptr, "use_reverse_transfer"); + + if (STREQ(RNA_property_identifier(prop), "layers_select_dst")) { + if (reverse_transfer) { + return dt_layers_select_src_itemf(C, ptr, prop, r_free); + } + else { + return dt_layers_select_dst_itemf(C, ptr, prop, r_free); + } + } + else if (reverse_transfer) { + return dt_layers_select_dst_itemf(C, ptr, prop, r_free); + } + else { + return dt_layers_select_src_itemf(C, ptr, prop, r_free); + } +} + /* Note: DT_mix_mode_items enum is from rna_modifier.c */ static EnumPropertyItem *dt_mix_mode_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free) { @@ -329,6 +350,8 @@ static int data_transfer_exec(bContext *C, wmOperator *op) bool changed = false; + const bool is_frozen = RNA_boolean_get(op->ptr, "use_freeze"); + const bool reverse_transfer = RNA_boolean_get(op->ptr, "use_reverse_transfer"); const int data_type = RNA_enum_get(op->ptr, "data_type"); @@ -358,6 +381,12 @@ static int data_transfer_exec(bContext *C, wmOperator *op) SpaceTransform space_transform_data; SpaceTransform *space_transform = (use_object_transform && !use_auto_transform) ? &space_transform_data : NULL; + if (is_frozen) { + BKE_report(op->reports, RPT_INFO, + "Operator is frozen, changes to its settings won't take effect until you unfreeze it"); + return OPERATOR_FINISHED; + } + if (reverse_transfer && ((ID *)(ob_src->data))->lib) { /* Do not transfer to linked data, not supported. */ return OPERATOR_CANCELLED; @@ -522,7 +551,11 @@ void OBJECT_OT_data_transfer(wmOperatorType *ot) /* Properties.*/ prop = RNA_def_boolean(ot->srna, "use_reverse_transfer", false, "Reverse Transfer", "Transfer from selected objects to active one"); - RNA_def_property_flag(prop, PROP_HIDDEN); + RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); + + RNA_def_boolean(ot->srna, "use_freeze", false, "Freeze Operator", + "Prevent changes to settings to re-run the operator, " + "handy to change several things at once with heavy geometry"); /* Data type to transfer. */ ot->prop = RNA_def_enum(ot->srna, "data_type", DT_layer_items, 0, "Data Type", "Which data to transfer"); @@ -562,11 +595,11 @@ void OBJECT_OT_data_transfer(wmOperatorType *ot) /* How to handle multi-layers types of data. */ prop = RNA_def_enum(ot->srna, "layers_select_src", DT_layers_select_src_items, DT_LAYERS_ACTIVE_SRC, "Source Layers Selection", "Which layers to transfer, in case of multi-layers types"); - RNA_def_property_enum_funcs_runtime(prop, NULL, NULL, dt_layers_select_src_itemf); + RNA_def_property_enum_funcs_runtime(prop, NULL, NULL, dt_layers_select_itemf); prop = RNA_def_enum(ot->srna, "layers_select_dst", DT_layers_select_dst_items, DT_LAYERS_ACTIVE_DST, "Destination Layers Matching", "How to match source and destination layers"); - RNA_def_property_enum_funcs_runtime(prop, NULL, NULL, dt_layers_select_dst_itemf); + RNA_def_property_enum_funcs_runtime(prop, NULL, NULL, dt_layers_select_itemf); prop = RNA_def_enum(ot->srna, "mix_mode", DT_mix_mode_items, CDT_MIX_TRANSFER, "Mix Mode", "How to affect destination elements with source values"); |