📄 filer.c
字号:
for(i=0; i<KEY_LEN; i++)
drawChar(KEY[i],
KEY_X+2+4 + (i%WFONTS+1)*20 - 12,
KEY_Y+16 + (i/WFONTS)*8,
setting->color[3]);
printXY("OK CANCEL",
KEY_X+2+4 + 20 - 12,
KEY_Y+16 + HFONTS*8,
setting->color[3], TRUE);
if(sel<=WFONTS*HFONTS)
x = KEY_X+2+4 + (sel%WFONTS+1)*20 - 20;
else
x = KEY_X+2+4 + 25*8;
y = KEY_Y+16 + (sel/WFONTS)*8;
drawChar(127, x, y, setting->color[3]);
// 憖嶌愢柧
x = SCREEN_MARGIN;
y = SCREEN_HEIGHT-SCREEN_MARGIN-FONT_HEIGHT;
itoSprite(setting->color[0],
0,
y/2,
SCREEN_WIDTH,
y/2+8, 0);
printXY("仜:OK 亊:Back L1:Left R1:Right START:Enter",
x, y/2, setting->color[2], TRUE);
drawScr();
}
return 0;
}
///////////////////////////////////////////////////////////////////////////
// 僼傽僀儖儕僗僩愝掕
int setFileList(const char *path, const char *ext, FILEINFO *files, int cnfmode)
{
char *p;
int nfiles, i, j, ret;
// 僼傽僀儖儕僗僩愝掕
if(path[0]==0){
strcpy(files[0].name, "mc0:");
strcpy(files[1].name, "mc1:");
strcpy(files[2].name, "hdd0:");
strcpy(files[3].name, "cdfs:");
strcpy(files[4].name, "mass:");
files[0].attr = FIO_S_IFDIR;
files[1].attr = FIO_S_IFDIR;
files[2].attr = FIO_S_IFDIR;
files[3].attr = FIO_S_IFDIR;
files[4].attr = FIO_S_IFDIR;
nfiles = 5;
for(i=0; i<nfiles; i++)
files[i].title[0]=0;
if(cnfmode){
strcpy(files[nfiles].name, "MISC");
files[nfiles].attr = FIO_S_IFDIR;
nfiles++;
}
vfreeSpace=FALSE;
}else if(!strcmp(path, "MISC/")){
strcpy(files[0].name, "..");
strcpy(files[1].name, "FileBrowser");
strcpy(files[2].name, "PS2Browser");
strcpy(files[3].name, "PS2Disc");
files[0].attr = FIO_S_IFDIR;
files[1].attr = FIO_S_IFREG;
files[2].attr = FIO_S_IFREG;
files[3].attr = FIO_S_IFREG;
nfiles = 4;
for(i=0; i<nfiles; i++)
files[i].title[0]=0;
}else{
strcpy(files[0].name, "..");
files[0].attr = FIO_S_IFDIR;
nfiles = getDir(path, &files[1]) + 1;
if(strcmp(ext,"*")){
for(i=j=1; i<nfiles; i++){
if(files[i].attr & FIO_S_IFDIR)
files[j++] = files[i];
else{
p = strrchr(files[i].name, '.');
if(p!=NULL && !stricmp(ext,p+1))
files[j++] = files[i];
}
}
nfiles = j;
}
if(title){
for(i=1; i<nfiles; i++){
ret = getGameTitle(path, &files[i], files[i].title);
if(ret<0) files[i].title[0]=0;
}
}
if(!strcmp(path, "hdd0:/"))
vfreeSpace=FALSE;
else if(nfiles>1)
sort(&files[1], 0, nfiles-2);
}
return nfiles;
}
////////////////////////////////////////////////////////////////////////
// 擟堄偺僼傽僀儖僷僗傪曉偡
void getFilePath(char *out, int cnfmode)
{
char path[MAX_PATH], oldFolder[MAX_PATH],
msg0[MAX_PATH], msg1[MAX_PATH],
tmp[MAX_PATH], ext[8], *p;
uint64 color;
FILEINFO files[MAX_ENTRY];
int nfiles=0, sel=0, top=0, rows=MAX_ROWS;
int cd=TRUE, up=FALSE, pushed=TRUE;
int nofnt=FALSE;
int x, y, y0, y1;
int i, ret, fd;
size_t size;
if(cnfmode) strcpy(ext, "elf");
else strcpy(ext, "*");
strcpy(path, LastDir);
mountedParty[0][0]=0;
mountedParty[1][0]=0;
clipPath[0] = 0;
nclipFiles = 0;
cut = 0;
title=FALSE;
while(1){
waitPadReady(0, 0);
if(readpad()){
if(new_pad) pushed=TRUE;
if(new_pad & PAD_UP)
sel--;
else if(new_pad & PAD_DOWN)
sel++;
else if(new_pad & PAD_LEFT)
sel-=rows/2;
else if(new_pad & PAD_RIGHT)
sel+=rows/2;
else if(new_pad & PAD_TRIANGLE)
up=TRUE;
else if(new_pad & PAD_CIRCLE){
if(files[sel].attr & FIO_S_IFDIR){
if(!strcmp(files[sel].name,".."))
up=TRUE;
else {
strcat(path, files[sel].name);
strcat(path, "/");
cd=TRUE;
}
}else{
sprintf(out, "%s%s", path, files[sel].name);
if(checkELFheader(out)<0){
pushed=FALSE;
sprintf(msg0, "This file isn't ELF.");
}else{
strcpy(LastDir, path);
break;
}
}
}
if(cnfmode){
// 僼傽僀儖儅僗僋愗傝懼偊
if(new_pad & PAD_SQUARE) {
if(!strcmp(ext,"*")) strcpy(ext, "elf");
else strcpy(ext, "*");
cd=TRUE;
// 儊僀儞儊僯儏乕偵栠傞
} else if(new_pad & PAD_CROSS){
if(mountedParty[0][0]!=0) fileXioUmount("pfs0:");
return;
}
}else{
// 儊僯儏乕
if(new_pad & PAD_R1) {
ret = menu(path, files[sel].name);
// 僋儕僢僾儃乕僪偵僐僺乕
if(ret==COPY || ret==CUT){
strcpy(clipPath, path);
if(nmarks>0){
for(i=nclipFiles=0; i<nfiles; i++)
if(marks[i])
clipFiles[nclipFiles++]=files[i];
}else{
clipFiles[0]=files[sel];
nclipFiles = 1;
}
sprintf(msg0, "Copied to the Clipboard");
pushed=FALSE;
if(ret==CUT) cut=TRUE;
else cut=FALSE;
// 僨儕乕僩
} else if(ret==DELETE){
if(nmarks==0){
if(title && files[sel].title[0])
sprintf(tmp,"%s",files[sel].title);
else{
sprintf(tmp,"%s",files[sel].name);
if(files[sel].attr & FIO_S_IFDIR)
strcat(tmp,"/");
}
strcat(tmp, "\nDelete?");
ret = ynDialog(tmp);
}else
ret = ynDialog("Mark Files Delete?");
if(ret>0){
if(nmarks==0){
strcpy(tmp, files[sel].name);
if(files[sel].attr & FIO_S_IFDIR) strcat(tmp,"/");
strcat(tmp, " deleting");
drawMsg(tmp);
ret=delete(path, &files[sel]);
}else{
for(i=0; i<nfiles; i++){
if(marks[i]){
strcpy(tmp, files[i].name);
if(files[i].attr & FIO_S_IFDIR) strcat(tmp,"/");
strcat(tmp, " deleting");
drawMsg(tmp);
ret=delete(path, &files[i]);
if(ret<0) break;
}
}
}
if(ret>=0) cd=TRUE;
else{
strcpy(msg0, "Delete Failed");
pushed = FALSE;
}
}
// 儕僱乕儉
} else if(ret==RENAME){
strcpy(tmp, files[sel].name);
if(keyboard(tmp, 36)>=0){
if(Rename(path, &files[sel], tmp)<0){
pushed=FALSE;
strcpy(msg0, "Rename Failed");
}else
cd=TRUE;
}
// 僋儕僢僾儃乕僪偐傜儁乕僗僩
} else if(ret==PASTE){
drawMsg("Pasting...");
ret=paste(path);
if(ret < 0){
strcpy(msg0, "Paste Failed");
pushed = FALSE;
}else
if(cut) nclipFiles=0;
cd=TRUE;
// 怴婯僼僅儖僟嶌惉
} else if(ret==NEWDIR){
tmp[0]=0;
if(keyboard(tmp, 36)>=0){
ret = newdir(path, tmp);
if(ret == -17){
strcpy(msg0, "directory already exists");
pushed=FALSE;
}else if(ret < 0){
strcpy(msg0, "NewDir Failed");
pushed=FALSE;
}else{
strcat(path, tmp);
strcat(path, "/");
cd=TRUE;
}
}
// 僒僀僘昞帵
} else if(ret==GETSIZE){
drawMsg("Checking Size...");
if(nmarks==0){
size=getFileSize(path, &files[sel]);
}else{
for(i=size=0; i<nfiles; i++){
if(marks[i])
size+=getFileSize(path, &files[i]);
if(size<0) size=-1;
}
}
if(size<0){
strcpy(msg0, "Paste Failed");
}else{
if(size >= 1024*1024)
sprintf(msg0, "SIZE = %.1fMB", (double)size/1024/1024);
else if(size >= 1024)
sprintf(msg0, "SIZE = %.1fKB", (double)size/1024);
else
sprintf(msg0, "SIZE = %dB", size);
}
pushed = FALSE;
}
// 儅乕僋
} else if(new_pad & PAD_CROSS) {
if(sel!=0 && path[0]!=0 && strcmp(path,"hdd0:/")){
if(marks[sel]){
marks[sel]=FALSE;
nmarks--;
}else{
marks[sel]=TRUE;
nmarks++;
}
}
sel++;
// 儅乕僋斀揮
} else if(new_pad & PAD_SQUARE) {
if(path[0]!=0 && strcmp(path,"hdd0:/")){
for(i=1; i<nfiles; i++){
if(marks[i]){
marks[i]=FALSE;
nmarks--;
}else{
marks[i]=TRUE;
nmarks++;
}
}
}
// 僞僀僩儖昞帵愗傝懼偊
} else if(new_pad & PAD_L1) {
if(elisaFnt==NULL && nofnt==FALSE){
sprintf(tmp, "%s%s", LaunchElfDir, "ELISA100.FNT");
if(!strncmp(tmp, "cdrom", 5)) strcat(tmp, ";1");
fd = fioOpen(tmp, O_RDONLY);
if(fd>0){
ret = fioLseek(fd,0,SEEK_END);
if(ret==55016){
elisaFnt = (char*)malloc(ret);
fioLseek(fd,0,SEEK_SET);
fioRead(fd, elisaFnt, ret);
fioClose(fd);
}
}else
nofnt = TRUE;
}
title = !title;
if(elisaFnt!=NULL){
if(title) rows=19;
else rows=MAX_ROWS;
}
cd=TRUE;
// 儊僀儞儊僯儏乕偵栠傞
} else if(new_pad & PAD_SELECT){
if(mountedParty[0][0]!=0) fileXioUmount("pfs0:");
if(mountedParty[1][0]!=0) fileXioUmount("pfs1:");
return;
}
}
}
// 忋埵僼僅儖僟堏摦
if(up){
if((p=strrchr(path, '/'))!=NULL)
*p = 0;
if((p=strrchr(path, '/'))!=NULL){
p++;
strcpy(oldFolder, p);
*p = 0;
}else{
strcpy(oldFolder, path);
path[0] = 0;
}
cd=TRUE;
}
// 僼僅儖僟堏摦
if(cd){
nfiles = setFileList(path, ext, files, cnfmode);
// 嬻偒梕検庢摼
if(!cnfmode){
if(!strncmp(path, "mc", 2)){
mcGetInfo(path[2]-'0', 0, NULL, &mcfreeSpace, NULL);
}else if(!strncmp(path,"hdd",3)&&strcmp(path,"hdd0:/")){
freeSpace =
fileXioDevctl("pfs0:",PFSCTL_GET_ZONE_FREE,NULL,0,NULL,0)*fileXioDevctl("pfs0:",PFSCTL_GET_ZONE_SIZE,NULL,0,NULL,0);
vfreeSpace=TRUE;
}
}
// 曄悢弶婜壔
sel=0;
top=0;
if(up){
for(i=0; i<nfiles; i++) {
if(!strcmp(oldFolder, files[i].name)) {
sel=i;
top=sel-3;
break;
}
}
}
nmarks = 0;
memset(marks, 0, MAX_ENTRY);
cd=FALSE;
up=FALSE;
}
if(strncmp(path,"cdfs",4) && setting->discControl)
CDVD_Stop();
// 僼傽僀儖儕僗僩昞帵梡曄悢偺惓婯壔
if(top > nfiles-rows) top=nfiles-rows;
if(top < 0) top=0;
if(sel >= nfiles) sel=nfiles-1;
if(sel < 0) sel=0;
if(sel >= top+rows) top=sel-rows+1;
if(sel < top) top=sel;
// 夋柺昤夋奐巒
clrScr(setting->color[0]);
// 僼傽僀儖儕僗僩
x = SCREEN_MARGIN + LINE_THICKNESS + FONT_WIDTH;
y = SCREEN_MARGIN + FONT_HEIGHT*2 + LINE_THICKNESS + 12;
if(title && elisaFnt!=NULL) y-=2;
for(i=0; i<rows; i++)
{
if(top+i >= nfiles) break;
if(top+i == sel) color = setting->color[2];
else color = setting->color[3];
if(files[top+i].attr & FIO_S_IFDIR){
if(!strcmp(files[top+i].name,".."))
strcpy(tmp,"..");
else if(title && files[top+i].title[0]!=0)
strcpy(tmp,files[top+i].title);
else
sprintf(tmp, "%s/", files[top+i].name);
}else
strcpy(tmp,files[top+i].name);
printXY(tmp, x+4, y/2, color, TRUE);
if(marks[top+i]) drawChar('*', x-6, y/2, setting->color[3]);
y += FONT_HEIGHT;
if(title && elisaFnt!=NULL) y+=2;
}
// 僗僋儘乕儖僶乕
if(nfiles > rows)
{
itoSprite(setting->color[1],
SCREEN_WIDTH-SCREEN_MARGIN-LINE_THICKNESS-14,
(SCREEN_MARGIN+FONT_HEIGHT*2+4)/2,
SCREEN_WIDTH-SCREEN_MARGIN-LINE_THICKNESS-12,
(SCREEN_HEIGHT-SCREEN_MARGIN-FONT_HEIGHT)/2,
0);
y0=(SCREEN_HEIGHT-SCREEN_MARGIN*2-FONT_HEIGHT*3-LINE_THICKNESS*2-4)
* ((double)top/nfiles);
y1=(SCREEN_HEIGHT-SCREEN_MARGIN*2-FONT_HEIGHT*3-LINE_THICKNESS*2-4)
* ((double)(top+rows)/nfiles);
itoSprite(setting->color[1],
SCREEN_WIDTH-SCREEN_MARGIN-LINE_THICKNESS-11,
(y0+SCREEN_MARGIN+FONT_HEIGHT*2+LINE_THICKNESS+4)/2,
SCREEN_WIDTH-SCREEN_MARGIN-LINE_THICKNESS-1,
(y1+SCREEN_MARGIN+FONT_HEIGHT*2+LINE_THICKNESS+4)/2,
0);
}
// 儊僢僙乕僕
if(pushed) sprintf(msg0, "Path: %s", path);
// 憖嶌愢柧
if(cnfmode){
if(!strcmp(ext, "*"))
sprintf(msg1, "仜:OK 亊:Cancel 仮:Up 仩:*->ELF");
else
sprintf(msg1, "仜:OK 亊:Cancel 仮:Up 仩:ELF->*");
}else{
if(title)
sprintf(msg1, "仜:OK 仮:Up 亊:Mark 仩:RevMark L1:TitleOFF R1:Menu");
else
sprintf(msg1, "仜:OK 仮:Up 亊:Mark 仩:RevMark L1:TitleON R1:Menu");
}
setScrTmp(msg0, msg1);
// 僼儕乕僗儁乕僗昞帵
if(!strncmp(path, "mc", 2) && !vfreeSpace && !cnfmode){
if(mcSync(1,NULL,NULL)!=0){
freeSpace = mcfreeSpace*1024;
vfreeSpace=TRUE;
}
}
if(vfreeSpace){
if(freeSpace >= 1024*1024)
sprintf(tmp, "[%.1fMB free]", (double)freeSpace/1024/1024);
else if(freeSpace >= 1024)
sprintf(tmp, "[%.1fKB free]", (double)freeSpace/1024);
else
sprintf(tmp, "[%dB free]", freeSpace);
ret=strlen(tmp);
itoSprite(setting->color[0],
SCREEN_WIDTH-SCREEN_MARGIN-(ret+1)*8,
(SCREEN_MARGIN+FONT_HEIGHT+4)/2,
SCREEN_WIDTH,
(SCREEN_MARGIN+FONT_HEIGHT+20)/2, 0);
printXY(tmp,
SCREEN_WIDTH-SCREEN_MARGIN-ret*8,
(SCREEN_MARGIN+FONT_HEIGHT+4)/2,
setting->color[2], TRUE);
}
drawScr();
}
if(mountedParty[0][0]!=0) fileXioUmount("pfs0:");
if(mountedParty[1][0]!=0) fileXioUmount("pfs1:");
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -