From 0ec73520e6d423becbdf973a35d5a665c5866b37 Mon Sep 17 00:00:00 2001 From: d0k3 Date: Sat, 12 Oct 2019 16:58:31 +0200 Subject: [PATCH] Rewrote the dir/file/drive info dialogue --- arm9/source/godmode.c | 151 +++++++++++++++++++++--------------------- 1 file changed, 74 insertions(+), 77 deletions(-) diff --git a/arm9/source/godmode.c b/arm9/source/godmode.c index 8aab7fb..26693d0 100644 --- a/arm9/source/godmode.c +++ b/arm9/source/godmode.c @@ -947,122 +947,119 @@ u32 StandardCopy(u32* cursor, u32* scroll) { } u32 DirFileAttrMenu(const char* path, const char *name) { - bool drive; + bool drv = (path[2] == '\0'); + bool vrt = (!drv); // will be checked below + char namestr[32], datestr[32], attrstr[128], sizestr[192]; FILINFO fno; u8 new_attrib; - char namestr[32], datestr[32], attrstr[128], sizestr[64]; - drive = (path[2] == '\0'); + // create truncated name string 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", + // preparations: create file info, date string + if (!drv) { + if (fvx_stat(path, &fno) != FR_OK) return 1; + vrt = (fno.fattrib & AM_VRT); + new_attrib = fno.fattrib; + snprintf(datestr, 64, "%s: %04d-%02d-%02d %02d:%02d:%02d\n", (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 - ); + (fno.ftime >> 11) & 0x1F, (fno.ftime >> 5) & 0x3F, (fno.ftime & 0x1F) << 1); + } else { + *datestr = '\0'; + *attrstr = '\0'; + new_attrib = 0; + } - new_attrib = fno.fattrib; + // create size string + if (drv || (fno.fattrib & AM_DIR)) { // for dirs and drives + char bytestr[32]; + u64 tsize = 0; + u32 tdirs = 0; + u32 tfiles = 0; - if (fno.fattrib & AM_DIR) { - u64 tsize = 0; - u32 tdirs = 0; - u32 tfiles = 0; + // this may take a while... + ShowString("Analyzing %s, please wait...", drv ? "drive" : "dir"); + if (!DirInfo(path, &tsize, &tdirs, &tfiles)) + return 1; + FormatBytes(bytestr, tsize); - if (!DirInfo(path, &tsize, &tdirs, &tfiles)) - return 1; - - FormatBytes(bytestr, tsize); - snprintf(sizestr, 64, "%lu files & %lu subdirs\n%s total space", + if (drv) { // drive specific + char freestr[32], drvsstr[32], usedstr[32]; + FormatBytes(freestr, GetFreeSpace(path)); + FormatBytes(drvsstr, GetTotalSpace(path)); + FormatBytes(usedstr, GetTotalSpace(path) - GetFreeSpace(path)); + snprintf(sizestr, 192, "%lu files & %lu subdirs\n%s total size\n \nspace free: %s\nspace used: %s\nspace total: %s", + tfiles, tdirs, bytestr, freestr, usedstr, drvsstr); + } else { // dir specific + snprintf(sizestr, 192, "%lu files & %lu subdirs\n%s total size", tfiles, tdirs, bytestr); - } else { - FormatBytes(bytestr, fno.fsize); - snprintf(sizestr, 64, "filesize: %s byte", bytestr); } + } else { // for files + char bytestr[32]; + FormatBytes(bytestr, fno.fsize); + snprintf(sizestr, 64, "filesize: %s byte", bytestr); } while(true) { - const bool vrt = (!drive) && (fno.fattrib & AM_VRT); - - if (!drive) { + if (!drv) { snprintf(attrstr, 128, + " \n" "[%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)" + vrt ? "" : " \n(\x18\x19\x1A\x1B to change attributes)\n" ); } ShowString( - "%s\n" // name - " \n" - "%s\n" // size - "%s\n" // date - " \n" - "%s\n" // attr - " \n" - "%s\n", // options - namestr, sizestr, datestr, attrstr, - (drive || vrt || (new_attrib == fno.fattrib)) ? "( to continue)" : "( to apply, to cancel)" + "%s\n \n" // name + "%s" // date (not for drives) + "%s\n" // size + "%s \n" // attr (not for drives) + "%s\n", // options + namestr, datestr, sizestr, attrstr, + (drv || vrt || (new_attrib == fno.fattrib)) ? "( to continue)" : "( to apply, to cancel)" ); 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(path, new_attrib & mask, mask)) { - ShowPrompt(false, "%s\nFailed to set attributes!", namestr); + if (!drv && !vrt) { + const u8 mask = (AM_RDO | AM_HID | AM_SYS | AM_ARC); + bool apply = (new_attrib != fno.fattrib) && (pad_state & BUTTON_A); + if (apply && !PathAttr(path, new_attrib & mask, mask)) { + ShowPrompt(false, "%s\nFailed to set attributes!", namestr); + } } ClearScreenF(true, false, COLOR_STD_BG); return 0; - } else if (vrt) continue; - - switch (pad_state & BUTTON_ARROW) { - case BUTTON_UP: - new_attrib ^= AM_RDO; - break; - case BUTTON_DOWN: - new_attrib ^= AM_HID; - break; - case BUTTON_RIGHT: - new_attrib ^= AM_SYS; - break; - case BUTTON_LEFT: - new_attrib ^= AM_ARC; - break; - default: - continue; } - break; + + if (!drv && !vrt && (pad_state & BUTTON_ARROW)) { + switch (pad_state & BUTTON_ARROW) { + case BUTTON_UP: + new_attrib ^= AM_RDO; + break; + case BUTTON_DOWN: + new_attrib ^= AM_HID; + break; + case BUTTON_RIGHT: + new_attrib ^= AM_SYS; + break; + case BUTTON_LEFT: + new_attrib ^= AM_ARC; + break; + } + break; + } } } }