[Bf-blender-cvs] [0c6dc7c59eb] master: Outliner: New "Hierarchies" view mode for Library Overrides

Julian Eisel noreply at git.blender.org
Thu Mar 31 12:21:23 CEST 2022


Commit: 0c6dc7c59ebd8d7857e8c078e37e285769fb5770
Author: Julian Eisel
Date:   Thu Mar 31 12:09:56 2022 +0200
Branches: master
https://developer.blender.org/rB0c6dc7c59ebd8d7857e8c078e37e285769fb5770

Outliner: New "Hierarchies" view mode for Library Overrides

Adds a dropdown for the Library Overrides display mode that lets users
choose between a "Properties" and a "Hierachies" view mode. The former
is what was previously there (a mode that displays all overridden
properties with buttons to edit the values), the latter is new. It
displays the hierarchical relationships between library overridden
data-blocks. E.g. to override the mesh of an object inside a linked
collection, the entire collection > object > mesh hierarchy needs to be
overridden (whereby the former two will be automatically overridden
using system overrides).
The Hierarchies mode will also show the override hierarchies of
data-blocks that were linked and are overridden in the source file. This
information is useful to have, especially for debugging scenes.

Part of T95802.

Differential Revision: https://developer.blender.org/D14440

Reviewed by: Bastien Montagne

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

M	release/scripts/startup/bl_ui/space_outliner.py
M	source/blender/editors/space_outliner/CMakeLists.txt
M	source/blender/editors/space_outliner/outliner_draw.cc
M	source/blender/editors/space_outliner/outliner_utils.cc
M	source/blender/editors/space_outliner/tree/tree_display.cc
M	source/blender/editors/space_outliner/tree/tree_display.hh
A	source/blender/editors/space_outliner/tree/tree_display_override_library_hierarchies.cc
R089	source/blender/editors/space_outliner/tree/tree_display_override_library.cc	source/blender/editors/space_outliner/tree/tree_display_override_library_properties.cc
M	source/blender/editors/space_outliner/tree/tree_element.cc
M	source/blender/editors/space_outliner/tree/tree_element.hh
M	source/blender/editors/space_outliner/tree/tree_element_id.hh
M	source/blender/makesdna/DNA_space_types.h
M	source/blender/makesrna/intern/rna_space.c

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

diff --git a/release/scripts/startup/bl_ui/space_outliner.py b/release/scripts/startup/bl_ui/space_outliner.py
index 0f3dc1f8794..eff8ad8e8b3 100644
--- a/release/scripts/startup/bl_ui/space_outliner.py
+++ b/release/scripts/startup/bl_ui/space_outliner.py
@@ -22,6 +22,8 @@ class OUTLINER_HT_header(Header):
 
         if display_mode == 'DATA_API':
             OUTLINER_MT_editor_menus.draw_collapsible(context, layout)
+        if display_mode == 'LIBRARY_OVERRIDES':
+            layout.prop(space, "lib_override_view_mode", text="")
 
         layout.separator_spacer()
 
@@ -41,7 +43,11 @@ class OUTLINER_HT_header(Header):
                 text="",
                 icon='FILTER',
             )
-        if display_mode in {'LIBRARIES', 'LIBRARY_OVERRIDES', 'ORPHAN_DATA'}:
+        if display_mode == 'LIBRARY_OVERRIDES' and space.lib_override_view_mode == 'HIERARCHIES':
+            # Don't add ID type filter for library overrides hierarchies mode. Point of it is to see a hierarchy that is
+            # usually constructed out of different ID types.
+            pass
+        elif display_mode in {'LIBRARIES', 'LIBRARY_OVERRIDES', 'ORPHAN_DATA'}:
             row.prop(space, "use_filter_id_type", text="", icon='FILTER')
             sub = row.row(align=True)
             sub.active = space.use_filter_id_type
@@ -364,7 +370,7 @@ class OUTLINER_PT_filter(Panel):
         col.prop(space, "use_filter_complete", text="Exact Match")
         col.prop(space, "use_filter_case_sensitive", text="Case Sensitive")
 
-        if display_mode == 'LIBRARY_OVERRIDES' and bpy.data.libraries:
+        if display_mode == 'LIBRARY_OVERRIDES' and space.lib_override_view_mode == 'PROPERTIES' and bpy.data.libraries:
             col.separator()
             row = col.row()
             row.label(icon='LIBRARY_DATA_OVERRIDE')
