[Bf-blender-cvs] [ef7e116fec4] override-recursive-resync: Add option to link assets on drag & drop

Julian Eisel noreply at git.blender.org
Mon Jun 14 16:35:00 CEST 2021


Commit: ef7e116fec4b72a2eea9a8103cb80152d7448488
Author: Julian Eisel
Date:   Fri Jun 11 16:35:39 2021 +0200
Branches: override-recursive-resync
https://developer.blender.org/rBef7e116fec4b72a2eea9a8103cb80152d7448488

Add option to link assets on drag & drop

Note: Linking in this case as in link vs. append. Easily confused with linking
a data-block to multiple usages (e.g. single material used by multiple
objects).

Adds a drop-down to the Asset Browser header to choose between Link and Append.
This is probably gonna be a temporary place, T54642 shows where this could be
placed eventually.

Linking support is crucial for usage of the asset browser in production
environments. It just wasn't enabled yet because a) the asset project currently
focuses on single user, not production assets, and b) because there were many
unkowns still for the workflow that have big impact on production use as well.
With the recently held asset workshop I'm more confident with enabling linking,
as design ideas relevant to production use were confirmed.

Differential Revision: https://developer.blender.org/D11536

Reviewed by: Bastien Montagne

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

M	release/scripts/startup/bl_ui/space_filebrowser.py
M	source/blender/blenloader/intern/versioning_300.c
M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/interface/interface.c
M	source/blender/editors/space_file/file_draw.c
M	source/blender/editors/space_file/filesel.c
M	source/blender/makesdna/DNA_space_types.h
M	source/blender/makesrna/intern/rna_space.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/WM_types.h
M	source/blender/windowmanager/intern/wm_dragdrop.c
M	source/blender/windowmanager/intern/wm_files_link.c

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

diff --git a/release/scripts/startup/bl_ui/space_filebrowser.py b/release/scripts/startup/bl_ui/space_filebrowser.py
index b236b2ee7cf..1ad88744b16 100644
--- a/release/scripts/startup/bl_ui/space_filebrowser.py
+++ b/release/scripts/startup/bl_ui/space_filebrowser.py
@@ -44,6 +44,10 @@ class FILEBROWSER_HT_header(Header):
 
         layout.separator_spacer()
 
+        layout.prop(params, "import_type", text="")
+
+        layout.separator_spacer()
+
         # Uses prop_with_popover() as popover() only adds the triangle icon in headers.
         layout.prop_with_popover(
             params,
diff --git a/source/blender/blenloader/intern/versioning_300.c b/source/blender/blenloader/intern/versioning_300.c
index 93e2af1b68e..268598ccc51 100644
--- a/source/blender/blenloader/intern/versioning_300.c
+++ b/source/blender/blenloader/intern/versioning_300.c
@@ -244,5 +244,20 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain)
       }
     }
     FOREACH_NODETREE_END;
+
+    if (!DNA_struct_elem_find(fd->filesdna, "FileAssetSelectParams", "int", "import_type")) {
+      LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
+        LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
+          LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
+            if (sl->spacetype == SPACE_FILE) {
+              SpaceFile *sfile = (SpaceFile *)sl;
+              if (sfile->asset_params) {
+                sfile->asset_params->import_type = FILE_ASSET_IMPORT_APPEND;
+              }
+            }
+          }
+        }
+      }
+    }
   }
 }
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 338b12f7985..1d335c500ca 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -723,6 +723,7 @@ void UI_but_drag_set_asset(uiBut *but,
                            const char *name,
                            const char *path,
                            int id_type,
+                           int import_type, /* eFileAssetImportType */
                            int icon,
                            struct ImBuf *imb,
                            float scale);
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index f6b2a6a1bc6..26ea5f8e24a 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -6144,6 +6144,7 @@ void UI_but_drag_set_asset(uiBut *but,
                            const char *name,
                            const char *path,
                            int id_type,
+                           int import_type,
                            int icon,
                            struct ImBuf *imb,
                            float scale)
@@ -6153,6 +6154,7 @@ void UI_but_drag_set_asset(uiBut *but,
   BLI_strncpy(asset_drag->name, name, sizeof(asset_drag->name));
   asset_drag->path = path;
   asset_drag->id_type = id_type;
+  asset_drag->import_type = import_type;
 
   but->dragtype = WM_DRAG_ASSET;
   ui_def_but_icon(but, icon, 0); /* no flag UI_HAS_ICON, so icon doesn't draw in button */
diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c
index 189b9b4c874..17d029f7541 100644
--- a/source/blender/editors/space_file/file_draw.c
+++ b/source/blender/editors/space_file/file_draw.c
@@ -142,7 +142,8 @@ static void draw_tile(int sx, int sy, int width, int height, int colorid, int sh
       color);
 }
 
