[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 ¬ifier) 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 ¬ifier) 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