forked from Mirror/GodMode9
Added ability to rename files
This commit is contained in:
parent
40ea11d778
commit
9f562dbd39
111
source/draw.c
111
source/draw.c
@ -264,6 +264,117 @@ bool ShowUnlockSequence(u32 seqlvl, const char *format, ...) {
|
|||||||
return (lvl >= len);
|
return (lvl >= len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ShowInputPrompt(char* inputstr, u32 max_size, const char *format, ...) {
|
||||||
|
const char* alphabet = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz(){}[]'`^,~!@#$%&0123456789=+-_.";
|
||||||
|
const u32 alphabet_size = strnlen(alphabet, 256);
|
||||||
|
const u32 input_shown = 22;
|
||||||
|
const u32 fast_scroll = 4;
|
||||||
|
|
||||||
|
u32 str_width, str_height;
|
||||||
|
u32 x, y;
|
||||||
|
|
||||||
|
char str[512] = {}; // 512 should be more than enough
|
||||||
|
va_list va;
|
||||||
|
|
||||||
|
va_start(va, format);
|
||||||
|
vsnprintf(str, 512, format, va);
|
||||||
|
va_end(va);
|
||||||
|
|
||||||
|
// check / fix up the inputstring if required
|
||||||
|
if (max_size < 2) return false; // catching this, too
|
||||||
|
if (*inputstr == '\0') snprintf(inputstr, 2, "%c", alphabet[0]); // set the string if it is not set
|
||||||
|
|
||||||
|
str_width = GetDrawStringWidth(str);
|
||||||
|
str_height = GetDrawStringHeight(str) + (8*10);
|
||||||
|
if (str_width < 24) str_width = 24;
|
||||||
|
x = (str_width >= SCREEN_WIDTH_TOP) ? 0 : (SCREEN_WIDTH_TOP - str_width) / 2;
|
||||||
|
y = (str_height >= SCREEN_HEIGHT) ? 0 : (SCREEN_HEIGHT - str_height) / 2;
|
||||||
|
|
||||||
|
ClearScreenF(true, false, COLOR_STD_BG);
|
||||||
|
DrawStringF(true, x, y, COLOR_STD_FONT, COLOR_STD_BG, str);
|
||||||
|
DrawStringF(true, x + 8, y + str_height - 38, COLOR_STD_FONT, COLOR_STD_BG, "R - (\x18\x19) fast scroll\nL - clear string\nX - remove char\nY - insert char");
|
||||||
|
|
||||||
|
int cursor_s = 0;
|
||||||
|
int cursor_a = -1;
|
||||||
|
int scroll = 0;
|
||||||
|
bool ret = false;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
u32 inputstr_size = strnlen(inputstr, max_size - 1);
|
||||||
|
if (cursor_s < scroll) scroll = cursor_s;
|
||||||
|
else if (cursor_s - scroll >= input_shown) scroll = cursor_s - input_shown + 1;
|
||||||
|
DrawStringF(true, x, y + str_height - 68, COLOR_STD_FONT, COLOR_STD_BG, "%c%-*.*s%c%-*.*s\n%-*.*s^%-*.*s",
|
||||||
|
(scroll) ? '<' : '|',
|
||||||
|
(inputstr_size > input_shown) ? input_shown : inputstr_size,
|
||||||
|
(inputstr_size > input_shown) ? input_shown : inputstr_size,
|
||||||
|
inputstr + scroll,
|
||||||
|
(inputstr_size - scroll > input_shown) ? '>' : '|',
|
||||||
|
(inputstr_size > input_shown) ? 0 : input_shown - inputstr_size,
|
||||||
|
(inputstr_size > input_shown) ? 0 : input_shown - inputstr_size,
|
||||||
|
"",
|
||||||
|
1 + cursor_s - scroll,
|
||||||
|
1 + cursor_s - scroll,
|
||||||
|
"",
|
||||||
|
input_shown - (cursor_s - scroll),
|
||||||
|
input_shown - (cursor_s - scroll),
|
||||||
|
""
|
||||||
|
);
|
||||||
|
if (cursor_a < 0) {
|
||||||
|
for (cursor_a = alphabet_size - 1; (cursor_a > 0) && (alphabet[cursor_a] != inputstr[cursor_s]); cursor_a--);
|
||||||
|
}
|
||||||
|
u32 pad_state = InputWait();
|
||||||
|
if (pad_state & BUTTON_A) {
|
||||||
|
ret = true;
|
||||||
|
break;
|
||||||
|
} else if (pad_state & BUTTON_B) {
|
||||||
|
break;
|
||||||
|
} else if (pad_state & BUTTON_L1) {
|
||||||
|
cursor_a = 0;
|
||||||
|
cursor_s = 0;
|
||||||
|
inputstr[0] = alphabet[0];
|
||||||
|
inputstr[1] = '\0';
|
||||||
|
} else if (pad_state & BUTTON_X) {
|
||||||
|
if (inputstr_size > 1) {
|
||||||
|
inputstr_size--;
|
||||||
|
memmove(&inputstr[cursor_s], &inputstr[cursor_s + 1], max_size - (cursor_s + 1));
|
||||||
|
if (cursor_s >= inputstr_size) {
|
||||||
|
cursor_s--;
|
||||||
|
cursor_a = -1;
|
||||||
|
}
|
||||||
|
} else inputstr[0] = alphabet[0];
|
||||||
|
} else if (pad_state & BUTTON_Y) {
|
||||||
|
if (inputstr_size < max_size - 1) {
|
||||||
|
inputstr_size--;
|
||||||
|
memmove(&inputstr[cursor_s + 1], &inputstr[cursor_s], max_size - (cursor_s + 1));
|
||||||
|
inputstr[cursor_s] = alphabet[0];
|
||||||
|
cursor_a = 0;
|
||||||
|
} else inputstr[0] = alphabet[0];
|
||||||
|
} else if (pad_state & BUTTON_UP) {
|
||||||
|
cursor_a += (pad_state & BUTTON_R1) ? fast_scroll : 1;
|
||||||
|
cursor_a = cursor_a % alphabet_size;
|
||||||
|
inputstr[cursor_s] = alphabet[cursor_a];
|
||||||
|
} else if (pad_state & BUTTON_DOWN) {
|
||||||
|
cursor_a -= (pad_state & BUTTON_R1) ? fast_scroll : 1;
|
||||||
|
if (cursor_a < 0) cursor_a = alphabet_size + cursor_a;
|
||||||
|
inputstr[cursor_s] = alphabet[cursor_a];
|
||||||
|
} else if (pad_state & BUTTON_LEFT) {
|
||||||
|
if (cursor_s > 0) cursor_s--;
|
||||||
|
cursor_a = -1;
|
||||||
|
} else if (pad_state & BUTTON_RIGHT) {
|
||||||
|
if (cursor_s < max_size - 2) cursor_s++;
|
||||||
|
if (cursor_s >= inputstr_size) {
|
||||||
|
inputstr[cursor_s] = alphabet[0];
|
||||||
|
inputstr[cursor_s+1] = '\0';
|
||||||
|
}
|
||||||
|
cursor_a = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ClearScreenF(true, false, COLOR_STD_BG);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
bool ShowProgress(u64 current, u64 total, const char* opstr)
|
bool ShowProgress(u64 current, u64 total, const char* opstr)
|
||||||
{
|
{
|
||||||
static u32 last_prog_width = 0;
|
static u32 last_prog_width = 0;
|
||||||
|
@ -70,4 +70,5 @@ void FormatBytes(char* str, u64 bytes);
|
|||||||
|
|
||||||
bool ShowPrompt(bool ask, const char *format, ...);
|
bool ShowPrompt(bool ask, const char *format, ...);
|
||||||
bool ShowUnlockSequence(u32 seqlvl, const char *format, ...);
|
bool ShowUnlockSequence(u32 seqlvl, const char *format, ...);
|
||||||
|
bool ShowInputPrompt(char* inputstr, u32 max_size, const char *format, ...);
|
||||||
bool ShowProgress(u64 current, u64 total, const char* opstr);
|
bool ShowProgress(u64 current, u64 total, const char* opstr);
|
||||||
|
10
source/fs.c
10
source/fs.c
@ -288,6 +288,16 @@ bool PathDelete(const char* path) {
|
|||||||
return PathDeleteWorker(fpath);
|
return PathDeleteWorker(fpath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool PathRename(const char* path, const char* newname) {
|
||||||
|
char npath[256]; // 256 is the maximum length of a full path
|
||||||
|
char* oldname = strrchr(path, '/');
|
||||||
|
if (!oldname) return false;
|
||||||
|
oldname++;
|
||||||
|
strncpy(npath, path, oldname - path);
|
||||||
|
strncpy(npath + (oldname - path), newname, strnlen(newname, 255 - (oldname - path)));
|
||||||
|
return (f_rename(path, npath) == FR_OK);
|
||||||
|
}
|
||||||
|
|
||||||
void CreateScreenshot() {
|
void CreateScreenshot() {
|
||||||
const u8 bmp_header[54] = {
|
const u8 bmp_header[54] = {
|
||||||
0x42, 0x4D, 0x36, 0xCA, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
|
0x42, 0x4D, 0x36, 0xCA, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
|
||||||
|
@ -49,6 +49,9 @@ bool PathCopy(const char* destdir, const char* orig);
|
|||||||
/** Recursively delete a file or directory **/
|
/** Recursively delete a file or directory **/
|
||||||
bool PathDelete(const char* path);
|
bool PathDelete(const char* path);
|
||||||
|
|
||||||
|
/** Rename file / folder in path to new name **/
|
||||||
|
bool PathRename(const char* path, const char* newname);
|
||||||
|
|
||||||
/** Create a screenshot of the current framebuffer **/
|
/** Create a screenshot of the current framebuffer **/
|
||||||
void CreateScreenshot();
|
void CreateScreenshot();
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ void DrawUserInterface(const char* curr_path, DirEntry* curr_entry, DirStruct* c
|
|||||||
// bottom: inctruction block
|
// bottom: inctruction block
|
||||||
char instr[256];
|
char instr[256];
|
||||||
snprintf(instr, 256, "%s%s%s%s%s",
|
snprintf(instr, 256, "%s%s%s%s%s",
|
||||||
"GodMode9 Explorer v0.0.9\n", // generic start part
|
"GodMode9 Explorer v0.1.1\n", // generic start part
|
||||||
(*curr_path) ? ((clipboard->n_entries == 0) ? "L - MARK files (use with \x18\x19\x1A\x1B)\nX - DELETE / [+R] RENAME file(s)\nY - COPY file(s) / [+R] CREATE dir\n" :
|
(*curr_path) ? ((clipboard->n_entries == 0) ? "L - MARK files (use with \x18\x19\x1A\x1B)\nX - DELETE / [+R] RENAME file(s)\nY - COPY file(s) / [+R] CREATE dir\n" :
|
||||||
"L - MARK files (use with \x18\x19\x1A\x1B)\nX - DELETE / [+R] RENAME file(s)\nY - PASTE file(s) / [+R] CREATE dir\n") :
|
"L - MARK files (use with \x18\x19\x1A\x1B)\nX - DELETE / [+R] RENAME file(s)\nY - PASTE file(s) / [+R] CREATE dir\n") :
|
||||||
((GetWritePermissions() <= 1) ? "X - Unlock EmuNAND writing\nY - Unlock SysNAND writing\n" :
|
((GetWritePermissions() <= 1) ? "X - Unlock EmuNAND writing\nY - Unlock SysNAND writing\n" :
|
||||||
@ -166,7 +166,7 @@ u32 GodMode() {
|
|||||||
} else { // type == T_FAT_DIR || type == T_VRT_ROOT
|
} else { // type == T_FAT_DIR || type == T_VRT_ROOT
|
||||||
strncpy(current_path, current_dir->entry[cursor].path, 256);
|
strncpy(current_path, current_dir->entry[cursor].path, 256);
|
||||||
}
|
}
|
||||||
GetDirContents(current_dir, current_path);
|
GetDirContents(current_dir, current_path); // maybe start cursor at 1 instead of 0? (!!!)
|
||||||
cursor = 0;
|
cursor = 0;
|
||||||
} else if (pad_state & BUTTON_B) { // one level down
|
} else if (pad_state & BUTTON_B) { // one level down
|
||||||
char* last_slash = strrchr(current_path, '/');
|
char* last_slash = strrchr(current_path, '/');
|
||||||
@ -270,7 +270,21 @@ u32 GodMode() {
|
|||||||
ClearScreenF(true, false, COLOR_STD_BG);
|
ClearScreenF(true, false, COLOR_STD_BG);
|
||||||
}
|
}
|
||||||
} else { // switched command set
|
} else { // switched command set
|
||||||
// not implemented yet
|
if (pad_state & BUTTON_X) { // rename a file
|
||||||
|
char newname[256];
|
||||||
|
char namestr[20+1];
|
||||||
|
TruncateString(namestr, current_dir->entry[cursor].name, 20, 12);
|
||||||
|
snprintf(newname, 255, current_dir->entry[cursor].name);
|
||||||
|
if (ShowInputPrompt(newname, 256, "Rename %s?\nEnter new name below.", namestr)) {
|
||||||
|
if (!PathRename(current_dir->entry[cursor].path, newname))
|
||||||
|
ShowPrompt(false, "Failed renaming path:\n%s", namestr);
|
||||||
|
else GetDirContents(current_dir, current_path);
|
||||||
|
}
|
||||||
|
} else if (pad_state & BUTTON_Y) { // create a folder
|
||||||
|
char dirname[256];
|
||||||
|
snprintf(dirname, 255, "newdir");
|
||||||
|
ShowInputPrompt(dirname, 256, "Create a new folder here?\nEnter name below.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pad_state & BUTTON_START) {
|
if (pad_state & BUTTON_START) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user