[Bf-blender-cvs] [69c840808e6] temp-asset-browser-catalogs-ui: Store tree-views in uiBlocks, preparing for persistent state

Julian Eisel noreply at git.blender.org
Tue Sep 7 15:21:23 CEST 2021


Commit: 69c840808e620f8821147325730c31bc960f9ea5
Author: Julian Eisel
Date:   Tue Sep 7 15:15:12 2021 +0200
Branches: temp-asset-browser-catalogs-ui
https://developer.blender.org/rB69c840808e620f8821147325730c31bc960f9ea5

Store tree-views in uiBlocks, preparing for persistent state

We need to be able to store persistent state in tree-views, e.g. which
items are collapsed. First step for that is storing the tree-views
somewhere where we can relate them to earlier versions of themselves.
The uiBlock should be a decent place for that.

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

A	source/blender/editors/include/UI_interface.hh
M	source/blender/editors/interface/CMakeLists.txt
M	source/blender/editors/interface/interface.c
M	source/blender/editors/interface/interface_intern.h
A	source/blender/editors/interface/interface_view.cc
M	source/blender/editors/space_file/asset_catalog_tree_view.cc
M	source/blender/editors/util/CMakeLists.txt

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

diff --git a/source/blender/editors/include/UI_interface.hh b/source/blender/editors/include/UI_interface.hh
new file mode 100644
index 00000000000..07a0a555f81
--- /dev/null
+++ b/source/blender/editors/include/UI_interface.hh
@@ -0,0 +1,35 @@
+/*
+ * 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 editorui
+ */
+
+#pragma once
+
+#include <memory>
+
+#include "BLI_string_ref.hh"
+
+struct uiBlock;
+namespace blender::ui {
+class uiAbstractTreeView;
+}
+
+blender::ui::uiAbstractTreeView &UI_block_add_view(
+    uiBlock *block,
+    blender::StringRef idname,
+    std::unique_ptr<blender::ui::uiAbstractTreeView> tree_view);
diff --git a/source/blender/editors/interface/CMakeLists.txt b/source/blender/editors/interface/CMakeLists.txt
index d1d5e55c138..79e08f46292 100644
--- a/source/blender/editors/interface/CMakeLists.txt
+++ b/source/blender/editors/interface/CMakeLists.txt
@@ -73,6 +73,7 @@ set(SRC
   interface_templates.c
   interface_undo.c
   interface_utils.c
+  interface_view.cc
   interface_widgets.c
   resources.c
   tree_view.cc
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 90cf12a7c0d..4901e594174 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -3447,6 +3447,7 @@ void UI_block_free(const bContext *C, uiBlock *block)
   BLI_freelistN(&block->color_pickers.list);
 
   ui_block_free_button_groups(block);
+  ui_block_free_views(block);
 
   MEM_freeN(block);
 }
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index ac68e75e15d..9d5df53681e 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -495,6 +495,11 @@ struct uiBlock {
 
   ListBase contexts;
 
+  /** A block contain store "views" on data-sets. Currently tree-views (#uiAbstractTreeView) only.
+   * Others are imaginable, e.g. table-views, grid-views, etc. These are stored here to support
+   * state that is persistent over redraws (e.g. collapsed tree-view items). */
+  ListBase views;
+
   char name[UI_MAX_NAME_STR];
 
   float winmat[4][4];
@@ -1281,6 +1286,9 @@ bool ui_jump_to_target_button_poll(struct bContext *C);
 /* interface_queries.c */
 void ui_interface_tag_script_reload_queries(void);
 
+/* interface_view.cc */
+void ui_block_free_views(struct uiBlock *block);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/editors/interface/interface_view.cc b/source/blender/editors/interface/interface_view.cc
new file mode 100644
index 00000000000..3877eea6424
--- /dev/null
+++ b/source/blender/editors/interface/interface_view.cc
@@ -0,0 +1,62 @@
+/*
+ * 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 edinterface
+ */
+
+#include <memory>
+#include <variant>
+
+#include "BLI_listbase.h"
+
+#include "interface_intern.h"
+
+#include "UI_interface.hh"
+#include "UI_tree_view.hh"
+
+using namespace blender;
+using namespace blender::ui;
+
+/**
+ * Wrapper to store views in a #ListBase.
+ */
+struct uiViewLink : public Link {
+  using TreeViewPtr = std::unique_ptr<uiAbstractTreeView>;
+
+  std::string idname;
+  std::variant<TreeViewPtr> view;
+};
+
+uiAbstractTreeView &UI_block_add_view(uiBlock *block,
+                                      StringRef idname,
+                                      std::unique_ptr<uiAbstractTreeView> tree_view)
+{
+  uiViewLink *view_link = OBJECT_GUARDED_NEW(uiViewLink);
+  BLI_addtail(&block->views, view_link);
+
+  view_link->view = std::move(tree_view);
+  view_link->idname = idname;
+
+  return *std::get<uiViewLink::TreeViewPtr>(view_link->view);
+}
+
+void ui_block_free_views(uiBlock *block)
+{
+  LISTBASE_FOREACH_MUTABLE (uiViewLink *, link, &block->views) {
+    OBJECT_GUARDED_DELETE(link, uiViewLink);
+  }
+}
diff --git a/source/blender/editors/space_file/asset_catalog_tree_view.cc b/source/blender/editors/space_file/asset_catalog_tree_view.cc
index 0a922a8abea..0c68f96cbe7 100644
--- a/source/blender/editors/space_file/asset_catalog_tree_view.cc
+++ b/source/blender/editors/space_file/asset_catalog_tree_view.cc
@@ -35,6 +35,7 @@
 #include "RNA_access.h"
 
 #include "UI_interface.h"
+#include "UI_interface.hh"
 #include "UI_resources.h"
 #include "UI_tree_view.hh"
 
@@ -109,9 +110,9 @@ void file_draw_asset_catalog_tree_view_in_layout(::AssetLibrary *asset_library_c
   bke::AssetLibrary *asset_library = reinterpret_cast<blender::bke::AssetLibrary *>(
       asset_library_c);
 
-  static std::unique_ptr<AssetCatalogTreeView> asset_tree_view = nullptr;
-  asset_tree_view = std::make_unique<AssetCatalogTreeView>(asset_library);
+  uiAbstractTreeView &tree_view = UI_block_add_view(
+      block, "asset catalog tree view", std::make_unique<AssetCatalogTreeView>(asset_library));
 
-  asset_tree_view->build_tree();
-  asset_tree_view->build_layout_from_tree(uiTreeViewLayoutBuilder(*block));
+  tree_view.build_tree();
+  tree_view.build_layout_from_tree(uiTreeViewLayoutBuilder(*block));
 }
diff --git a/source/blender/editors/util/CMakeLists.txt b/source/blender/editors/util/CMakeLists.txt
index eb8764de635..b339bfbdc47 100644
--- a/source/blender/editors/util/CMakeLists.txt
+++ b/source/blender/editors/util/CMakeLists.txt
@@ -103,6 +103,7 @@ set(SRC
   ../include/ED_view3d_offscreen.h
   ../include/UI_icons.h
   ../include/UI_interface.h
+  ../include/UI_interface.hh
   ../include/UI_interface_icons.h
   ../include/UI_resources.h
   ../include/UI_tree_view.hh



More information about the Bf-blender-cvs mailing list