29class AbstractTreeElement;
44 current_file_te->
name =
IFACE_(
"Current File");
47 build_hierarchy_for_lib_or_main(
source_data.bmain, *current_file_te);
58 dummy_te->
name =
IFACE_(
"No Library Overrides");
73 if (top_level_te == current_file_te) {
99 struct HierarchyBuildData {
100 const ID &override_root_id_;
113 : space_outliner_(space_outliner), bmain_(bmain), id_relations_(id_relations)
120 void build_hierarchy_for_ID_recursive(
const ID &parent_id,
121 HierarchyBuildData &build_data,
125ListBase TreeDisplayOverrideLibraryHierarchies::build_hierarchy_for_lib_or_main(
146 if (iter_id->
lib !=
lib) {
151 TreeElement *new_te = AbstractTreeDisplay::add_element(&space_outliner_,
153 reinterpret_cast<ID *>(lib),
158 new_te->name = outliner_idcode_to_plural(GS(iter_id->name));
163 &new_base_te->subtree,
171 builder.build_hierarchy_for_ID(*iter_id, *new_id_te);
183 HierarchyBuildData build_data{override_root_id};
184 build_hierarchy_for_ID_recursive(override_root_id, build_data, te_to_expand);
197 const ID &relationship_parent_id,
198 const ID &override_root_id);
200void OverrideIDHierarchyBuilder::build_hierarchy_for_ID_recursive(
const ID &parent_id,
201 HierarchyBuildData &build_data,
202 TreeElement &te_to_expand)
205 build_data.parent_ids.add(&parent_id);
209 if (&
id == &parent_id) {
213 return FOREACH_CONTINUE;
218 if (build_data.parent_ids.lookup_key_default(&
id,
nullptr)) {
219 return FOREACH_CONTINUE;
224 if (build_data.sibling_ids.lookup_key_default(&
id,
nullptr)) {
225 return FOREACH_CONTINUE;
237 &te_to_expand.subtree,
245 build_data.sibling_ids.add(&
id);
248 HierarchyBuildData child_build_data{build_data.override_root_id_};
249 child_build_data.parent_ids = build_data.parent_ids;
250 child_build_data.parent_ids.add(&
id);
251 child_build_data.sibling_ids.reserve(10);
252 build_hierarchy_for_ID_recursive(
id, child_build_data, *new_te);
287 to_id_entry = to_id_entry->next)
290 ID &target_id = **to_id_entry->id_pointer.to;
300 const Object &potential_child_ob =
reinterpret_cast<const Object &
>(target_id);
301 if (potential_child_ob.
parent) {
317 from_id_entry = from_id_entry->next)
319 ID &potential_child_id = *from_id_entry->id_pointer.from;
325 const Object &potential_child_ob =
reinterpret_cast<Object &
>(potential_child_id);
326 if (!potential_child_ob.
parent || &potential_child_ob.
parent->
id != &parent_id) {
339 const ID &relationship_parent_id,
340 const ID &override_root_id)
345 const ID *real_override_id = &id;
351 const_cast<ID *
>(&
id),
352 const_cast<ID *
>(&relationship_parent_id),
353 const_cast<ID **
>(&real_override_id));
IDOverrideLibrary * BKE_lib_override_library_get(Main *bmain, ID *id, ID *owner_id_hint, ID **r_owner_id)
#define FOREACH_MAIN_ID_END
void BKE_main_relations_create(Main *bmain, short flag)
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
void BKE_main_relations_free(Main *bmain)
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 TreeElement * add_element(SpaceOutliner *space_outliner, ListBase *lb, ID *owner_id, void *create_data, TreeElement *parent, short type, short index, const bool expand=true)
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 build_tree(const TreeSourceData &source_data) override
GPU_SHADER_INTERFACE_INFO(depth_2d_update_iface, "").smooth(Type fragColor push_constant(Type::VEC2, "extent") .push_constant(Type source_data
void outliner_free_tree_element(TreeElement *element, ListBase *parent_subtree)
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
#define TSELEM_OPEN(telm, sv)
struct ID * hierarchy_root
IDOverrideLibrary * override_library
MainIDRelationsEntryItem * from_ids
MainIDRelationsEntryItem * to_ids
GHash * relations_from_pointers
MainIDRelations * relations
The data to build the tree from.
Establish and manage Outliner trees for different display modes.
static DynamicLibrary lib