Get filtering by asset catalog to work
This commit is contained in:
parent
d5c60f912f
commit
56582fbf82
|
@ -34,18 +34,16 @@
|
|||
|
||||
using namespace blender;
|
||||
|
||||
static void asset_shelf_send_redraw_notifier(bContext &C)
|
||||
{
|
||||
WM_event_add_notifier(&C, NC_SPACE | ND_SPACE_ASSET_SHELF, nullptr);
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Asset Shelf Regions
|
||||
* \{ */
|
||||
|
||||
void ED_asset_shelf_region_listen(const wmRegionListenerParams *params)
|
||||
{
|
||||
if (ED_assetlist_listen(params->notifier)) {
|
||||
ED_region_tag_redraw_no_rebuild(params->region);
|
||||
}
|
||||
}
|
||||
|
||||
void ED_asset_shelf_footer_region_listen(const wmRegionListenerParams *params)
|
||||
static void asset_shelf_region_listen(const wmRegionListenerParams *params)
|
||||
{
|
||||
ARegion *region = params->region;
|
||||
const wmNotifier *wmn = params->notifier;
|
||||
|
@ -59,6 +57,22 @@ void ED_asset_shelf_footer_region_listen(const wmRegionListenerParams *params)
|
|||
}
|
||||
}
|
||||
|
||||
void ED_asset_shelf_region_listen(const wmRegionListenerParams *params)
|
||||
{
|
||||
if (ED_assetlist_listen(params->notifier)) {
|
||||
ED_region_tag_redraw_no_rebuild(params->region);
|
||||
}
|
||||
/* If the asset list didn't catch the notifier, let the region itself listen. */
|
||||
else {
|
||||
asset_shelf_region_listen(params);
|
||||
}
|
||||
}
|
||||
|
||||
void ED_asset_shelf_footer_region_listen(const wmRegionListenerParams *params)
|
||||
{
|
||||
asset_shelf_region_listen(params);
|
||||
}
|
||||
|
||||
void ED_asset_shelf_footer_region_init(wmWindowManager * /*wm*/, ARegion *region)
|
||||
{
|
||||
ED_region_header_init(region);
|
||||
|
@ -265,7 +279,7 @@ class AssetCatalogSelectorTree : public ui::AbstractTreeView {
|
|||
return view_item;
|
||||
}
|
||||
|
||||
void update_shelf_settings_from_enabled_catalogs(const bContext *C);
|
||||
void update_shelf_settings_from_enabled_catalogs();
|
||||
|
||||
class Item : public ui::BasicTreeViewItem {
|
||||
asset_system::AssetCatalogTreeItem catalog_item_;
|
||||
|
@ -294,6 +308,7 @@ class AssetCatalogSelectorTree : public ui::AbstractTreeView {
|
|||
|
||||
void build_row(uiLayout &row) override
|
||||
{
|
||||
AssetCatalogSelectorTree &tree = dynamic_cast<AssetCatalogSelectorTree &>(get_tree_view());
|
||||
uiBlock *block = uiLayoutGetBlock(&row);
|
||||
|
||||
uiLayoutSetEmboss(&row, UI_EMBOSS);
|
||||
|
@ -316,29 +331,23 @@ class AssetCatalogSelectorTree : public ui::AbstractTreeView {
|
|||
0,
|
||||
0,
|
||||
TIP_("Toggle catalog visibility in the asset shelf"));
|
||||
UI_but_func_set(
|
||||
but,
|
||||
[](bContext *C, void *selector_tree_ptr, void *) {
|
||||
AssetCatalogSelectorTree &selector_tree = *static_cast<AssetCatalogSelectorTree *>(
|
||||
selector_tree_ptr);
|
||||
selector_tree.update_shelf_settings_from_enabled_catalogs(C);
|
||||
},
|
||||
&dynamic_cast<AssetCatalogSelectorTree &>(get_tree_view()),
|
||||
nullptr);
|
||||
UI_but_func_set(but, [&tree](bContext &C) {
|
||||
tree.update_shelf_settings_from_enabled_catalogs();
|
||||
asset_shelf_send_redraw_notifier(C);
|
||||
});
|
||||
UI_but_flag_disable(but, UI_BUT_UNDO);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
void AssetCatalogSelectorTree::update_shelf_settings_from_enabled_catalogs(const bContext *C)
|
||||
void AssetCatalogSelectorTree::update_shelf_settings_from_enabled_catalogs()
|
||||
{
|
||||
asset_shelf_settings_clear_enabled_catalogs(shelf_settings_);
|
||||
foreach_item([C, this](ui::AbstractTreeViewItem &view_item) {
|
||||
foreach_item([this](ui::AbstractTreeViewItem &view_item) {
|
||||
const auto &selector_tree_item = dynamic_cast<AssetCatalogSelectorTree::Item &>(view_item);
|
||||
if (selector_tree_item.is_catalog_path_enabled()) {
|
||||
asset_shelf_settings_set_catalog_path_enabled(shelf_settings_,
|
||||
selector_tree_item.catalog_path());
|
||||
WM_event_add_notifier(C, NC_SPACE | ND_SPACE_ASSET_SHELF, nullptr);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -420,8 +429,9 @@ static void add_catalog_toggle_buttons(AssetShelfSettings &shelf_settings, uiLay
|
|||
"Enable catalog, making contained assets visible in the asset shelf");
|
||||
|
||||
UI_but_drawflag_enable(but, UI_BUT_ALIGN_TOP);
|
||||
UI_but_func_set(but, [&shelf_settings, path](bContext &) {
|
||||
UI_but_func_set(but, [&shelf_settings, path](bContext &C) {
|
||||
asset_shelf_settings_set_active_catalog(shelf_settings, path);
|
||||
asset_shelf_send_redraw_notifier(C);
|
||||
});
|
||||
UI_but_func_pushed_state_set(but, [&shelf_settings, path](const uiBut &) -> bool {
|
||||
return asset_shelf_settings_is_active_catalog(shelf_settings, path);
|
||||
|
|
|
@ -4,8 +4,11 @@
|
|||
* \ingroup edinterface
|
||||
*/
|
||||
|
||||
#include "AS_asset_library.hh"
|
||||
|
||||
#include "BKE_context.h"
|
||||
|
||||
#include "DNA_screen_types.h"
|
||||
#include "DNA_space_types.h"
|
||||
|
||||
#include "ED_asset.h"
|
||||
|
@ -14,6 +17,10 @@
|
|||
#include "UI_resources.h"
|
||||
#include "interface_intern.hh"
|
||||
|
||||
#include "RNA_prototypes.h"
|
||||
|
||||
using namespace blender;
|
||||
|
||||
/* TODO copy of #asset_view_item_but_drag_set(). */
|
||||
static void asset_tile_but_drag_set(uiBut &but, AssetHandle &asset_handle)
|
||||
{
|
||||
|
@ -69,14 +76,44 @@ static void asset_tile_draw(uiLayout &layout,
|
|||
asset_tile_but_drag_set(*but, asset_handle);
|
||||
}
|
||||
|
||||
static std::optional<asset_system::AssetCatalogFilter> catalog_filter_from_shelf_settings(
|
||||
const AssetShelfSettings *shelf_settings, const asset_system::AssetLibrary *library)
|
||||
{
|
||||
if (!shelf_settings || !shelf_settings->active_catalog_path) {
|
||||
return {};
|
||||
}
|
||||
|
||||
asset_system ::AssetCatalog *active_catalog = library->catalog_service->find_catalog_by_path(
|
||||
shelf_settings->active_catalog_path);
|
||||
if (!active_catalog) {
|
||||
return {};
|
||||
}
|
||||
|
||||
return library->catalog_service->create_catalog_filter(active_catalog->catalog_id);
|
||||
}
|
||||
|
||||
void uiTemplateAssetShelf(uiLayout *layout,
|
||||
const bContext *C,
|
||||
const AssetFilterSettings *filter_settings)
|
||||
{
|
||||
const AssetLibraryReference *library_ref = CTX_wm_asset_library_ref(C);
|
||||
const PointerRNA shelf_settings_ptr = CTX_data_pointer_get_type(
|
||||
C, "asset_shelf_settings", &RNA_AssetShelfSettings);
|
||||
const AssetShelfSettings *shelf_settings = static_cast<AssetShelfSettings *>(
|
||||
shelf_settings_ptr.data);
|
||||
|
||||
ED_assetlist_storage_fetch(library_ref, C);
|
||||
ED_assetlist_ensure_previews_job(library_ref, C);
|
||||
|
||||
const asset_system::AssetLibrary *library = ED_assetlist_library_get_once_available(
|
||||
*library_ref);
|
||||
if (!library) {
|
||||
return;
|
||||
}
|
||||
|
||||
std::optional<asset_system::AssetCatalogFilter> catalog_filter =
|
||||
catalog_filter_from_shelf_settings(shelf_settings, library);
|
||||
|
||||
uiLayoutSetScaleX(layout, 1.0f);
|
||||
uiLayoutSetScaleY(layout, 1.0f);
|
||||
|
||||
|
@ -94,6 +131,11 @@ void uiTemplateAssetShelf(uiLayout *layout,
|
|||
/* Don't do anything else, but return true to continue iterating. */
|
||||
return true;
|
||||
}
|
||||
/* Filter by active catalog. */
|
||||
const AssetMetaData *asset_data = ED_asset_handle_get_metadata(&asset);
|
||||
if (catalog_filter && !catalog_filter->contains(asset_data->catalog_id)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
asset_tile_draw(*row, asset, width, height, show_names);
|
||||
return true;
|
||||
|
|
|
@ -2186,6 +2186,7 @@ void ED_spacetype_view3d()
|
|||
art->prefsizey = HEADERY * 3.5f;
|
||||
art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_VIEW2D | ED_KEYMAP_FRAMES | ED_KEYMAP_HEADER;
|
||||
art->listener = ED_asset_shelf_region_listen;
|
||||
art->context = view3d_asset_shelf_context;
|
||||
art->init = view3d_header_region_init;
|
||||
art->draw = ED_region_header;
|
||||
BLI_addhead(&st->regiontypes, art);
|
||||
|
|
Loading…
Reference in New Issue