diff options
author | Hans Goudey <h.goudey@me.com> | 2022-10-17 23:28:43 +0300 |
---|---|---|
committer | Hans Goudey <h.goudey@me.com> | 2022-10-17 23:28:43 +0300 |
commit | 525a0319358a3cbf78f8eebfc2c2bfb6aa27b404 (patch) | |
tree | 676ad1f73bf6fc958bd4cb2c9e80017a79d2bf74 | |
parent | b280dce0a489720fb86820666317506c5fba50cd (diff) |
Add "Is Loading" label for the first time the menu is openednode-add-asset-menu
-rw-r--r-- | source/blender/editors/asset/ED_asset_list.h | 1 | ||||
-rw-r--r-- | source/blender/editors/asset/intern/asset_list.cc | 12 | ||||
-rw-r--r-- | source/blender/editors/space_node/add_menu_assets.cc | 69 |
3 files changed, 49 insertions, 33 deletions
diff --git a/source/blender/editors/asset/ED_asset_list.h b/source/blender/editors/asset/ED_asset_list.h index b54f81004f2..3d2aaa3bda1 100644 --- a/source/blender/editors/asset/ED_asset_list.h +++ b/source/blender/editors/asset/ED_asset_list.h @@ -23,6 +23,7 @@ struct wmNotifier; */ void ED_assetlist_storage_fetch(const struct AssetLibraryReference *library_reference, const struct bContext *C); +bool ED_assetlist_is_loaded(const struct AssetLibraryReference *library_reference); void ED_assetlist_ensure_previews_job(const struct AssetLibraryReference *library_reference, const struct bContext *C); void ED_assetlist_clear(const struct AssetLibraryReference *library_reference, struct bContext *C); diff --git a/source/blender/editors/asset/intern/asset_list.cc b/source/blender/editors/asset/intern/asset_list.cc index 7fdb924d769..01a6dc46c48 100644 --- a/source/blender/editors/asset/intern/asset_list.cc +++ b/source/blender/editors/asset/intern/asset_list.cc @@ -422,6 +422,18 @@ void ED_assetlist_storage_fetch(const AssetLibraryReference *library_reference, AssetListStorage::fetch_library(*library_reference, *C); } +bool ED_assetlist_is_loaded(const AssetLibraryReference *library_reference) +{ + AssetList *list = AssetListStorage::lookup_list(*library_reference); + if (!list) { + return false; + } + if (list->needsRefetch()) { + return false; + } + return true; +} + void ED_assetlist_ensure_previews_job(const AssetLibraryReference *library_reference, const bContext *C) { diff --git a/source/blender/editors/space_node/add_menu_assets.cc b/source/blender/editors/space_node/add_menu_assets.cc index 5d4b198eda6..1cba47c8d26 100644 --- a/source/blender/editors/space_node/add_menu_assets.cc +++ b/source/blender/editors/space_node/add_menu_assets.cc @@ -11,11 +11,12 @@ #include "BKE_idprop.h" #include "BKE_screen.h" +#include "BLT_translation.h" + #include "RNA_access.h" #include "RNA_prototypes.h" #include "ED_asset.h" -#include "ED_screen.h" #include "node_intern.hh" @@ -42,23 +43,21 @@ struct AssetItemTree { Map<const bke::AssetCatalogTreeItem *, bke::AssetCatalogPath> full_catalog_per_tree_item; }; -static void search_listen_fn(const wmRegionListenerParams *params) +static bool all_loading_finished() { - const wmNotifier *wmn = params->notifier; - - switch (wmn->category) { - case NC_ASSET: - if (wmn->data == ND_ASSET_LIST_READING) { - std::cout << "TAGGING FOR REDRAW\n"; - ED_region_tag_redraw(params->region); - ED_region_tag_refresh_ui(params->region); - } - break; + for (const AssetLibraryReference &library : bke::all_asset_library_refs()) { + if (!ED_assetlist_is_loaded(&library)) { + return false; + } } + return true; } -static AssetItemTree build_catalog_tree(const bContext &C, const bNodeTree &node_tree) +static AssetItemTree build_catalog_tree(const bContext &C, const bNodeTree *node_tree) { + if (!node_tree) { + return {}; + } const Main &bmain = *CTX_data_main(&C); const Vector<AssetLibraryReference> all_libraries = bke::all_asset_library_refs(); @@ -94,7 +93,7 @@ static AssetItemTree build_catalog_tree(const bContext &C, const bNodeTree &node } const AssetMetaData &meta_data = *ED_asset_handle_get_metadata(&asset); const IDProperty *tree_type = BKE_asset_metadata_idprop_find(&meta_data, "type"); - if (tree_type == nullptr || IDP_Int(tree_type) != node_tree.type) { + if (tree_type == nullptr || IDP_Int(tree_type) != node_tree->type) { return true; } if (BLI_uuid_is_nil(meta_data.catalog_id)) { @@ -163,49 +162,53 @@ static void node_add_catalog_assets_draw(const bContext *C, Menu *menu) uiItemS(layout); for (const LibraryAsset &item : asset_items) { - uiLayout *row = uiLayoutColumn(layout, false); + uiLayout *col = uiLayoutColumn(layout, false); PointerRNA file{ &screen.id, &RNA_FileSelectEntry, const_cast<FileDirEntry *>(item.handle.file_data)}; - uiLayoutSetContextPointer(row, "active_file", &file); + uiLayoutSetContextPointer(col, "active_file", &file); PointerRNA library_ptr{&screen.id, &RNA_AssetLibraryReference, const_cast<AssetLibraryReference *>(&item.library_ref)}; - uiLayoutSetContextPointer(row, "asset_library_ref", &library_ptr); + uiLayoutSetContextPointer(col, "asset_library_ref", &library_ptr); - uiItemO(row, ED_asset_handle_get_name(&item.handle), ICON_NONE, "NODE_OT_add_group_asset"); + uiItemO(col, ED_asset_handle_get_name(&item.handle), ICON_NONE, "NODE_OT_add_group_asset"); } catalog_item->foreach_child([&](bke::AssetCatalogTreeItem &child_item) { const bke::AssetCatalogPath &path = tree.full_catalog_per_tree_item.lookup(&child_item); PointerRNA path_ptr{ &screen.id, &RNA_AssetCatalogPath, const_cast<bke::AssetCatalogPath *>(&path)}; - uiLayout *row = uiLayoutColumn(layout, false); - uiLayoutSetContextPointer(row, "asset_catalog_path", &path_ptr); - uiItemM(row, "NODE_MT_node_add_catalog_assets", path.name().c_str(), ICON_NONE); + uiLayout *col = uiLayoutColumn(layout, false); + uiLayoutSetContextPointer(col, "asset_catalog_path", &path_ptr); + uiItemM(col, "NODE_MT_node_add_catalog_assets", path.name().c_str(), ICON_NONE); }); } static void add_root_catalogs_draw(const bContext *C, Menu *menu) { - std::cout << __func__ << '\n'; bScreen &screen = *CTX_wm_screen(C); SpaceNode &snode = *CTX_wm_space_node(C); const bNodeTree *edit_tree = snode.edittree; - ARegion *region = CTX_wm_region(C); - region->type->listener = search_listen_fn; + uiLayout *layout = menu->layout; snode.runtime->assets_for_menu.reset(); snode.runtime->assets_for_menu = std::make_shared<AssetItemTree>( - build_catalog_tree(*C, *edit_tree)); + build_catalog_tree(*C, edit_tree)); + + const bool loading_finished = all_loading_finished(); + AssetItemTree &tree = *snode.runtime->assets_for_menu; - if (tree.catalogs.is_empty()) { + if (tree.catalogs.is_empty() && loading_finished) { return; } - uiLayout *layout = menu->layout; uiItemS(layout); + if (!loading_finished) { + uiItemL(layout, IFACE_("Loading Asset Libraries"), ICON_INFO); + } + /* Avoid adding a separate root catalog when the assets have already been added to one of the * builtin menus. * TODO: The need to define the builtin menu labels here is completely non-ideal. We don't have @@ -247,9 +250,9 @@ static void add_root_catalogs_draw(const bContext *C, Menu *menu) const bke::AssetCatalogPath &path = tree.full_catalog_per_tree_item.lookup(&item); PointerRNA path_ptr{ &screen.id, &RNA_AssetCatalogPath, const_cast<bke::AssetCatalogPath *>(&path)}; - uiLayout *row = uiLayoutColumn(layout, false); - uiLayoutSetContextPointer(row, "asset_catalog_path", &path_ptr); - uiItemM(row, "NODE_MT_node_add_catalog_assets", path.name().c_str(), ICON_NONE); + uiLayout *col = uiLayoutColumn(layout, false); + uiLayoutSetContextPointer(col, "asset_catalog_path", &path_ptr); + uiItemM(col, "NODE_MT_node_add_catalog_assets", path.name().c_str(), ICON_NONE); }); } @@ -289,7 +292,7 @@ void uiTemplateNodeAssetMenuItems(uiLayout *layout, bContext *C, const char *cat PointerRNA path_ptr{ &screen.id, &RNA_AssetCatalogPath, const_cast<bke::AssetCatalogPath *>(&path)}; uiItemS(layout); - uiLayout *row = uiLayoutColumn(layout, false); - uiLayoutSetContextPointer(row, "asset_catalog_path", &path_ptr); - uiItemMContents(row, "NODE_MT_node_add_catalog_assets"); + uiLayout *col = uiLayoutColumn(layout, false); + uiLayoutSetContextPointer(col, "asset_catalog_path", &path_ptr); + uiItemMContents(col, "NODE_MT_node_add_catalog_assets"); } |