[Bf-blender-cvs] [073ad01a4bb] asset-browser: Show UIList with asset tags in Asset Browser sidebar

Julian Eisel noreply at git.blender.org
Fri Nov 20 01:27:43 CET 2020


Commit: 073ad01a4bb87c7498397b2ae2ea44d240651316
Author: Julian Eisel
Date:   Fri Nov 20 01:25:53 2020 +0100
Branches: asset-browser
https://developer.blender.org/rB073ad01a4bb87c7498397b2ae2ea44d240651316

Show UIList with asset tags in Asset Browser sidebar

Tags can still only be edited from Python. Operators and buttons still have to
be added.
Also, tags aren't read for other files yet, so the tag list is only shown for
the "Current File".

===================================================================

M	release/scripts/startup/bl_ui/space_filebrowser.py
M	source/blender/editors/space_file/filelist.c
M	source/blender/makesdna/DNA_asset_types.h
M	source/blender/makesdna/DNA_space_types.h
M	source/blender/makesrna/intern/rna_asset.c
M	source/blender/makesrna/intern/rna_space.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/space_filebrowser.py b/release/scripts/startup/bl_ui/space_filebrowser.py
index 9df46d388c7..f036ee08bfa 100644
--- a/release/scripts/startup/bl_ui/space_filebrowser.py
+++ b/release/scripts/startup/bl_ui/space_filebrowser.py
@@ -569,6 +569,39 @@ class ASSETBROWSER_PT_metadata(Panel):
 
         if active_file:
             layout.label(text=active_file.name)
