[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