49 void ensure_entire_collection(
TreeElement &te_to_expand,
51 const char *coll_prop_path,
67 if (legacy_te.
parent !=
nullptr &&
73 legacy_te.
name =
id.name + 2;
80 return RPT_(
"This override data-block is not needed anymore, but was detected as user-edited");
84 return RPT_(
"This override data-block is unused");
91 const bool show_system_overrides,
102 int rnaprop_index = 0;
104 &idpoin, override_prop, &override_rna_ptr, &override_rna_prop, &rnaprop_index);
108 if (is_rna_path_valid && !show_system_overrides) {
110 bool is_system_override =
false;
123 is_system_override =
true;
129 &
id, override_prop, override_rna_prop, rnaprop_index))
140 id, *override_prop, override_rna_ptr, *override_rna_prop, is_rna_path_valid};
174 override_rna_ptr(override_data.override_rna_ptr),
175 override_rna_prop(override_data.override_rna_prop),
176 rna_path(override_data.override_property.rna_path),
177 is_rna_path_valid(override_data.is_rna_path_valid)
189 "This override property does not exist in current data, it will be removed on "
190 "next .blend file save");
210 "Override operations are only supported for collections right now");
214 throw std::invalid_argument(
"missing operation");
217 operation_ = std::make_unique<IDOverrideLibraryPropertyOperation>(*override_data.
operation);
219 operation_->next = operation_->prev =
nullptr;
221 if (std::optional<PointerRNA> col_item_ptr = get_collection_ptr()) {
224 legacy_te.
name = dyn_name;
235 switch (operation_->operation) {
238 return RPT_(
"Added through override");
245 return RPT_(
"Protected from override");
247 return RPT_(
"Additive override");
249 return RPT_(
"Subtractive override");
251 return RPT_(
"Multiplicative override");
260 if (
const std::optional<PointerRNA> col_item_ptr = get_collection_ptr()) {
267std::optional<PointerRNA> TreeElementOverridesPropertyOperation::get_collection_ptr()
const
272 operation_->subitem_local_index,
307 : space_outliner_(space_outliner)
322 const char *elem_path =
nullptr;
324 char name_buf[128], *name;
331 const char *previous_path = elem_path;
332 const char *new_path =
RNA_path_append(previous_path, &elem->ptr, elem->prop, -1,
nullptr);
334 te_to_expand = &ensure_label_element_for_prop(
335 *te_to_expand, new_path, elem->ptr, *elem->prop, index);
342 &elem->ptr, elem->prop, &elem->next->ptr);
345 previous_path, &elem->ptr, elem->prop, coll_item_idx, name);
346 if (name && (name != name_buf)) {
350 te_to_expand = &ensure_label_element_for_ptr(
351 *te_to_expand, coll_item_path, elem->
next->ptr, index);
353 MEM_delete(new_path);
354 new_path = coll_item_path;
358 MEM_delete(elem_path);
359 elem_path = new_path;
374 te_to_expand = &ensure_label_element_for_prop(*te_to_expand,
380 ensure_entire_collection(*te_to_expand, override_data, elem_path, index);
395 MEM_delete(elem_path);
398void OverrideRNAPathTreeBuilder::ensure_entire_collection(
402 const char *coll_prop_path,
409 char name_buf[128], *name;
417 if (name && (name != name_buf)) {
430 TreeElement *current_te =
nullptr;
432 TreeElement *existing_te = path_te_map.lookup_default(coll_item_path,
nullptr);
439 current_te = existing_te;
444 else if (item_operation) {
445 TreeElementOverridesData override_op_data = override_data;
446 override_op_data.
operation = item_operation;
450 &override_op_data.id,
458 current_te = &ensure_label_element_for_ptr(te_to_expand, coll_item_path, itemptr, index);
461 MEM_delete(coll_item_path);
463 previous_te = current_te;
480 if (icon != ICON_DOT) {
488TreeElement &OverrideRNAPathTreeBuilder::ensure_label_element_for_prop(
491 return *path_te_map.lookup_or_add_cb(elem_path, [&]() {
507TreeElement &OverrideRNAPathTreeBuilder::ensure_label_element_for_ptr(TreeElement &parent,
512 return *path_te_map.lookup_or_add_cb(elem_path, [&]() {
526 MEM_delete(dyn_name);
bool BKE_lib_override_library_property_is_animated(const ID *id, const IDOverrideLibraryProperty *liboverride_prop, const PropertyRNA *override_rna_prop, const int rnaprop_index)
IDOverrideLibraryPropertyOperation * BKE_lib_override_library_property_operation_find(IDOverrideLibraryProperty *liboverride_property, const char *subitem_refname, const char *subitem_locname, const std::optional< const ID * > &subitem_refid, const std::optional< const ID * > &subitem_locid, int subitem_refindex, int subitem_locindex, bool strict, bool *r_strict)
bool BKE_lib_override_rna_property_find(PointerRNA *idpoin, const IDOverrideLibraryProperty *library_prop, PointerRNA *r_override_poin, PropertyRNA **r_override_prop, int *r_index)
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define ID_IS_OVERRIDE_LIBRARY_REAL(_id)
@ LIBOVERRIDE_OP_FLAG_IDPOINTER_MATCH_REFERENCE
@ ID_FLAG_LIB_OVERRIDE_RESYNC_LEFTOVER
@ LIBOVERRIDE_OP_SUBTRACT
@ LIBOVERRIDE_OP_MULTIPLY
@ LIBOVERRIDE_OP_INSERT_BEFORE
@ LIBOVERRIDE_OP_INSERT_AFTER
#define ID_REAL_USERS(id)
@ TSE_LIBRARY_OVERRIDE_OPERATION
@ TSE_LIBRARY_OVERRIDE_BASE
@ SO_FILTER_SHOW_SYSTEM_OVERRIDES
#define RNA_PROP_BEGIN(sptr, itemptr, prop)
static TreeElement * add_element(SpaceOutliner *space_outliner, ListBase *lb, ID *owner_id, void *create_data, TreeElement *parent, short type, short index, const bool expand=true)
void build_path(TreeElement &parent, TreeElementOverridesData &override_data, short &index)
OverrideRNAPathTreeBuilder(SpaceOutliner &space_outliner)
TreeElementOverridesBase(TreeElement &legacy_te, ID &id)
void expand(SpaceOutliner &) const override
StringRefNull get_warning() const override
TreeElementOverridesPropertyOperation(TreeElement &legacy_te, TreeElementOverridesData &override_data)
std::optional< BIFIconID > get_icon() const override
StringRefNull get_override_operation_label() const
TreeElementOverridesProperty(TreeElement &legacy_te, TreeElementOverridesData &override_data)
PointerRNA override_rna_ptr
PropertyRNA & override_rna_prop
StringRefNull get_warning() const override
void MEM_freeN(void *vmemh)
static void iterate_properties_to_display(ID &id, const bool show_system_overrides, FunctionRef< void(TreeElementOverridesData &data)> fn)
TreeElementT * tree_element_cast(const TreeElement *te)
static BIFIconID get_property_icon(PointerRNA &ptr, PropertyRNA &prop)
ListBaseWrapperTemplate< ListBase, T > ListBaseWrapper
#define SUPPORT_FILTER_OUTLINER(space_outliner_)
bool RNA_struct_is_ID(const StructRNA *type)
int RNA_property_ui_icon(const PropertyRNA *prop)
int RNA_property_collection_lookup_index(PointerRNA *ptr, PropertyRNA *prop, const PointerRNA *t_ptr)
StructRNA * RNA_property_pointer_type(PointerRNA *ptr, PropertyRNA *prop)
char * RNA_struct_name_get_alloc(PointerRNA *ptr, char *fixedbuf, int fixedlen, int *r_len)
PropertyType RNA_property_type(PropertyRNA *prop)
int RNA_struct_ui_icon(const StructRNA *type)
bool RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int key, PointerRNA *r_ptr)
const char * RNA_struct_ui_name(const StructRNA *type)
const char * RNA_property_ui_name(const PropertyRNA *prop)
PointerRNA RNA_id_pointer_create(ID *id)
bool RNA_path_resolve_elements(PointerRNA *ptr, const char *path, ListBase *r_elements)
char * RNA_path_append(const char *path, const PointerRNA *, PropertyRNA *prop, int intkey, const char *strkey)
PointerRNA & override_rna_ptr
PropertyRNA & override_rna_prop
IDOverrideLibraryProperty & override_property
IDOverrideLibraryPropertyOperation * operation
TreeStoreElem * store_elem
Establish and manage Outliner trees for different display modes.