-static void file_draw_icon(uiBlock *block,
+static void file_draw_icon(const SpaceFile *sfile,
+                           uiBlock *block,
                            const FileDirEntry *file,
                            const char *path,
                            int sx,
@@ -177,10 +178,14 @@ static void file_draw_icon(uiBlock *block,
       ImBuf *preview_image = filelist_file_getimage(file);
       char blend_path[FILE_MAX_LIBEXTRA];
       if (BLO_library_path_explode(path, blend_path, NULL, NULL)) {
+        const FileAssetSelectParams *asset_params = ED_fileselect_get_asset_params(sfile);
+        BLI_assert(asset_params != NULL);
+
         UI_but_drag_set_asset(but,
                               file->name,
                               BLI_strdup(blend_path),
                               file->blentype,
+                              asset_params->import_type,
                               icon,
                               preview_image,
                               UI_DPI_FAC);
@@ -299,7 +304,8 @@ void file_calc_previews(const bContext *C, ARegion *region)
   UI_view2d_totRect_set(v2d, sfile->layout->width, sfile->layout->height);
 }
 
-static void file_draw_preview(uiBlock *block,
+static void file_draw_preview(const SpaceFile *sfile,
+                              uiBlock *block,
                               const FileDirEntry *file,
                               const char *path,
                               int sx,
@@ -484,9 +490,19 @@ static void file_draw_preview(uiBlock *block,
     /* path is no more static, cannot give it directly to but... */
     else if (file->typeflag & FILE_TYPE_ASSET) {
       char blend_path[FILE_MAX_LIBEXTRA];
+
       if (BLO_library_path_explode(path, blend_path, NULL, NULL)) {
-        UI_but_drag_set_asset(
-            but, file->name, BLI_strdup(blend_path), file->blentype, icon, imb, scale);
+        const FileAssetSelectParams *asset_params = ED_fileselect_get_asset_params(sfile);
+        BLI_assert(asset_params != NULL);
+
+        UI_but_drag_set_asset(but,
+                              file->name,
+                              BLI_strdup(blend_path),
+                              file->blentype,
+                              asset_params->import_type,
+                              icon,
+                              imb,
+                              scale);
       }
     }
     else {
@@ -925,7 +941,8 @@ void file_draw_list(const bContext *C, ARegion *region)
         is_icon = 1;
       }
 
-      file_draw_preview(block,
+      file_draw_preview(sfile,
+                        block,
                         file,
                         path,
                         sx,
@@ -940,7 +957,8 @@ void file_draw_list(const bContext *C, ARegion *region)
                         is_link);
     }
     else {
-      file_draw_icon(block,
+      file_draw_icon(sfile,
+                     block,
                      file,
                      path,
                      sx,
diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c
index 038b9c11bca..8e3fc36aa71 100644
--- a/source/blender/editors/space_file/filesel.c
+++ b/source/blender/editors/space_file/filesel.c
@@ -120,6 +120,7 @@ static void fileselect_ensure_updated_asset_params(SpaceFile *sfile)
     asset_params->base_params.details_flags = U_default.file_space_data.details_flags;
     asset_params->asset_library.type = FILE_ASSET_LIBRARY_LOCAL;
     asset_params->asset_library.custom_library_index = -1;
+    asset_params->import_type = FILE_ASSET_IMPORT_APPEND;
   }
 
   FileSelectParams *base_params = &asset_params->base_params;
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index 9f3576a2cbe..71764d9308c 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -780,8 +780,16 @@ typedef struct FileAssetSelectParams {
   FileSelectParams base_params;
 
   FileSelectAssetLibraryUID asset_library;
+
+  short import_type; /* eFileAssetImportType */
+  char _pad[6];
 } FileAssetSelectParams;
 
+typedef enum eFileAssetImportType {
+  FILE_ASSET_IMPORT_LINK = 0,
+  FILE_ASSET_IMPORT_APPEND = 1,
+} eFileAssetImportType;
+
 /**
  * A wrapper to store previous and next folder lists (#FolderList) for a specific browse mode
  * (#eFileBrowse_Mode).
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index bb356e4b532..3cd576a9641 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -6569,6 +6569,16 @@ static void rna_def_fileselect_asset_params(BlenderRNA *brna)
       {0, NULL, 0, NULL, NULL},
   };
 
+  static const EnumPropertyItem asset_import_type_items[] = {
+      {FILE_ASSET_IMPORT_LINK, "LINK", 0, "Link", "Import the assets as linked data-block"},
+      {FILE_ASSET_IMPORT_APPEND,
+       "APPEND",
+       0,
+       "Append",
+       "Import the assets as copied data-block, with no link to the original asset data-block"},
+      {0, NULL, 0, NULL, NULL},
+  };
+
   srna = RNA_def_struct(brna, "FileAssetSelectParams", "FileSelectParams");
   RNA_def_struct_ui_text(
       srna, "Asset Select Parameters", "Settings for the file selection in Asset Browser mode");
@@ -6590,6 +6600,13 @@ static void rna_def_fileselect_asset_params(BlenderRNA *brna)
                               NULL);
   RNA_def_property_ui_text(prop, "Asset Category", "Determine which kind of assets to display");
   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
+
+  prop = RNA_def_property(srna, "import_type", PROP_ENUM, PROP_NONE);
+  RNA_def_property_enum_items(prop, asset_import_type_items);
+  RNA_def_property_ui_text(prop, "Import Type", "Determine how the asset will be imported");
+  /* Asset drag info saved by buttons stores the import type, so the space must redraw when import
+   * type changes. */
+  RNA_def_property_update(prop, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
 }
 
 static void rna_def_filemenu_entry(BlenderRNA *brna)
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index edd5b555e2f..eebd6e16dd7 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -205,6 +205,13 @@ void WM_autosave_init(struct wmWindowManager *wm);
 bool WM_recover_last_session(struct bContext *C, struct ReportList *reports);
 void WM_file_tag_modified(void);
 
+struct ID *WM_file_link_datablock(struct Main *bmain,
+                                  struct Scene *scene,
+                                  str

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list