[Bf-blender-cvs] [34df0c4e35c] temp-library-overrides-outliner: Fix glitchy highlighting of tree elements

Julian Eisel noreply at git.blender.org
Thu Mar 3 17:44:23 CET 2022


Commit: 34df0c4e35c016888439de3e947af064dcafb978
Author: Julian Eisel
Date:   Thu Mar 3 17:43:12 2022 +0100
Branches: temp-library-overrides-outliner
https://developer.blender.org/rB34df0c4e35c016888439de3e947af064dcafb978

Fix glitchy highlighting of tree elements

Tree items need to be uniquely identifiable via type + data-pointer (the
ID pointer that isn't necessary an ID pointer) + index.

===================================================================

M	source/blender/editors/space_outliner/outliner_tree.cc
M	source/blender/editors/space_outliner/tree/tree_element_overrides.cc
M	source/blender/editors/space_outliner/tree/tree_element_overrides.hh

===================================================================

diff --git a/source/blender/editors/space_outliner/outliner_tree.cc b/source/blender/editors/space_outliner/outliner_tree.cc
index 673fe8ae1c6..0064b8732b2 100644
--- a/source/blender/editors/space_outliner/outliner_tree.cc
+++ b/source/blender/editors/space_outliner/outliner_tree.cc
@@ -64,6 +64,7 @@
 #include "tree/common.hh"
 #include "tree/tree_display.hh"
 #include "tree/tree_element.hh"
+#include "tree/tree_element_overrides.hh"
 
 #ifdef WIN32
 #  include "BLI_math_base.h" /* M_PI */
@@ -811,6 +812,17 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
     /* idv is the layer itself */
     id = TREESTORE(parent)->id;
   }
+  else if (ELEM(type,
+                TSE_LIBRARY_OVERRIDE,
+                TSE_LIBRARY_OVERRIDE_RNA_CONTAINER,
+                TSE_LIBRARY_OVERRIDE_RNA_COLLECTION_ITEM)) {
+    if (auto *override_base_te = tree_element_cast<TreeElementOverridesBase>(parent)) {
+      id = &override_base_te->id;
+    }
+    else if (auto *override_item_te = tree_element_cast<TreeElementOverridesItem>(parent)) {
+      id = override_item_te->getOverrideOwnerID();
+    }
+  }
 
   /* exceptions */
   if (type == TSE_ID_BASE) {
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 548e6bd73dc..eacec12c940 100644
--- a/source/blender/editors/space_outliner/tree/tree_element_overrides.cc
+++ b/source/blender/editors/space_outliner/tree/tree_element_overrides.cc
@@ -62,7 +62,7 @@ static void expand_from_rna_path(SpaceOutliner &space_outliner,
                                                        &property_and_ptr,
                                                        parent_to_expand,
                                                        TSE_LIBRARY_OVERRIDE_RNA_CONTAINER,
-                                                       *index++);
+                                                       (*index)++);
 
       parent_to_expand = container_te;
       /* Iterate over the children the container item expanded, and continue building the path for
@@ -78,6 +78,12 @@ static void expand_from_rna_path(SpaceOutliner &space_outliner,
         }
       }
 
+      /* All items within the same owning ID must have a unique index. If the container expands
+       * items, they count up based on the parent's index (or any preceding siblings if any). */
+      *index = BLI_listbase_is_empty(&container_te->subtree) ?
+                   container_te->index + 1 :
+                   ((TreeElement *)container_te->subtree.last)->index + 1;
+
       continue;
     }
 
@@ -89,7 +95,7 @@ static void expand_from_rna_path(SpaceOutliner &space_outliner,
                          &override_data,
                          parent_to_expand,
                          TSE_LIBRARY_OVERRIDE,
-                         *index++);
+                         (*index)++);
   }
 
   BLI_freelistN(&path_elems);
@@ -138,7 +144,7 @@ void TreeElementOverridesBase::expand(SpaceOutliner &space_outliner) const
 
 TreeElementOverridesProperty::TreeElementOverridesProperty(TreeElement &legacy_te,
                                                            TreeElementOverridesData &override_data)
-    : AbstractTreeElement(legacy_te),
+    : TreeElementOverridesItem(legacy_te),
       override_prop_(override_data.override_property),
       override_rna_ptr(override_data.override_rna_ptr),
       override_rna_prop(override_data.override_rna_prop)
