Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_outliner/tree/tree_element_overrides.cc
| Show All 34 Lines | |||||
| #include "tree_element_overrides.hh" | #include "tree_element_overrides.hh" | ||||
| namespace blender::ed::outliner { | namespace blender::ed::outliner { | ||||
| TreeElementOverridesBase::TreeElementOverridesBase(TreeElement &legacy_te, ID &id) | TreeElementOverridesBase::TreeElementOverridesBase(TreeElement &legacy_te, ID &id) | ||||
| : AbstractTreeElement(legacy_te), id_(id) | : AbstractTreeElement(legacy_te), id_(id) | ||||
| { | { | ||||
| BLI_assert(legacy_te.store_elem->type == TSE_LIBRARY_OVERRIDE_BASE); | BLI_assert(legacy_te.store_elem->type == TSE_LIBRARY_OVERRIDE_BASE); | ||||
| if (legacy_te.parent != nullptr && | |||||
| ELEM(legacy_te.parent->store_elem->type, TSE_SOME_ID, TSE_LAYER_COLLECTION)) | |||||
| { | |||||
| legacy_te.name = IFACE_("Library Overrides"); | legacy_te.name = IFACE_("Library Overrides"); | ||||
| } | } | ||||
| else { | |||||
| legacy_te.name = id.name + 2; | |||||
| } | |||||
| } | |||||
| void TreeElementOverridesBase::expand(SpaceOutliner &space_outliner) const | void TreeElementOverridesBase::expand(SpaceOutliner &space_outliner) const | ||||
| { | { | ||||
| BLI_assert(id_.override_library != nullptr); | BLI_assert(id_.override_library != nullptr); | ||||
| const bool show_system_overrides = (SUPPORT_FILTER_OUTLINER(&space_outliner) && | |||||
| (space_outliner.filter & SO_FILTER_SHOW_SYSTEM_OVERRIDES) != | |||||
| 0); | |||||
| PointerRNA idpoin; | PointerRNA idpoin; | ||||
| RNA_id_pointer_create(&id_, &idpoin); | RNA_id_pointer_create(&id_, &idpoin); | ||||
| PointerRNA override_rna_ptr; | PointerRNA override_rna_ptr; | ||||
| PropertyRNA *override_rna_prop; | PropertyRNA *override_rna_prop; | ||||
| short index = 0; | short index = 0; | ||||
| for (auto *override_prop : | for (auto *override_prop : | ||||
| ListBaseWrapper<IDOverrideLibraryProperty>(id_.override_library->properties)) { | ListBaseWrapper<IDOverrideLibraryProperty>(id_.override_library->properties)) { | ||||
| if (!BKE_lib_override_rna_property_find( | const bool is_rna_path_valid = BKE_lib_override_rna_property_find( | ||||
| &idpoin, override_prop, &override_rna_ptr, &override_rna_prop)) { | &idpoin, override_prop, &override_rna_ptr, &override_rna_prop); | ||||
| /* This is fine, override properties list is not always fully up-to-date with current | if (is_rna_path_valid && !show_system_overrides && | ||||
| * RNA/IDProps etc., this gets cleaned up when re-generating the overrides rules, | ELEM(override_prop->rna_prop_type, PROP_POINTER, PROP_COLLECTION) && | ||||
| * no error here. */ | RNA_struct_is_ID(RNA_property_pointer_type(&override_rna_ptr, override_rna_prop))) { | ||||
| bool do_continue = true; | |||||
| for (auto *override_prop_op : | |||||
| ListBaseWrapper<IDOverrideLibraryPropertyOperation>(override_prop->operations)) { | |||||
| if ((override_prop_op->flag & IDOVERRIDE_LIBRARY_FLAG_IDPOINTER_MATCH_REFERENCE) == 0) { | |||||
| do_continue = false; | |||||
| break; | |||||
| } | |||||
| } | |||||
| if (do_continue) { | |||||
| continue; | continue; | ||||
| } | } | ||||
| } | |||||
| TreeElementOverridesData data = {id_, *override_prop}; | TreeElementOverridesData data = {id_, *override_prop, is_rna_path_valid}; | ||||
| outliner_add_element( | outliner_add_element( | ||||
| &space_outliner, &legacy_te_.subtree, &data, &legacy_te_, TSE_LIBRARY_OVERRIDE, index++); | &space_outliner, &legacy_te_.subtree, &data, &legacy_te_, TSE_LIBRARY_OVERRIDE, index++); | ||||
| } | } | ||||
| } | } | ||||
| TreeElementOverridesProperty::TreeElementOverridesProperty(TreeElement &legacy_te, | TreeElementOverridesProperty::TreeElementOverridesProperty(TreeElement &legacy_te, | ||||
| TreeElementOverridesData &override_data) | TreeElementOverridesData &override_data) | ||||
| : AbstractTreeElement(legacy_te), | : AbstractTreeElement(legacy_te), | ||||
| id_(override_data.id), | id_(override_data.id), | ||||
| override_prop_(override_data.override_property) | override_prop_(override_data.override_property) | ||||
| { | { | ||||
| BLI_assert(legacy_te.store_elem->type == TSE_LIBRARY_OVERRIDE); | BLI_assert(legacy_te.store_elem->type == TSE_LIBRARY_OVERRIDE); | ||||
| legacy_te.name = override_prop_.rna_path; | legacy_te.name = override_prop_.rna_path; | ||||
| /* Abusing this for now, better way to do it is also pending current refactor of the whole tree | |||||
| * code to use C++. */ | |||||
| legacy_te.directdata = POINTER_FROM_UINT(override_data.is_rna_path_valid); | |||||
| } | } | ||||
| } // namespace blender::ed::outliner | } // namespace blender::ed::outliner | ||||