Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/space_outliner/tree')
-rw-r--r--source/blender/editors/space_outliner/tree/common.cc31
-rw-r--r--source/blender/editors/space_outliner/tree/common.hh4
-rw-r--r--source/blender/editors/space_outliner/tree/tree_display.hh35
-rw-r--r--source/blender/editors/space_outliner/tree/tree_display_data.cc6
-rw-r--r--source/blender/editors/space_outliner/tree/tree_display_libraries.cc33
-rw-r--r--source/blender/editors/space_outliner/tree/tree_display_orphaned.cc9
-rw-r--r--source/blender/editors/space_outliner/tree/tree_display_override_library_hierarchies.cc40
-rw-r--r--source/blender/editors/space_outliner/tree/tree_display_override_library_properties.cc31
-rw-r--r--source/blender/editors/space_outliner/tree/tree_display_scenes.cc9
-rw-r--r--source/blender/editors/space_outliner/tree/tree_display_sequencer.cc11
-rw-r--r--source/blender/editors/space_outliner/tree/tree_display_view_layer.cc56
-rw-r--r--source/blender/editors/space_outliner/tree/tree_element.cc71
-rw-r--r--source/blender/editors/space_outliner/tree/tree_element.hh26
-rw-r--r--source/blender/editors/space_outliner/tree/tree_element_anim_data.cc8
-rw-r--r--source/blender/editors/space_outliner/tree/tree_element_driver.cc3
-rw-r--r--source/blender/editors/space_outliner/tree/tree_element_id.cc3
-rw-r--r--source/blender/editors/space_outliner/tree/tree_element_id_scene.cc12
-rw-r--r--source/blender/editors/space_outliner/tree/tree_element_nla.cc5
-rw-r--r--source/blender/editors/space_outliner/tree/tree_element_overrides.cc11
-rw-r--r--source/blender/editors/space_outliner/tree/tree_element_rna.cc16
-rw-r--r--source/blender/editors/space_outliner/tree/tree_element_scene_objects.cc4
-rw-r--r--source/blender/editors/space_outliner/tree/tree_element_seq.cc6
-rw-r--r--source/blender/editors/space_outliner/tree/tree_element_view_layer.cc2
23 files changed, 233 insertions, 199 deletions
diff --git a/source/blender/editors/space_outliner/tree/common.cc b/source/blender/editors/space_outliner/tree/common.cc
index 199c80f021a..448df9c1e7d 100644
--- a/source/blender/editors/space_outliner/tree/common.cc
+++ b/source/blender/editors/space_outliner/tree/common.cc
@@ -36,25 +36,26 @@ const char *outliner_idcode_to_plural(short idcode)
/** \} */
-void outliner_make_object_parent_hierarchy(ListBase *lb)
+void outliner_make_object_parent_hierarchy(SubTree &subtree)
{
/* build hierarchy */
/* XXX also, set extents here... */
- TreeElement *te = static_cast<TreeElement *>(lb->first);
- while (te) {
- TreeElement *ten = te->next;
- TreeStoreElem *tselem = TREESTORE(te);
-
- if ((tselem->type == TSE_SOME_ID) && te->idcode == ID_OB) {
- Object *ob = (Object *)tselem->id;
- if (ob->parent && ob->parent->id.newid) {
- BLI_remlink(lb, te);
- TreeElement *tep = (TreeElement *)ob->parent->id.newid;
- BLI_addtail(&tep->subtree, te);
- te->parent = tep;
- }
+ for (TreeElement &te : subtree) {
+ TreeStoreElem *tselem = TREESTORE(&te);
+
+ if ((tselem->type != TSE_SOME_ID) || te.idcode != ID_OB) {
+ continue;
+ }
+
+ Object *ob = (Object *)tselem->id;
+ if (!ob->parent || !ob->parent->id.newid) {
+ continue;
}
- te = ten;
+
+ TreeElement *new_parent = reinterpret_cast<TreeElement *>(ob->parent->id.newid);
+
+ std::unique_ptr floating_te = subtree.remove(te);
+ new_parent->child_elements.add_back(std::move(floating_te));
}
}
diff --git a/source/blender/editors/space_outliner/tree/common.hh b/source/blender/editors/space_outliner/tree/common.hh
index ba2d1c3fab6..286e81c4a0c 100644
--- a/source/blender/editors/space_outliner/tree/common.hh
+++ b/source/blender/editors/space_outliner/tree/common.hh
@@ -10,9 +10,11 @@ struct ListBase;
namespace blender::ed::outliner {
+class SubTree;
+
const char *outliner_idcode_to_plural(short idcode);
-void outliner_make_object_parent_hierarchy(ListBase *lb);
+void outliner_make_object_parent_hierarchy(SubTree &subtree);
bool outliner_animdata_test(const struct AnimData *adt);
} // namespace blender::ed::outliner
diff --git a/source/blender/editors/space_outliner/tree/tree_display.hh b/source/blender/editors/space_outliner/tree/tree_display.hh
index 295eeb59eaa..31e35ad0ed8 100644
--- a/source/blender/editors/space_outliner/tree/tree_display.hh
+++ b/source/blender/editors/space_outliner/tree/tree_display.hh
@@ -34,6 +34,7 @@ struct ViewLayer;
namespace blender::ed::outliner {
+class SubTree;
struct TreeElement;
class TreeElementID;
@@ -73,7 +74,7 @@ class AbstractTreeDisplay {
* Build a tree for this display mode with the Blender context data given in \a source_data and
* the view settings in \a space_outliner.
*/
- virtual ListBase buildTree(const TreeSourceData &source_data) = 0;
+ virtual SubTree buildTree(const TreeSourceData &source_data) = 0;
/**
* Define if the display mode should be allowed to show a mode column on the left. This column
@@ -111,14 +112,14 @@ class TreeDisplayViewLayer final : public AbstractTreeDisplay {
public:
TreeDisplayViewLayer(SpaceOutliner &space_outliner);
- ListBase buildTree(const TreeSourceData &source_data) override;
+ SubTree buildTree(const TreeSourceData &source_data) override;
bool supportsModeColumn() const override;
private:
- void add_view_layer(Scene &, ListBase &, TreeElement *);
- void add_layer_collections_recursive(ListBase &, ListBase &, TreeElement &);
- void add_layer_collection_objects(ListBase &, LayerCollection &, TreeElement &);
+ void add_view_layer(Scene &, SubTree &);
+ void add_layer_collections_recursive(ListBase &, TreeElement &);
+ void add_layer_collection_objects(LayerCollection &, TreeElement &);
void add_layer_collection_objects_children(TreeElement &);
};
@@ -132,10 +133,10 @@ class TreeDisplayLibraries final : public AbstractTreeDisplay {
public:
TreeDisplayLibraries(SpaceOutliner &space_outliner);
- ListBase buildTree(const TreeSourceData &source_data) override;
+ SubTree buildTree(const TreeSourceData &source_data) override;
private:
- TreeElement *add_library_contents(Main &, ListBase &, Library *);
+ TreeElement *add_library_contents(Main &, SubTree &, Library *);
bool library_id_filter_poll(const Library *lib, ID *id) const;
short id_filter_get() const;
};
@@ -150,10 +151,10 @@ class TreeDisplayOverrideLibraryProperties final : public AbstractTreeDisplay {
public:
TreeDisplayOverrideLibraryProperties(SpaceOutliner &space_outliner);
- ListBase buildTree(const TreeSourceData &source_data) override;
+ SubTree buildTree(const TreeSourceData &source_data) override;
private:
- ListBase add_library_contents(Main &);
+ SubTree add_library_contents(Main &);
short id_filter_get() const;
};
@@ -164,14 +165,14 @@ class TreeDisplayOverrideLibraryHierarchies final : public AbstractTreeDisplay {
public:
TreeDisplayOverrideLibraryHierarchies(SpaceOutliner &space_outliner);
- ListBase buildTree(const TreeSourceData &source_data) override;
+ SubTree buildTree(const TreeSourceData &source_data) override;
bool is_lazy_built() const override;
private:
- ListBase build_hierarchy_for_lib_or_main(Main *bmain,
- TreeElement &parent_te,
- Library *lib = nullptr);
+ void build_hierarchy_for_lib_or_main(Main *bmain,
+ TreeElement &parent_te,
+ Library *lib = nullptr);
};
/* -------------------------------------------------------------------- */
@@ -190,7 +191,7 @@ class TreeDisplaySequencer final : public AbstractTreeDisplay {
public:
TreeDisplaySequencer(SpaceOutliner &space_outliner);
- ListBase buildTree(const TreeSourceData &source_data) override;
+ SubTree buildTree(const TreeSourceData &source_data) override;
private:
TreeElement *add_sequencer_contents() const;
@@ -211,7 +212,7 @@ class TreeDisplayIDOrphans final : public AbstractTreeDisplay {
public:
TreeDisplayIDOrphans(SpaceOutliner &space_outliner);
- ListBase buildTree(const TreeSourceData &source_data) override;
+ SubTree buildTree(const TreeSourceData &source_data) override;
private:
bool datablock_has_orphans(ListBase &) const;
@@ -227,7 +228,7 @@ class TreeDisplayScenes final : public AbstractTreeDisplay {
public:
TreeDisplayScenes(SpaceOutliner &space_outliner);
- ListBase buildTree(const TreeSourceData &source_data) override;
+ SubTree buildTree(const TreeSourceData &source_data) override;
bool supportsModeColumn() const override;
};
@@ -242,7 +243,7 @@ class TreeDisplayDataAPI final : public AbstractTreeDisplay {
public:
TreeDisplayDataAPI(SpaceOutliner &space_outliner);
- ListBase buildTree(const TreeSourceData &source_data) override;
+ SubTree buildTree(const TreeSourceData &source_data) override;
bool is_lazy_built() const override;
};
diff --git a/source/blender/editors/space_outliner/tree/tree_display_data.cc b/source/blender/editors/space_outliner/tree/tree_display_data.cc
index 3d9b927fbf1..2206eda2c23 100644
--- a/source/blender/editors/space_outliner/tree/tree_display_data.cc
+++ b/source/blender/editors/space_outliner/tree/tree_display_data.cc
@@ -22,15 +22,15 @@ TreeDisplayDataAPI::TreeDisplayDataAPI(SpaceOutliner &space_outliner)
{
}
-ListBase TreeDisplayDataAPI::buildTree(const TreeSourceData &source_data)
+SubTree TreeDisplayDataAPI::buildTree(const TreeSourceData &source_data)
{
- ListBase tree = {nullptr};
+ SubTree tree;
PointerRNA mainptr;
RNA_main_pointer_create(source_data.bmain, &mainptr);
TreeElement *te = outliner_add_element(
- &space_outliner_, &tree, (void *)&mainptr, nullptr, TSE_RNA_STRUCT, -1);
+ &space_outliner_, (void *)&mainptr, tree, TSE_RNA_STRUCT, -1);
/* On first view open parent data elements */
const int show_opened = !space_outliner_.treestore ||
diff --git a/source/blender/editors/space_outliner/tree/tree_display_libraries.cc b/source/blender/editors/space_outliner/tree/tree_display_libraries.cc
index 405f1dd73f4..d8268080974 100644
--- a/source/blender/editors/space_outliner/tree/tree_display_libraries.cc
+++ b/source/blender/editors/space_outliner/tree/tree_display_libraries.cc
@@ -29,9 +29,9 @@ TreeDisplayLibraries::TreeDisplayLibraries(SpaceOutliner &space_outliner)
{
}
-ListBase TreeDisplayLibraries::buildTree(const TreeSourceData &source_data)
+SubTree TreeDisplayLibraries::buildTree(const TreeSourceData &source_data)
{
- ListBase tree = {nullptr};
+ SubTree tree;
{
/* current file first - mainvar provides tselem with unique pointer - not used */
@@ -56,13 +56,13 @@ ListBase TreeDisplayLibraries::buildTree(const TreeSourceData &source_data)
}
/* make hierarchy */
- for (TreeElement *ten : List<TreeElement>(tree)) {
- if (ten == tree.first) {
+ for (TreeElement &ten : tree) {
+ if (&ten == &*tree.begin()) {
/* First item is main, skip. */
continue;
}
- TreeStoreElem *tselem = TREESTORE(ten);
+ TreeStoreElem *tselem = TREESTORE(&ten);
Library *lib = (Library *)tselem->id;
BLI_assert(!lib || (GS(lib->id.name) == ID_LI));
if (!lib || !lib->parent) {
@@ -73,16 +73,12 @@ ListBase TreeDisplayLibraries::buildTree(const TreeSourceData &source_data)
if (tselem->id->tag & LIB_TAG_INDIRECT) {
/* Only remove from 'first level' if lib is not also directly used. */
- BLI_remlink(&tree, ten);
- BLI_addtail(&parent->subtree, ten);
- ten->parent = parent;
+ std::unique_ptr<TreeElement> ten_uptr = tree.remove(ten);
+ parent->child_elements.add_back(std::move(ten_uptr));
}
else {
/* Else, make a new copy of the libtree for our parent. */
- TreeElement *dupten = add_library_contents(*source_data.bmain, parent->subtree, lib);
- if (dupten) {
- dupten->parent = parent;
- }
+ add_library_contents(*source_data.bmain, parent->child_elements, lib);
}
}
/* restore newid pointers */
@@ -93,7 +89,9 @@ ListBase TreeDisplayLibraries::buildTree(const TreeSourceData &source_data)
return tree;
}
-TreeElement *TreeDisplayLibraries::add_library_contents(Main &mainvar, ListBase &lb, Library *lib)
+TreeElement *TreeDisplayLibraries::add_library_contents(Main &mainvar,
+ SubTree &subtree,
+ Library *lib)
{
const short filter_id_type = id_filter_get();
@@ -135,10 +133,10 @@ TreeElement *TreeDisplayLibraries::add_library_contents(Main &mainvar, ListBase
if (!tenlib) {
/* Create library tree element on demand, depending if there are any data-blocks. */
if (lib) {
- tenlib = outliner_add_element(&space_outliner_, &lb, lib, nullptr, TSE_SOME_ID, 0);
+ tenlib = outliner_add_element(&space_outliner_, lib, subtree, TSE_SOME_ID, 0);
}
else {
- tenlib = outliner_add_element(&space_outliner_, &lb, &mainvar, nullptr, TSE_ID_BASE, 0);
+ tenlib = outliner_add_element(&space_outliner_, &mainvar, subtree, TSE_ID_BASE, 0);
tenlib->name = IFACE_("Current File");
}
}
@@ -151,15 +149,14 @@ TreeElement *TreeDisplayLibraries::add_library_contents(Main &mainvar, ListBase
ten = tenlib;
}
else {
- ten = outliner_add_element(
- &space_outliner_, &tenlib->subtree, lib, nullptr, TSE_ID_BASE, a);
+ ten = outliner_add_element(&space_outliner_, lib, subtree, TSE_ID_BASE, a);
ten->directdata = lbarray[a];
ten->name = outliner_idcode_to_plural(GS(id->name));
}
for (ID *id : List<ID>(lbarray[a])) {
if (library_id_filter_poll(lib, id)) {
- outliner_add_element(&space_outliner_, &ten->subtree, id, ten, TSE_SOME_ID, 0);
+ outliner_add_element(&space_outliner_, id, ten, TSE_SOME_ID, 0);
}
}
}
diff --git a/source/blender/editors/space_outliner/tree/tree_display_orphaned.cc b/source/blender/editors/space_outliner/tree/tree_display_orphaned.cc
index d5ecfd4edf3..d7885bb1aa6 100644
--- a/source/blender/editors/space_outliner/tree/tree_display_orphaned.cc
+++ b/source/blender/editors/space_outliner/tree/tree_display_orphaned.cc
@@ -27,9 +27,9 @@ TreeDisplayIDOrphans::TreeDisplayIDOrphans(SpaceOutliner &space_outliner)
{
}
-ListBase TreeDisplayIDOrphans::buildTree(const TreeSourceData &source_data)
+SubTree TreeDisplayIDOrphans::buildTree(const TreeSourceData &source_data)
{
- ListBase tree = {nullptr};
+ SubTree tree;
ListBase *lbarray[INDEX_ID_MAX];
short filter_id_type = (space_outliner_.filter & SO_FILTER_ID_TYPE) ?
space_outliner_.filter_id_type :
@@ -56,7 +56,7 @@ ListBase TreeDisplayIDOrphans::buildTree(const TreeSourceData &source_data)
TreeElement *te = nullptr;
if (!filter_id_type) {
ID *id = (ID *)lbarray[a]->first;
- te = outliner_add_element(&space_outliner_, &tree, lbarray[a], nullptr, TSE_ID_BASE, 0);
+ te = outliner_add_element(&space_outliner_, lbarray[a], tree, TSE_ID_BASE, 0);
te->directdata = lbarray[a];
te->name = outliner_idcode_to_plural(GS(id->name));
}
@@ -64,8 +64,7 @@ ListBase TreeDisplayIDOrphans::buildTree(const TreeSourceData &source_data)
/* Add the orphaned data-blocks - these will not be added with any subtrees attached. */
for (ID *id : List<ID>(lbarray[a])) {
if (ID_REAL_USERS(id) <= 0) {
- outliner_add_element(
- &space_outliner_, (te) ? &te->subtree : &tree, id, te, TSE_SOME_ID, 0);
+ outliner_add_element(&space_outliner_, id, te ? te->child_elements : tree, TSE_SOME_ID, 0);
}
}
}
diff --git a/source/blender/editors/space_outliner/tree/tree_display_override_library_hierarchies.cc b/source/blender/editors/space_outliner/tree/tree_display_override_library_hierarchies.cc
index fa4479d0d9d..679627d6518 100644
--- a/source/blender/editors/space_outliner/tree/tree_display_override_library_hierarchies.cc
+++ b/source/blender/editors/space_outliner/tree/tree_display_override_library_hierarchies.cc
@@ -33,13 +33,13 @@ TreeDisplayOverrideLibraryHierarchies::TreeDisplayOverrideLibraryHierarchies(
{
}
-ListBase TreeDisplayOverrideLibraryHierarchies::buildTree(const TreeSourceData &source_data)
+SubTree TreeDisplayOverrideLibraryHierarchies::buildTree(const TreeSourceData &source_data)
{
- ListBase tree = {nullptr};
+ SubTree tree;
/* First step: Build "Current File" hierarchy. */
TreeElement *current_file_te = outliner_add_element(
- &space_outliner_, &tree, source_data.bmain, nullptr, TSE_ID_BASE, -1);
+ &space_outliner_, source_data.bmain, tree, TSE_ID_BASE, -1);
current_file_te->name = IFACE_("Current File");
AbstractTreeElement::uncollapse_by_default(current_file_te);
{
@@ -48,7 +48,7 @@ ListBase TreeDisplayOverrideLibraryHierarchies::buildTree(const TreeSourceData &
/* Add dummy child if there's nothing to display. */
if (BLI_listbase_is_empty(&current_file_te->subtree)) {
TreeElement *dummy_te = outliner_add_element(
- &space_outliner_, &current_file_te->subtree, nullptr, current_file_te, TSE_ID_BASE, 0);
+ &space_outliner_, nullptr, current_file_te, TSE_ID_BASE, 0);
dummy_te->name = IFACE_("No Library Overrides");
}
}
@@ -56,19 +56,18 @@ ListBase TreeDisplayOverrideLibraryHierarchies::buildTree(const TreeSourceData &
/* Second step: Build hierarchies for external libraries. */
for (Library *lib = (Library *)source_data.bmain->libraries.first; lib;
lib = (Library *)lib->id.next) {
- TreeElement *tenlib = outliner_add_element(
- &space_outliner_, &tree, lib, nullptr, TSE_SOME_ID, 0);
+ TreeElement *tenlib = outliner_add_element(&space_outliner_, lib, tree, TSE_SOME_ID, 0);
build_hierarchy_for_lib_or_main(source_data.bmain, *tenlib, lib);
}
/* Remove top level library elements again that don't contain any overrides. */
- LISTBASE_FOREACH_MUTABLE (TreeElement *, top_level_te, &tree) {
- if (top_level_te == current_file_te) {
+ for (TreeElement &top_level_te : tree) {
+ if (&top_level_te == current_file_te) {
continue;
}
- if (BLI_listbase_is_empty(&top_level_te->subtree)) {
- outliner_free_tree_element(top_level_te, &tree);
+ if (top_level_te.child_elements.is_empty()) {
+ tree.remove(top_level_te);
}
}
@@ -115,11 +114,10 @@ class OverrideIDHierarchyBuilder {
TreeElement &te_to_expand);
};
-ListBase TreeDisplayOverrideLibraryHierarchies::build_hierarchy_for_lib_or_main(
- Main *bmain, TreeElement &parent_te, Library *lib)
+void TreeDisplayOverrideLibraryHierarchies::build_hierarchy_for_lib_or_main(Main *bmain,
+ TreeElement &parent_te,
+ Library *lib)
{
- ListBase tree = {nullptr};
-
/* Ensure #Main.relations contains the latest mapping of relations. Must be freed before
* returning. */
BKE_main_relations_create(bmain, 0);
@@ -141,26 +139,20 @@ ListBase TreeDisplayOverrideLibraryHierarchies::build_hierarchy_for_lib_or_main(
}
TreeElement *new_base_te = id_base_te_map.lookup_or_add_cb(GS(iter_id->name), [&]() {
- TreeElement *new_te = outliner_add_element(&space_outliner_,
- &parent_te.subtree,
- lib ? (void *)lib : bmain,
- &parent_te,
- TSE_ID_BASE,
- base_index++);
+ TreeElement *new_te = outliner_add_element(
+ &space_outliner_, lib ? (void *)lib : bmain, &parent_te, TSE_ID_BASE, base_index++);
new_te->name = outliner_idcode_to_plural(GS(iter_id->name));
return new_te;
});
TreeElement *new_id_te = outliner_add_element(
- &space_outliner_, &new_base_te->subtree, iter_id, new_base_te, TSE_SOME_ID, 0, false);
+ &space_outliner_, iter_id, new_base_te, TSE_SOME_ID, 0, false);
builder.build_hierarchy_for_ID(*iter_id, *new_id_te);
}
FOREACH_MAIN_ID_END;
BKE_main_relations_free(bmain);
-
- return tree;
}
void OverrideIDHierarchyBuilder::build_hierarchy_for_ID(ID &override_root_id,
@@ -220,7 +212,7 @@ void OverrideIDHierarchyBuilder::build_hierarchy_for_ID_recursive(const ID &pare
}
TreeElement *new_te = outliner_add_element(
- &space_outliner_, &te_to_expand.subtree, &id, &te_to_expand, TSE_SOME_ID, 0, false);
+ &space_outliner_, &id, &te_to_expand, TSE_SOME_ID, 0, false);
build_data.sibling_ids.add(&id);
diff --git a/source/blender/editors/space_outliner/tree/tree_display_override_library_properties.cc b/source/blender/editors/space_outliner/tree/tree_display_override_library_properties.cc
index 5713a4a6a1f..1cd946f152e 100644
--- a/source/blender/editors/space_outliner/tree/tree_display_override_library_properties.cc
+++ b/source/blender/editors/space_outliner/tree/tree_display_override_library_properties.cc
@@ -31,12 +31,12 @@ TreeDisplayOverrideLibraryProperties::TreeDisplayOverrideLibraryProperties(
{
}
-ListBase TreeDisplayOverrideLibraryProperties::buildTree(const TreeSourceData &source_data)
+SubTree TreeDisplayOverrideLibraryProperties::buildTree(const TreeSourceData &source_data)
{
- ListBase tree = add_library_contents(*source_data.bmain);
+ SubTree tree = add_library_contents(*source_data.bmain);
- for (TreeElement *top_level_te : List<TreeElement>(tree)) {
- TreeStoreElem *tselem = TREESTORE(top_level_te);
+ for (TreeElement &top_level_te : tree) {
+ TreeStoreElem *tselem = TREESTORE(&top_level_te);
if (!tselem->used) {
tselem->flag &= ~TSE_CLOSED;
}
@@ -45,9 +45,9 @@ ListBase TreeDisplayOverrideLibraryProperties::buildTree(const TreeSourceData &s
return tree;
}
-ListBase TreeDisplayOverrideLibraryProperties::add_library_contents(Main &mainvar)
+SubTree TreeDisplayOverrideLibraryProperties::add_library_contents(Main &mainvar)
{
- ListBase tree = {nullptr};
+ SubTree tree;
const short filter_id_type = id_filter_get();
@@ -82,33 +82,32 @@ ListBase TreeDisplayOverrideLibraryProperties::add_library_contents(Main &mainva
/* Create data-block list parent element on demand. */
TreeElement *id_base_te = nullptr;
- ListBase *lb_to_expand = &tree;
+ SubTree *subtree_to_expand = &tree;
if (!filter_id_type) {
- id_base_te = outliner_add_element(
- &space_outliner_, &tree, lbarray[a], nullptr, TSE_ID_BASE, 0);
+ id_base_te = outliner_add_element(&space_outliner_, lbarray[a], tree, TSE_ID_BASE, 0);
id_base_te->directdata = lbarray[a];
id_base_te->name = outliner_idcode_to_plural(GS(id->name));
- lb_to_expand = &id_base_te->subtree;
+ subtree_to_expand = &id_base_te->child_elements;
}
for (ID *id : List<ID>(lbarray[a])) {
if (ID_IS_OVERRIDE_LIBRARY_REAL(id) && !ID_IS_LINKED(id)) {
TreeElement *override_tree_element = outliner_add_element(
- &space_outliner_, lb_to_expand, id, id_base_te, TSE_LIBRARY_OVERRIDE_BASE, 0);
+ &space_outliner_, id, id_base_te, TSE_LIBRARY_OVERRIDE_BASE, 0);
- if (BLI_listbase_is_empty(&override_tree_element->subtree)) {
- outliner_free_tree_element(override_tree_element, lb_to_expand);
+ if (override_tree_element->child_elements.is_empty()) {
+ subtree_to_expand->remove(*override_tree_element);
}
}
}
}
/* Remove ID base elements that turn out to be empty. */
- LISTBASE_FOREACH_MUTABLE (TreeElement *, te, &tree) {
- if (BLI_listbase_is_empty(&te->subtree)) {
- outliner_free_tree_element(te, &tree);
+ for (TreeElement &te : tree) {
+ if (te.child_elements.is_empty()) {
+ tree.remove(te);
}
}
diff --git a/source/blender/editors/space_outliner/tree/tree_display_scenes.cc b/source/blender/editors/space_outliner/tree/tree_display_scenes.cc
index 6b1de7f8b95..671a2b8c113 100644
--- a/source/blender/editors/space_outliner/tree/tree_display_scenes.cc
+++ b/source/blender/editors/space_outliner/tree/tree_display_scenes.cc
@@ -31,17 +31,16 @@ bool TreeDisplayScenes::supportsModeColumn() const
return true;
}
-ListBase TreeDisplayScenes::buildTree(const TreeSourceData &source_data)
+SubTree TreeDisplayScenes::buildTree(const TreeSourceData &source_data)
{
/* On first view we open scenes. */
const int show_opened = !space_outliner_.treestore ||
!BLI_mempool_len(space_outliner_.treestore);
- ListBase tree = {nullptr};
+ SubTree tree;
for (ID *id : List<ID>(source_data.bmain->scenes)) {
Scene *scene = reinterpret_cast<Scene *>(id);
- TreeElement *te = outliner_add_element(
- &space_outliner_, &tree, scene, nullptr, TSE_SOME_ID, 0);
+ TreeElement *te = outliner_add_element(&space_outliner_, scene, tree, TSE_SOME_ID, 0);
TreeStoreElem *tselem = TREESTORE(te);
/* New scene elements open by default */
@@ -49,7 +48,7 @@ ListBase TreeDisplayScenes::buildTree(const TreeSourceData &source_data)
tselem->flag &= ~TSE_CLOSED;
}
- outliner_make_object_parent_hierarchy(&te->subtree);
+ outliner_make_object_parent_hierarchy(te->child_elements);
}
return tree;
diff --git a/source/blender/editors/space_outliner/tree/tree_display_sequencer.cc b/source/blender/editors/space_outliner/tree/tree_display_sequencer.cc
index c2739d876f4..530ce40bae7 100644
--- a/source/blender/editors/space_outliner/tree/tree_display_sequencer.cc
+++ b/source/blender/editors/space_outliner/tree/tree_display_sequencer.cc
@@ -28,9 +28,9 @@ TreeDisplaySequencer::TreeDisplaySequencer(SpaceOutliner &space_outliner)
{
}
-ListBase TreeDisplaySequencer::buildTree(const TreeSourceData &source_data)
+SubTree TreeDisplaySequencer::buildTree(const TreeSourceData &source_data)
{
- ListBase tree = {nullptr};
+ SubTree tree;
Editing *ed = SEQ_editing_get(source_data.scene);
if (ed == nullptr) {
@@ -40,11 +40,10 @@ ListBase TreeDisplaySequencer::buildTree(const TreeSourceData &source_data)
for (Sequence *seq : List<Sequence>(ed->seqbasep)) {
SequenceAddOp op = need_add_seq_dup(seq);
if (op == SEQUENCE_DUPLICATE_NONE) {
- outliner_add_element(&space_outliner_, &tree, seq, nullptr, TSE_SEQUENCE, 0);
+ outliner_add_element(&space_outliner_, seq, tree, TSE_SEQUENCE, 0);
}
else if (op == SEQUENCE_DUPLICATE_ADD) {
- TreeElement *te = outliner_add_element(
- &space_outliner_, &tree, seq, nullptr, TSE_SEQUENCE_DUP, 0);
+ TreeElement *te = outliner_add_element(&space_outliner_, seq, tree, TSE_SEQUENCE_DUP, 0);
add_seq_dup(seq, te, 0);
}
}
@@ -101,7 +100,7 @@ void TreeDisplaySequencer::add_seq_dup(Sequence *seq, TreeElement *te, short ind
}
if (STREQ(p->strip->stripdata->name, seq->strip->stripdata->name)) {
- outliner_add_element(&space_outliner_, &te->subtree, (void *)p, te, TSE_SEQUENCE, index);
+ outliner_add_element(&space_outliner_, (void *)p, te, TSE_SEQUENCE, index);
}
p = p->next;
}
diff --git a/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc b/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc
index c8869d90eca..cbaba863950 100644
--- a/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc
+++ b/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc
@@ -60,9 +60,9 @@ bool TreeDisplayViewLayer::supportsModeColumn() const
return true;
}
-ListBase TreeDisplayViewLayer::buildTree(const TreeSourceData &source_data)
+SubTree TreeDisplayViewLayer::buildTree(const TreeSourceData &source_data)
{
- ListBase tree = {nullptr};
+ SubTree subtree;
Scene *scene = source_data.scene;
show_objects_ = !(space_outliner_.filter & SO_FILTER_NO_OBJECT);
@@ -74,23 +74,23 @@ ListBase TreeDisplayViewLayer::buildTree(const TreeSourceData &source_data)
continue;
}
- add_view_layer(*scene, tree, (TreeElement *)nullptr);
+ add_view_layer(*scene, subtree);
}
else {
TreeElement &te_view_layer = *outliner_add_element(
- &space_outliner_, &tree, scene, nullptr, TSE_R_LAYER, 0);
+ &space_outliner_, scene, subtree, TSE_R_LAYER, 0);
TREESTORE(&te_view_layer)->flag &= ~TSE_CLOSED;
te_view_layer.name = view_layer->name;
te_view_layer.directdata = view_layer;
- add_view_layer(*scene, te_view_layer.subtree, &te_view_layer);
+ add_view_layer(*scene, te_view_layer.child_elements);
}
}
- return tree;
+ return subtree;
}
-void TreeDisplayViewLayer::add_view_layer(Scene &scene, ListBase &tree, TreeElement *parent)
+void TreeDisplayViewLayer::add_view_layer(Scene &scene, SubTree &subtree)
{
const bool show_children = (space_outliner_.filter & SO_FILTER_NO_CHILDREN) == 0;
@@ -98,18 +98,18 @@ void TreeDisplayViewLayer::add_view_layer(Scene &scene, ListBase &tree, TreeElem
/* Show objects in the view layer. */
for (Base *base : List<Base>(view_layer_->object_bases)) {
TreeElement *te_object = outliner_add_element(
- &space_outliner_, &tree, base->object, parent, TSE_SOME_ID, 0);
+ &space_outliner_, base->object, subtree, TSE_SOME_ID, 0);
te_object->directdata = base;
}
if (show_children) {
- outliner_make_object_parent_hierarchy(&tree);
+ outliner_make_object_parent_hierarchy(subtree);
}
}
else {
/* Show collections in the view layer. */
TreeElement &ten = *outliner_add_element(
- &space_outliner_, &tree, &scene, parent, TSE_VIEW_COLLECTION_BASE, 0);
+ &space_outliner_, &scene, subtree, TSE_VIEW_COLLECTION_BASE, 0);
ten.name = IFACE_("Scene Collection");
TREESTORE(&ten)->flag &= ~TSE_CLOSED;
@@ -119,9 +119,9 @@ void TreeDisplayViewLayer::add_view_layer(Scene &scene, ListBase &tree, TreeElem
return;
}
- add_layer_collections_recursive(ten.subtree, lc->layer_collections, ten);
+ add_layer_collections_recursive(lc->layer_collections, ten);
if (show_objects_) {
- add_layer_collection_objects(ten.subtree, *lc, ten);
+ add_layer_collection_objects(*lc, ten);
}
if (show_children) {
add_layer_collection_objects_children(ten);
@@ -129,8 +129,7 @@ void TreeDisplayViewLayer::add_view_layer(Scene &scene, ListBase &tree, TreeElem
}
}
-void TreeDisplayViewLayer::add_layer_collections_recursive(ListBase &tree,
- ListBase &layer_collections,
+void TreeDisplayViewLayer::add_layer_collections_recursive(ListBase &layer_collections,
TreeElement &parent_ten)
{
for (LayerCollection *lc : List<LayerCollection>(layer_collections)) {
@@ -142,8 +141,7 @@ void TreeDisplayViewLayer::add_layer_collections_recursive(ListBase &tree,
}
else {
ID *id = &lc->collection->id;
- ten = outliner_add_element(
- &space_outliner_, &tree, id, &parent_ten, TSE_LAYER_COLLECTION, 0);
+ ten = outliner_add_element(&space_outliner_, id, &parent_ten, TSE_LAYER_COLLECTION, 0);
ten->name = id->name + 2;
ten->directdata = lc;
@@ -155,21 +153,19 @@ void TreeDisplayViewLayer::add_layer_collections_recursive(ListBase &tree,
}
}
- add_layer_collections_recursive(ten->subtree, lc->layer_collections, *ten);
+ add_layer_collections_recursive(lc->layer_collections, *ten);
if (!exclude && show_objects_) {
- add_layer_collection_objects(ten->subtree, *lc, *ten);
+ add_layer_collection_objects(*lc, *ten);
}
}
}
-void TreeDisplayViewLayer::add_layer_collection_objects(ListBase &tree,
- LayerCollection &lc,
- TreeElement &ten)
+void TreeDisplayViewLayer::add_layer_collection_objects(LayerCollection &lc, TreeElement &ten)
{
for (CollectionObject *cob : List<CollectionObject>(lc.collection->gobject)) {
Base *base = BKE_view_layer_base_find(view_layer_, cob->ob);
TreeElement *te_object = outliner_add_element(
- &space_outliner_, &tree, base->object, &ten, TSE_SOME_ID, 0);
+ &space_outliner_, base->object, &ten, TSE_SOME_ID, 0);
te_object->directdata = base;
}
}
@@ -261,9 +257,10 @@ void ObjectsChildrenBuilder::make_object_parent_hierarchy_collections()
for (TreeElement *child_ob_tree_element : child_ob_tree_elements) {
if (child_ob_tree_element->parent == parent_ob_collection_tree_element) {
/* Move from the collection subtree into the parent object subtree. */
- BLI_remlink(&parent_ob_collection_tree_element->subtree, child_ob_tree_element);
- BLI_addtail(&parent_ob_tree_element->subtree, child_ob_tree_element);
- child_ob_tree_element->parent = parent_ob_tree_element;
+ std::unique_ptr<TreeElement> removed_te =
+ parent_ob_collection_tree_element->child_elements.remove(*child_ob_tree_element);
+ parent_ob_tree_element->child_elements.add_back(std::move(removed_te));
+
found = true;
break;
}
@@ -272,13 +269,8 @@ void ObjectsChildrenBuilder::make_object_parent_hierarchy_collections()
if (!found) {
/* We add the child in the tree even if it is not in the collection.
* We don't expand its sub-tree though, to make it less prominent. */
- TreeElement *child_ob_tree_element = outliner_add_element(&outliner_,
- &parent_ob_tree_element->subtree,
- child,
- parent_ob_tree_element,
- TSE_SOME_ID,
- 0,
- false);
+ TreeElement *child_ob_tree_element = outliner_add_element(
+ &outliner_, child, parent_ob_tree_element, TSE_SOME_ID, 0, false);
child_ob_tree_element->flag |= TE_CHILD_NOT_IN_COLLECTION;
child_ob_tree_elements.append(child_ob_tree_element);
}
diff --git a/source/blender/editors/space_outliner/tree/tree_element.cc b/source/blender/editors/space_outliner/tree/tree_element.cc
index 4a540c3ce87..4b85784d2ae 100644
--- a/source/blender/editors/space_outliner/tree/tree_element.cc
+++ b/source/blender/editors/space_outliner/tree/tree_element.cc
@@ -146,4 +146,75 @@ void tree_element_expand(const AbstractTreeElement &tree_element, SpaceOutliner
tree_element.expand(space_outliner);
}
+/* -------------------------------------------------------------------- */
+
+SubTree::SubTree(TreeElement &parent) : parent_(&parent)
+{
+}
+
+SubTree::SubTree(SpaceOutliner_Runtime &) : parent_(nullptr)
+{
+}
+
+void SubTree::add_back(std::unique_ptr<TreeElement> element)
+{
+ element->parent = parent_;
+ /* TODO is this the right place for this? */
+ element->child_elements.parent_ = element.get();
+ elements_.push_back(std::move(element));
+}
+
+void SubTree::insert_before(Iterator pos, std::unique_ptr<TreeElement> element)
+{
+ element->parent = parent_;
+ elements_.insert(pos.iter_, std::move(element));
+}
+
+std::unique_ptr<TreeElement> SubTree::remove(TreeElement &element)
+{
+ std::unique_ptr<TreeElement> element_uptr = nullptr;
+ /* TODO doesn't free element entirely yet, #TreeElement.name may need freeing! See
+ * #outliner_free_tree_element(). */
+
+ for (decltype(elements_)::iterator iter = elements_.begin(); iter != elements_.end(); ++iter) {
+ if (iter->get() == &element) {
+ element_uptr = std::move(*iter);
+ elements_.erase(iter);
+ break;
+ }
+ }
+ BLI_assert(!has_child(element));
+
+ if (element_uptr) {
+ element_uptr->parent = nullptr;
+ }
+ return element_uptr;
+}
+
+void SubTree::clear()
+{
+ elements_.clear();
+ /* No need to clear the parent pointer, elements get destructed entirely anyway. */
+}
+
+bool SubTree::has_child(const TreeElement &needle) const
+{
+ for (const TreeElement &te : *this) {
+ if (&te == &needle) {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool SubTree::is_empty() const
+{
+ return elements_.empty();
+}
+
+TreeElement *SubTree::parent() const
+{
+ return parent_;
+}
+
} // namespace blender::ed::outliner
diff --git a/source/blender/editors/space_outliner/tree/tree_element.hh b/source/blender/editors/space_outliner/tree/tree_element.hh
index 1b145a48daa..71f64cfe610 100644
--- a/source/blender/editors/space_outliner/tree/tree_element.hh
+++ b/source/blender/editors/space_outliner/tree/tree_element.hh
@@ -18,6 +18,7 @@ struct SpaceOutliner;
namespace blender::ed::outliner {
struct TreeElement;
+class SubTree;
/* -------------------------------------------------------------------- */
/* Tree-Display Interface */
@@ -114,21 +115,28 @@ class AbstractTreeElement {
* TODO: this function needs to be split up! It's getting a bit too large...
*
* \note "ID" is not always a real ID.
- * \note If child items are only added to the tree if the item is open,
- * the `TSE_` type _must_ be added to #outliner_element_needs_rebuild_on_open_change().
+ * \note If child items are only added to the tree if the item is open, the `TSE_` type _must_ be
+ * added to #outliner_element_needs_rebuild_on_open_change().
*
+ * \param parent: The parent element to add the new element to. If this is null, the new element
+ * will be added to the root level of the tree.
* \param expand: If true, the element may add its own sub-tree. E.g. objects will list their
* animation data, object data, constraints, modifiers, ... This often adds visual
* noise, and can be expensive to add in big scenes. So prefer setting this to
* false.
*/
-struct TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
- ListBase *lb,
- void *idv,
- struct TreeElement *parent,
- short type,
- short index,
- const bool expand = true);
+TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
+ void *idv,
+ TreeElement *parent,
+ short type,
+ short index,
+ const bool expand = true);
+TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
+ void *idv,
+ SubTree &subtree,
+ short type,
+ short index,
+ const bool expand = true);
void tree_element_expand(const AbstractTreeElement &tree_element, SpaceOutliner &space_outliner);
diff --git a/source/blender/editors/space_outliner/tree/tree_element_anim_data.cc b/source/blender/editors/space_outliner/tree/tree_element_anim_data.cc
index bb514cf6f3c..20f48e2421b 100644
--- a/source/blender/editors/space_outliner/tree/tree_element_anim_data.cc
+++ b/source/blender/editors/space_outliner/tree/tree_element_anim_data.cc
@@ -30,8 +30,7 @@ TreeElementAnimData::TreeElementAnimData(TreeElement &legacy_te, AnimData &anim_
void TreeElementAnimData::expand(SpaceOutliner &space_outliner) const
{
/* Animation data-block itself. */
- outliner_add_element(
- &space_outliner, &legacy_te_.subtree, anim_data_.action, &legacy_te_, TSE_SOME_ID, 0);
+ outliner_add_element(&space_outliner, anim_data_.action, &legacy_te_, TSE_SOME_ID, 0);
expand_drivers(space_outliner);
expand_NLA_tracks(space_outliner);
@@ -42,8 +41,7 @@ void TreeElementAnimData::expand_drivers(SpaceOutliner &space_outliner) const
if (BLI_listbase_is_empty(&anim_data_.drivers)) {
return;
}
- outliner_add_element(
- &space_outliner, &legacy_te_.subtree, &anim_data_, &legacy_te_, TSE_DRIVER_BASE, 0);
+ outliner_add_element(&space_outliner, &anim_data_, &legacy_te_, TSE_DRIVER_BASE, 0);
}
void TreeElementAnimData::expand_NLA_tracks(SpaceOutliner &space_outliner) const
@@ -51,7 +49,7 @@ void TreeElementAnimData::expand_NLA_tracks(SpaceOutliner &space_outliner) const
if (BLI_listbase_is_empty(&anim_data_.nla_tracks)) {
return;
}
- outliner_add_element(&space_outliner, &legacy_te_.subtree, &anim_data_, &legacy_te_, TSE_NLA, 0);
+ outliner_add_element(&space_outliner, &anim_data_, &legacy_te_, TSE_NLA, 0);
}
} // namespace blender::ed::outliner
diff --git a/source/blender/editors/space_outliner/tree/tree_element_driver.cc b/source/blender/editors/space_outliner/tree/tree_element_driver.cc
index f8072d2814d..acd75fefff3 100644
--- a/source/blender/editors/space_outliner/tree/tree_element_driver.cc
+++ b/source/blender/editors/space_outliner/tree/tree_element_driver.cc
@@ -40,8 +40,7 @@ void TreeElementDriverBase::expand(SpaceOutliner &space_outliner) const
DRIVER_TARGETS_USED_LOOPER_BEGIN (dvar) {
if (lastadded != dtar->id) {
/* XXX this lastadded check is rather lame, and also fails quite badly... */
- outliner_add_element(
- &space_outliner, &legacy_te_.subtree, dtar->id, &legacy_te_, TSE_LINKED_OB, 0);
+ outliner_add_element(&space_outliner, dtar->id, &legacy_te_, TSE_LINKED_OB, 0);
lastadded = dtar->id;
}
}
diff --git a/source/blender/editors/space_outliner/tree/tree_element_id.cc b/source/blender/editors/space_outliner/tree/tree_element_id.cc
index 86f5fd4eff5..78f734a5579 100644
--- a/source/blender/editors/space_outliner/tree/tree_element_id.cc
+++ b/source/blender/editors/space_outliner/tree/tree_element_id.cc
@@ -107,8 +107,7 @@ void TreeElementID::expand_animation_data(SpaceOutliner &space_outliner,
const AnimData *anim_data) const
{
if (outliner_animdata_test(anim_data)) {
- outliner_add_element(
- &space_outliner, &legacy_te_.subtree, &id_, &legacy_te_, TSE_ANIM_DATA, 0);
+ outliner_add_element(&space_outliner, &id_, &legacy_te_, TSE_ANIM_DATA, 0);
}
}
diff --git a/source/blender/editors/space_outliner/tree/tree_element_id_scene.cc b/source/blender/editors/space_outliner/tree/tree_element_id_scene.cc
index 328c19c56fd..753de08c72a 100644
--- a/source/blender/editors/space_outliner/tree/tree_element_id_scene.cc
+++ b/source/blender/editors/space_outliner/tree/tree_element_id_scene.cc
@@ -36,26 +36,22 @@ void TreeElementIDScene::expand(SpaceOutliner &space_outliner) const
void TreeElementIDScene::expandViewLayers(SpaceOutliner &space_outliner) const
{
- outliner_add_element(
- &space_outliner, &legacy_te_.subtree, &scene_, &legacy_te_, TSE_R_LAYER_BASE, 0);
+ outliner_add_element(&space_outliner, &scene_, &legacy_te_, TSE_R_LAYER_BASE, 0);
}
void TreeElementIDScene::expandWorld(SpaceOutliner &space_outliner) const
{
- outliner_add_element(
- &space_outliner, &legacy_te_.subtree, scene_.world, &legacy_te_, TSE_SOME_ID, 0);
+ outliner_add_element(&space_outliner, scene_.world, &legacy_te_, TSE_SOME_ID, 0);
}
void TreeElementIDScene::expandCollections(SpaceOutliner &space_outliner) const
{
- outliner_add_element(
- &space_outliner, &legacy_te_.subtree, &scene_, &legacy_te_, TSE_SCENE_COLLECTION_BASE, 0);
+ outliner_add_element(&space_outliner, &scene_, &legacy_te_, TSE_SCENE_COLLECTION_BASE, 0);
}
void TreeElementIDScene::expandObjects(SpaceOutliner &space_outliner) const
{
- outliner_add_element(
- &space_outliner, &legacy_te_.subtree, &scene_, &legacy_te_, TSE_SCENE_OBJECTS_BASE, 0);
+ outliner_add_element(&space_outliner, &scene_, &legacy_te_, TSE_SCENE_OBJECTS_BASE, 0);
}
} // namespace blender::ed::outliner
diff --git a/source/blender/editors/space_outliner/tree/tree_element_nla.cc b/source/blender/editors/space_outliner/tree/tree_element_nla.cc
index df19b2e8f4b..75ae4d0744b 100644
--- a/source/blender/editors/space_outliner/tree/tree_element_nla.cc
+++ b/source/blender/editors/space_outliner/tree/tree_element_nla.cc
@@ -30,7 +30,7 @@ void TreeElementNLA::expand(SpaceOutliner &space_outliner) const
{
int a = 0;
for (NlaTrack *nlt : ListBaseWrapper<NlaTrack>(anim_data_.nla_tracks)) {
- outliner_add_element(&space_outliner, &legacy_te_.subtree, nlt, &legacy_te_, TSE_NLA_TRACK, a);
+ outliner_add_element(&space_outliner, nlt, &legacy_te_, TSE_NLA_TRACK, a);
a++;
}
}
@@ -48,8 +48,7 @@ void TreeElementNLATrack::expand(SpaceOutliner &space_outliner) const
{
int a = 0;
for (NlaStrip *strip : ListBaseWrapper<NlaStrip>(track_.strips)) {
- outliner_add_element(
- &space_outliner, &legacy_te_.subtree, strip->act, &legacy_te_, TSE_NLA_ACTION, a);
+ outliner_add_element(&space_outliner, strip->act, &legacy_te_, TSE_NLA_ACTION, a);
a++;
}
}
diff --git a/source/blender/editors/space_outliner/tree/tree_element_overrides.cc b/source/blender/editors/space_outliner/tree/tree_element_overrides.cc
index 11067d37966..f4684d89d45 100644
--- a/source/blender/editors/space_outliner/tree/tree_element_overrides.cc
+++ b/source/blender/editors/space_outliner/tree/tree_element_overrides.cc
@@ -353,12 +353,8 @@ void OverrideRNAPathTreeBuilder::build_path(TreeElement &parent,
* values), so the element may already be present. At this point they are displayed as a single
* property in the tree, so don't add it multiple times here. */
else if (!path_te_map.contains(override_data.override_property.rna_path)) {
- outliner_add_element(&space_outliner_,
- &te_to_expand->subtree,
- &override_data,
- te_to_expand,
- TSE_LIBRARY_OVERRIDE,
- index++);
+ outliner_add_element(
+ &space_outliner_, &override_data, te_to_expand, TSE_LIBRARY_OVERRIDE, index++);
}
MEM_delete(elem_path);
@@ -403,7 +399,6 @@ void OverrideRNAPathTreeBuilder::ensure_entire_collection(
override_op_data.operation = item_operation;
current_te = outliner_add_element(&space_outliner_,
- &te_to_expand.subtree,
/* Element will store a copy. */
&override_op_data,
&te_to_expand,
@@ -446,7 +441,6 @@ TreeElement &OverrideRNAPathTreeBuilder::ensure_label_element_for_prop(
{
return *path_te_map.lookup_or_add_cb(elem_path, [&]() {
TreeElement *new_te = outliner_add_element(&space_outliner_,
- &parent.subtree,
(void *)RNA_property_ui_name(&prop),
&parent,
TSE_GENERIC_LABEL,
@@ -469,7 +463,6 @@ TreeElement &OverrideRNAPathTreeBuilder::ensure_label_element_for_ptr(TreeElemen
TreeElement *new_te = outliner_add_element(
&space_outliner_,
- &parent.subtree,
(void *)(dyn_name ? dyn_name : RNA_struct_ui_name(ptr.type)),
&parent,
TSE_GENERIC_LABEL,
diff --git a/source/blender/editors/space_outliner/tree/tree_element_rna.cc b/source/blender/editors/space_outliner/tree/tree_element_rna.cc
index 9e1f22b49d6..9a0563f36fa 100644
--- a/source/blender/editors/space_outliner/tree/tree_element_rna.cc
+++ b/source/blender/editors/space_outliner/tree/tree_element_rna.cc
@@ -118,8 +118,7 @@ void TreeElementRNAStruct::expand(SpaceOutliner &space_outliner) const
PointerRNA propptr;
RNA_property_collection_lookup_int(&ptr, iterprop, index, &propptr);
if (!(RNA_property_flag(static_cast<PropertyRNA *>(propptr.data)) & PROP_HIDDEN)) {
- outliner_add_element(
- &space_outliner, &legacy_te_.subtree, &ptr, &legacy_te_, TSE_RNA_PROPERTY, index);
+ outliner_add_element(&space_outliner, &ptr, &legacy_te_, TSE_RNA_PROPERTY, index);
}
}
}
@@ -168,8 +167,7 @@ void TreeElementRNAProperty::expand(SpaceOutliner &space_outliner) const
if (pptr.data) {
if (TSELEM_OPEN(&tselem, &space_outliner)) {
- outliner_add_element(
- &space_outliner, &legacy_te_.subtree, &pptr, &legacy_te_, TSE_RNA_STRUCT, -1);
+ outliner_add_element(&space_outliner, &pptr, &legacy_te_, TSE_RNA_STRUCT, -1);
}
else {
legacy_te_.flag |= TE_PRETEND_HAS_CHILDREN;
@@ -184,8 +182,7 @@ void TreeElementRNAProperty::expand(SpaceOutliner &space_outliner) const
for (int index = 0; index < tot; index++) {
PointerRNA pptr;
RNA_property_collection_lookup_int(&rna_ptr, rna_prop_, index, &pptr);
- outliner_add_element(
- &space_outliner, &legacy_te_.subtree, &pptr, &legacy_te_, TSE_RNA_STRUCT, index);
+ outliner_add_element(&space_outliner, &pptr, &legacy_te_, TSE_RNA_STRUCT, index);
}
}
else if (tot) {
@@ -198,12 +195,7 @@ void TreeElementRNAProperty::expand(SpaceOutliner &space_outliner) const
if (TSELEM_OPEN(&tselem, &space_outliner)) {
for (int index = 0; index < tot; index++) {
- outliner_add_element(&space_outliner,
- &legacy_te_.subtree,
- &rna_ptr,
- &legacy_te_,
- TSE_RNA_ARRAY_ELEM,
- index);
+ outliner_add_element(&space_outliner, &rna_ptr, &legacy_te_, TSE_RNA_ARRAY_ELEM, index);
}
}
else if (tot) {
diff --git a/source/blender/editors/space_outliner/tree/tree_element_scene_objects.cc b/source/blender/editors/space_outliner/tree/tree_element_scene_objects.cc
index b47707e8891..0f6b9363bf9 100644
--- a/source/blender/editors/space_outliner/tree/tree_element_scene_objects.cc
+++ b/source/blender/editors/space_outliner/tree/tree_element_scene_objects.cc
@@ -29,10 +29,10 @@ TreeElementSceneObjectsBase::TreeElementSceneObjectsBase(TreeElement &legacy_te,
void TreeElementSceneObjectsBase::expand(SpaceOutliner &space_outliner) const
{
FOREACH_SCENE_OBJECT_BEGIN (&scene_, ob) {
- outliner_add_element(&space_outliner, &legacy_te_.subtree, ob, &legacy_te_, TSE_SOME_ID, 0);
+ outliner_add_element(&space_outliner, ob, &legacy_te_, TSE_SOME_ID, 0);
}
FOREACH_SCENE_OBJECT_END;
- outliner_make_object_parent_hierarchy(&legacy_te_.subtree);
+ outliner_make_object_parent_hierarchy(legacy_te_.child_elements);
}
} // namespace blender::ed::outliner
diff --git a/source/blender/editors/space_outliner/tree/tree_element_seq.cc b/source/blender/editors/space_outliner/tree/tree_element_seq.cc
index 550a72d246d..dbe587075f8 100644
--- a/source/blender/editors/space_outliner/tree/tree_element_seq.cc
+++ b/source/blender/editors/space_outliner/tree/tree_element_seq.cc
@@ -45,13 +45,11 @@ void TreeElementSequence::expand(SpaceOutliner &space_outliner) const
if (sequence_.type == SEQ_TYPE_META) {
LISTBASE_FOREACH (Sequence *, child, &sequence_.seqbase) {
- outliner_add_element(
- &space_outliner, &legacy_te_.subtree, child, &legacy_te_, TSE_SEQUENCE, 0);
+ outliner_add_element(&space_outliner, child, &legacy_te_, TSE_SEQUENCE, 0);
}
}
else {
- outliner_add_element(
- &space_outliner, &legacy_te_.subtree, sequence_.strip, &legacy_te_, TSE_SEQ_STRIP, 0);
+ outliner_add_element(&space_outliner, sequence_.strip, &legacy_te_, TSE_SEQ_STRIP, 0);
}
}
diff --git a/source/blender/editors/space_outliner/tree/tree_element_view_layer.cc b/source/blender/editors/space_outliner/tree/tree_element_view_layer.cc
index da82854facb..ba11af3110a 100644
--- a/source/blender/editors/space_outliner/tree/tree_element_view_layer.cc
+++ b/source/blender/editors/space_outliner/tree/tree_element_view_layer.cc
@@ -29,7 +29,7 @@ void TreeElementViewLayerBase::expand(SpaceOutliner &space_outliner) const
{
for (auto *view_layer : ListBaseWrapper<ViewLayer>(scene_.view_layers)) {
TreeElement *tenlay = outliner_add_element(
- &space_outliner, &legacy_te_.subtree, &scene_, &legacy_te_, TSE_R_LAYER, 0);
+ &space_outliner, &scene_, &legacy_te_, TSE_R_LAYER, 0);
tenlay->name = view_layer->name;
tenlay->directdata = view_layer;
}