Skip to content

Instantly share code, notes, and snippets.

@telecomadm1145
Last active February 18, 2024 17:42
Show Gist options
  • Save telecomadm1145/11492ba9870176f238a4a0942bf19b2a to your computer and use it in GitHub Desktop.
Save telecomadm1145/11492ba9870176f238a4a0942bf19b2a to your computer and use it in GitHub Desktop.
Hp Prime 文件管理器
#pragma mode( separator(.,;) integer(h32) )
EXPORT lineheight:=0;
EXPORT ansicp:="936";
EXPORT useansi:=0;
EXPORT fullscreen:=0;
LOCAL Render(file,ptr,lh,vv,typ)
BEGIN
LOCAL cx:=0;
LOCAL cy:=0;
LOCAL sz := AFilesB(file);
LOCAL blksz := MIN(2048,sz - ptr);
IF (ptr >= sz) THEN
RETURN 999999999;
END;
LOCAL buf := AFilesB(file,ptr,blksz);
LOCAL final:={};
LOCAL i:=0;
LOCAL b;
LOCAL t:=0;
LOCAL v:=0;
LOCAL t2:=0;
LOCAL len:=0;
WHILE (i + 1 <= blksz) DO
CASE
IF typ == 1 THEN
t2:=BITSL(buf(i+2),8) + buf(i+1);
len:=2;
END;
IF typ == 2 THEN
t2:=BITSL(buf(i+1),8) + buf(i+2);
len:=2;
END;
IF typ == 3 THEN
CASE
IF BITAND(buf(i + 1),#80h) == 0 THEN
t2:=buf(i+1);
len:=1;
END;
IF BITAND(buf(i + 1),#E0h) == #C0h THEN
t2:=BITSL(BITAND(buf(i+1),#1Fh),6);
t2:=BITOR(t2,BITAND(buf(i+2),#3Fh));
len:=2;
END;
IF BITAND(buf(i + 1),#F0h) == #E0h THEN
t2:=BITSL(BITAND(buf(i+1),#0Fh),12);
t2:=BITOR(t2,BITSL(BITAND(buf(i+2),#3Fh),6));
t2:=BITOR(t2,BITAND(buf(i+3),#3Fh));
len:=3;
END;
DEFAULT
t2:=63; // "?"
len:=1;
END;
END;
IF typ == 4 THEN
IF BITAND(buf(i + 1),#80h) == 0 THEN
t2:= buf(i+1);
len:=1;
ELSE
LOCAL buf2 := AFilesB(ansicp,BITSL(buf(i+2),8) + buf(i+1),2);
t2:=BITSL(buf2(2),8) + buf2(1);
len:=2;
END;
END;
END;
v:=CHAR(t2);
IF (t2 == 10 OR t2 == #FEFFh) THEN
i:=i+len;
CONTINUE;
END;
IF (t2==13) THEN
cx:=0;
cy:=cy+lh;
i:=i+len;
CONTINUE;
END;
b:=TEXTSIZE(v);
IF (cx + b(1) > 320) THEN
cx:=0;
cy:=cy+lh;
CONTINUE;
END;
IF (cy+lh >= 240) THEN
BREAK;
END;
IF (vv == 1) THEN
TEXTOUT_P(v,G1,cx,cy);
ELSE
IF (vv == 2) THEN
TEXTOUT_P(v,G2,cx,cy);
END;
END;
cx:=cx + b(1);
i:=i+len;
END;
RETURN ptr+i;
END;
LOCAL DetectType(file)
BEGIN
LOCAL B := AFilesB(file,0,4);
IF B(1) == #FFh AND B(2) == #D8h AND
B(3) == #FFh THEN // PNG
RETURN 0;
END;
IF B(1) == #89h AND B(2) == #50h AND
B(3) == #4Eh AND B(4) == #47h THEN // JPG
RETURN 0;
END;
IF B(1) == #FFh AND B(2) == #FEh THEN // LE UTF16
RETURN 1;
END;
IF B(2) == #FFh AND B(1) == #FEh THEN // BE UTF16
RETURN 2;
END;
IF B(1) == #EFh AND B(2) == #BBh AND
B(3) == #BFh THEN // UTF8
RETURN 3;
END;
IF useansi THEN
RETURN 4; // ANSI
END;
RETURN 3;
END;
LOCAL ListFiles()
BEGIN
LOCAL files:= AFiles();
LOCAL out:={};
LOCAL y;
FOR y FROM 1 TO SIZE(files) DO
LOCAL file:=files(y);
IF SIZE(file) > 4 THEN // "."
LOCAL ext:=MID(file,SIZE(file) - 3);
IF ext == ".stt" THEN
ELSE
out(0):=files(y);
END;
ELSE
out(0):=files(y);
END;
END;
RETURN out;
END;
LOCAL Exists(file)
BEGIN
LOCAL files:= AFiles();
LOCAL y;
FOR y FROM 1 TO SIZE(files) DO
LOCAL file2:=files(y);
IF file2 == file THEN
RETURN TRUE;
END;
END;
RETURN FALSE;
END;
LOCAL TextReader(file)
BEGIN
DIMGROB_P(G1,320,240,#FFFFFFh);
DIMGROB_P(G2,320,240,#FFFFFFh);
LOCAL b := TEXTSIZE("a");
LOCAL lh := b(2);
LOCAL typ := DetectType(file);
IF lineheight == 0 THEN
ELSE
lh := lineheight;
END;
LOCAL ptr := 0;
LOCAL pages:={0};
LOCAL i:=1;
LOCAL origy:=0;
LOCAL offsety:=0;
LOCAL dirty:=1;
LOCAL brk_scroll:=0;
LOCAL hint:=0;
IF Exists(file+ ".stt") THEN // If status file exists
IF MSGBOX("Do you want to start reading from where you left off last time?",1) THEN
LOCAL status:=AFiles(file + ".stt"); // Load it
// Loads offsety, ptr, index and pages
offsety:=status(1);
i:=status(2);
pages:=status(3);
ptr:=pages(i);
END;
END;
WHILE (ptr < 999999999) DO
IF MOUSE(1) > 0 THEN
IF NOT brk_scroll THEN
IF origy == 0 THEN
origy := offsety;
END;
offsety:= origy - MOUSE(1) + MOUSE(3);
IF offsety >= 240 THEN
offsety:=0;
origy:=origy + 240;
i:=i+1;
dirty:=1;
brk_scroll:=1;
hint:=-1;
ELSE IF offsety <= -20 AND i > 1 THEN
offsety:=240+offsety;
origy:=origy+240+offsety;
i:=i-1;
ptr:=pages(i);
dirty:=1;
brk_scroll:=1;
hint:=1;
END;END;
END;
ELSE
origy:=0;
brk_scroll:=0;
END;
IF dirty THEN
IF hint == 0 THEN
RECT_P(G1);
RECT_P(G2);
ptr:=Render(file,ptr,lh,1,typ);
pages(i+1):=ptr;
pages(i+2):=Render(file,ptr,lh,2,typ);
ELSE IF hint == 1 THEN
BLIT_P(G2,G1);
RECT_P(G1);
Render(file,pages(i),lh,1,typ);
ELSE
BLIT_P(G1,G2);
RECT_P(G2);
pages(i+2):=Render(file,pages(i+1),lh,2,typ);
END;
END;
dirty:=0;
END;
BLIT_P(G0,0,-offsety,G1);
BLIT_P(G0,0,-offsety+240,G2);
TEXTOUT_P(i,G0,300,0);
IF ISKEYDOWN(2) AND i > 1 THEN
i:=i-1;
ptr:=pages(i);
dirty:=1;
hint:=1;
END;
IF ISKEYDOWN(12) THEN
i:=i+1;
dirty:=1;
hint:=-1;
END;
IF ISKEYDOWN(4) THEN
AFiles(file + ".stt"):={offsety,i,pages};
RETURN;
END;
WAIT(-1);
END;
END;
LOCAL SettingScreen()
BEGIN
INPUT({
{lineheight,[0]},
{ansicp,AFiles()},
{useansi,{False,True}},
{fullscreen,{False,True}}
},"Settings",
{"Line height","DBCS Codepage file","Use Ansi","Fullscreen"},
{"The height of a line.(doesn't affect font size)","DBCS codepage file.(see manual)","Toggle if you have some ansi file to read.","Show picture as fullscreen(fit screen)."});
END;
EXPORT FileManager_MAIN()
BEGIN
LOCAL l := ListFiles();
LOCAL i := 0;
LOCAL selection := 1;
LOCAL origs:=1;
LOCAL img := 0;
LOCAL offy := 0;
LOCAL a:=0;
LOCAL origa:=0;
LOCAL origoff := 0;
LOCAL mouy := -1;
LOCAL offx := 0;
LOCAL origoff2 := 0;
LOCAL moux := -1;
LOCAL scale := 1;
LOCAL mse;
LOCAL origscale := 1;
LOCAL moudist := -1;
LOCAL dist;
LOCAL mse1;
LOCAL mse2;
LOCAL file;
dimgrob_p(G1,320,240,#FFFFFF);
WHILE 1 DO
IF img == 0 THEN
RECT_P(G1);
IF ISKEYDOWN(2) THEN
selection := selection - 1;
END;
IF ISKEYDOWN(12) THEN
selection := selection + 1;
END;
IF ISKEYDOWN(4) THEN
RETURN;
END;
IF ISKEYDOWN(9) THEN
SettingScreen();
END;
IF ISKEYDOWN(30) THEN
file:=AFiles(selection);
IF DetectType(file) > 0 THEN
TextReader(file);
ELSE
G2:=AFiles(file);
IF fullscreen THEN
scale:=320 / GROBW_P(G2);
ELSE
scale:=1;
END;
img:= 1;
END;
END;
IF (MOUSE(1) > 1) THEN
IF mouy == -1 THEN
mouy := MOUSE(3);
origa := offy;
origs:=selection;
END;
a := origa - mouy + MOUSE(1);
selection := origs - (MOUSE(1) - mouy) / 20;
ELSE
selection :=round(selection,0);
mouy := -1;
END;
WHILE 1 DO
IF selection*20+10+a≥220 THEN
a-40▶a;
ELSE IF selection*20+10+a≤20 THEN
a+40▶a;
ELSE
BREAK;
END;
END;
END;
selection:=MAX(MIN(selection,SIZE(l)),1);
FOR i FROM 1 TO SIZE(l) DO
TEXTOUT_P(l[i],G1,10,i*20+10+a);
END;
TEXTOUT_P(">",G1,2,selection*20+10+a);
ELSE
RECT_P(G1,0);
IF ISKEYDOWN(2) THEN
offy := offy - 20;
END;
IF ISKEYDOWN(12) THEN
offy := offy + 20;
END;
IF ISKEYDOWN(4) THEN
img := 0;
END;
// This should be fix since there's no check about what the next file is
IF ISKEYDOWN(7) THEN
selection := selection - 1;
IF selection > SIZE(l) OR selection < 1 THEN
img:=0;
CONTINUE;
END;
WHILE DetectType(AFiles(selection)) > 0 DO
selection := selection - 1;
IF selection > SIZE(l) OR selection < 1 THEN
BREAK;
END;
END;
IF selection > SIZE(l) OR selection < 1 THEN
img:=0;
CONTINUE;
END;
G2:=AFiles(AFiles(selection));
IF fullscreen THEN
scale:=320 / GROBW_P(G2);
ELSE
scale:=1;
END;
offy:=0;offx:=0;
END;
IF ISKEYDOWN(8) THEN
selection := selection + 1;
IF selection > SIZE(l) OR selection < 1 THEN
img:=0;
CONTINUE;
END;
WHILE DetectType(AFiles(selection)) > 0 DO
selection := selection + 1;
IF selection > SIZE(l) OR selection < 1 THEN
BREAK;
END;
END;
IF selection > SIZE(l) OR selection < 1 THEN
img:=0;
CONTINUE;
END;
G2:=AFiles(AFiles(selection));
IF fullscreen THEN
scale:=320 / GROBW_P(G2);
ELSE
scale:=1;
END;
offy:=0;offx:=0;
END;
IF ISKEYDOWN(0) THEN
scale := scale / 0.9;
END;
IF ISKEYDOWN(5) THEN
scale := scale * 0.9;
END;
IF ISKEYDOWN(1) THEN
scale:=1;
offy:=0;offx:=0;
END;
IF ISKEYDOWN(6) THEN
scale:=320 / GROBW_P(G2);
offy:=0;offx:=0;
END;
mse:=MOUSE();
IF (SIZE(mse[1]) > 0 AND SIZE(mse[2]) > 0) THEN
mse1 := mse[1];
mse2 := mse[2];
dist := sqrt((mse1[1] - mse2[1])^2 + (mse1[2] - mse2[2])^2);
IF moudist == -1 THEN
origscale:=scale;
moudist := dist;
END;
scale:= origscale - (moudist - dist) / 200;
ELSE
moudist := -1;
IF (MOUSE(1) > 1) THEN
IF mouy == -1 THEN
mouy := MOUSE(1);
origoff := offy;
moux := MOUSE(0);
origoff2 := offx;
END;
offy := origoff + mouy - MOUSE(1);
offx := origoff2 + moux - MOUSE(0);
ELSE
mouy := -1;
END;
END;
BLIT_P(G1,0,0,320,240,G2,offx,offy,320 / scale +offx,240 / scale + offy);
TEXTOUT_P(selection + "/" + SIZE(l),G1,0,0);
END;
BLIT_P(G1);
WAIT(-1);
END;
END;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment