[Bf-blender-cvs] [cd84d3f3da1] master: Refactor: Move file browser filelist.c to C++

Julian Eisel noreply at git.blender.org
Wed Sep 21 12:39:30 CEST 2022


Commit: cd84d3f3da197b12b56d766ee469c5fc1c368a21
Author: Julian Eisel
Date:   Wed Sep 21 12:25:50 2022 +0200
Branches: master
https://developer.blender.org/rBcd84d3f3da197b12b56d766ee469c5fc1c368a21

Refactor: Move file browser filelist.c to C++

I'm adding some asset APIs/types in C++ that the file-listing code would
use. I prefer porting this code to C++ over adding a C-API for the asset
code.

Includes some minor cleanups that shouldn't change behavior, like using
`MEM_new()`/`MEM_cnew()`, C++ style C-library includes,
`LISTBASE_FOREACH()`, removing unnecessary typedefs, etc.

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

M	source/blender/blenlib/BLI_fileops.h
M	source/blender/editors/space_file/CMakeLists.txt
R094	source/blender/editors/space_file/filelist.c	source/blender/editors/space_file/filelist.cc
M	source/blender/makesdna/DNA_space_types.h

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

diff --git a/source/blender/blenlib/BLI_fileops.h b/source/blender/blenlib/BLI_fileops.h
index 063e60ecf03..0ff75ca16e5 100644
--- a/source/blender/blenlib/BLI_fileops.h
+++ b/source/blender/blenlib/BLI_fileops.h
@@ -101,6 +101,7 @@ typedef enum eFileAttributes {
   FILE_ATTR_MOUNT_POINT = 1 << 14,    /* Volume mounted as a folder. */
   FILE_ATTR_HARDLINK = 1 << 15,       /* Duplicated directory entry. */
 } eFileAttributes;
