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:
authorJulian Eisel <julian@blender.org>2022-09-07 13:05:56 +0300
committerJulian Eisel <julian@blender.org>2022-09-07 13:05:56 +0300
commitee3d36f78a59ebde397962d97fde4a4137f3aada (patch)
treebea7dd512699511ef0aeba78f042e282080187b8 /source/blender/editors/space_outliner/tree/tree_element.cc
parent788952705c623d3748c6e46fa244b63bd9209717 (diff)
Outliner: Initial (half working) port to new element storagetemp-outliner-new-element-storage
Basicaly the idea is to have a C++ class to better manage the runtime tree element storage and access. This branch doesn't even compile yet, it's just an early experiment so far that I don't only want to keep locally.
Diffstat (limited to 'source/blender/editors/space_outliner/tree/tree_element.cc')
-rw-r--r--source/blender/editors/space_outliner/tree/tree_element.cc71
1 files changed, 71 insertions, 0 deletions
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