2020-05-01 23:50:08 +01:00
|
|
|
#include <string.h>
|
2020-03-17 23:41:09 +00:00
|
|
|
#include "menu.h"
|
|
|
|
#include "gfxutils.h"
|
|
|
|
#include "../common/types.h"
|
|
|
|
#include "../../utils/btn.h"
|
|
|
|
#include "../common/common.h"
|
|
|
|
#include "../../utils/util.h"
|
|
|
|
#include "../../mem/minerva.h"
|
2020-03-22 21:56:36 +00:00
|
|
|
#include "../../soc/gpio.h"
|
2020-05-01 21:42:49 +01:00
|
|
|
#include "../../hid/hid.h"
|
2020-05-02 12:05:06 +01:00
|
|
|
#include "../fs/fsutils.h"
|
2020-05-04 12:55:26 +01:00
|
|
|
#include "../utils/menuUtils.h"
|
2020-03-22 21:56:36 +00:00
|
|
|
|
|
|
|
extern void sd_unmount();
|
|
|
|
extern bool sd_inited;
|
2020-03-17 23:41:09 +00:00
|
|
|
|
2020-05-04 12:55:26 +01:00
|
|
|
#pragma GCC push_options
|
|
|
|
#pragma GCC optimize ("O2")
|
2020-05-02 12:05:06 +01:00
|
|
|
|
2020-05-04 12:55:26 +01:00
|
|
|
void _printentry(menu_entry *entry, bool highlighted, bool refresh, const char *path){
|
2020-05-20 01:28:43 +01:00
|
|
|
if (entry->isHide)
|
|
|
|
return;
|
|
|
|
|
2020-05-04 12:55:26 +01:00
|
|
|
u32 color = (entry->isMenu) ? entry->storage : ((entry->isDir) ? COLOR_WHITE : COLOR_VIOLET);
|
2020-05-02 12:05:06 +01:00
|
|
|
|
2020-05-04 12:55:26 +01:00
|
|
|
SWAPALLCOLOR((highlighted) ? COLOR_DEFAULT : color, (highlighted) ? color : COLOR_DEFAULT);
|
2020-03-17 23:41:09 +00:00
|
|
|
|
2020-05-04 12:55:26 +01:00
|
|
|
if (!(entry->isMenu))
|
|
|
|
gfx_printf("%c ", (entry->isDir) ? 30 : 31);
|
2020-03-17 23:41:09 +00:00
|
|
|
|
|
|
|
if (refresh)
|
2020-05-02 12:05:06 +01:00
|
|
|
gfx_printandclear(entry->name, 37, 720);
|
2020-03-17 23:41:09 +00:00
|
|
|
else
|
2020-05-02 12:05:06 +01:00
|
|
|
gfx_printlength(37, entry->name);
|
2020-03-17 23:41:09 +00:00
|
|
|
|
2020-05-04 12:55:26 +01:00
|
|
|
if (entry->property & (ISMENU | ISDIR))
|
2020-03-17 23:41:09 +00:00
|
|
|
gfx_printf("\n");
|
|
|
|
else {
|
2020-05-04 12:55:26 +01:00
|
|
|
if (entry->isNull){
|
|
|
|
u64 totalSize;
|
|
|
|
u32 sizeType = 0;
|
|
|
|
totalSize = fsutil_getfilesize(fsutil_getnextloc(path, entry->name));
|
|
|
|
|
|
|
|
while (totalSize > 1024){
|
|
|
|
totalSize /= 1024;
|
|
|
|
sizeType++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sizeType > 3)
|
|
|
|
sizeType = 3;
|
|
|
|
|
|
|
|
entry->size = sizeType;
|
|
|
|
entry->storage = totalSize;
|
|
|
|
SETBIT(entry->property, ISNULL, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
SWAPALLCOLOR(COLOR_BLUE, COLOR_DEFAULT);
|
2020-05-02 12:05:06 +01:00
|
|
|
gfx_printf("\a%4d", entry->storage);
|
2020-04-23 13:40:55 +01:00
|
|
|
gfx_con.fntsz = 8;
|
2020-05-04 12:55:26 +01:00
|
|
|
gfx_printf("\n\e%s\n", gfx_file_size_names[entry->size]);
|
2020-04-23 13:40:55 +01:00
|
|
|
gfx_con.fntsz = 16;
|
2020-03-17 23:41:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-01 23:50:08 +01:00
|
|
|
|
2020-05-01 21:42:49 +01:00
|
|
|
bool disableB = false;
|
2020-05-04 12:55:26 +01:00
|
|
|
int menu_make(menu_entry *entries, int amount, const char *toptext){
|
2020-05-20 01:28:43 +01:00
|
|
|
int currentpos = 0, offset = 0, delay = 300, minscreen = 0, calculatedamount = 0, cursub = 0, temp;
|
2020-05-02 12:05:06 +01:00
|
|
|
u32 scrolltimer, timer, sideY;
|
|
|
|
bool refresh = true;
|
2020-05-01 21:42:49 +01:00
|
|
|
Inputs *input = hidRead();
|
|
|
|
input->buttons = 0;
|
2020-03-17 23:41:09 +00:00
|
|
|
|
|
|
|
gfx_clearscreen();
|
|
|
|
|
2020-05-04 19:48:23 +01:00
|
|
|
calculatedamount = mu_countObjects(entries, amount, ISMENU);
|
2020-03-22 21:56:36 +00:00
|
|
|
|
2020-05-01 23:50:08 +01:00
|
|
|
gfx_con_setpos(0, 16);
|
2020-03-17 23:41:09 +00:00
|
|
|
|
|
|
|
SWAPCOLOR(COLOR_GREEN);
|
|
|
|
gfx_printlength(42, toptext);
|
|
|
|
RESETCOLOR;
|
|
|
|
|
2020-05-02 12:05:06 +01:00
|
|
|
gfx_sideSetY(48);
|
|
|
|
|
2020-05-01 23:50:08 +01:00
|
|
|
char *currentfolder = strrchr(toptext, '/');
|
|
|
|
if (currentfolder != NULL){
|
|
|
|
if (calculatedamount)
|
2020-05-02 12:05:06 +01:00
|
|
|
gfx_sideprintf("%d items in current dir\n\n", calculatedamount);
|
|
|
|
|
|
|
|
gfx_sideprintf("Current directory:\n");
|
|
|
|
|
2020-05-01 23:50:08 +01:00
|
|
|
if (*(currentfolder + 1) != 0)
|
|
|
|
currentfolder++;
|
|
|
|
SWAPCOLOR(COLOR_GREEN);
|
2020-05-02 12:05:06 +01:00
|
|
|
gfx_sideprintandclear(currentfolder, 28);
|
|
|
|
|
|
|
|
gfx_sideprintf("\n\n\n");
|
2020-05-01 23:50:08 +01:00
|
|
|
}
|
|
|
|
|
2020-05-20 01:28:43 +01:00
|
|
|
for (;;){
|
2020-05-01 23:50:08 +01:00
|
|
|
gfx_con_setpos(0, 48);
|
2020-03-17 23:41:09 +00:00
|
|
|
timer = get_tmr_ms();
|
|
|
|
|
2020-05-20 01:28:43 +01:00
|
|
|
if (!currentpos)
|
|
|
|
cursub = 1;
|
|
|
|
else if (currentpos == amount - 1)
|
|
|
|
cursub = -1;
|
|
|
|
else
|
|
|
|
cursub = 0;
|
|
|
|
|
|
|
|
while (entries[currentpos].property & (ISSKIP | ISHIDE))
|
|
|
|
currentpos += cursub;
|
|
|
|
|
2020-03-17 23:41:09 +00:00
|
|
|
|
2020-05-20 01:28:43 +01:00
|
|
|
if (currentpos > (minscreen + SCREENMAXOFFSET)){
|
|
|
|
offset += currentpos - (minscreen + SCREENMAXOFFSET);
|
|
|
|
minscreen += currentpos - (minscreen + SCREENMAXOFFSET);
|
2020-03-18 22:58:32 +00:00
|
|
|
refresh = true;
|
|
|
|
}
|
2020-05-20 01:28:43 +01:00
|
|
|
else if (currentpos < minscreen){
|
2020-03-18 22:58:32 +00:00
|
|
|
offset -= minscreen - currentpos;
|
2020-05-20 01:28:43 +01:00
|
|
|
minscreen -= minscreen - currentpos;
|
|
|
|
refresh = true;
|
2020-03-18 22:58:32 +00:00
|
|
|
}
|
2020-05-20 01:28:43 +01:00
|
|
|
|
2020-03-18 22:58:32 +00:00
|
|
|
|
2020-05-02 13:20:55 +01:00
|
|
|
if (refresh || currentfolder == NULL || !calculatedamount){
|
2020-05-20 01:28:43 +01:00
|
|
|
for (int i = 0 + offset; i < amount && i < SCREENMAXOFFSET + 1 + offset; i++)
|
|
|
|
_printentry(&entries[i], (i == currentpos), refresh, toptext);
|
2020-05-02 12:05:06 +01:00
|
|
|
}
|
|
|
|
else {
|
2020-05-20 01:28:43 +01:00
|
|
|
temp = (currentpos - minscreen > 0) ? 0 : 16;
|
|
|
|
gfx_con_setpos(0, 32 + temp + (currentpos - minscreen) * 16);
|
|
|
|
|
|
|
|
if (!temp)
|
2020-05-02 12:05:06 +01:00
|
|
|
_printentry(&entries[currentpos - 1], false, false, toptext);
|
|
|
|
|
|
|
|
_printentry(&entries[currentpos], true, false, toptext);
|
|
|
|
|
2020-05-20 01:28:43 +01:00
|
|
|
if (currentpos < MIN(amount - 1, minscreen + SCREENMAXOFFSET))
|
2020-05-02 12:05:06 +01:00
|
|
|
_printentry(&entries[currentpos + 1], false, false, toptext);
|
|
|
|
}
|
2020-03-17 23:41:09 +00:00
|
|
|
|
2020-05-01 23:50:08 +01:00
|
|
|
RESETCOLOR;
|
|
|
|
|
2020-05-20 01:28:43 +01:00
|
|
|
|
2020-05-02 12:05:06 +01:00
|
|
|
sideY = gfx_sideGetY();
|
2020-05-04 12:55:26 +01:00
|
|
|
if (!(entries[currentpos].isMenu)){
|
2020-05-02 12:05:06 +01:00
|
|
|
gfx_sideprintf("Current selection:\n");
|
2020-05-01 23:50:08 +01:00
|
|
|
SWAPCOLOR(COLOR_YELLOW);
|
2020-05-02 12:05:06 +01:00
|
|
|
gfx_sideprintandclear(entries[currentpos].name, 28);
|
2020-05-01 23:50:08 +01:00
|
|
|
RESETCOLOR;
|
2020-05-04 12:55:26 +01:00
|
|
|
gfx_sideprintf("Type: %s", (entries[currentpos].isDir) ? "Dir " : "File");
|
2020-05-02 12:05:06 +01:00
|
|
|
gfx_sideSetY(sideY);
|
2020-05-01 23:50:08 +01:00
|
|
|
}
|
|
|
|
else
|
2020-05-02 12:05:06 +01:00
|
|
|
gfx_boxGrey(800, sideY, 1279, sideY + 48, 0x1B);
|
2020-05-01 23:50:08 +01:00
|
|
|
|
|
|
|
gfx_con_setpos(0, 703);
|
2020-05-20 01:28:43 +01:00
|
|
|
SWAPALLCOLOR(COLOR_DEFAULT, COLOR_WHITE);
|
2020-05-02 12:05:06 +01:00
|
|
|
gfx_printf("Time taken for screen draw: %dms ", get_tmr_ms() - timer);
|
|
|
|
|
|
|
|
if (refresh)
|
2020-05-20 01:28:43 +01:00
|
|
|
gfx_drawScrollBar(minscreen, minscreen + SCREENMAXOFFSET, amount);
|
|
|
|
|
|
|
|
refresh = false;
|
|
|
|
|
2020-03-17 23:41:09 +00:00
|
|
|
|
2020-05-02 15:40:40 +01:00
|
|
|
while (hidRead()->buttons & (KEY_B | KEY_A));
|
2020-03-17 23:41:09 +00:00
|
|
|
|
2020-05-10 10:41:16 +01:00
|
|
|
scrolltimer = get_tmr_ms();
|
|
|
|
while (1){
|
2020-04-12 19:31:32 +01:00
|
|
|
if (sd_inited && !!gpio_read(GPIO_PORT_Z, GPIO_PIN_1)){
|
|
|
|
gfx_errDisplay("menu", ERR_SD_EJECTED, 0);
|
|
|
|
sd_unmount();
|
|
|
|
return -1;
|
2020-03-22 21:56:36 +00:00
|
|
|
}
|
|
|
|
|
2020-05-01 21:42:49 +01:00
|
|
|
input = hidRead();
|
2020-03-17 23:41:09 +00:00
|
|
|
|
2020-05-10 10:41:16 +01:00
|
|
|
if (!(input->buttons & (KEY_A | KEY_LDOWN | KEY_LUP | KEY_B | KEY_RUP | KEY_RDOWN))){
|
2020-03-17 23:41:09 +00:00
|
|
|
delay = 300;
|
2020-05-10 10:41:16 +01:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (input->buttons & (KEY_RDOWN | KEY_RUP)){
|
|
|
|
delay = 1;
|
|
|
|
input->Lup = input->Rup;
|
|
|
|
input->Ldown = input->Rdown;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (delay < 300){
|
|
|
|
if (scrolltimer + delay < get_tmr_ms()){
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
break;
|
|
|
|
}
|
2020-03-17 23:41:09 +00:00
|
|
|
}
|
|
|
|
|
2020-05-10 10:41:16 +01:00
|
|
|
|
2020-05-20 01:28:43 +01:00
|
|
|
if (input->a){
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (input->b && !disableB){
|
2020-05-01 21:42:49 +01:00
|
|
|
currentpos = 0;
|
|
|
|
break;
|
|
|
|
}
|
2020-05-02 12:05:06 +01:00
|
|
|
|
2020-05-20 01:28:43 +01:00
|
|
|
|
|
|
|
if (delay > 46)
|
|
|
|
delay -= 45;
|
|
|
|
|
|
|
|
|
|
|
|
if (input->Lup && currentpos > 0)
|
|
|
|
cursub = -1;
|
|
|
|
else if (input->Ldown && currentpos < amount - 1)
|
|
|
|
cursub = 1;
|
|
|
|
else
|
|
|
|
cursub = 0;
|
|
|
|
|
|
|
|
if (cursub){
|
|
|
|
do {
|
|
|
|
currentpos += cursub;
|
|
|
|
} while (currentpos < amount - 1 && currentpos > 0 && entries[currentpos].property & (ISSKIP | ISHIDE));
|
|
|
|
}
|
2020-03-17 23:41:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
minerva_periodic_training();
|
|
|
|
//return (mode) ? currentpos : entries[currentpos].property;
|
|
|
|
return currentpos;
|
2020-05-04 12:55:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#pragma GCC pop_options
|