diff --git a/arm9/source/godmode.c b/arm9/source/godmode.c
index 4ae9b4e..15387d0 100644
--- a/arm9/source/godmode.c
+++ b/arm9/source/godmode.c
@@ -944,52 +944,100 @@ u32 StandardCopy(u32* cursor, u32* scroll) {
return 0;
}
-u32 FileAttrMenu(const char* file_path) {
+u32 DirFileAttrMenu(const char* path, const char *name) {
+ bool drive;
FILINFO fno;
- if (fvx_stat(file_path, &fno) != FR_OK) {
- char pathstr[32 + 1];
- TruncateString(pathstr, file_path, 32, 8);
- ShowPrompt(false, "%s\nFile info failed!", pathstr);
- return 1;
+ u8 new_attrib;
+ char namestr[32], datestr[32], attrstr[128], sizestr[64];
+
+ drive = (path[2] == '\0');
+ TruncateString(namestr, name, 31, 8);
+
+ if (drive) {
+ char freestr[32], drvsstr[32], usedstr[32];
+ datestr[0] = attrstr[0] = '\0';
+
+ FormatBytes(freestr, GetFreeSpace(path));
+ FormatBytes(drvsstr, GetTotalSpace(path));
+ FormatBytes(usedstr, GetTotalSpace(path) - GetFreeSpace(path));
+
+ snprintf(sizestr, 64, "space free: %s\nspace used: %s\nspace total: %s",
+ freestr, usedstr, drvsstr);
+ } else {
+ char bytestr[32];
+
+ if (fvx_stat(path, &fno) != FR_OK)
+ return 1;
+
+ snprintf(datestr, 64, "%s: %04d-%02d-%02d %02d:%02d:%02d",
+ (fno.fattrib & AM_DIR) ? "created" : "modified",
+ 1980 + ((fno.fdate >> 9) & 0x7F), (fno.fdate >> 5) & 0xF, fno.fdate & 0x1F,
+ (fno.ftime >> 11) & 0x1F, (fno.ftime >> 5) & 0x3F, (fno.ftime & 0x1F) << 1
+ );
+
+ new_attrib = fno.fattrib;
+
+ if (fno.fattrib & AM_DIR) {
+ u64 tsize = 0;
+ u32 tdirs = 0;
+ u32 tfiles = 0;
+
+ if (!DirInfo(path, &tsize, &tdirs, &tfiles))
+ return 1;
+
+ FormatBytes(bytestr, tsize);
+ snprintf(sizestr, 64, "%lu files & %lu subdirs\n%s total space",
+ tfiles, tdirs, bytestr);
+ } else {
+ FormatBytes(bytestr, fno.fsize);
+ snprintf(sizestr, 64, "filesize: %s byte", bytestr);
+ }
}
- char namestr[32 + 1];
- char sizestr[32];
- TruncateString(namestr, fno.fname, 32, 8);
- FormatNumber(sizestr, fno.fsize);
- const bool vrt = (fno.fattrib & AM_VRT);
- u8 new_attrib = fno.fattrib;
+ while(true) {
+ const bool vrt = (!drive) && (fno.fattrib & AM_VRT);
+
+ if (!drive) {
+ snprintf(attrstr, 128,
+ "[%c] %sread-only [%c] %shidden\n"
+ "[%c] %ssystem [%c] %sarchive\n"
+ "[%c] %svirtual\n"
+ "\n"
+ "%s",
+ (new_attrib & AM_RDO) ? 'X' : ' ', vrt ? "" : "\x18 ",
+ (new_attrib & AM_HID) ? 'X' : ' ', vrt ? "" : "\x19 ",
+ (new_attrib & AM_SYS) ? 'X' : ' ', vrt ? "" : "\x1A ",
+ (new_attrib & AM_ARC) ? 'X' : ' ', vrt ? "" : "\x1B ",
+ vrt ? 'X' : ' ', vrt ? "" : " ",
+ vrt ? "" : "(\x18\x19\x1A\x1B to change attributes)"
+ );
+ }
- while (true) {
ShowString(
- "%s\n"
+ "%s\n" // name
" \n"
- "filesize: %s byte\n"
- "modified: %04lu-%02lu-%02lu %02lu:%02lu:%02lu\n"
+ "%s\n" // size
+ "%s\n" // date
" \n"
- "[%c] %sread-only [%c] %shidden\n"
- "[%c] %ssystem [%c] %sarchive\n"
- "[%c] %svirtual\n"
+ "%s\n" // attr
" \n"
- "%s"
- "%s",
- namestr, sizestr,
- 1980 + ((fno.fdate >> 9) & 0x7F), (fno.fdate >> 5) & 0x0F, (fno.fdate >> 0) & 0x1F,
- (fno.ftime >> 11) & 0x1F, (fno.ftime >> 5) & 0x3F, ((fno.ftime >> 0) & 0x1F) << 1,
- (new_attrib & AM_RDO) ? 'X' : ' ', (vrt ? "" : "\x18 "),
- (new_attrib & AM_HID) ? 'X' : ' ', (vrt ? "" : "\x19 "),
- (new_attrib & AM_SYS) ? 'X' : ' ', (vrt ? "" : "\x1A "),
- (new_attrib & AM_ARC) ? 'X' : ' ', (vrt ? "" : "\x1B "),
- vrt ? 'X' : ' ', (vrt ? "" : " "),
- vrt ? "" : "(\x18\x19\x1A\x1B to change attributes)\n",
- (vrt || (new_attrib == fno.fattrib)) ? "( to continue)" : "( to apply, to cancel)");
+ "%s\n", // options
+ namestr, sizestr, datestr, attrstr,
+ (drive || vrt || (new_attrib == fno.fattrib)) ? "( to continue)" : "( to apply, to cancel)"
+ );
- while (true) {
+ while(true) {
u32 pad_state = InputWait(0);
+
+ if (drive && (pad_state & BUTTON_A)) {
+ ClearScreenF(true, false, COLOR_STD_BG);
+ return 0;
+ }
+
if (pad_state & (BUTTON_A | BUTTON_B)) {
bool apply = !vrt && (new_attrib != fno.fattrib) && (pad_state & BUTTON_A);
const u8 mask = (AM_RDO | AM_HID | AM_SYS | AM_ARC);
- if (apply && !PathAttr(file_path, new_attrib & mask, mask)) {
+ if (apply && !PathAttr(path, new_attrib & mask, mask)) {
ShowPrompt(false, "%s\nFailed to set attributes!", namestr);
}
ClearScreenF(true, false, COLOR_STD_BG);
@@ -1019,6 +1067,7 @@ u32 FileAttrMenu(const char* file_path) {
u32 FileHandlerMenu(char* current_path, u32* cursor, u32* scroll, PaneData** pane) {
const char* file_path = (&(current_dir->entry[*cursor]))->path;
+ const char* file_name = (&(current_dir->entry[*cursor]))->name;
const char* optionstr[16];
// check for file lock
@@ -1202,7 +1251,7 @@ u32 FileHandlerMenu(char* current_path, u32* cursor, u32* scroll, PaneData** pan
return FileHandlerMenu(current_path, cursor, scroll, pane);
}
else if (user_select == fileinfo) { // -> show file info
- FileAttrMenu(file_path);
+ DirFileAttrMenu(file_path, file_name);
return 0;
}
else if (user_select == copystd) { // -> copy to OUTPUT_PATH
@@ -2259,36 +2308,11 @@ u32 GodMode(int entrypoint) {
RecursiveFixFileCmac(curr_entry->path);
ShowPrompt(false, "Fix CMACs for drive finished.");
} else if (user_select == dirnfo) {
- bool is_drive = (!*current_path);
- FILINFO fno;
- u64 tsize = 0;
- u32 tdirs = 0;
- u32 tfiles = 0;
-
- ShowString("Analyzing %s, please wait...", is_drive ? "drive" : "dir");
- if ((is_drive || (fvx_stat(curr_entry->path, &fno) == FR_OK)) &&
- DirInfo(curr_entry->path, &tsize, &tdirs, &tfiles)) {
- char bytestr[32];
- FormatBytes(bytestr, tsize);
- if (is_drive) {
- char freestr[32];
- char drvsstr[32];
- char usedstr[32];
- FormatBytes(freestr, GetFreeSpace(curr_entry->path));
- FormatBytes(drvsstr, GetTotalSpace(curr_entry->path));
- FormatBytes(usedstr, GetTotalSpace(curr_entry->path) - GetFreeSpace(curr_entry->path));
- ShowPrompt(false, "%s\n \n%lu files & %lu subdirs\n%s total size\n \nspace free: %s\nspace used: %s\nspace total: %s",
- namestr, tfiles, tdirs, bytestr, freestr, usedstr, drvsstr);
- } else {
- ShowPrompt(false, "%s\n \ncreated: %04lu-%02lu-%02lu %02lu:%02lu:%02lu\n%lu files & %lu subdirs\n%s total size\n \n[%c] read-only [%c] hidden\n[%c] system [%c] archive\n[%c] virtual",
- namestr,
- 1980 + ((fno.fdate >> 9) & 0x7F), (fno.fdate >> 5) & 0x0F, (fno.fdate >> 0) & 0x1F,
- (fno.ftime >> 11) & 0x1F, (fno.ftime >> 5) & 0x3F, ((fno.ftime >> 0) & 0x1F) << 1,
- tfiles, tdirs, bytestr,
- (fno.fattrib & AM_RDO) ? 'X' : ' ', (fno.fattrib & AM_HID) ? 'X' : ' ', (fno.fattrib & AM_SYS) ? 'X' : ' ' ,
- (fno.fattrib & AM_ARC) ? 'X' : ' ', (fno.fattrib & AM_VRT) ? 'X' : ' ');
- }
- } else ShowPrompt(false, "Analyze %s: failed!", is_drive ? "drive" : "dir");
+ if (DirFileAttrMenu(curr_entry->path, curr_entry->name)) {
+ ShowPrompt(false, "Failed to analyze %s\n",
+ (current_path[0] == '\0') ? "drive" : "dir"
+ );
+ }
} else if (user_select == stdcpy) {
StandardCopy(&cursor, &scroll);
}