[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