diff options
author | Bastien Montagne <bastien@blender.org> | 2020-12-07 18:52:45 +0300 |
---|---|---|
committer | Bastien Montagne <bastien@blender.org> | 2020-12-07 18:55:51 +0300 |
commit | bab57550b69b8429bb2f081fbc75f1d1ca035a34 (patch) | |
tree | 2a92f1ea9a693b32bc22dea73d1dfe7bdfb4506b /source/blender/editors/object | |
parent | 513578b182fd0c427b9da653b715f8bfb16faec1 (diff) |
LibOverride: Abstract a bit handling of local items of RNA collections.
RNA collections that support insertion of new items in liboverride
data-block need a special way to distiguish between locale and
orig-from-linked items (since some operations are allowed on the forer,
but no the latter).
In future we want a proper solution to abstract that at the
`BKE_lib_override` level, but for now we need to add some code for each
case.
Note that this commit also fixes a few potential issues with GPencil
modifiers, and constraints, regarding their handling of local overrides.
Diffstat (limited to 'source/blender/editors/object')
-rw-r--r-- | source/blender/editors/object/object_constraint.c | 8 | ||||
-rw-r--r-- | source/blender/editors/object/object_gpencil_modifier.c | 34 | ||||
-rw-r--r-- | source/blender/editors/object/object_modifier.c | 8 |
3 files changed, 26 insertions, 24 deletions
diff --git a/source/blender/editors/object/object_constraint.c b/source/blender/editors/object/object_constraint.c index fa8531dfb48..e684ad03f53 100644 --- a/source/blender/editors/object/object_constraint.c +++ b/source/blender/editors/object/object_constraint.c @@ -706,11 +706,9 @@ static bool edit_constraint_poll_generic(bContext *C, return false; } - if (ID_IS_OVERRIDE_LIBRARY(ob) && !is_liboverride_allowed) { - if ((con == NULL) || (con->flag & CONSTRAINT_OVERRIDE_LIBRARY_LOCAL) == 0) { - CTX_wm_operator_poll_msg_set(C, "Cannot edit constraints coming from library override"); - return false; - } + if (!is_liboverride_allowed && !BKE_constraint_is_local_in_liboverride(ob, con)) { + CTX_wm_operator_poll_msg_set(C, "Cannot edit constraints coming from library override"); + return false; } return true; diff --git a/source/blender/editors/object/object_gpencil_modifier.c b/source/blender/editors/object/object_gpencil_modifier.c index eed3c7f419d..d3f165678c3 100644 --- a/source/blender/editors/object/object_gpencil_modifier.c +++ b/source/blender/editors/object/object_gpencil_modifier.c @@ -319,6 +319,8 @@ int ED_object_gpencil_modifier_copy(ReportList *reports, Object *ob, GpencilModi BLI_insertlinkafter(&ob->greasepencil_modifiers, md, nmd); BKE_gpencil_modifier_unique_name(&ob->greasepencil_modifiers, nmd); + nmd->flag |= eGpencilModifierFlag_OverrideLibrary_Local; + return 1; } @@ -422,7 +424,10 @@ void OBJECT_OT_gpencil_modifier_add(wmOperatorType *ot) /********** generic functions for operators using mod names and data context *********************/ -static bool gpencil_edit_modifier_poll_generic(bContext *C, StructRNA *rna_type, int obtype_flag) +static bool gpencil_edit_modifier_poll_generic(bContext *C, + StructRNA *rna_type, + int obtype_flag, + const bool is_liboverride_allowed) { PointerRNA ptr = CTX_data_pointer_get_type(C, "modifier", rna_type); Object *ob = (ptr.owner_id) ? (Object *)ptr.owner_id : ED_object_active_context(C); @@ -438,11 +443,10 @@ static bool gpencil_edit_modifier_poll_generic(bContext *C, StructRNA *rna_type, return false; } - if (ID_IS_OVERRIDE_LIBRARY(ob)) { - if ((mod == NULL) || (mod->flag & eGpencilModifierFlag_OverrideLibrary_Local) == 0) { - CTX_wm_operator_poll_msg_set(C, "Cannot edit modifiers coming from library override"); - return false; - } + if (!is_liboverride_allowed && + (mod == NULL || !BKE_gpencil_modifier_is_local_in_liboverride(ob, mod))) { + CTX_wm_operator_poll_msg_set(C, "Cannot edit modifiers coming from library override"); + return false; } return true; @@ -450,7 +454,14 @@ static bool gpencil_edit_modifier_poll_generic(bContext *C, StructRNA *rna_type, static bool gpencil_edit_modifier_poll(bContext *C) { - return gpencil_edit_modifier_poll_generic(C, &RNA_GpencilModifier, 0); + return gpencil_edit_modifier_poll_generic(C, &RNA_GpencilModifier, 0, false); +} + +/* Used by operators performing actions allowed also on modifiers from the overridden linked object + * (not only from added 'local' ones). */ +static bool gpencil_edit_modifier_liboverride_allowed_poll(bContext *C) +{ + return gpencil_edit_modifier_poll_generic(C, &RNA_Modifier, 0, true); } static void gpencil_edit_modifier_properties(wmOperatorType *ot) @@ -669,11 +680,6 @@ void OBJECT_OT_gpencil_modifier_move_down(wmOperatorType *ot) /* ************************* Move to Index Gpencil Modifier Operator ************************* */ -static bool gpencil_modifier_move_to_index_poll(bContext *C) -{ - return gpencil_edit_modifier_poll(C); -} - static int gpencil_modifier_move_to_index_exec(bContext *C, wmOperator *op) { Object *ob = ED_object_active_context(C); @@ -706,7 +712,7 @@ void OBJECT_OT_gpencil_modifier_move_to_index(wmOperatorType *ot) ot->invoke = gpencil_modifier_move_to_index_invoke; ot->exec = gpencil_modifier_move_to_index_exec; - ot->poll = gpencil_modifier_move_to_index_poll; + ot->poll = gpencil_edit_modifier_poll; /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; @@ -823,7 +829,7 @@ void OBJECT_OT_gpencil_modifier_copy(wmOperatorType *ot) ot->invoke = gpencil_modifier_copy_invoke; ot->exec = gpencil_modifier_copy_exec; - ot->poll = gpencil_edit_modifier_poll; + ot->poll = gpencil_edit_modifier_liboverride_allowed_poll; /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 7d12fa1805b..bb4581b0ee8 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -1052,11 +1052,9 @@ bool edit_modifier_poll_generic(bContext *C, return false; } - if (ID_IS_OVERRIDE_LIBRARY(ob) && !is_liboverride_allowed) { - if ((mod == NULL) || (mod->flag & eModifierFlag_OverrideLibrary_Local) == 0) { - CTX_wm_operator_poll_msg_set(C, "Cannot edit modifiers coming from library override"); - return false; - } + if (!is_liboverride_allowed && !BKE_modifier_is_local_in_liboverride(ob, mod)) { + CTX_wm_operator_poll_msg_set(C, "Cannot edit modifiers coming from library override"); + return false; } if (!is_editmode_allowed && CTX_data_edit_object(C) != NULL) { |