[Bf-blender-cvs] [29fdd436058] asset-browser-grid-view: Get changes in catalog tree to update the UI correctly

Julian Eisel noreply at git.blender.org
Tue Feb 8 16:31:36 CET 2022


Commit: 29fdd436058100f22668977bd71af0a0a4b5c090
Author: Julian Eisel
Date:   Tue Feb 8 16:28:40 2022 +0100
Branches: asset-browser-grid-view
https://developer.blender.org/rB29fdd436058100f22668977bd71af0a0a4b5c090

Get changes in catalog tree to update the UI correctly

The catalog tree-view now sends appropriate notifiers and messages when
changing data. Either itself or other UIs (like the main asset browser
region) can then listen to these and update.
I try to design this in a way that the views become independent on the
editor displaying them, so the views can be reused in multiple places.

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

M	source/blender/editors/asset/intern/asset_list.cc
M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/include/UI_tree_view.hh
M	source/blender/editors/interface/interface_view.cc
M	source/blender/editors/interface/tree_view.cc
M	source/blender/editors/space_assets/asset_browser_intern.hh
M	source/blender/editors/space_assets/asset_browser_panels.cc
M	source/blender/editors/space_assets/asset_catalog_tree_view.cc
M	source/blender/editors/space_assets/space_assets.cc
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/rna_space.c
M	source/blender/windowmanager/WM_types.h

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

diff --git a/source/blender/editors/asset/intern/asset_list.cc b/source/blender/editors/asset/intern/asset_list.cc
index 90448b882ed..1381bfbb78b 100644
--- a/source/blender/editors/asset/intern/asset_list.cc
+++ b/source/blender/editors/asset/intern/asset_list.cc
@@ -207,9 +207,7 @@ void AssetList::fetch(const bContext &C)
 void AssetList::setCatalogFilterSettings(const AssetCatalogFilterSettings &settings)
 {
   filelist_set_asset_catalog_filter_options(
-      filelist_,
-      (AssetCatalogFilterMode)settings.filter_mode,
-      &settings.active_catalog_id);
+      filelist_, (AssetCatalogFilterMode)settings.filter_mode, &settings.active_catalog_id);
 }
 
 bool AssetList::needsRefetch() const
@@ -285,7 +283,11 @@ bool AssetList::listen(const wmNotifier &notifier) const
       break;
     }
     case NC_ASSET:
