diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2015-09-02 14:02:06 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2015-09-02 14:10:29 +0300 |
commit | 525d7e02d48da1f8d415e84898039e647e6bc458 (patch) | |
tree | b001617f50d7952e87260f0b1c09995c10f15495 /source/blender/editors/object | |
parent | 5fe9b36aa6f2fcc86e3ee4fedb3ce802d0fc5f05 (diff) |
Fix T45991: Transfer Weight tool UI is inconsistent and crashes blender.
Since data transfer when called from this tool has reversed behavior (it transfers **towards**
active object, as previous tool), we have to also reverse source/destination layers selection options.
Also fix 'reverse' option being saved, otherwise calling regular operator after 'transfer weights'
would stay in reverse mode, ugly!
Diffstat (limited to 'source/blender/editors/object')
-rw-r--r-- | source/blender/editors/object/object_data_transfer.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/source/blender/editors/object/object_data_transfer.c b/source/blender/editors/object/object_data_transfer.c index 90c3f0026ac..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) { @@ -530,7 +551,7 @@ 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, " @@ -574,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"); |