diff --git a/source/blender/editors/space_outliner/CMakeLists.txt b/source/blender/editors/space_outliner/CMakeLists.txt
index b57525854d6..fae0e4be2a8 100644
--- a/source/blender/editors/space_outliner/CMakeLists.txt
+++ b/source/blender/editors/space_outliner/CMakeLists.txt
@@ -38,7 +38,8 @@ set(SRC
   tree/tree_display_data.cc
   tree/tree_display_libraries.cc
   tree/tree_display_orphaned.cc
-  tree/tree_display_override_library.cc
+  tree/tree_display_override_library_properties.cc
+  tree/tree_display_override_library_hierarchies.cc
   tree/tree_display_scenes.cc
   tree/tree_display_sequencer.cc
   tree/tree_display_view_layer.cc
diff --git a/source/blender/editors/space_outliner/outliner_draw.cc b/source/blender/editors/space_outliner/outliner_draw.cc
index a6f09a86eb4..d204e12b41d 100644
--- a/source/blender/editors/space_outliner/outliner_draw.cc
+++ b/source/blender/editors/space_outliner/outliner_draw.cc
@@ -3899,6 +3899,12 @@ void draw_outliner(const bContext *C)
   /* Default to no emboss for outliner UI. */
   UI_block_emboss_set(block, UI_EMBOSS_NONE_OR_STATUS);
 
+  if (space_outliner->outlinevis == SO_OVERRIDES_LIBRARY) {
+    /* Draw overrides status columns. */
+    outliner_draw_overrides_warning_buts(
+        block, region, space_outliner, &space_outliner->tree, true);
+  }
+
   if (space_outliner->outlinevis == SO_DATA_API) {
     int buttons_start_x = outliner_data_api_buttons_start_x(tree_width);
     /* draw rna buttons */
@@ -3913,11 +3919,8 @@ void draw_outliner(const bContext *C)
     /* draw user toggle columns */
     outliner_draw_userbuts(block, region, space_outliner, &space_outliner->tree);
   }
-  else if (space_outliner->outlinevis == SO_OVERRIDES_LIBRARY) {
-    /* Draw overrides status columns. */
-    outliner_draw_overrides_warning_buts(
-        block, region, space_outliner, &space_outliner->tree, true);
-
+  else if ((space_outliner->outlinevis == SO_OVERRIDES_LIBRARY) &&
+           (space_outliner->lib_override_view_mode == SO_LIB_OVERRIDE_VIEW_PROPERTIES)) {
     UI_block_emboss_set(block, UI_EMBOSS);
     UI_block_flag_enable(block, UI_BLOCK_NO_DRAW_OVERRIDDEN_STATE);
     const int x = region->v2d.cur.xmax - right_column_width;
diff --git a/source/blender/editors/space_outliner/outliner_utils.cc b/source/blender/editors/space_outliner/outliner_utils.cc
index ed5a2108d3c..7526cc7ef5c 100644
--- a/source/blender/editors/space_outliner/outliner_utils.cc
+++ b/source/blender/editors/space_outliner/outliner_utils.cc
@@ -324,6 +324,9 @@ float outliner_right_columns_width(const SpaceOutliner *space_outliner)
     case SO_LIBRARIES:
       return 0.0f;
     case SO_OVERRIDES_LIBRARY:
+      if (space_outliner->lib_override_view_mode != SO_LIB_OVERRIDE_VIEW_PROPERTIES) {
+        return 0.0f;
+      }
       num_columns = OL_RNA_COL_SIZEX / UI_UNIT_X;
       break;
     case SO_ID_ORPHANS:
diff --git a/source/blender/editors/space_outliner/tree/tree_display.cc b/source/blender/editors/space_outliner/tree/tree_display.cc
index f9141dffd6a..141c68594e8 100644
--- a/source/blender/editors/space_outliner/tree/tree_display.cc
+++ b/source/blender/editors/space_outliner/tree/tree_display.cc
@@ -30,7 +30,13 @@ std::unique_ptr<AbstractTreeDisplay> AbstractTreeDisplay::createFromDisplayMode(
     case SO_ID_ORPHANS:
       return std::make_unique<TreeDisplayIDOrphans>(space_outliner);
     case SO_OVERRIDES_LIBRARY:
-      return std::make_unique<TreeDisplayOverrideLibrary>(space_outliner);
+      switch ((eSpaceOutliner_LibOverrideViewMode)space_outliner.lib_override_view_mode) {
+        case SO_LIB_OVERRIDE_VIEW_PROPERTIES:
+          return std::make_unique<TreeDisplayOverrideLibraryProperties>(space_outliner);
+        case SO_LIB_OVERRIDE_VIEW_HIERARCHIES:
+          return std::make_unique<TreeDisplayOverrideLibraryHierarchies>(space_outliner);
+      }
+      break;
     case SO_VIEW_LAYER:
       return std::make_unique<TreeDisplayViewLayer>(space_outliner);
   }
diff --git a/source/blender/editors/space_outliner/tree/tree_display.hh b/source/blender/editors/space_outliner/tree/tree_display.hh
index a60d3339042..327f29aa15e 100644
--- a/source/blender/editors/space_outliner/tree/tree_display.hh
+++ b/source/blender/editors/space_outliner/tree/tree_display.hh
@@ -35,6 +35,8 @@ struct ViewLayer;
 
 namespace blender::ed::outliner {
 
+class TreeElementID;
+
 /**
  * \brief The data to build the tree from.
  */
@@ -127,11 +129,11 @@ class TreeDisplayLibraries final : public AbstractTreeDisplay {
 /* Library Overrides Tree-Display. */
 
 /**
- * \brief Tree-Display for the Library Overrides display mode.
+ * \brief Tree-Display for the Library Overrides display mode, Properties view mode.
  */
-class TreeDisplayOverrideLibrary final : public AbstractTreeDisplay {
+class TreeDisplayOverrideLibraryProperties final : public AbstractTreeDisplay {
  public:
-  TreeDisplayOverrideLibrary(SpaceOutliner &space_outliner);
+  TreeDisplayOverrideLibraryProperties(SpaceOutliner &space_outliner);
 
   ListBase buildTree(const TreeSourceData &source_data) override;
 
@@ -140,6 +142,22 @@ class TreeDisplayOverrideLibrary final : public AbstractTreeDisplay {
   short id_filter_get() const;
 };
 
+/**
+ * \brief Tree-Display for the Library Overrides display mode, Hierarchies view mode.
+ */
+class TreeDisplayOverrideLibraryHierarchies final : public AbstractTreeDisplay {
+ public:
+  TreeDisplayOverrideLibraryHierarchies(SpaceOutliner &space_outliner);
+
+  ListBase buildTree(const TreeSourceData &source_data) override;
+
+ private:
+  ListBase build_hierarchy_for_lib_or_main(Main *bmain,
+                                           TreeElement &parent_te,
+                                           Library *lib = nullptr);
+  void build_hierarchy_for_ID(Main *bmain, ID &override_root_id, TreeElementID &te_id) const;
+};
+
 /* -------------------------------------------------------------------- */
 /* Video Sequencer Tree-Display */
 
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
new file mode 100644
index 00000000000..4b568a6004d
--- /dev/null
+++ b/source/blender/editors/space_outliner/tree/tree_display_override_library_hierarchies.cc
@@ -0,0 +1,224 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+/** \file
+ * \ingroup spoutliner
+ */
+
+#include "DNA_ID.h"
+#include "DNA_collection_types.h"
+#include "DNA_key_types.h"
+#include "DNA_space_types.h"
+
+#include "BLI_listbase.h"
+#include "BLI_map.hh"
+#include "BLI_set.hh"
+
+#include "BLT_translation.h"
+
+#include "BKE_collection.h"
+#include "BKE_lib_query.h"
+#include "BKE_main.h"
+
+#include "../outliner_intern.hh"
+#include "common.hh"
+#include "tree_display.hh"
+#include "tree_element_id.hh"
+
+namespace blender::ed::outliner {
+
+class AbstractTreeElement;
+
+TreeDisplayOverrideLibraryHierarchies::TreeDisplayOverrideLibraryHierarchies(
+    SpaceOutliner &space_outliner)
+    : AbstractTreeDisplay(space_outliner)
+{
+}
+
+/* XXX Remove expanded subtree, we add our own items here. Expanding should probably be
+ * optional. */
+static void remove_expanded_children(TreeElement &te)
+{
+  outliner_free_tree(&te.subtree);
+}
+
+ListBase TreeDisplayOverrideLibraryHierarchies::buildTree(const TreeSourceData &source_data)
+{
+  ListBase tree = {nullptr};
+
+  /* First step: Build "Current File" hierarchy. */
+  TreeElement *current_file_te = outliner_add_element(
+      &space_outliner_, &tree, source_data.bmain, nullptr, TSE_ID_BASE, -1);
+  current_file_te->name = IFACE_("Current File");
+  {
+    AbstractTreeElement::uncollapse_by_default(current_file_te);
+    build_hierarchy_for_lib_or_main(source_data.bmain, *current_file_te);
+
+    /* 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);
+      dummy_te->name = IFACE_("No Library Overrides");
+    }
+  }
+
+  /* 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

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list