[Bf-blender-cvs] [70474e1a7cc] master: Asset System: Prepare File Browser backend for the Asset Browser

Julian Eisel noreply at git.blender.org
Tue Dec 15 17:04:35 CET 2020


Commit: 70474e1a7cc45a1b1cc08d39b3e472c88c8d3225
Author: Julian Eisel
Date:   Mon Dec 14 13:50:36 2020 +0100
Branches: master
https://developer.blender.org/rB70474e1a7cc45a1b1cc08d39b3e472c88c8d3225

Asset System: Prepare File Browser backend for the Asset Browser

The Asset Browser will be a sub-editor of the File Browser. This prepares the
File Browser code for that.

**File-Lists**
* Support loading assets with metadata read from external files into the
  file-list.
* New main based file-list type, for the "Current File" asset library.
* Refresh file-list when switching between browse modes or asset libraries.
* Support empty file-lists (asset library with no assets).
* Store file previews as icons, so scripts can reference them via icon-id. See
  previous commit.

**Space Data**
* Introduce "browse mode" to differeniate between file and asset browsing.
* Add `FileAssetSelectParams` to `SpaceFile`, with `FileSelectParams` as base.
  Makes sure data is separated between asset and file browsing when switching
  between them. The active params can be obtained through
  `ED_fileselect_get_active_params()`.
* `FileAssetSelectParams` stores the currently visible asset library ID.
* Introduce file history abstraction so file and asset browsing can keep a
  separate history (previous and next directories).

**General**
* Option to only show asset data-blocks while file browsing (not exposed here).
* Add "active_file" context member, so scripts can get and display info about
  the active file.
* Add "active_id" context member, so `ED_OT_lib_id_load_custom_preview` can set
  a custom ID preview. (Only for "Current File" asset library)
* Expose some of `FileDirEntry` in RNA as (non-editable). That way scripts can
  obtain name, preview icon and asset-data.

Part of the first Asset Browser milestone. Check the #asset_browser_milestone_1
project milestone on developer.blender.org.

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

Reviewed by: Bastien Montagne

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

M	source/blender/blenkernel/intern/screen.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/editors/include/ED_fileselect.h
M	source/blender/editors/space_file/file_intern.h
M	source/blender/editors/space_file/file_ops.c
M	source/blender/editors/space_file/filelist.c
M	source/blender/editors/space_file/filelist.h
M	source/blender/editors/space_file/filesel.c
M	source/blender/editors/space_file/space_file.c
M	source/blender/makesdna/DNA_space_types.h
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/RNA_enum_types.h
M	source/blender/makesrna/intern/rna_space.c
M	source/blender/windowmanager/intern/wm_operator_props.c

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

diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index ae817c46931..52c41c9fd05 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -1266,6 +1266,9 @@ static void write_area_regions(BlendWriter *writer, ScrArea *area)
       if (sfile->params) {
         BLO_write_struct(writer, FileSelectParams, sfile->params);
       }
+      if (sfile->asset_params) {
+        BLO_write_struct(writer, FileAssetSelectParams, sfile->asset_params);
+      }
     }
     else if (sl->spacetype == SPACE_SEQ) {
       BLO_write_struct(writer, SpaceSeq, sl);
@@ -1663,11 +1666,14 @@ static void direct_link_area(BlendDataReader *reader, ScrArea *area)
        * plus, it isn't saved to files yet!
        */
       sfile->folders_prev = sfile->folders_next = NULL;
+      BLI_listbase_clear(&sfile->folder_histories);
       sfile->files = NULL;
       sfile->layout = NULL;
       sfile->op = NULL;
       sfile->previews_timer = NULL;
+      sfile->tags = 0;
       BLO_read_data_address(reader, &sfile->params);
+      BLO_read_data_address(reader, &sfile->asset_params);
     }
     else if (sl->spacetype == SPACE_CLIP) {
       SpaceClip *sclip = (SpaceClip *)sl;
@@ -1751,8 +1757,11 @@ void BKE_screen_area_blend_read_lib(BlendLibReader *reader, ID *parent_id, ScrAr
         }
         break;
       }
