22 #include "../outliner_intern.hh"
28 class AbstractTreeElement;
43 current_file_te->
name =
IFACE_(
"Current File");
46 build_hierarchy_for_lib_or_main(source_data.
bmain, *current_file_te);
52 dummy_te->
name =
IFACE_(
"No Library Overrides");
61 build_hierarchy_for_lib_or_main(source_data.
bmain, *tenlib,
lib);
66 if (top_level_te == current_file_te) {
92 struct HierarchyBuildData {
93 const ID &override_root_id_;
106 : space_outliner_(space_outliner), bmain_(bmain), id_relations_(id_relations)
113 void build_hierarchy_for_ID_recursive(
const ID &parent_id,
114 HierarchyBuildData &build_data,
118 ListBase TreeDisplayOverrideLibraryHierarchies::build_hierarchy_for_lib_or_main(
139 if (iter_id->
lib !=
lib) {
144 TreeElement *new_te = outliner_add_element(&space_outliner_,
146 lib ? (void *)lib : bmain,
150 new_te->name = outliner_idcode_to_plural(GS(iter_id->name));
157 builder.build_hierarchy_for_ID(*iter_id, *new_id_te);
169 HierarchyBuildData build_data{override_root_id};
170 build_hierarchy_for_ID_recursive(override_root_id, build_data, te_to_expand);
183 const ID &relationship_parent_id,
184 const ID &override_root_id);
186 void OverrideIDHierarchyBuilder::build_hierarchy_for_ID_recursive(
const ID &parent_id,
187 HierarchyBuildData &build_data,
191 build_data.parent_ids.add(&parent_id);
195 if (&
id == &parent_id) {
199 return FOREACH_CONTINUE;
204 if (build_data.parent_ids.lookup_key_default(&
id,
nullptr)) {
205 return FOREACH_CONTINUE;
210 if (build_data.sibling_ids.lookup_key_default(&
id,
nullptr)) {
211 return FOREACH_CONTINUE;
225 build_data.sibling_ids.add(&
id);
228 HierarchyBuildData child_build_data{build_data.override_root_id_};
229 child_build_data.parent_ids = build_data.parent_ids;
230 child_build_data.parent_ids.add(&
id);
231 child_build_data.sibling_ids.reserve(10);
232 build_hierarchy_for_ID_recursive(
id, child_build_data, *new_te);
267 to_id_entry = to_id_entry->
next) {
269 ID &target_id = **to_id_entry->id_pointer.to;
279 const Object &potential_child_ob =
reinterpret_cast<const Object &
>(target_id);
280 if (potential_child_ob.
parent) {
296 from_id_entry = from_id_entry->
next) {
297 ID &potential_child_id = *from_id_entry->id_pointer.from;
303 const Object &potential_child_ob =
reinterpret_cast<Object &
>(potential_child_id);
304 if (!potential_child_ob.
parent || &potential_child_ob.
parent->
id != &parent_id) {
317 const ID &relationship_parent_id,
318 const ID &override_root_id)
323 const ID *real_override_id = &
id;
329 const_cast<ID *
>(&
id),
330 const_cast<ID *
>(&relationship_parent_id),
331 const_cast<ID **
>(&real_override_id));
IDOverrideLibrary * BKE_lib_override_library_get(struct Main *bmain, struct ID *id, struct ID *owner_id_hint, struct ID **r_owner_id)
#define FOREACH_MAIN_ID_END
void BKE_main_relations_create(struct Main *bmain, short flag)
void BKE_main_relations_free(struct Main *bmain)
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
#define ID_IS_OVERRIDE_LIBRARY_VIRTUAL(_id)
#define ID_IS_OVERRIDE_LIBRARY_REAL(_id)
#define ID_IS_OVERRIDE_LIBRARY(_id)
#define ID_IS_OVERRIDE_LIBRARY_HIERARCHY_ROOT(_id)
Value & lookup_or_add_cb(const Key &key, const CreateValueF &create_value)
Base Class For Tree-Displays.
SpaceOutliner & space_outliner_
static void uncollapse_by_default(TreeElement *legacy_te)
OverrideIDHierarchyBuilder(SpaceOutliner &space_outliner, Main &bmain, MainIDRelations &id_relations)
void build_hierarchy_for_ID(ID &root_id, TreeElement &te_to_expand)
bool is_lazy_built() const override
TreeDisplayOverrideLibraryHierarchies(SpaceOutliner &space_outliner)
ListBase buildTree(const TreeSourceData &source_data) override
TreeElement * outliner_add_element(SpaceOutliner *space_outliner, ListBase *lb, void *idv, TreeElement *parent, short type, short index, const bool expand)
static void foreach_natural_hierarchy_child(const MainIDRelations &id_relations, const ID &parent_id, FunctionRef< ForeachChildReturn(ID &)> fn)
static bool id_is_in_override_hierarchy(const Main &bmain, const ID &id, const ID &relationship_parent_id, const ID &override_root_id)
@ TE_PRETEND_HAS_CHILDREN
void outliner_free_tree_element(TreeElement *element, ListBase *parent_subtree)
#define TSELEM_OPEN(telm, sv)
struct ID * hierarchy_root
IDOverrideLibrary * override_library
struct MainIDRelationsEntryItem * next
struct MainIDRelationsEntryItem * to_ids
struct MainIDRelationsEntryItem * from_ids
struct GHash * relations_from_pointers
struct MainIDRelations * relations
The data to build the tree from.
Establish and manage Outliner trees for different display modes.