forked from Mirror/GodMode9
Rewrote the dir/file/drive info dialogue
This commit is contained in:
parent
dc746f69c5
commit
0ec73520e6
@ -947,122 +947,119 @@ u32 StandardCopy(u32* cursor, u32* scroll) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
u32 DirFileAttrMenu(const char* path, const char *name) {
|
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;
|
FILINFO fno;
|
||||||
u8 new_attrib;
|
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);
|
TruncateString(namestr, name, 31, 8);
|
||||||
|
|
||||||
if (drive) {
|
// preparations: create file info, date string
|
||||||
char freestr[32], drvsstr[32], usedstr[32];
|
if (!drv) {
|
||||||
datestr[0] = attrstr[0] = '\0';
|
if (fvx_stat(path, &fno) != FR_OK) return 1;
|
||||||
|
vrt = (fno.fattrib & AM_VRT);
|
||||||
FormatBytes(freestr, GetFreeSpace(path));
|
new_attrib = fno.fattrib;
|
||||||
FormatBytes(drvsstr, GetTotalSpace(path));
|
snprintf(datestr, 64, "%s: %04d-%02d-%02d %02d:%02d:%02d\n",
|
||||||
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",
|
(fno.fattrib & AM_DIR) ? "created" : "modified",
|
||||||
1980 + ((fno.fdate >> 9) & 0x7F), (fno.fdate >> 5) & 0xF, fno.fdate & 0x1F,
|
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) {
|
// this may take a while...
|
||||||
u64 tsize = 0;
|
ShowString("Analyzing %s, please wait...", drv ? "drive" : "dir");
|
||||||
u32 tdirs = 0;
|
if (!DirInfo(path, &tsize, &tdirs, &tfiles))
|
||||||
u32 tfiles = 0;
|
return 1;
|
||||||
|
FormatBytes(bytestr, tsize);
|
||||||
|
|
||||||
if (!DirInfo(path, &tsize, &tdirs, &tfiles))
|
if (drv) { // drive specific
|
||||||
return 1;
|
char freestr[32], drvsstr[32], usedstr[32];
|
||||||
|
FormatBytes(freestr, GetFreeSpace(path));
|
||||||
FormatBytes(bytestr, tsize);
|
FormatBytes(drvsstr, GetTotalSpace(path));
|
||||||
snprintf(sizestr, 64, "%lu files & %lu subdirs\n%s total space",
|
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);
|
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) {
|
while(true) {
|
||||||
const bool vrt = (!drive) && (fno.fattrib & AM_VRT);
|
if (!drv) {
|
||||||
|
|
||||||
if (!drive) {
|
|
||||||
snprintf(attrstr, 128,
|
snprintf(attrstr, 128,
|
||||||
|
" \n"
|
||||||
"[%c] %sread-only [%c] %shidden\n"
|
"[%c] %sread-only [%c] %shidden\n"
|
||||||
"[%c] %ssystem [%c] %sarchive\n"
|
"[%c] %ssystem [%c] %sarchive\n"
|
||||||
"[%c] %svirtual\n"
|
"[%c] %svirtual\n"
|
||||||
"\n"
|
|
||||||
"%s",
|
"%s",
|
||||||
(new_attrib & AM_RDO) ? 'X' : ' ', vrt ? "" : "\x18 ",
|
(new_attrib & AM_RDO) ? 'X' : ' ', vrt ? "" : "\x18 ",
|
||||||
(new_attrib & AM_HID) ? 'X' : ' ', vrt ? "" : "\x19 ",
|
(new_attrib & AM_HID) ? 'X' : ' ', vrt ? "" : "\x19 ",
|
||||||
(new_attrib & AM_SYS) ? 'X' : ' ', vrt ? "" : "\x1A ",
|
(new_attrib & AM_SYS) ? 'X' : ' ', vrt ? "" : "\x1A ",
|
||||||
(new_attrib & AM_ARC) ? 'X' : ' ', vrt ? "" : "\x1B ",
|
(new_attrib & AM_ARC) ? 'X' : ' ', vrt ? "" : "\x1B ",
|
||||||
vrt ? 'X' : ' ', vrt ? "" : " ",
|
vrt ? 'X' : ' ', vrt ? "" : " ",
|
||||||
vrt ? "" : "(\x18\x19\x1A\x1B to change attributes)"
|
vrt ? "" : " \n(\x18\x19\x1A\x1B to change attributes)\n"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
ShowString(
|
ShowString(
|
||||||
"%s\n" // name
|
"%s\n \n" // name
|
||||||
" \n"
|
"%s" // date (not for drives)
|
||||||
"%s\n" // size
|
"%s\n" // size
|
||||||
"%s\n" // date
|
"%s \n" // attr (not for drives)
|
||||||
" \n"
|
"%s\n", // options
|
||||||
"%s\n" // attr
|
namestr, datestr, sizestr, attrstr,
|
||||||
" \n"
|
(drv || vrt || (new_attrib == fno.fattrib)) ? "(<A> to continue)" : "(<A> to apply, <B> to cancel)"
|
||||||
"%s\n", // options
|
|
||||||
namestr, sizestr, datestr, attrstr,
|
|
||||||
(drive || vrt || (new_attrib == fno.fattrib)) ? "(<A> to continue)" : "(<A> to apply, <B> to cancel)"
|
|
||||||
);
|
);
|
||||||
|
|
||||||
while(true) {
|
while(true) {
|
||||||
u32 pad_state = InputWait(0);
|
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)) {
|
if (pad_state & (BUTTON_A | BUTTON_B)) {
|
||||||
bool apply = !vrt && (new_attrib != fno.fattrib) && (pad_state & BUTTON_A);
|
if (!drv && !vrt) {
|
||||||
const u8 mask = (AM_RDO | AM_HID | AM_SYS | AM_ARC);
|
const u8 mask = (AM_RDO | AM_HID | AM_SYS | AM_ARC);
|
||||||
if (apply && !PathAttr(path, new_attrib & mask, mask)) {
|
bool apply = (new_attrib != fno.fattrib) && (pad_state & BUTTON_A);
|
||||||
ShowPrompt(false, "%s\nFailed to set attributes!", namestr);
|
if (apply && !PathAttr(path, new_attrib & mask, mask)) {
|
||||||
|
ShowPrompt(false, "%s\nFailed to set attributes!", namestr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ClearScreenF(true, false, COLOR_STD_BG);
|
ClearScreenF(true, false, COLOR_STD_BG);
|
||||||
return 0;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user