UI: Windows Platform File Browser System List
Showing Windows special folder locations with icons in File Browser System list. https://developer.blender.org/D6405 Reviewed by Brecht Van Lommel
This commit is contained in:
parent
a5790b2656
commit
1af8e0cc6c
Notes:
blender-bot
2023-02-14 10:11:54 +01:00
Referenced by issue #73494, Jagged Wireframes in 2.83 Alpha.
|
@ -947,15 +947,13 @@ ImBuf *filelist_geticon_image(struct FileList *filelist, const int index)
|
|||
return filelist_geticon_image_ex(file->typeflag, file->relpath);
|
||||
}
|
||||
|
||||
static int filelist_geticon_ex(const int typeflag,
|
||||
const int blentype,
|
||||
const char *relpath,
|
||||
const bool is_main,
|
||||
const bool ignore_libdir)
|
||||
static int filelist_geticon_ex(FileDirEntry *file, const char *root, const bool is_main, const bool ignore_libdir)
|
||||
{
|
||||
const int typeflag = file->typeflag;
|
||||
|
||||
if ((typeflag & FILE_TYPE_DIR) &&
|
||||
!(ignore_libdir && (typeflag & (FILE_TYPE_BLENDERLIB | FILE_TYPE_BLENDER)))) {
|
||||
if (FILENAME_IS_PARENT(relpath)) {
|
||||
if (FILENAME_IS_PARENT(file->relpath)) {
|
||||
return is_main ? ICON_FILE_PARENT : ICON_NONE;
|
||||
}
|
||||
else if (typeflag & FILE_TYPE_APPLICATIONBUNDLE) {
|
||||
|
@ -969,6 +967,20 @@ static int filelist_geticon_ex(const int typeflag,
|
|||
* (e.g. when used over previews). */
|
||||
return ICON_FILE_FOLDER;
|
||||
}
|
||||
else {
|
||||
/* If this path is in System list then use that icon. */
|
||||
struct FSMenu *fsmenu = ED_fsmenu_get();
|
||||
FSMenuEntry *tfsm = ED_fsmenu_get_category(fsmenu, FS_CATEGORY_SYSTEM_BOOKMARKS);
|
||||
char fullpath[FILE_MAX_LIBEXTRA];
|
||||
BLI_join_dirfile(fullpath, sizeof(fullpath), root, file->relpath);
|
||||
BLI_add_slash(fullpath);
|
||||
for (; tfsm; tfsm = tfsm->next) {
|
||||
if (STREQ(tfsm->path, fullpath)) {
|
||||
/* Never want a little folder inside a large one. */
|
||||
return (tfsm->icon == ICON_FILE_FOLDER) ? ICON_NONE : tfsm->icon;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (typeflag & FILE_TYPE_BLENDER) {
|
||||
|
@ -1014,7 +1026,7 @@ static int filelist_geticon_ex(const int typeflag,
|
|||
return ICON_FILE_ARCHIVE;
|
||||
}
|
||||
else if (typeflag & FILE_TYPE_BLENDERLIB) {
|
||||
const int ret = UI_idcode_icon_get(blentype);
|
||||
const int ret = UI_idcode_icon_get(file->blentype);
|
||||
if (ret != ICON_NONE) {
|
||||
return ret;
|
||||
}
|
||||
|
@ -1026,7 +1038,7 @@ int filelist_geticon(struct FileList *filelist, const int index, const bool is_m
|
|||
{
|
||||
FileDirEntry *file = filelist_geticon_get_file(filelist, index);
|
||||
|
||||
return filelist_geticon_ex(file->typeflag, file->blentype, file->relpath, is_main, false);
|
||||
return filelist_geticon_ex(file, filelist->filelist.root, is_main, false);
|
||||
}
|
||||
|
||||
/* ********** Main ********** */
|
||||
|
|
|
@ -31,6 +31,8 @@
|
|||
#include "BLI_utildefines.h"
|
||||
#include "BLI_blenlib.h"
|
||||
|
||||
#include "BLT_translation.h"
|
||||
|
||||
#include "BKE_appdir.h"
|
||||
|
||||
#include "ED_fileselect.h"
|
||||
|
@ -270,7 +272,7 @@ void fsmenu_insert_entry(struct FSMenu *fsmenu,
|
|||
FSMenuCategory category,
|
||||
const char *path,
|
||||
const char *name,
|
||||
const int icon,
|
||||
int icon,
|
||||
FSMenuInsert flag)
|
||||
{
|
||||
FSMenuEntry *fsm_prev;
|
||||
|
@ -311,19 +313,22 @@ void fsmenu_insert_entry(struct FSMenu *fsmenu,
|
|||
fsm_iter->path = BLI_strdup(path);
|
||||
fsm_iter->save = (flag & FS_INSERT_SAVE) != 0;
|
||||
|
||||
if ((category == FS_CATEGORY_RECENT) && (!name || !name[0])) {
|
||||
/* Special handling when adding new recent entry - check if dir exists in
|
||||
* some other categories, and try to use name from there if so. */
|
||||
/* If entry is also in another list, use that icon and maybe name. */
|
||||
if (ELEM(category, FS_CATEGORY_BOOKMARKS, FS_CATEGORY_RECENT)) {
|
||||
|
||||
FSMenuCategory cats[] = {
|
||||
FS_CATEGORY_SYSTEM, FS_CATEGORY_SYSTEM_BOOKMARKS, FS_CATEGORY_BOOKMARKS};
|
||||
int i = ARRAY_SIZE(cats);
|
||||
if (category == FS_CATEGORY_BOOKMARKS) {
|
||||
i--;
|
||||
}
|
||||
|
||||
while (i--) {
|
||||
FSMenuEntry *tfsm = ED_fsmenu_get_category(fsmenu, cats[i]);
|
||||
|
||||
for (; tfsm; tfsm = tfsm->next) {
|
||||
if (STREQ(tfsm->path, fsm_iter->path)) {
|
||||
if (tfsm->name[0]) {
|
||||
icon = tfsm->icon;
|
||||
if (tfsm->name[0] && (!name || !name[0])) {
|
||||
name = tfsm->name;
|
||||
}
|
||||
break;
|
||||
|
@ -485,6 +490,25 @@ void fsmenu_read_bookmarks(struct FSMenu *fsmenu, const char *filename)
|
|||
fclose(fp);
|
||||
}
|
||||
|
||||
#ifdef WIN32
|
||||
/* Add a Windows known folder path to the System list. */
|
||||
static void fsmenu_add_windows_folder(struct FSMenu *fsmenu,
|
||||
REFKNOWNFOLDERID rfid,
|
||||
const char *name,
|
||||
const int icon,
|
||||
FSMenuInsert flag)
|
||||
{
|
||||
LPWSTR pPath;
|
||||
char line[FILE_MAXDIR];
|
||||
if (SHGetKnownFolderPath(rfid, 0, NULL, &pPath) == S_OK) {
|
||||
BLI_strncpy_wchar_as_utf8(line, pPath, FILE_MAXDIR);
|
||||
CoTaskMemFree(pPath);
|
||||
BLI_add_slash(line);
|
||||
fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM_BOOKMARKS, line, name, icon, flag);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void fsmenu_read_system(struct FSMenu *fsmenu, int read_bookmarks)
|
||||
{
|
||||
char line[FILE_MAXDIR];
|
||||
|
@ -541,16 +565,24 @@ void fsmenu_read_system(struct FSMenu *fsmenu, int read_bookmarks)
|
|||
}
|
||||
}
|
||||
|
||||
/* Adding Desktop and My Documents */
|
||||
/* Get Special Folder Locations. */
|
||||
if (read_bookmarks) {
|
||||
SHGetSpecialFolderPathW(0, wline, CSIDL_PERSONAL, 0);
|
||||
BLI_strncpy_wchar_as_utf8(line, wline, FILE_MAXDIR);
|
||||
fsmenu_insert_entry(
|
||||
fsmenu, FS_CATEGORY_SYSTEM_BOOKMARKS, line, NULL, ICON_DOCUMENTS, FS_INSERT_SORTED);
|
||||
SHGetSpecialFolderPathW(0, wline, CSIDL_DESKTOPDIRECTORY, 0);
|
||||
BLI_strncpy_wchar_as_utf8(line, wline, FILE_MAXDIR);
|
||||
fsmenu_insert_entry(
|
||||
fsmenu, FS_CATEGORY_SYSTEM_BOOKMARKS, line, NULL, ICON_DESKTOP, FS_INSERT_SORTED);
|
||||
fsmenu_add_windows_folder(
|
||||
fsmenu, &FOLDERID_Profile, IFACE_("Home"), ICON_HOME, FS_INSERT_LAST);
|
||||
fsmenu_add_windows_folder(
|
||||
fsmenu, &FOLDERID_Desktop, IFACE_("Desktop"), ICON_DESKTOP, FS_INSERT_LAST);
|
||||
fsmenu_add_windows_folder(
|
||||
fsmenu, &FOLDERID_Documents, IFACE_("Documents"), ICON_DOCUMENTS, FS_INSERT_LAST);
|
||||
fsmenu_add_windows_folder(
|
||||
fsmenu, &FOLDERID_Downloads, IFACE_("Downloads"), ICON_IMPORT, FS_INSERT_LAST);
|
||||
fsmenu_add_windows_folder(
|
||||
fsmenu, &FOLDERID_Music, IFACE_("Music"), ICON_FILE_SOUND, FS_INSERT_LAST);
|
||||
fsmenu_add_windows_folder(
|
||||
fsmenu, &FOLDERID_Pictures, IFACE_("Pictures"), ICON_FILE_IMAGE, FS_INSERT_LAST);
|
||||
fsmenu_add_windows_folder(
|
||||
fsmenu, &FOLDERID_Videos, IFACE_("Videos"), ICON_FILE_MOVIE, FS_INSERT_LAST);
|
||||
fsmenu_add_windows_folder(
|
||||
fsmenu, &FOLDERID_Fonts, IFACE_("Fonts"), ICON_FONTPREVIEW, FS_INSERT_LAST);
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
|
Loading…
Reference in New Issue