45 current_file_te->
name =
IFACE_(
"Current File");
48 build_hierarchy_for_lib_or_main(
source_data.bmain, *current_file_te);
59 dummy_te->
name =
IFACE_(
"No Library Overrides");
74 if (top_level_te == current_file_te) {
100 struct HierarchyBuildData {
101 const ID &override_root_id_;
114 : space_outliner_(space_outliner), bmain_(bmain), id_relations_(id_relations)
121 void build_hierarchy_for_ID_recursive(
const ID &parent_id,
122 HierarchyBuildData &build_data,
126ListBase TreeDisplayOverrideLibraryHierarchies::build_hierarchy_for_lib_or_main(
147 if (iter_id->
lib !=
lib) {
152 TreeElement *new_te = AbstractTreeDisplay::add_element(&space_outliner_,
154 reinterpret_cast<ID *>(lib),
159 new_te->name = outliner_idcode_to_plural(GS(iter_id->name));
164 &new_base_te->subtree,
172 builder.build_hierarchy_for_ID(*iter_id, *new_id_te);
184 HierarchyBuildData build_data{override_root_id};
185 build_hierarchy_for_ID_recursive(override_root_id, build_data, te_to_expand);
198 const ID &relationship_parent_id,
199 const ID &override_root_id);
201void OverrideIDHierarchyBuilder::build_hierarchy_for_ID_recursive(
const ID &parent_id,
202 HierarchyBuildData &build_data,
203 TreeElement &te_to_expand)
206 build_data.parent_ids.add(&parent_id);
210 if (&
id == &parent_id) {
219 if (build_data.parent_ids.lookup_key_default(&
id,
nullptr)) {
225 if (build_data.sibling_ids.lookup_key_default(&
id,
nullptr)) {
238 &te_to_expand.subtree,
246 build_data.sibling_ids.add(&
id);
249 HierarchyBuildData child_build_data{build_data.override_root_id_};
250 child_build_data.parent_ids = build_data.parent_ids;
251 child_build_data.parent_ids.add(&
id);
252 child_build_data.sibling_ids.reserve(10);
253 build_hierarchy_for_ID_recursive(
id, child_build_data, *new_te);
288 to_id_entry = to_id_entry->
next)
291 ID &target_id = **to_id_entry->id_pointer.to;
301 const Object &potential_child_ob =
reinterpret_cast<const Object &
>(target_id);
302 if (potential_child_ob.
parent) {
318 from_id_entry = from_id_entry->
next)
320 ID &potential_child_id = *from_id_entry->id_pointer.from;
326 const Object &potential_child_ob =
reinterpret_cast<Object &
>(potential_child_id);
327 if (!potential_child_ob.
parent || &potential_child_ob.
parent->
id != &parent_id) {
340 const ID &relationship_parent_id,
341 const ID &override_root_id)
346 const ID *real_override_id = &id;
352 const_cast<ID *
>(&
id),
353 const_cast<ID *
>(&relationship_parent_id),
354 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 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)
AbstractTreeDisplay(SpaceOutliner &space_outliner)
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::float2_t, "extent") .push_constant(Type source_data
@ TE_PRETEND_HAS_CHILDREN
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)
#define TSELEM_OPEN(telm, sv)
struct ID * hierarchy_root
IDOverrideLibrary * override_library
MainIDRelationsEntryItem * next
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