From 395f2791666b3dc32cd5f090ca0a105cf2eeefdd Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 26 Sep 2023 16:38:50 +0200 Subject: [PATCH] Fix: Missing node asset menu updates after mark asset Use of node group assets relies on a few properties written to asset meta-data for proper filtering of assets in menus (add modifier menu, node add menu, 3D view menus for tools). Currently these meta-data properties are written when updating their source properties and when saving the file. That means they *aren't* written when marking a group as an asset, which is necessary because the meta-data doesn't exist before when the group isn't an asset. Currently users have to save the file to update menus in this case, which isn't intuitive. As a fix, call the function to write the meta-data when marking a data-block as an asset. Pull Request: https://projects.blender.org/blender/blender/pulls/112743 --- source/blender/blenkernel/BKE_asset.h | 2 ++ source/blender/blenkernel/intern/action.cc | 5 +++-- source/blender/blenkernel/intern/node.cc | 6 ++++++ source/blender/blenkernel/intern/object.cc | 5 +++-- source/blender/editors/asset/intern/asset_mark_clear.cc | 1 + source/blender/editors/space_view3d/space_view3d.cc | 5 +++++ 6 files changed, 20 insertions(+), 4 deletions(-) diff --git a/source/blender/blenkernel/BKE_asset.h b/source/blender/blenkernel/BKE_asset.h index 1ea9cfee925..4a930a2e62a 100644 --- a/source/blender/blenkernel/BKE_asset.h +++ b/source/blender/blenkernel/BKE_asset.h @@ -26,6 +26,7 @@ struct IDProperty; struct PreviewImage; typedef void (*PreSaveFn)(void *asset_ptr, struct AssetMetaData *asset_data); +typedef void (*OnMarkAssetFn)(void *asset_ptr, struct AssetMetaData *asset_data); typedef struct AssetTypeInfo { /** @@ -33,6 +34,7 @@ typedef struct AssetTypeInfo { * saved. */ PreSaveFn pre_save_fn; + OnMarkAssetFn on_mark_asset_fn; } AssetTypeInfo; struct AssetMetaData *BKE_asset_metadata_create(void); diff --git a/source/blender/blenkernel/intern/action.cc b/source/blender/blenkernel/intern/action.cc index 9b28e1413ae..964edb396b5 100644 --- a/source/blender/blenkernel/intern/action.cc +++ b/source/blender/blenkernel/intern/action.cc @@ -250,7 +250,7 @@ static IDProperty *action_asset_type_property(const bAction *action) return property; } -static void action_asset_pre_save(void *asset_ptr, AssetMetaData *asset_data) +static void action_asset_metadata_ensure(void *asset_ptr, AssetMetaData *asset_data) { bAction *action = (bAction *)asset_ptr; BLI_assert(GS(action->id.name) == ID_AC); @@ -260,7 +260,8 @@ static void action_asset_pre_save(void *asset_ptr, AssetMetaData *asset_data) } static AssetTypeInfo AssetType_AC = { - /*pre_save_fn*/ action_asset_pre_save, + /*pre_save_fn*/ action_asset_metadata_ensure, + /*on_mark_asset_fn*/ action_asset_metadata_ensure, }; IDTypeInfo IDType_ID_AC = { diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index 68f22e37e2f..45115febc2b 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -1127,10 +1127,16 @@ static void node_tree_asset_pre_save(void *asset_ptr, AssetMetaData * /*asset_da node_update_asset_metadata(*static_cast(asset_ptr)); } +static void node_tree_asset_on_mark_asset(void *asset_ptr, AssetMetaData * /*asset_data*/) +{ + node_update_asset_metadata(*static_cast(asset_ptr)); +} + } // namespace blender::bke static AssetTypeInfo AssetType_NT = { /*pre_save_fn*/ blender::bke::node_tree_asset_pre_save, + /*on_mark_asset_fn*/ blender::bke::node_tree_asset_on_mark_asset, }; IDTypeInfo IDType_ID_NT = { diff --git a/source/blender/blenkernel/intern/object.cc b/source/blender/blenkernel/intern/object.cc index e13108f20ef..8b739e0a96d 100644 --- a/source/blender/blenkernel/intern/object.cc +++ b/source/blender/blenkernel/intern/object.cc @@ -1032,7 +1032,7 @@ static IDProperty *object_asset_dimensions_property(Object *ob) return property; } -static void object_asset_pre_save(void *asset_ptr, AssetMetaData *asset_data) +static void object_asset_metadata_ensure(void *asset_ptr, AssetMetaData *asset_data) { Object *ob = (Object *)asset_ptr; BLI_assert(GS(ob->id.name) == ID_OB); @@ -1045,7 +1045,8 @@ static void object_asset_pre_save(void *asset_ptr, AssetMetaData *asset_data) } static AssetTypeInfo AssetType_OB = { - /*pre_save_fn*/ object_asset_pre_save, + /*pre_save_fn*/ object_asset_metadata_ensure, + /*on_mark_asset_fn*/ object_asset_metadata_ensure, }; IDTypeInfo IDType_ID_OB = { diff --git a/source/blender/editors/asset/intern/asset_mark_clear.cc b/source/blender/editors/asset/intern/asset_mark_clear.cc index e98e2c7c0d0..df1b668144a 100644 --- a/source/blender/editors/asset/intern/asset_mark_clear.cc +++ b/source/blender/editors/asset/intern/asset_mark_clear.cc @@ -44,6 +44,7 @@ bool ED_asset_mark_id(ID *id) const IDTypeInfo *id_type_info = BKE_idtype_get_info_from_id(id); id->asset_data = BKE_asset_metadata_create(); id->asset_data->local_type_info = id_type_info->asset_type_info; + id->asset_data->local_type_info->on_mark_asset_fn(id, id->asset_data); /* Important for asset storage to update properly! */ ED_assetlist_storage_tag_main_data_dirty(); diff --git a/source/blender/editors/space_view3d/space_view3d.cc b/source/blender/editors/space_view3d/space_view3d.cc index cbd13f9fc37..893b05f191d 100644 --- a/source/blender/editors/space_view3d/space_view3d.cc +++ b/source/blender/editors/space_view3d/space_view3d.cc @@ -1626,6 +1626,11 @@ static void view3d_header_region_listener(const wmRegionListenerParams *params) blender::ed::geometry::clear_operator_asset_trees(); ED_region_tag_redraw(region); break; + default: + if (ELEM(wmn->action, NA_ADDED, NA_REMOVED)) { + blender::ed::geometry::clear_operator_asset_trees(); + ED_region_tag_redraw(region); + } } break; case NC_NODE: