[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