+        else:
+            layout.label(text="No asset selected.")
+
+
+class ASSETBROWSER_PT_metadata_tags(Panel):
+    bl_space_type = 'FILE_BROWSER'
+    bl_region_type = 'TOOL_PROPS'
+    bl_label = "Asset Tags"
+
+    @classmethod
+    def poll(cls, context):
+        active_file = context.active_file
+        return panel_poll_is_asset_browsing(context) and active_file and active_file.asset_data
+
+    def draw(self, context):
+        layout = self.layout
+        active_file = context.active_file
+        asset_data = active_file.asset_data
+
+        layout.template_list("ASSETBROWSER_UL_metadata_tags", "asset_tags", asset_data, "tags",
+                             asset_data, "active_tag", rows=4)
+
+
+class ASSETBROWSER_UL_metadata_tags(UIList):
+    def draw_item(self, _context, layout, _data, item, icon, _active_data, _active_propname, _index):
+        tag = item
+
+        row = layout.row(align=True)
+        # Non-editable entries would show grayed-out, which is bad in this specific case, so switch to mere label.
+        if tag.is_property_readonly("name"):
+            row.label(text=tag.name, icon_value=icon)
+        else:
+            row.prop(tag, "name", text="", emboss=False, icon_value=icon)
 
 
 classes = (
@@ -589,6 +622,8 @@ classes = (
     FILEBROWSER_MT_select,
     FILEBROWSER_MT_context_menu,
     ASSETBROWSER_PT_metadata,
+    ASSETBROWSER_PT_metadata_tags,
+    ASSETBROWSER_UL_metadata_tags,
 )
 
 if __name__ == "__main__":  # only for live edit.
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index dab46e04d26..cb2370b6cf6 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -279,6 +279,8 @@ typedef struct FileListInternEntry {
    * preview reading from disk. Non-owning pointer. */
   PreviewImage *preview_image;
 
+  AssetData *asset_data;
+
   /** Defined in BLI_fileops.h */
   eFileAttributes attributes;
   BLI_stat_t st;
@@ -1906,6 +1908,7 @@ static FileDirEntry *filelist_file_create_entry(FileList *filelist, const int in
   if (entry->redirection_path) {
     ret->redirection_path = BLI_strdup(entry->redirection_path);
   }
+  ret->asset_data = entry->asset_data;
   ret->id_uuid = entry->id_uuid;
   /* For some file types the preview is already available. */
   if (entry->preview_image &&
@@ -3225,6 +3228,7 @@ static void filelist_readjob_main_assets(Main *current_main,
         (uint32_t *)filelist->filelist_intern.curr_uuid, 1);
     entry->preview_image = BKE_assetdata_preview_get_from_id(id_iter->asset_data, id_iter);
     entry->id_uuid = id_iter->session_uuid;
+    entry->asset_data = id_iter->asset_data;
     nbr_entries++;
     BLI_addtail(&tmp_entries, entry);
   }
diff --git a/source/blender/makesdna/DNA_asset_types.h b/source/blender/makesdna/DNA_asset_types.h
index 70097369564..3a1e2f035e2 100644
--- a/source/blender/makesdna/DNA_asset_types.h
+++ b/source/blender/makesdna/DNA_asset_types.h
@@ -59,6 +59,9 @@ typedef struct AssetData {
    * function exactly (e.g. how they are registered to provide a list of searchable available tags)
    * is up to the asset-engine. */
   ListBase tags; /* CustomTag */
+  short active_tag;
+
+  char _pad[6];
 } AssetData;
 
 #endif /* __DNA_ASSET_TYPES_H__ */
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index ab17f5537a1..05a6cae2538 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -1074,6 +1074,8 @@ typedef struct FileDirEntry {
   /** ID type, in case typeflag has FILE_TYPE_BLENDERLIB set. */
   int blentype;
 
+  struct AssetData *asset_data;
+
   /* Path to item that is relative to current folder root. */
   char *relpath;
   /** Optional argument for shortcuts, aliases etc. */
diff --git a/source/blender/makesrna/intern/rna_asset.c b/source/blender/makesrna/intern/rna_asset.c
index 32725739cde..decb0b23613 100644
--- a/source/blender/makesrna/intern/rna_asset.c
+++ b/source/blender/makesrna/intern/rna_asset.c
@@ -32,6 +32,8 @@
 
 #  include "BKE_asset.h"
 
+#  include "BLI_listbase.h"
+
 #  include "RNA_access.h"
 
 static CustomTag *rna_AssetData_tag_new(AssetData *asset_data,
@@ -97,6 +99,14 @@ static void rna_AssetData_description_set(PointerRNA *ptr, const char *value)
   }
 }
 
+static void rna_AssetData_active_tag_range(
+    PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
+{
+  const AssetData *asset_data = ptr->data;
+  *min = *softmin = 0;
+  *max = *softmax = BLI_listbase_count(&asset_data->tags) - 1;
+}
+
 #else
 
 static void rna_def_custom_tag(BlenderRNA *brna)
@@ -173,6 +183,10 @@ static void rna_def_asset_data(BlenderRNA *brna)
                            "Custom tags (name tokens) for the asset, used for filtering and "
                            "general asset management");
   rna_def_asset_custom_tags_api(brna, prop);
+
+  prop = RNA_def_property(srna, "active_tag", PROP_INT, PROP_NONE);
+  RNA_def_property_int_funcs(prop, NULL, NULL, "rna_AssetData_active_tag_range");
+  RNA_def_property_ui_text(prop, "Active Tag", "Index of the tag set for editing");
 }
 
 void RNA_def_asset(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index b20dba0c86d..8e80130a377 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -2543,6 +2543,12 @@ static int rna_FileBrowser_FileSelectEntry_name_length(PointerRNA *ptr)
   return (int)strlen(entry->name);
 }
 
+static PointerRNA rna_FileBrowser_FileSelectEntry_asset_data_get(PointerRNA *ptr)
+{
+  const FileDirEntry *entry = ptr->data;
+  return rna_pointer_inherit_refine(ptr, &RNA_AssetData, entry->asset_data);
+}
+
 static void rna_FileSelectParams_asset_category_set(PointerRNA *ptr, uint64_t value)
 {
   FileSelectParams *params = ptr->data;
@@ -5897,6 +5903,13 @@ static void rna_def_fileselect_entry(BlenderRNA *brna)
   RNA_def_property_ui_text(prop, "Name", "");
   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
   RNA_def_struct_name_property(srna, prop);
+
+  prop = RNA_def_property(srna, "asset_data", PROP_POINTER, PROP_NONE);
+  RNA_def_property_struct_type(prop, "AssetData");
+  RNA_def_property_pointer_funcs(
+      prop, "rna_FileBrowser_FileSelectEntry_asset_data_get", NULL, NULL, NULL);
+  RNA_def_property_ui_text(
+      prop, "Asset Data", "Asset data, valid if the file represents an asset");
 }
 
 static void rna_def_fileselect_params(BlenderRNA *brna)



More information about the Bf-blender-cvs mailing list