-      case SPACE_FILE:
+      case SPACE_FILE: {
+        SpaceFile *sfile = (SpaceFile *)sl;
+        sfile->tags |= FILE_TAG_REBUILD_MAIN_FILES;
         break;
+      }
       case SPACE_ACTION: {
         SpaceAction *saction = (SpaceAction *)sl;
         bDopeSheet *ads = &saction->ads;
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index a3e793038f7..bccc7150523 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -2751,6 +2751,7 @@ static void lib_link_workspace_layout_restore(struct IDNameLib_Map *id_map,
           SpaceFile *sfile = (SpaceFile *)sl;
           sfile->op = NULL;
           sfile->previews_timer = NULL;
+          sfile->tags = FILE_TAG_REBUILD_MAIN_FILES;
         }
         else if (sl->spacetype == SPACE_ACTION) {
           SpaceAction *saction = (SpaceAction *)sl;
diff --git a/source/blender/editors/include/ED_fileselect.h b/source/blender/editors/include/ED_fileselect.h
index a5a8df916d6..3288cf11cb0 100644
--- a/source/blender/editors/include/ED_fileselect.h
+++ b/source/blender/editors/include/ED_fileselect.h
@@ -29,6 +29,7 @@ extern "C" {
 
 struct ARegion;
 struct FileSelectParams;
+struct FileAssetSelectParams;
 struct Scene;
 struct ScrArea;
 struct SpaceFile;
@@ -103,14 +104,14 @@ struct rcti;
 
 struct FileSelectParams *ED_fileselect_ensure_active_params(struct SpaceFile *sfile);
 struct FileSelectParams *ED_fileselect_get_active_params(const struct SpaceFile *sfile);
+struct FileSelectParams *ED_fileselect_get_file_params(const struct SpaceFile *sfile);
+struct FileAssetSelectParams *ED_fileselect_get_asset_params(const struct SpaceFile *sfile);
 
 void ED_fileselect_set_params_from_userdef(struct SpaceFile *sfile);
 void ED_fileselect_params_to_userdef(struct SpaceFile *sfile,
                                      const int temp_win_size[],
                                      const bool is_maximized);
 
-void ED_fileselect_reset_params(struct SpaceFile *sfile);
-
 void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *region);
 
 FileLayout *ED_fileselect_get_layout(struct SpaceFile *sfile, struct ARegion *region);
@@ -142,6 +143,8 @@ void ED_fileselect_exit(struct wmWindowManager *wm,
                         struct Scene *owner_scene,
                         struct SpaceFile *sfile);
 
+bool ED_fileselect_is_asset_browser(const struct SpaceFile *sfile);
+
 void ED_fileselect_window_params_get(const struct wmWindow *win,
                                      int win_size[2],
                                      bool *is_maximized);
diff --git a/source/blender/editors/space_file/file_intern.h b/source/blender/editors/space_file/file_intern.h
index b459c02d9e5..a0e02681e0e 100644
--- a/source/blender/editors/space_file/file_intern.h
+++ b/source/blender/editors/space_file/file_intern.h
@@ -90,6 +90,7 @@ void file_sfile_to_operator(struct Main *bmain, struct wmOperator *op, struct Sp
 void file_operator_to_sfile(struct Main *bmain, struct SpaceFile *sfile, struct wmOperator *op);
 
 /* filesel.c */
+void fileselect_refresh_params(struct SpaceFile *sfile);
 void fileselect_file_set(SpaceFile *sfile, const int index);
 bool file_attribute_column_type_enabled(const FileSelectParams *params,
                                         FileAttributeColumnType column);
diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c
index b98348307f3..8af84f65ced 100644
--- a/source/blender/editors/space_file/file_ops.c
+++ b/source/blender/editors/space_file/file_ops.c
@@ -930,6 +930,7 @@ void FILE_OT_select_all(wmOperatorType *ot)
 
 /* Note we could get rid of this one, but it's used by some addon so...
  * Does not hurt keeping it around for now. */
+/* TODO disallow bookmark editing in assets mode? */
 static int bookmark_select_exec(bContext *C, wmOperator *op)
 {
   Main *bmain = CTX_data_main(C);
@@ -1836,10 +1837,6 @@ static int file_previous_exec(bContext *C, wmOperator *UNUSED(op))
   FileSelectParams *params = ED_fileselect_get_active_params(sfile);
 
   if (params) {
-    if (!sfile->folders_next) {
-      sfile->folders_next = folderlist_new();
-    }
-
     folderlist_pushdir(sfile->folders_next, params->dir);
     folderlist_popdir(sfile->folders_prev, params->dir);
     folderlist_pushdir(sfile->folders_next, params->dir);
@@ -1874,10 +1871,6 @@ static int file_next_exec(bContext *C, wmOperator *UNUSED(unused))
   SpaceFile *sfile = CTX_wm_space_file(C);
   FileSelectParams *params = ED_fileselect_get_active_params(sfile);
   if (params) {
-    if (!sfile->folders_next) {
-      sfile->folders_next = folderlist_new();
-    }
-
     folderlist_pushdir(sfile->folders_prev, params->dir);
     folderlist_popdir(sfile->folders_next, params->dir);
 
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index e87142a7096..5dc5f741ac3 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -53,13 +53,17 @@
 #  include "BLI_winstuff.h"
 #endif
 
+#include "BKE_asset.h"
 #include "BKE_context.h"
 #include "BKE_global.h"
 #include "BKE_icons.h"
 #include "BKE_idtype.h"
+#include "BKE_lib_id.h"
 #include "BKE_main.h"
+#include "BKE_main_idmap.h"
 #include "BLO_readfile.h"
 
+#include "DNA_asset_types.h"
 #include "DNA_space_types.h"
 
 #include "ED_datafiles.h"
@@ -82,6 +86,8 @@
 
 #include "filelist.h"
 
+#define FILEDIR_NBR_ENTRIES_UNSET -1
+
 /* ----------------- FOLDERLIST (previous/next) -------------- */
 
 typedef struct FolderList {
@@ -89,12 +95,6 @@ typedef struct FolderList {
   char *foldername;
 } FolderList;
 
-ListBase *folderlist_new(void)
-{
-  ListBase *p = MEM_callocN(sizeof(*p), __func__);
-  return p;
-}
-
 void folderlist_popdir(struct ListBase *folderlist, char *dir)
 {
   const char *prev_dir;
@@ -117,6 +117,10 @@ void folderlist_popdir(struct ListBase *folderlist, char *dir)
 
 void folderlist_pushdir(ListBase *folderlist, const char *dir)
 {
+  if (!dir[0]) {
+    return;
+  }
+
   struct FolderList *folder, *previous_folder;
   previous_folder = folderlist->last;
 
@@ -153,7 +157,7 @@ int folderlist_clear_next(struct SpaceFile *sfile)
   struct FolderList *folder;
 
   /* if there is no folder_next there is nothing we can clear */
-  if (!sfile->folders_next) {
+  if (BLI_listbase_is_empty(sfile->folders_next)) {
     return 0;
   }
 
@@ -180,23 +184,79 @@ void folderlist_free(ListBase *folderlist)
   }
 }
 
-ListBase *folderlist_duplicate(ListBase *folderlist)
+static ListBase folderlist_duplicate(ListBase *folderlist)
 {
+  ListBase folderlistn = {NULL};
 
-  if (folderlist) {
-    ListBase *folderlistn = MEM_callocN(sizeof(*folderlistn), __func__);
-    FolderList *folder;
+  BLI_duplicatelist(&folderlistn, folderlist);
+
+  for (FolderList *folder = folderlistn.first; folder; folder = folder->next) {
+    folder->foldername = MEM_dupallocN(folder->foldername);
+  }
+  return folderlistn;
+}
 
-    BLI_duplicatelist(folderlistn, folderlist);
+/* ----------------- Folder-History (wraps/owns file list above) -------------- */
 
-    for (folder = folderlistn->first; folder; folder = folder->next) {
-      folder->foldername = MEM_dupallocN(folder->foldername);
+static FileFolderHistory *folder_history_find(const SpaceFile *sfile, eFileBrowse_Mode browse_mode)
+{
+  LISTBASE_FOREACH (FileFolderHistory *, history, &sfile->folder_histories) {
+    if (history->browse_mode == browse_mode) {
+      return history;
     }
-    return folderlistn;
   }
+
   return NULL;
 }
 
+void folder_history_list_ensure_for_active_browse_mode(SpaceFile *sfile)
+{
+  FileFolderHistory *history = folder_history_find(sfile, sfile->browse_mode);
+
+  if (!history) {
+    history = MEM_callocN(sizeof(*history), __func__);
+    history->browse_mode = sfile->browse_mode;
+    BLI_addtail(&sfile->folder_histories, history);
+  }
+
+  sfile->folders_next = &history->folders_next;
+  sfile->folders_prev = &history->folders_prev;
+}
+
+static void folder_history_entry_free(SpaceFile *sfile, FileFolderHistory *history)
+{
+  if (sfile->folders_prev == &history->folders_prev) {
+    sfile->folders_prev = NULL;
+  }
+  if (sfile->folders_next == &history->folders_next) {
+    sfile->folders_next = NULL;
+  }
+  folderlist_free(&history->folders_prev);
+  folderlist_free(&history->folders_next);
+  BLI_freelinkN(&sfile->folder_histories, history);
+}
+
+void folder_history_list_free(SpaceFile *sfile)
+{
+  LISTBASE_FOREACH_MUTABLE (FileFolderHistory *, history, &sfile->folder_histories) {
+    folder_history_entry_free(sfile, history);
+  }
+}
+
+ListBase folder_history_list_duplicate(ListBase *listbase)
+{
+  ListBase histories = {NULL};
+
+  LISTBASE_FOREACH (FileFold

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list