Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Goudey <h.goudey@me.com>2022-10-17 23:28:43 +0300
committerHans Goudey <h.goudey@me.com>2022-10-17 23:28:43 +0300
commit525a0319358a3cbf78f8eebfc2c2bfb6aa27b404 (patch)
tree676ad1f73bf6fc958bd4cb2c9e80017a79d2bf74
parentb280dce0a489720fb86820666317506c5fba50cd (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.h1
-rw-r--r--source/blender/editors/asset/intern/asset_list.cc12
-rw-r--r--source/blender/editors/space_node/add_menu_assets.cc69
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");
}