@@ -153,7 +159,7 @@ TreeElementOverridesProperty::TreeElementOverridesProperty(TreeElement &legacy_t
 
 TreeElementOverrideRNAContainer::TreeElementOverrideRNAContainer(
     TreeElement &legacy_te, PropertyPointerRNA &container_prop_and_ptr)
-    : AbstractTreeElement(legacy_te),
+    : TreeElementOverridesItem(legacy_te),
       container_ptr(container_prop_and_ptr.ptr),
       container_prop(*container_prop_and_ptr.prop)
 {
@@ -169,7 +175,13 @@ void TreeElementOverrideRNAContainer::expand(SpaceOutliner &space_outliner) cons
     return;
   }
 
-  int index = 0;
+  /* All items within the same owning ID must have a unique index. Count up based on the parent's
+   * index (or any preceding siblings if any). The parent increases the index counter to be higher
+   * than its last child too. */
+  int index = BLI_listbase_is_empty(&legacy_te_.subtree) ?
+                  legacy_te_.parent->index :
+                  ((TreeElement *)legacy_te_.subtree.last)->index;
+
   /* Non-const copy. */
   PointerRNA ptr = container_ptr;
   RNA_PROP_BEGIN (&ptr, itemptr, &container_prop) {
@@ -178,14 +190,27 @@ void TreeElementOverrideRNAContainer::expand(SpaceOutliner &space_outliner) cons
                          &itemptr,
                          &legacy_te_,
                          TSE_LIBRARY_OVERRIDE_RNA_COLLECTION_ITEM,
-                         index++);
+                         ++index);
   }
   RNA_PROP_END;
 }
 
+ID *TreeElementOverridesItem::getOverrideOwnerID()
+{
+  for (AbstractTreeElement *parent = tree_element_cast<AbstractTreeElement>(legacy_te_.parent);
+       parent;
+       parent = tree_element_cast<AbstractTreeElement>(parent->getLegacyElement().parent)) {
+    if (TreeElementOverridesBase *base_te = dynamic_cast<TreeElementOverridesBase *>(parent)) {
+      return &base_te->id;
+    }
+  }
+
+  return nullptr;
+}
+
 TreeElementOverrideRNACollectionItem::TreeElementOverrideRNACollectionItem(
     TreeElement &legacy_te, const PointerRNA &item_ptr)
-    : AbstractTreeElement(legacy_te), item_ptr(item_ptr)
+    : TreeElementOverridesItem(legacy_te), item_ptr(item_ptr)
 {
   BLI_assert(legacy_te.store_elem->type == TSE_LIBRARY_OVERRIDE_RNA_COLLECTION_ITEM);
   /* Non-const copy. */
diff --git a/source/blender/editors/space_outliner/tree/tree_element_overrides.hh b/source/blender/editors/space_outliner/tree/tree_element_overrides.hh
index 3734c1f67f7..5d784b79467 100644
--- a/source/blender/editors/space_outliner/tree/tree_element_overrides.hh
+++ b/source/blender/editors/space_outliner/tree/tree_element_overrides.hh
@@ -34,7 +34,19 @@ class TreeElementOverridesBase final : public AbstractTreeElement {
   void expand(SpaceOutliner &) const override;
 };
 
-class TreeElementOverridesProperty final : public AbstractTreeElement {
+/**
+ * Common interface for any item nested under #TreeElementOverridesBase. It gives access to the ID
+ * owning the override.
+ */
+class TreeElementOverridesItem : public AbstractTreeElement {
+ public:
+  ID *getOverrideOwnerID();
+
+ protected:
+  using AbstractTreeElement::AbstractTreeElement;
+};
+
+class TreeElementOverridesProperty final : public TreeElementOverridesItem {
   IDOverrideLibraryProperty &override_prop_;
 
  public:
@@ -49,7 +61,7 @@ class TreeElementOverridesProperty final : public AbstractTreeElement {
  * If the override is within some collection or pointer property, the collection/pointer gets its
  * own parent item with items inside.
  */
-class TreeElementOverrideRNAContainer final : public AbstractTreeElement {
+class TreeElementOverrideRNAContainer final : public TreeElementOverridesItem {
  public:
   PointerRNA container_ptr;
   PropertyRNA &container_prop;
@@ -61,7 +73,7 @@ class TreeElementOverrideRNAContainer final : public AbstractTreeElement {
   void expand(SpaceOutliner &) const override;
 };
 
-class TreeElementOverrideRNACollectionItem final : public AbstractTreeElement {
+class TreeElementOverrideRNACollectionItem final : public TreeElementOverridesItem {
  public:
   PointerRNA item_ptr;



More information about the Bf-blender-cvs mailing list