22 #include "../outliner_intern.hh"
44 void ensure_entire_collection(
TreeElement &te_to_expand,
46 const char *coll_prop_path,
62 if (legacy_te.
parent !=
nullptr &&
67 legacy_te.
name =
id.name + 2;
74 return TIP_(
"This override data-block is not needed anymore, but was detected as user-edited");
78 return TIP_(
"This override data-block is unused");
85 const bool show_system_overrides,
96 int rnaprop_index = 0;
98 &idpoin, override_prop, &override_rna_ptr, &override_rna_prop, &rnaprop_index);
102 if (is_rna_path_valid && !show_system_overrides) {
104 bool is_system_override =
false;
115 is_system_override =
true;
121 &
id, override_prop, override_rna_prop, rnaprop_index)) {
131 id, *override_prop, override_rna_ptr, *override_rna_prop, is_rna_path_valid};
165 override_rna_ptr(override_data.override_rna_ptr),
166 override_rna_prop(override_data.override_rna_prop),
167 rna_path(override_data.override_property.rna_path),
168 is_rna_path_valid(override_data.is_rna_path_valid)
180 "This override property does not exist in current data, it will be removed on "
181 "next .blend file save");
201 "Override operations are only supported for collections right now");
205 throw std::invalid_argument(
"missing operation");
208 operation_ = std::make_unique<IDOverrideLibraryPropertyOperation>(*override_data.
operation);
210 operation_->next = operation_->prev =
nullptr;
212 if (std::optional<PointerRNA> col_item_ptr = get_collection_ptr()) {
215 legacy_te.
name = dyn_name;
226 if (
ELEM(operation_->operation,
229 return TIP_(
"Added through override");
238 if (
const std::optional<PointerRNA> col_item_ptr = get_collection_ptr()) {
245 std::optional<PointerRNA> TreeElementOverridesPropertyOperation::get_collection_ptr()
const
250 operation_->subitem_local_index,
284 : space_outliner_(space_outliner)
300 const char *elem_path =
nullptr;
308 const char *previous_path = elem_path;
309 const char *new_path =
RNA_path_append(previous_path, &elem->ptr, elem->prop, -1,
nullptr);
311 te_to_expand = &ensure_label_element_for_prop(
312 *te_to_expand, new_path, elem->ptr, *elem->prop, index);
319 &elem->ptr, elem->prop, &elem->next->ptr);
321 previous_path, &elem->ptr, elem->prop, coll_item_idx,
nullptr);
323 te_to_expand = &ensure_label_element_for_ptr(
324 *te_to_expand, coll_item_path, elem->
next->ptr, index);
326 MEM_delete(new_path);
327 new_path = coll_item_path;
331 MEM_delete(elem_path);
332 elem_path = new_path;
344 te_to_expand = &ensure_label_element_for_prop(*te_to_expand,
350 ensure_entire_collection(*te_to_expand, override_data, elem_path, index);
364 MEM_delete(elem_path);
367 void OverrideRNAPathTreeBuilder::ensure_entire_collection(
371 const char *coll_prop_path,
374 AbstractTreeElement *abstract_parent = tree_element_cast<AbstractTreeElement>(&te_to_expand);
388 &override_data.
override_property,
nullptr,
nullptr, -1, item_idx,
false,
nullptr);
398 current_te = existing_te;
403 else if (item_operation) {
404 TreeElementOverridesData override_op_data = override_data;
405 override_op_data.
operation = item_operation;
416 current_te = &ensure_label_element_for_ptr(te_to_expand, coll_item_path, itemptr, index);
419 MEM_delete(coll_item_path);
421 previous_te = current_te;
438 if (icon != ICON_DOT) {
446 TreeElement &OverrideRNAPathTreeBuilder::ensure_label_element_for_prop(
457 TreeElementLabel *te_label = tree_element_cast<TreeElementLabel>(new_te);
479 TreeElementLabel *te_label = tree_element_cast<TreeElementLabel>(new_te);
482 MEM_delete(dyn_name);
struct IDOverrideLibraryPropertyOperation * BKE_lib_override_library_property_operation_find(struct IDOverrideLibraryProperty *override_property, const char *subitem_refname, const char *subitem_locname, int subitem_refindex, int subitem_locindex, bool strict, bool *r_strict)
bool BKE_lib_override_rna_property_find(struct PointerRNA *idpoin, const struct IDOverrideLibraryProperty *library_prop, struct PointerRNA *r_override_poin, struct PropertyRNA **r_override_prop, int *r_index)
bool BKE_lib_override_library_property_is_animated(const ID *id, const IDOverrideLibraryProperty *override_prop, const struct PropertyRNA *override_rna_prop, const int rnaprop_index)
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
#define LISTBASE_FOREACH(type, var, list)
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define UNUSED_VARS_NDEBUG(...)
@ IDOVERRIDE_LIBRARY_FLAG_IDPOINTER_MATCH_REFERENCE
#define ID_IS_OVERRIDE_LIBRARY_REAL(_id)
@ IDOVERRIDE_LIBRARY_OP_INSERT_AFTER
@ IDOVERRIDE_LIBRARY_OP_INSERT_BEFORE
@ LIB_LIB_OVERRIDE_RESYNC_LEFTOVER
#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)
Value lookup_default(const Key &key, const Value &default_value) const
Value & lookup_or_add_cb(const Key &key, const CreateValueF &create_value)
bool contains(const Key &key) const
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 getWarning() const override
TreeElementOverridesPropertyOperation(TreeElement &legacy_te, TreeElementOverridesData &override_data)
std::optional< BIFIconID > getIcon() const override
StringRefNull getOverrideOperationLabel() const
TreeElementOverridesProperty(TreeElement &legacy_te, TreeElementOverridesData &override_data)
PointerRNA override_rna_ptr
PropertyRNA & override_rna_prop
StringRefNull getWarning() const override
TreeElement * outliner_add_element(SpaceOutliner *space_outliner, ListBase *lb, void *idv, TreeElement *parent, short type, short index, const bool expand)
static void iterate_properties_to_display(ID &id, const bool show_system_overrides, FunctionRef< void(TreeElementOverridesData &data)> fn)
static BIFIconID get_property_icon(PointerRNA &ptr, PropertyRNA &prop)
#define SUPPORT_FILTER_OUTLINER(space_outliner_)
void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr)
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)
char * RNA_struct_name_get_alloc(PointerRNA *ptr, char *fixedbuf, int fixedlen, int *r_len)
const char * RNA_struct_ui_name(const StructRNA *type)
PropertyType RNA_property_type(PropertyRNA *prop)
int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int key, PointerRNA *r_ptr)
StructRNA * RNA_property_pointer_type(PointerRNA *ptr, PropertyRNA *prop)
int RNA_struct_ui_icon(const StructRNA *type)
const char * RNA_property_ui_name(const PropertyRNA *prop)
bool RNA_path_resolve_elements(PointerRNA *ptr, const char *path, ListBase *r_elements)
char * RNA_path_append(const char *path, const PointerRNA *UNUSED(ptr), PropertyRNA *prop, int intkey, const char *strkey)
struct TreeElement * parent
TreeStoreElem * store_elem
struct TreeElement * next
PointerRNA & override_rna_ptr
PropertyRNA & override_rna_prop
IDOverrideLibraryProperty & override_property
IDOverrideLibraryPropertyOperation * operation