[Bf-blender-cvs] [9bce134e56c] master: Outliner: Port RNA elements to new tree-element design

Julian Eisel noreply at git.blender.org
Wed Jan 26 11:56:16 CET 2022


Commit: 9bce134e56c28045aee37080f5c5b6622a07927b
Author: Julian Eisel
Date:   Wed Jan 26 11:44:58 2022 +0100
Branches: master
https://developer.blender.org/rB9bce134e56c28045aee37080f5c5b6622a07927b

Outliner: Port RNA elements to new tree-element design

Continuation of work started in 2e221de4ceee and 249e4df110e0.

Adds new tree-element classes for RNA structs, properties and array
elements. This isn't exactly a copy and paste, even though logic should
effectively be the same. Further cleanups are included to share code in
a nice way, improve code with simple C++ features, etc.

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

M	source/blender/editors/space_outliner/CMakeLists.txt
M	source/blender/editors/space_outliner/outliner_intern.hh
M	source/blender/editors/space_outliner/outliner_tree.cc
M	source/blender/editors/space_outliner/tree/tree_element.cc
A	source/blender/editors/space_outliner/tree/tree_element_rna.cc
A	source/blender/editors/space_outliner/tree/tree_element_rna.hh

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

diff --git a/source/blender/editors/space_outliner/CMakeLists.txt b/source/blender/editors/space_outliner/CMakeLists.txt
index cac9d4131f8..60b881fb32b 100644
--- a/source/blender/editors/space_outliner/CMakeLists.txt
+++ b/source/blender/editors/space_outliner/CMakeLists.txt
@@ -65,6 +65,7 @@ set(SRC
   tree/tree_element_id_scene.cc
   tree/tree_element_nla.cc
   tree/tree_element_overrides.cc
+  tree/tree_element_rna.cc
   tree/tree_element_scene_objects.cc
   tree/tree_element_view_layer.cc
 
@@ -81,6 +82,7 @@ set(SRC
   tree/tree_element_id_scene.hh
   tree/tree_element_nla.hh
   tree/tree_element_overrides.hh
+  tree/tree_element_rna.hh
   tree/tree_element_scene_objects.hh
   tree/tree_element_view_layer.hh
 )
diff --git a/source/blender/editors/space_outliner/outliner_intern.hh b/source/blender/editors/space_outliner/outliner_intern.hh
index 9065f7f9cc1..a62d35131ca 100644
--- a/source/blender/editors/space_outliner/outliner_intern.hh
+++ b/source/blender/editors/space_outliner/outliner_intern.hh
@@ -225,7 +225,7 @@ typedef enum {
  * - not searching into RNA items helps but isn't the complete solution
  */
 
-#define SEARCHING_OUTLINER(sov) (sov->search_flags & SO_SEARCH_RECURSIVE)
+#define SEARCHING_OUTLINER(sov) ((sov)->search_flags & SO_SEARCH_RECURSIVE)
 
 /* is the current element open? if so we also show children */
 #define TSELEM_OPEN(telm, sv) \
diff --git a/source/blender/editors/space_outliner/outliner_tree.cc b/source/blender/editors/space_outliner/outliner_tree.cc
index 3454a27ce13..be792be95a9 100644
--- a/source/blender/editors/space_outliner/outliner_tree.cc
+++ b/source/blender/editors/space_outliner/outliner_tree.cc
@@ -977,144 +977,6 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
     te->directdata = seq;
     te->name = seq->strip->stripdata->name;
   }
-  else if (ELEM(type, TSE_RNA_STRUCT, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM)) {
-    PointerRNA *ptr = (PointerRNA *)idv;
-
-    /* Don't display arrays larger, weak but index is stored as a short,
-     * also the outliner isn't intended for editing such large data-sets. */
-    BLI_STATIC_ASSERT(sizeof(te->index) == 2, "Index is no longer short!")
-    const int tot_limit = SHRT_MAX;
-
-    /* we do lazy build, for speed and to avoid infinite recursion */
-
-    if (ptr->data == nullptr) {
-      te->name = IFACE_("(empty)");
-    }
-    else if (type == TSE_RNA_STRUCT) {
-      /* struct */
-      te->name = RNA_struct_name_get_alloc(ptr, nullptr, 0, nullptr);
-
-      if (te->name) {
-        te->flag |= TE_FREE_NAME;
-      }
-      else {
-        te->name = RNA_struct_ui_name(ptr->type);
-      }
-
-      /* If searching don't expand RNA entries */
-      if (SEARCHING_OUTLINER(space_outliner) && BLI_strcasecmp("RNA", te->name) == 0) {
-        tselem->flag &= ~TSE_CHILDSEARCH;
-      }
-
-      PropertyRNA *iterprop = RNA_struct_iterator_property(ptr->type);
-      int tot = RNA_property_collection_length(ptr, iterprop);
-      CLAMP_MAX(tot, tot_limit);
-
-      /* auto open these cases */
-      if (!parent || (RNA_property_type(reinterpret_cast<PropertyRNA *>(parent->directdata))) ==
-                         PROP_POINTER) {
-        if (!tselem->used) {
-          tselem->flag &= ~TSE_CLOSED;
-        }
-      }
-
-      if (TSELEM_OPEN(tselem, space_outliner)) {
-        for (int a = 0; a < tot; a++) {
-          PointerRNA propptr;
-          RNA_property_collection_lookup_int(ptr, iterprop, a, &propptr);
-          if (!(RNA_property_flag(reinterpret_cast<PropertyRNA *>(propptr.data)) & PROP_HIDDEN)) {
-            outliner_add_element(
-                space_outliner, &te->subtree, (void *)ptr, te, TSE_RNA_PROPERTY, a);
-          }
-        }
-      }
-      else if (tot) {
-        te->flag |= TE_LAZY_CLOSED;
-      }
-
-      te->rnaptr = *ptr;
-    }
-    else if (type == TSE_RNA_PROPERTY) {
-      /* property */
-      PointerRNA propptr;
-      PropertyRNA *iterprop = RNA_struct_iterator_property(ptr->type);
-      RNA_property_collection_lookup_int(ptr, iterprop, index, &propptr);
-
-      PropertyRNA *prop = reinterpret_cast<PropertyRNA *>(propptr.data);
-      PropertyType proptype = RNA_property_type(prop);
-
-      te->name = RNA_property_ui_name(prop);
-      te->directdata = prop;
-      te->rnaptr = *ptr;
-
-      /* If searching don't expand RNA entries */
-      if (SEARCHING_OUTLINER(space_outliner) && BLI_strcasecmp("RNA", te->name) == 0) {
-        tselem->flag &= ~TSE_CHILDSEARCH;
-      }
-
-      if (proptype == PROP_POINTER) {
-        PointerRNA pptr = RNA_property_pointer_get(ptr, prop);
-
-        if (pptr.data) {
-          if (TSELEM_OPEN(tselem, space_outliner)) {
-            outliner_add_element(
-                space_outliner, &te->subtree, (void *)&pptr, te, TSE_RNA_STRUCT, -1);
-          }
-          else {
-            te->flag |= TE_LAZY_CLOSED;
-          }
-        }
-      }
-      else if (proptype == PROP_COLLECTION) {
-        int tot = RNA_property_collection_length(ptr, prop);
-        CLAMP_MAX(tot, tot_limit);
-
-        if (TSELEM_OPEN(tselem, space_outliner)) {
-          for (int a = 0; a < tot; a++) {
-            PointerRNA pptr;
-            RNA_property_collection_lookup_int(ptr, prop, a, &pptr);
-            outliner_add_element(
-                space_outliner, &te->subtree, (void *)&pptr, te, TSE_RNA_STRUCT, a);
-          }
-        }
-        else if (tot) {
-          te->flag |= TE_LAZY_CLOSED;
-        }
-      }
-      else if (ELEM(proptype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) {
-        int tot = RNA_property_array_length(ptr, prop);
-        CLAMP_MAX(tot, tot_limit);
-
-        if (TSELEM_OPEN(tselem, space_outliner)) {
-          for (int a = 0; a < tot; a++) {
-            outliner_add_element(
-                space_outliner, &te->subtree, (void *)ptr, te, TSE_RNA_ARRAY_ELEM, a);
-          }
-        }
-        else if (tot) {
-          te->flag |= TE_LAZY_CLOSED;
-        }
-      }
-    }
-    else if (type == TSE_RNA_ARRAY_ELEM) {
-      PropertyRNA *prop = reinterpret_cast<PropertyRNA *>(parent->directdata);
-
-      te->directdata = prop;
-      te->rnaptr = *ptr;
-      te->index = index;
-
-      char c = RNA_property_array_item_char(prop, index);
-
-      te->name = reinterpret_cast<char *>(MEM_callocN(sizeof(char[20]), "OutlinerRNAArrayName"));
-      if (c) {
-        sprintf((char *)te->name, "  %c", c);
-      }
-      else {
-        sprintf((char *)te->name, "  %d", index + 1);
-      }
-      te->flag |= TE_FREE_NAME;
-    }
-  }
 
   if (tree_element_warnings_get(te, nullptr, nullptr)) {
     te->flag |= TE_HAS_WARNING;
diff --git a/source/blender/editors/space_outliner/tree/tree_element.cc b/source/blender/editors/space_outliner/tree/tree_element.cc
index ea78f70f86d..bed28e59f0b 100644
--- a/source/blender/editors/space_outliner/tree/tree_element.cc
+++ b/source/blender/editors/space_outliner/tree/tree_element.cc
@@ -33,6 +33,7 @@
 #include "tree_element_id.hh"
 #include "tree_element_nla.hh"
 #include "tree_element_overrides.hh"
+#include "tree_element_rna.hh"
 #include "tree_element_scene_objects.hh"
 #include "tree_element_view_layer.hh"
 
@@ -86,6 +87,15 @@ std::unique_ptr<AbstractTreeElement> AbstractTreeElement::createFromType(const i
     case TSE_LIBRARY_OVERRIDE:
       return std::make_unique<TreeElementOverridesProperty>(
           legacy_te, *static_cast<TreeElementOverridesData *>(idv));
+    case TSE_RNA_STRUCT:
+      return std::make_unique<TreeElementRNAStruct>(legacy_te,
+                                                    *reinterpret_cast<PointerRNA *>(idv));
+    case TSE_RNA_PROPERTY:
+      return std::make_unique<TreeElementRNAProperty>(
+          legacy_te, *reinterpret_cast<PointerRNA *>(idv), legacy_te.index);
+    case TSE_RNA_ARRAY_ELEM:
+      return std::make_unique<TreeElementRNAArrayElement>(
+          legacy_te, *reinterpret_cast<PointerRNA *>(idv), legacy_te.index);
     default:
       break;
   }
diff --git a/source/blender/editors/space_outliner/tree/tree_element_rna.cc b/source/blender/editors/space_outliner/tree/tree_element_rna.cc
new file mode 100644
index 00000000000..0152f59268d
--- /dev/null
+++ b/source/blender/editors/space_outliner/tree/tree_element_rna.cc
@@ -0,0 +1,249 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup spoutliner
+ */
+
+#include <climits>
+#include <iostream>
+
+#include "BLI_listbase.h"
+#include "BLI_string.h"
+
+#include "BLT_translation.h"
+
+#include "DNA_outliner_types.h"
+#include "DNA_space_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "RNA_access.h"
+
+#include "../outliner_intern.hh"
+
+#include "tree_element_rna.hh"
+
+namespace blender::ed::outliner {
+
+/* Don't display arrays larger, weak but index is stored as a short,
+ * also the outliner isn't intended for editing such large data-sets. */
+BLI_STATIC_ASSERT(sizeof(TreeElement::index) == 2, "Index is no longer short!")
+
+/* -------------------------------------------------------------------- */
+/* Common functionality (#TreeElementRNACommon Base Class) */
+
+TreeElementRNACommon::TreeElementRNACommon(TreeElement &legacy_te, PointerRNA &rna_ptr)
+    : AbstractTreeElement(legacy_te), rna_ptr_(rna_ptr)
+{
+  /* Create an empty tree-element. */
+  if (!isRNAValid()) {
+    legacy_te_.name = IFACE_("(empty)");
+    return;
+  }
+
+  legacy_te_.rnaptr = rna_ptr;
+}
+
+bool TreeElementRNACommon::isExpandValid() const
+{
+  return true;
+}
+
+bool TreeElementRNACommon::isRNAValid() const
+{
+  ret

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list