Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_file/fsmenu.c
| Show First 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | |||||
| /* FSMENU HANDLING */ | /* FSMENU HANDLING */ | ||||
| typedef struct FSMenu { | typedef struct FSMenu { | ||||
| FSMenuEntry *fsmenu_system; | FSMenuEntry *fsmenu_system; | ||||
| FSMenuEntry *fsmenu_system_bookmarks; | FSMenuEntry *fsmenu_system_bookmarks; | ||||
| FSMenuEntry *fsmenu_bookmarks; | FSMenuEntry *fsmenu_bookmarks; | ||||
| FSMenuEntry *fsmenu_recent; | FSMenuEntry *fsmenu_recent; | ||||
| FSMenuEntry *fsmenu_other; | |||||
| } FSMenu; | } FSMenu; | ||||
| static FSMenu *g_fsmenu = NULL; | static FSMenu *g_fsmenu = NULL; | ||||
| FSMenu *ED_fsmenu_get(void) | FSMenu *ED_fsmenu_get(void) | ||||
| { | { | ||||
| if (!g_fsmenu) { | if (!g_fsmenu) { | ||||
| g_fsmenu = MEM_callocN(sizeof(struct FSMenu), "fsmenu"); | g_fsmenu = MEM_callocN(sizeof(struct FSMenu), "fsmenu"); | ||||
| Show All 13 Lines | |||||
| fsm_head = fsmenu->fsmenu_system_bookmarks; | fsm_head = fsmenu->fsmenu_system_bookmarks; | ||||
| break; | break; | ||||
| case FS_CATEGORY_BOOKMARKS: | case FS_CATEGORY_BOOKMARKS: | ||||
| fsm_head = fsmenu->fsmenu_bookmarks; | fsm_head = fsmenu->fsmenu_bookmarks; | ||||
| break; | break; | ||||
| case FS_CATEGORY_RECENT: | case FS_CATEGORY_RECENT: | ||||
| fsm_head = fsmenu->fsmenu_recent; | fsm_head = fsmenu->fsmenu_recent; | ||||
| break; | break; | ||||
| case FS_CATEGORY_OTHER: | |||||
| fsm_head = fsmenu->fsmenu_other; | |||||
| break; | |||||
| } | } | ||||
| return fsm_head; | return fsm_head; | ||||
| } | } | ||||
| /* -------------------------------------------------------------------- */ | /* -------------------------------------------------------------------- */ | ||||
| /** \name XDG User Directory Support (Unix) | /** \name XDG User Directory Support (Unix) | ||||
| * | * | ||||
| * Generic Unix, Use XDG when available, otherwise fallback to the home directory. | * Generic Unix, Use XDG when available, otherwise fallback to the home directory. | ||||
| ▲ Show 20 Lines • Show All 104 Lines • ▼ Show 20 Lines | |||||
| fsmenu->fsmenu_system_bookmarks = fsm_head; | fsmenu->fsmenu_system_bookmarks = fsm_head; | ||||
| break; | break; | ||||
| case FS_CATEGORY_BOOKMARKS: | case FS_CATEGORY_BOOKMARKS: | ||||
| fsmenu->fsmenu_bookmarks = fsm_head; | fsmenu->fsmenu_bookmarks = fsm_head; | ||||
| break; | break; | ||||
| case FS_CATEGORY_RECENT: | case FS_CATEGORY_RECENT: | ||||
| fsmenu->fsmenu_recent = fsm_head; | fsmenu->fsmenu_recent = fsm_head; | ||||
| break; | break; | ||||
| case FS_CATEGORY_OTHER: | |||||
| fsmenu->fsmenu_other = fsm_head; | |||||
| break; | |||||
| } | } | ||||
| } | } | ||||
| int ED_fsmenu_get_nentries(struct FSMenu *fsmenu, FSMenuCategory category) | int ED_fsmenu_get_nentries(struct FSMenu *fsmenu, FSMenuCategory category) | ||||
| { | { | ||||
| FSMenuEntry *fsm_iter; | FSMenuEntry *fsm_iter; | ||||
| int count = 0; | int count = 0; | ||||
| ▲ Show 20 Lines • Show All 184 Lines • ▼ Show 20 Lines | |||||
| else { | else { | ||||
| fsm_iter->path = BLI_strdupn(path, path_len + 1); | fsm_iter->path = BLI_strdupn(path, path_len + 1); | ||||
| fsm_iter->path[path_len] = SEP; | fsm_iter->path[path_len] = SEP; | ||||
| fsm_iter->path[path_len + 1] = '\0'; | fsm_iter->path[path_len + 1] = '\0'; | ||||
| } | } | ||||
| fsm_iter->save = (flag & FS_INSERT_SAVE) != 0; | fsm_iter->save = (flag & FS_INSERT_SAVE) != 0; | ||||
| /* If entry is also in another list, use that icon and maybe name. */ | /* If entry is also in another list, use that icon and maybe name. */ | ||||
| if (ELEM(category, FS_CATEGORY_BOOKMARKS, FS_CATEGORY_RECENT)) { | if (ELEM(category, FS_CATEGORY_SYSTEM_BOOKMARKS, FS_CATEGORY_BOOKMARKS, FS_CATEGORY_RECENT)) { | ||||
| FSMenuCategory cats[] = { | FSMenuCategory cats[] = { | ||||
| FS_CATEGORY_SYSTEM, FS_CATEGORY_SYSTEM_BOOKMARKS, FS_CATEGORY_BOOKMARKS}; | FS_CATEGORY_OTHER, | ||||
| FS_CATEGORY_SYSTEM, | |||||
| FS_CATEGORY_SYSTEM_BOOKMARKS, | |||||
| FS_CATEGORY_BOOKMARKS, | |||||
| }; | |||||
| int i = ARRAY_SIZE(cats); | int i = ARRAY_SIZE(cats); | ||||
| if (category == FS_CATEGORY_BOOKMARKS) { | if (category == FS_CATEGORY_BOOKMARKS) { | ||||
| i--; | i--; | ||||
| } | } | ||||
| while (i--) { | while (i--) { | ||||
| FSMenuEntry *tfsm = ED_fsmenu_get_category(fsmenu, cats[i]); | FSMenuEntry *tfsm = ED_fsmenu_get_category(fsmenu, cats[i]); | ||||
| for (; tfsm; tfsm = tfsm->next) { | for (; tfsm; tfsm = tfsm->next) { | ||||
| ▲ Show 20 Lines • Show All 159 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| } | } | ||||
| fclose(fp); | fclose(fp); | ||||
| } | } | ||||
| #ifdef WIN32 | #ifdef WIN32 | ||||
| /* Add a Windows known folder path to the System list. */ | /* Add a Windows known folder path to the System list. */ | ||||
| static void fsmenu_add_windows_folder(struct FSMenu *fsmenu, | static void fsmenu_add_windows_folder(struct FSMenu *fsmenu, | ||||
| FSMenuCategory category, | |||||
| REFKNOWNFOLDERID rfid, | REFKNOWNFOLDERID rfid, | ||||
| const char *name, | const char *name, | ||||
| const int icon, | const int icon, | ||||
| FSMenuInsert flag) | FSMenuInsert flag) | ||||
| { | { | ||||
| LPWSTR pPath; | LPWSTR pPath; | ||||
| char line[FILE_MAXDIR]; | char line[FILE_MAXDIR]; | ||||
| if (SHGetKnownFolderPath(rfid, 0, NULL, &pPath) == S_OK) { | if (SHGetKnownFolderPath(rfid, 0, NULL, &pPath) == S_OK) { | ||||
| BLI_strncpy_wchar_as_utf8(line, pPath, FILE_MAXDIR); | BLI_strncpy_wchar_as_utf8(line, pPath, FILE_MAXDIR); | ||||
| CoTaskMemFree(pPath); | CoTaskMemFree(pPath); | ||||
| fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM_BOOKMARKS, line, name, icon, flag); | fsmenu_insert_entry(fsmenu, category, line, name, icon, flag); | ||||
| } | } | ||||
| } | } | ||||
| #endif | #endif | ||||
| void fsmenu_read_system(struct FSMenu *fsmenu, int read_bookmarks) | void fsmenu_read_system(struct FSMenu *fsmenu, int read_bookmarks) | ||||
| { | { | ||||
| char line[FILE_MAXDIR]; | char line[FILE_MAXDIR]; | ||||
| #ifdef WIN32 | #ifdef WIN32 | ||||
| ▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM, tmps, name, icon, FS_INSERT_SORTED); | fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM, tmps, name, icon, FS_INSERT_SORTED); | ||||
| } | } | ||||
| } | } | ||||
| /* Get Special Folder Locations. */ | /* Get Special Folder Locations. */ | ||||
| if (read_bookmarks) { | if (read_bookmarks) { | ||||
| /* These items are shown in System List. */ | |||||
| fsmenu_add_windows_folder(fsmenu, | |||||
| FS_CATEGORY_SYSTEM_BOOKMARKS, | |||||
| &FOLDERID_Profile, | |||||
| IFACE_("Home"), | |||||
| ICON_HOME, | |||||
| FS_INSERT_LAST); | |||||
| fsmenu_add_windows_folder(fsmenu, | |||||
| FS_CATEGORY_SYSTEM_BOOKMARKS, | |||||
| &FOLDERID_Desktop, | |||||
| IFACE_("Desktop"), | |||||
| ICON_DESKTOP, | |||||
| FS_INSERT_LAST); | |||||
| fsmenu_add_windows_folder(fsmenu, | |||||
| FS_CATEGORY_SYSTEM_BOOKMARKS, | |||||
| &FOLDERID_Documents, | |||||
| IFACE_("Documents"), | |||||
| ICON_DOCUMENTS, | |||||
| FS_INSERT_LAST); | |||||
| fsmenu_add_windows_folder(fsmenu, | |||||
| FS_CATEGORY_SYSTEM_BOOKMARKS, | |||||
| &FOLDERID_Downloads, | |||||
| IFACE_("Downloads"), | |||||
| ICON_IMPORT, | |||||
| FS_INSERT_LAST); | |||||
| fsmenu_add_windows_folder(fsmenu, | |||||
| FS_CATEGORY_SYSTEM_BOOKMARKS, | |||||
| &FOLDERID_Music, | |||||
| IFACE_("Music"), | |||||
| ICON_FILE_SOUND, | |||||
| FS_INSERT_LAST); | |||||
| fsmenu_add_windows_folder(fsmenu, | |||||
| FS_CATEGORY_SYSTEM_BOOKMARKS, | |||||
| &FOLDERID_Pictures, | |||||
| IFACE_("Pictures"), | |||||
| ICON_FILE_IMAGE, | |||||
| FS_INSERT_LAST); | |||||
| fsmenu_add_windows_folder(fsmenu, | |||||
| FS_CATEGORY_SYSTEM_BOOKMARKS, | |||||
| &FOLDERID_Videos, | |||||
| IFACE_("Videos"), | |||||
| ICON_FILE_MOVIE, | |||||
| FS_INSERT_LAST); | |||||
| fsmenu_add_windows_folder(fsmenu, | |||||
| FS_CATEGORY_SYSTEM_BOOKMARKS, | |||||
| &FOLDERID_Fonts, | |||||
| IFACE_("Fonts"), | |||||
| ICON_FONTPREVIEW, | |||||
| FS_INSERT_LAST); | |||||
| /* These items are just put in path cache for thumbnail views and if bookmarked. */ | |||||
| fsmenu_add_windows_folder(fsmenu, FS_CATEGORY_OTHER, | |||||
| &FOLDERID_UserProfiles, | |||||
| NULL, | |||||
| ICON_COMMUNITY, | |||||
| FS_INSERT_LAST); | |||||
| fsmenu_add_windows_folder( | fsmenu_add_windows_folder( | ||||
| fsmenu, &FOLDERID_Profile, IFACE_("Home"), ICON_HOME, FS_INSERT_LAST); | fsmenu, FS_CATEGORY_OTHER, &FOLDERID_Objects3D, NULL, ICON_FILE_3D, 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_add_windows_folder( | ||||
| fsmenu, &FOLDERID_Fonts, IFACE_("Fonts"), ICON_FONTPREVIEW, FS_INSERT_LAST); | fsmenu, FS_CATEGORY_OTHER, &FOLDERID_SkyDrive, NULL, ICON_URL, FS_INSERT_LAST); | ||||
| } | } | ||||
| } | } | ||||
| #else | #else | ||||
| # ifdef __APPLE__ | # ifdef __APPLE__ | ||||
| { | { | ||||
| /* Get mounted volumes better method OSX 10.6 and higher, see: | /* Get mounted volumes better method OSX 10.6 and higher, see: | ||||
| * https://developer.apple.com/library/mac/#documentation/CoreFOundation/Reference/CFURLRef/Reference/reference.html | * https://developer.apple.com/library/mac/#documentation/CoreFOundation/Reference/CFURLRef/Reference/reference.html | ||||
| */ | */ | ||||
| ▲ Show 20 Lines • Show All 184 Lines • ▼ Show 20 Lines | |||||
| fsmenu_insert_entry( | fsmenu_insert_entry( | ||||
| fsmenu, FS_CATEGORY_SYSTEM, "/", NULL, ICON_DISK_DRIVE, FS_INSERT_SORTED); | fsmenu, FS_CATEGORY_SYSTEM, "/", NULL, ICON_DISK_DRIVE, FS_INSERT_SORTED); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| # endif | # endif | ||||
| #endif | #endif | ||||
| /* For all platforms, add some extra directories to FS_CATEGORY_OTHER | |||||
| * so they will get corrent icon in thumbnail view or if bookmarked. | |||||
| */ | |||||
| #define FS_UDIR_PATH(dir, icon) \ | |||||
| if (strlen(dir) > 2) { \ | |||||
| fsmenu_insert_entry(fsmenu, FS_CATEGORY_OTHER, dir, NULL, icon, FS_INSERT_LAST); \ | |||||
| } | |||||
brecht: Always use {} | |||||
| FS_UDIR_PATH(U.fontdir, ICON_FILE_FONT) | |||||
| FS_UDIR_PATH(U.textudir, ICON_FILE_IMAGE) | |||||
| FS_UDIR_PATH(U.pythondir, ICON_FILE_SCRIPT) | |||||
| FS_UDIR_PATH(U.sounddir, ICON_FILE_SOUND) | |||||
| FS_UDIR_PATH(U.tempdir, ICON_TEMP) | |||||
| #undef FS_UDIR_PATH | |||||
| #if defined(WIN32) || defined(__APPLE__) | #if defined(WIN32) || defined(__APPLE__) | ||||
| /* Quiet warnings. */ | /* Quiet warnings. */ | ||||
| UNUSED_VARS(fsmenu_xdg_insert_entry, fsmenu_xdg_user_dirs_parse, fsmenu_xdg_user_dirs_free); | UNUSED_VARS(fsmenu_xdg_insert_entry, fsmenu_xdg_user_dirs_parse, fsmenu_xdg_user_dirs_free); | ||||
| #endif | #endif | ||||
| } | } | ||||
| static void fsmenu_free_category(struct FSMenu *fsmenu, FSMenuCategory category) | static void fsmenu_free_category(struct FSMenu *fsmenu, FSMenuCategory category) | ||||
| { | { | ||||
| Show All 25 Lines | |||||
| static void fsmenu_free_ex(FSMenu **fsmenu) | static void fsmenu_free_ex(FSMenu **fsmenu) | ||||
| { | { | ||||
| if (*fsmenu != NULL) { | if (*fsmenu != NULL) { | ||||
| fsmenu_free_category(*fsmenu, FS_CATEGORY_SYSTEM); | fsmenu_free_category(*fsmenu, FS_CATEGORY_SYSTEM); | ||||
| fsmenu_free_category(*fsmenu, FS_CATEGORY_SYSTEM_BOOKMARKS); | fsmenu_free_category(*fsmenu, FS_CATEGORY_SYSTEM_BOOKMARKS); | ||||
| fsmenu_free_category(*fsmenu, FS_CATEGORY_BOOKMARKS); | fsmenu_free_category(*fsmenu, FS_CATEGORY_BOOKMARKS); | ||||
| fsmenu_free_category(*fsmenu, FS_CATEGORY_RECENT); | fsmenu_free_category(*fsmenu, FS_CATEGORY_RECENT); | ||||
| fsmenu_free_category(*fsmenu, FS_CATEGORY_OTHER); | |||||
| MEM_freeN(*fsmenu); | MEM_freeN(*fsmenu); | ||||
| } | } | ||||
| *fsmenu = NULL; | *fsmenu = NULL; | ||||
| } | } | ||||
| void fsmenu_free(void) | void fsmenu_free(void) | ||||
| { | { | ||||
| Show All 28 Lines | |||||
| static FSMenu *fsmenu_copy(FSMenu *fsmenu) | static FSMenu *fsmenu_copy(FSMenu *fsmenu) | ||||
| { | { | ||||
| FSMenu *fsmenu_copy = MEM_dupallocN(fsmenu); | FSMenu *fsmenu_copy = MEM_dupallocN(fsmenu); | ||||
| fsmenu_copy_category(fsmenu_copy, fsmenu_copy, FS_CATEGORY_SYSTEM); | fsmenu_copy_category(fsmenu_copy, fsmenu_copy, FS_CATEGORY_SYSTEM); | ||||
| fsmenu_copy_category(fsmenu_copy, fsmenu_copy, FS_CATEGORY_SYSTEM_BOOKMARKS); | fsmenu_copy_category(fsmenu_copy, fsmenu_copy, FS_CATEGORY_SYSTEM_BOOKMARKS); | ||||
| fsmenu_copy_category(fsmenu_copy, fsmenu_copy, FS_CATEGORY_BOOKMARKS); | fsmenu_copy_category(fsmenu_copy, fsmenu_copy, FS_CATEGORY_BOOKMARKS); | ||||
| fsmenu_copy_category(fsmenu_copy, fsmenu_copy, FS_CATEGORY_RECENT); | fsmenu_copy_category(fsmenu_copy, fsmenu_copy, FS_CATEGORY_RECENT); | ||||
| fsmenu_copy_category(fsmenu_copy, fsmenu_copy, FS_CATEGORY_OTHER); | |||||
| return fsmenu_copy; | return fsmenu_copy; | ||||
| } | } | ||||
| int fsmenu_get_active_indices(struct FSMenu *fsmenu, enum FSMenuCategory category, const char *dir) | int fsmenu_get_active_indices(struct FSMenu *fsmenu, enum FSMenuCategory category, const char *dir) | ||||
| { | { | ||||
| FSMenuEntry *fsm_iter = ED_fsmenu_get_category(fsmenu, category); | FSMenuEntry *fsm_iter = ED_fsmenu_get_category(fsmenu, category); | ||||
| int i; | int i; | ||||
| ▲ Show 20 Lines • Show All 92 Lines • Show Last 20 Lines | |||||
Always use {}