+ENUM_OPERATORS(eFileAttributes, FILE_ATTR_HARDLINK);
 
 #define FILE_ATTR_ANY_LINK \
   (FILE_ATTR_ALIAS | FILE_ATTR_REPARSE_POINT | FILE_ATTR_SYMLINK | FILE_ATTR_JUNCTION_POINT | \
diff --git a/source/blender/editors/space_file/CMakeLists.txt b/source/blender/editors/space_file/CMakeLists.txt
index 792b9120e7b..a50081df1ee 100644
--- a/source/blender/editors/space_file/CMakeLists.txt
+++ b/source/blender/editors/space_file/CMakeLists.txt
@@ -27,7 +27,7 @@ set(SRC
   file_ops.c
   file_panels.c
   file_utils.c
-  filelist.c
+  filelist.cc
   filesel.c
   fsmenu.c
   space_file.c
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.cc
similarity index 94%
rename from source/blender/editors/space_file/filelist.c
rename to source/blender/editors/space_file/filelist.cc
index 24e1faaf4c9..426cd05c949 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.cc
@@ -7,11 +7,11 @@
 
 /* global includes */
 
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
+#include <cmath>
+#include <cstdlib>
+#include <cstring>
+#include <ctime>
 #include <sys/stat.h>
-#include <time.h>
 
 #ifndef WIN32
 #  include <unistd.h>
@@ -90,14 +90,14 @@ void folderlist_popdir(struct ListBase *folderlist, char *dir)
 {
   const char *prev_dir;
   struct FolderList *folder;
-  folder = folderlist->last;
+  folder = static_cast<FolderList *>(folderlist->last);
 
   if (folder) {
     /* remove the current directory */
     MEM_freeN(folder->foldername);
     BLI_freelinkN(folderlist, folder);
 
-    folder = folderlist->last;
+    folder = static_cast<FolderList *>(folderlist->last);
     if (folder) {
       prev_dir = folder->foldername;
       BLI_strncpy(dir, prev_dir, FILE_MAXDIR);
@@ -113,7 +113,7 @@ void folderlist_pushdir(ListBase *folderlist, const char *dir)
   }
 
   struct FolderList *folder, *previous_folder;
-  previous_folder = folderlist->last;
+  previous_folder = static_cast<FolderList *>(folderlist->last);
 
   /* check if already exists */
   if (previous_folder && previous_folder->foldername) {
@@ -123,7 +123,7 @@ void folderlist_pushdir(ListBase *folderlist, const char *dir)
   }
 
   /* create next folder element */
-  folder = MEM_mallocN(sizeof(*folder), __func__);
+  folder = MEM_new<FolderList>(__func__);
   folder->foldername = BLI_strdup(dir);
 
   /* add it to the end of the list */
@@ -138,7 +138,7 @@ const char *folderlist_peeklastdir(ListBase *folderlist)
     return NULL;
   }
 
-  folder = folderlist->last;
+  folder = static_cast<FolderList *>(folderlist->last);
   return folder->foldername;
 }
 
@@ -154,7 +154,7 @@ int folderlist_clear_next(struct SpaceFile *sfile)
 
   /* if previous_folder, next_folder or refresh_folder operators are executed
    * it doesn't clear folder_next */
-  folder = sfile->folders_prev->last;
+  folder = static_cast<FolderList *>(sfile->folders_prev->last);
   if ((!folder) || (BLI_path_cmp(folder->foldername, params->dir) == 0)) {
     return 0;
   }
@@ -166,8 +166,7 @@ int folderlist_clear_next(struct SpaceFile *sfile)
 void folderlist_free(ListBase *folderlist)
 {
   if (folderlist) {
-    FolderList *folder;
-    for (folder = folderlist->first; folder; folder = folder->next) {
+    LISTBASE_FOREACH (FolderList *, folder, folderlist) {
       MEM_freeN(folder->foldername);
     }
     BLI_freelistN(folderlist);
@@ -180,8 +179,8 @@ static ListBase folderlist_duplicate(ListBase *folderlist)
 
   BLI_duplicatelist(&folderlistn, folderlist);
 
-  for (FolderList *folder = folderlistn.first; folder; folder = folder->next) {
-    folder->foldername = MEM_dupallocN(folder->foldername);
+  LISTBASE_FOREACH (FolderList *, folder, &folderlistn) {
+    folder->foldername = (char *)MEM_dupallocN(folder->foldername);
   }
   return folderlistn;
 }
@@ -201,10 +200,10 @@ static FileFolderHistory *folder_history_find(const SpaceFile *sfile, eFileBrows
 
 void folder_history_list_ensure_for_active_browse_mode(SpaceFile *sfile)
 {
-  FileFolderHistory *history = folder_history_find(sfile, sfile->browse_mode);
+  FileFolderHistory *history = folder_history_find(sfile, (eFileBrowse_Mode)sfile->browse_mode);
 
   if (!history) {
-    history = MEM_callocN(sizeof(*history), __func__);
+    history = MEM_cnew<FileFolderHistory>(__func__);
     history->browse_mode = sfile->browse_mode;
     BLI_addtail(&sfile->folder_histories, history);
   }
@@ -238,7 +237,7 @@ ListBase folder_history_list_duplicate(ListBase *listbase)
   ListBase histories = {NULL};
 
   LISTBASE_FOREACH (FileFolderHistory *, history, listbase) {
-    FileFolderHistory *history_new = MEM_dupallocN(history);
+    FileFolderHistory *history_new = static_cast<FileFolderHistory *>(MEM_dupallocN(history));
     history_new->folders_prev = folderlist_duplicate(&history->folders_prev);
     history_new->folders_next = folderlist_duplicate(&history->folders_next);
     BLI_addtail(&histories, history_new);
@@ -249,13 +248,12 @@ ListBase folder_history_list_duplicate(ListBase *listbase)
 
 /* ------------------FILELIST------------------------ */
 
-typedef struct FileListInternEntry {
-  struct FileListInternEntry *next, *prev;
+struct FileListInternEntry {
+  FileListInternEntry *next, *prev;
 
   FileUID uid;
 
-  /** eFileSel_File_Types */
-  int typeflag;
+  eFileSel_File_Types typeflag;
   /** ID type, in case typeflag has FILE_TYPE_BLENDERLIB set. */
   int blentype;
 
@@ -287,18 +285,18 @@ typedef struct FileListInternEntry {
   /** Defined in BLI_fileops.h */
   eFileAttributes attributes;
   BLI_stat_t st;
-} FileListInternEntry;
+};
 
-typedef struct FileListIntern {
+struct FileListIntern {
   /** FileListInternEntry items. */
   ListBase entries;
   FileListInternEntry **filtered;
 
   FileUID curr_uid; /* Used to generate UID during internal listing. */
-} FileListIntern;
+};
 
 #define FILELIST_ENTRYCACHESIZE_DEFAULT 1024 /* Keep it a power of two! */
-typedef struct FileListEntryCache {
+struct FileListEntryCache {
   size_t size; /* The size of the cache... */
 
   int flags;
@@ -327,7 +325,7 @@ typedef struct FileListEntryCache {
    * previews either in `previews_pool` or `previews_done`. #filelist_cache_previews_update() makes
    * previews in `preview_done` ready for display, so the counter is decremented there. */
   int previews_todo_count;
-} FileListEntryCache;
+};
 
 /** #FileListCache.flags */
 enum {
@@ -335,21 +333,21 @@ enum {
   FLC_PREVIEWS_ACTIVE = 1 << 1,
 };
 
-typedef struct FileListEntryPreview {
+struct FileListEntryPreview {
   char filepath[FILE_MAX];
   uint flags;
   int index;
   int attributes; /* from FileDirEntry. */
   int icon_id;
-} FileListEntryPreview;
+};
 
 /* Dummy wrapper around FileListEntryPreview to ensure we do not access freed memory when freeing
  * tasks' data (see T74609). */
-typedef struct FileListEntryPreviewTaskData {
+struct FileListEntryPreviewTaskData {
   FileListEntryPreview *preview;
-} FileListEntryPreviewTaskData;
+};
 
-typedef struct FileListFilter {
+struct FileListFilter {
   uint64_t filter;
   uint64_t filter_id;
   char filter_glob[FILE_MAXFILE];
@@ -357,7 +355,7 @@ typedef struct FileListFilter {
   short flags;
 
   FileAssetCatalogFilterSettingsHandle *asset_catalog_filter;
-} FileListFilter;
+};
 
 /** #FileListFilter.flags */
 enum {
@@ -369,13 +367,13 @@ enum {
 };
 
 struct FileListReadJob;
-typedef struct FileList {
+struct FileList {
   FileDirEntryArr filelist;
 
   eFileSelectType type;
   /* The library this list was created for. Stored here so we know when to re-read. */
   AssetLibraryReference *asset_library_ref;
-  struct AssetLibrary *asset_library; /* Non-owning pointer. */
+  AssetLibrary *asset_library; /* Non-owning pointer. */
 
   short flags;
 
@@ -386,11 +384,11 @@ typedef struct FileList {
   /**
    * File indexer to use. Attribute is always set.
    */
-  const struct FileIndexerType *indexer;
+  const FileIndexerType *indexer;
 
-  struct FileListIntern filelist_intern;
+  FileListIntern filelist_intern;
 
-  struct FileListEntryCache filelist_cache;
+  FileListEntryCache filelist_cache;
 
   /* We need to keep those info outside of actual filelist items,
    * because those are no more persistent
@@ -403,7 +401,7 @@ typedef struct FileList {
   short max_recursion;
   short recursion_level;
 
-  struct BlendHandle *libfiledata;
+  BlendHandle *libfiledata;
 
   /* Set given path as root directory,
    * if last bool is true may change given string in place to a valid value.
@@ -419,7 +417,7 @@ typedef struct FileList {
   void (*prepare_filter_fn)(const struct FileList *, FileListFilter *);
 
   short tags; /* FileListTags */
-} FileList;
+};
 
 /** #FileList.flags */
 enum {
@@ -459,23 +457,23 @@ enum {
 
 static ImBuf *gSpecialFileImages[SPECIAL_IMG_MAX];
 
-static void filelist_readjob_main(struct FileListReadJob *job_params,
+static void filelist_readjob_main(FileListReadJob *job_params,
                                   short *stop,
                                   short *do_update,
                                   float *progress);
-static void filelist_readjob_lib(struct FileListReadJob *job_params,
+static void filelist_readjob_lib(FileListReadJob *job_params,
                                  short *stop,
                                  short *do_update,
                                  float *progress);
-static void filelist_readjob_dir(struct FileListReadJob *job_params,
+static void filelist_readjob_dir(FileListReadJob *job_params,
                                  short *stop,
                                  short *do_update,
                                  float *progress);
-static void filelist_readjob_asset_library(struct FileListReadJob *job_params,
+static void filelist_readjob_asset_library(FileListRea

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list