[Bf-blender-cvs] [be41051bcdd] asset-browser: Automatically refresh "Current File" repository when creating assets

Julian Eisel noreply at git.blender.org
Fri Nov 13 01:23:39 CET 2020


Commit: be41051bcdd75d35a749e6ff54b2a9c2b04bde77
Author: Julian Eisel
Date:   Fri Nov 13 01:20:59 2020 +0100
Branches: asset-browser
https://developer.blender.org/rBbe41051bcdd75d35a749e6ff54b2a9c2b04bde77

Automatically refresh "Current File" repository when creating assets

It's confusing when this doesn't refresh, it's local data after all. It's not
entirely cheap to do, but is quite fast to do still. I don't think it will be
an issue if it's just done for creating/deleting assets.

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

M	source/blender/editors/asset/asset_ops.c
M	source/blender/editors/space_file/filelist.c
M	source/blender/editors/space_file/filelist.h
M	source/blender/editors/space_file/space_file.c
M	source/blender/windowmanager/WM_types.h

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

diff --git a/source/blender/editors/asset/asset_ops.c b/source/blender/editors/asset/asset_ops.c
index fd174f40319..ca60f752635 100644
--- a/source/blender/editors/asset/asset_ops.c
+++ b/source/blender/editors/asset/asset_ops.c
@@ -69,7 +69,8 @@ static int asset_make_exec(bContext *C, wmOperator *op)
 
   BKE_reportf(op->reports, RPT_INFO, "Data-block '%s' is now an asset", id->name + 2);
 
-  WM_event_add_notifier(C, NC_ID | NA_EDITED, NULL);
+  WM_main_add_notifier(NC_ID | NA_EDITED, NULL);
+  WM_main_add_notifier(NC_ASSET | NA_ADDED, NULL);
 
   return OPERATOR_FINISHED;
 }
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 41841bbc38e..12287f25270 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -1749,11 +1749,16 @@ void filelist_setrecursion(struct FileList *filelist, const int recursion_level)
   }
 }
 
-bool filelist_force_reset(struct FileList *filelist)
+bool filelist_needs_force_reset(FileList *filelist)
 {
   return (filelist->flags & FL_FORCE_RESET) != 0;
 }
 
+void filelist_tag_force_reset(FileList *filelist)
+{
+  filelist->flags |= FL_FORCE_RESET;
+}
+
 bool filelist_is_ready(struct FileList *filelist)
 {
   return (filelist->flags & FL_IS_READY) != 0;
@@ -1772,7 +1777,7 @@ bool filelist_pending(struct FileList *filelist)
  */
 int filelist_files_ensure(FileList *filelist)
 {
-  if (!filelist_force_reset(filelist) || !filelist_needs_reading(filelist)) {
+  if (!filelist_needs_force_reset(filelist) || !filelist_needs_reading(filelist)) {
     filelist_sort(filelist);
     filelist_filter(filelist);
   }
diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h
index 346ed731dcb..e57fab2e3d1 100644
--- a/source/blender/editors/space_file/filelist.h
+++ b/source/blender/editors/space_file/filelist.h
@@ -101,7 +101,8 @@ FileDirEntry *filelist_entry_find_uuid(struct FileList *filelist, const int uuid
 void filelist_file_cache_slidingwindow_set(struct FileList *filelist, size_t window_size);
 bool filelist_file_cache_block(struct FileList *filelist, const int index);
 
-bool filelist_force_reset(struct FileList *filelist);
+bool filelist_needs_force_reset(struct FileList *filelist);
+void filelist_tag_force_reset(struct FileList *filelist);
 bool filelist_pending(struct FileList *filelist);
 bool filelist_is_ready(struct FileList *filelist);
 
diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c
index 757fea56772..1c278b01ae7 100644
--- a/source/blender/editors/space_file/space_file.c
+++ b/source/blender/editors/space_file/space_file.c
@@ -306,6 +306,15 @@ static void file_ensure_valid_region_state(bContext *C,
   }
 }
 
+/**
+ * Tag the space to recreate the file-list.
+ */
+static void file_tag_reset_list(ScrArea *area, SpaceFile *sfile)
+{
+  filelist_tag_force_reset(sfile->files);
+  ED_area_tag_refresh(area);
+}
+
 static void file_refresh(const bContext *C, ScrArea *area)
 {
   wmWindowManager *wm = CTX_wm_manager(C);
@@ -350,7 +359,7 @@ static void file_refresh(const bContext *C, ScrArea *area)
   sfile->bookmarknr = fsmenu_get_active_indices(fsmenu, FS_CATEGORY_BOOKMARKS, params->dir);
   sfile->recentnr = fsmenu_get_active_indices(fsmenu, FS_CATEGORY_RECENT, params->dir);
 
-  if (filelist_force_reset(sfile->files)) {
+  if (filelist_needs_force_reset(sfile->files)) {
     filelist_readjob_stop(wm, CTX_data_scene(C));
     filelist_clear(sfile->files);
   }
@@ -415,6 +424,14 @@ static void file_listener(wmWindow *UNUSED(win),
           break;
       }
       break;
+    case NC_ASSET:
+      if (sfile->params && ED_fileselect_is_asset_browser(sfile->params) &&
+          (sfile->params->asset_repository.type == FILE_ASSET_REPO_LOCAL)) {
+        /* Full refresh of the file list if local asset data was changed. Refreshing this view is
+         * cheap and users expect this to be updated immediately. */
+        file_tag_reset_list(area, sfile);
+      }
+      break;
   }
 }
 
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index f9dace4274e..0ddd0f20c7a 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -298,6 +298,8 @@ typedef struct wmNotifier {
 #define NC_LINESTYLE (23 << 24)
 #define NC_CAMERA (24 << 24)
 #define NC_LIGHTPROBE (25 << 24)
+/* Changes to asset data in the current .blend. */
+#define NC_ASSET (26 << 24)
 
 /* data type, 256 entries is enough, it can overlap */
 #define NOTE_DATA 0x00FF0000



More information about the Bf-blender-cvs mailing list