-      if (ELEM(notifier.data, ND_ASSET_LIST, ND_ASSET_LIST_READING, ND_ASSET_LIST_PREVIEW)) {
+      if (ELEM(notifier.data, ND_ASSET_LIST)) {
+        filelist_tag_needs_filtering(filelist_);
+        return true;
+      }
+      if (ELEM(notifier.data, ND_ASSET_LIST_READING, ND_ASSET_LIST_PREVIEW)) {
         return true;
       }
       if (ELEM(notifier.action, NA_ADDED, NA_REMOVED, NA_EDITED)) {
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index e5ef3bb2806..607df5df934 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -3215,6 +3215,10 @@ uiTreeViewItemHandle *UI_block_tree_view_find_item_at(const struct ARegion *regi
                                                       const int xy[2]) ATTR_NONNULL(1, 2);
 uiTreeViewItemHandle *UI_block_tree_view_find_active_item(const struct ARegion *region);
 
+/**
+ * Listen to \a notifier, returning true if the region should redraw.
+ */
+bool UI_tree_view_listen_should_redraw(const uiTreeViewHandle *view, const wmNotifier *notifier);
 /**
  * Listen to \a notifier, returning true if the region should redraw.
  */
diff --git a/source/blender/editors/include/UI_tree_view.hh b/source/blender/editors/include/UI_tree_view.hh
index 8dee88defb3..7002754b934 100644
--- a/source/blender/editors/include/UI_tree_view.hh
+++ b/source/blender/editors/include/UI_tree_view.hh
@@ -42,6 +42,7 @@ struct uiButTreeRow;
 struct uiLayout;
 struct wmDrag;
 struct wmEvent;
+struct wmNotifier;
 
 namespace blender::ui {
 
@@ -142,6 +143,9 @@ class AbstractTreeView : public TreeViewItemContainer {
 
   void foreach_item(ItemIterFn iter_fn, IterOptions options = IterOptions::None) const;
 
+  /** Listen to a notifier, returning true if a redraw is needed. */
+  virtual bool listen(const wmNotifier &) const;
+
   /** Only one item can be renamed at a time. */
   bool is_renaming() const;
 
diff --git a/source/blender/editors/interface/interface_view.cc b/source/blender/editors/interface/interface_view.cc
index 96b9d974ae7..b4bdb41f478 100644
--- a/source/blender/editors/interface/interface_view.cc
+++ b/source/blender/editors/interface/interface_view.cc
@@ -101,12 +101,19 @@ void ui_block_free_views(uiBlock *block)
 
 void UI_block_views_listen(const uiBlock *block, const wmRegionListenerParams *listener_params)
 {
+  ARegion *region = listener_params->region;
+
   LISTBASE_FOREACH (ViewLink *, view_link, &block->views) {
-    /* TODO only grid views, should this be supported by all views? */
     if (AbstractGridView *grid_view = get_view_from_link<AbstractGridView>(*view_link)) {
       if (UI_grid_view_listen_should_redraw(reinterpret_cast<uiGridViewHandle *>(grid_view),
                                             listener_params->notifier)) {
-        ED_region_tag_redraw(listener_params->region);
+        ED_region_tag_redraw(region);
+      }
+    }
+    else if (AbstractTreeView *tree_view = get_view_from_link<AbstractTreeView>(*view_link)) {
+      if (UI_tree_view_listen_should_redraw(reinterpret_cast<uiTreeViewHandle *>(tree_view),
+                                            listener_params->notifier)) {
+        ED_region_tag_redraw(region);
       }
     }
   }
diff --git a/source/blender/editors/interface/tree_view.cc b/source/blender/editors/interface/tree_view.cc
index 3010aaba5a3..7ab169f15f8 100644
--- a/source/blender/editors/interface/tree_view.cc
+++ b/source/blender/editors/interface/tree_view.cc
@@ -82,6 +82,12 @@ void AbstractTreeView::foreach_item(ItemIterFn iter_fn, IterOptions options) con
   foreach_item_recursive(iter_fn, options);
 }
 
+bool AbstractTreeView::listen(const wmNotifier &) const
+{
+  /* Nothing by default. */
+  return false;
+}
+
 bool AbstractTreeView::is_renaming() const
 {
   return rename_buffer_ != nullptr;
@@ -819,6 +825,13 @@ class TreeViewItemAPIWrapper {
 
 using namespace blender::ui;
 
+bool UI_tree_view_listen_should_redraw(const uiTreeViewHandle *view_handle,
+                                       const wmNotifier *notifier)
+{
+  const AbstractTreeView &view = *reinterpret_cast<const AbstractTreeView *>(view_handle);
+  return view.listen(*notifier);
+}
+
 bool UI_tree_view_item_is_active(const uiTreeViewItemHandle *item_handle)
 {
   const AbstractTreeViewItem &item = reinterpret_cast<const AbstractTreeViewItem &>(*item_handle);
diff --git a/source/blender/editors/space_assets/asset_browser_intern.hh b/source/blender/editors/space_assets/asset_browser_intern.hh
index fdcea02d71c..3a56284a70c 100644
--- a/source/blender/editors/space_assets/asset_browser_intern.hh
+++ b/source/blender/editors/space_assets/asset_browser_intern.hh
@@ -26,13 +26,17 @@ struct ARegion;
 struct ARegionType;
 struct AssetLibrary;
 struct bContext;
-struct SpaceAssets;
+struct PointerRNA;
+struct PropertyRNA;
 struct uiLayout;
+struct wmMsgBus;
 
 void asset_browser_main_region_draw(const bContext *C, ARegion *region);
 
 void asset_browser_navigation_region_panels_register(ARegionType *art);
 
-void asset_brower_create_catalog_tree_view_in_layout(::AssetLibrary *asset_library,
-                                                     uiLayout *layout,
-                                                     SpaceAssets *assets_space);
+void asset_view_create_catalog_tree_view_in_layout(::AssetLibrary *asset_library,
+                                                   uiLayout *layout,
+                                                   PointerRNA *catalog_filter_owner_ptr,
+                                                   PropertyRNA *catalog_filter_prop,
+                                                   wmMsgBus *msg_bus);
diff --git a/source/blender/editors/space_assets/asset_browser_panels.cc b/source/blender/editors/space_assets/asset_browser_panels.cc
index 12d30be404e..6340bfb1fd4 100644
--- a/source/blender/editors/space_assets/asset_browser_panels.cc
+++ b/source/blender/editors/space_assets/asset_browser_panels.cc
@@ -74,7 +74,10 @@ static void assets_panel_asset_catalog_buttons_draw(const bContext *C, Panel *pa
   uiItemS(col);
 
   AssetLibrary *library = ED_assetlist_library_get(&assets_space->asset_library_ref);
-  asset_brower_create_catalog_tree_view_in_layout(library, col, assets_space);
+  PropertyRNA *catalog_filter_prop = RNA_struct_find_property(&assets_space_ptr, "catalog_filter");
+
+  asset_view_create_catalog_tree_view_in_layout(
+      library, col, &assets_space_ptr, catalog_filter_prop, CTX_wm_message_bus(C));
 }
 
 void asset_browser_navigation_region_panels_register(ARegionType *art)
diff --git a/source/blender/editors/space_assets/asset_catalog_tree_view.cc b/source/blender/editors/space_assets/asset_catalog_tree_view.cc
index 1371d177c45..1af1f16cb10 100644
--- a/source/blender/editors/space_assets/asset_catalog_tree_view.cc
+++ b/source/blender/editors/space_assets/asset_catalog_tree_view.cc
@@ -42,6 +42,7 @@
 #include "UI_tree_view.hh"
 
 #include "WM_api.h"
+#include "WM_message.h"
 #include "WM_types.h"
 
 #include "asset_browser_intern.hh"
@@ -54,19 +55,29 @@ namespace blender::ed::asset_browser {
 class AssetCatalogTreeViewAllItem;
 
 class AssetCatalogTreeView : public ui::AbstractTreeView {
+  /** The asset library this catalog tree comes from. May be null when drawing the catalog tree
+   * before the library was read. */
   ::AssetLibrary *asset_library_;
   /** The asset catalog tree this tree-view represents. */
   bke::AssetCatalogTree *catalog_tree_;
-  AssetCatalogFilterSettings &catalog_filter_;
+
+  PointerRNA catalog_filter_owner_;
+  PropertyRNA &catalog_filter_prop_;
+  /** Used to notify the parts of the UI that display the filtered assets. */
+  wmMsgBus *msg_bus_;
 
   friend class AssetCatalogTreeViewItem;
   friend class AssetCatalogDropController;
   friend class AssetCatalogTreeViewAllItem;
 
  public:
-  AssetCatalogTreeView(::AssetLibrary *library, AssetCatalogFilterSettings *catalog_filter);
+  AssetCatalogTreeView(::AssetLibrary *library,
+                       const PointerRNA &catalog_filter_owner,
+                       PropertyRNA &catalog_filter_prop,
+                       wmMsgBus *msg_bus);
 
   void build_tree() override;
+  bool listen(const wmNotifier &notifier) const override;
 
   void activate_catalog_by_id(CatalogID catalog_id);
 
@@ -77,6 +88,11 @@ class AssetCatalogTreeView : public ui::AbstractTreeView {
   AssetCatalogTreeViewAllItem &add_all_item();
   void add_unassigned_item();
   bool is_active_catalog(CatalogID catalog_id) const;
+
+  AssetCatalogFilterSettings &catalog_filter_settings() const;
+  void notify_catalog_filter_change();
+  void notify_catalog_tree_change();
+  void notify_catalog_assignments_change();
 };
 
 /* ---------------------------------------------------------------------- */
@@ -129,7 +145,7 @@ class AssetCatalogDropController : public ui::AbstractTreeViewItemDropController
   static AssetCatalog *get_drag_catalog(const wmDrag &drag, const ::AssetLibrary &asset_library);
   static bool has_droppable_asset(const wmDrag &drag, const char **r_disabled_hint);
   static bool drop_assets_into_catalog(struct bContext *C,
-                                       const AssetCatalogTreeView &tree_view,
+                                       AssetCatalogTreeView &tree_view,
                                        const wmDrag &drag,
                           

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list