axplore.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. //void *Port=0;
  2. #define DrawSStr(x,y,s) DStr((x)>>2,y,s)
  3. /*void DrawSStr(int x,int y,char *s) {
  4. DStr(x>>2,y,s);
  5. }*/
  6. typedef struct {
  7. int i,t;
  8. void *d;
  9. } XP_S;
  10. typedef struct {
  11. XP_S *s;
  12. int sh,sel,msel;
  13. } XP_C;
  14. int XpMove(XP_C *xc,int n) {
  15. XP_S *xs=xc->s+xc->sel,*lp=xc->s;
  16. int d=(n>=0?1:-1);
  17. while (n || xs->i<=0) {
  18. if (!xs->i) return lp-xc->s;
  19. if (xs->i>0) n-=d,lp=xs;
  20. xs+=d;
  21. }
  22. return xs-xc->s;
  23. }
  24. char XpSprite[8*5]={
  25. 0,0,0,0,0,0,0,0,
  26. 0b0110000,
  27. 0b1001100,
  28. 0b1110010,
  29. 0b1001110,
  30. 0b1000010,
  31. 0b0111100,
  32. 0,0,
  33. 0b0000000,
  34. 0b0110000,
  35. 0b1001110,
  36. 0b1000010,
  37. 0b1000010,
  38. 0b0111100,
  39. 0,0,
  40. 0b0000000,
  41. 0b1111100,
  42. 0b1000110,
  43. 0b1000010,
  44. 0b1000010,
  45. 0b1111110,
  46. 0,0,
  47. 0b0000000,
  48. 0b1111100,
  49. 0b1000110,
  50. 0b1011010,
  51. 0b1000010,
  52. 0b1111110,
  53. 0,0,
  54. };
  55. /* [IFT_TEXT] 4,
  56. [IFT_RES] 5,
  57. [IFT_C] 6,
  58. [IFT_H] 7,
  59. [IFT_PRGM] 8,
  60. [IFT_FUNC] 8,
  61. [IFT_XFUNC]8,
  62. [IFT_PACK] 9,
  63. [IFT_EXPR] 10,*/
  64. #define XP_X1 24
  65. #define XP_X2 136
  66. #define XP_N 8
  67. #define XP_H 6
  68. /*#define XP_Y1 14
  69. #define XP_Y2 (XP_Y1+8*XP_N)*/
  70. void XpDisp(XP_C *xc,int y) {
  71. XP_S *xs=xc->s+xc->sh;
  72. int r=xc->sel-xc->sh,n=XP_N;
  73. if (xc->sh) DrawChar(XP_X1+1,y,UPARR,A_NORMAL);
  74. do {
  75. if (!xs->i) return;
  76. if (xs->i>0) {
  77. int x=XP_X1+2-8+6+(xs->i<<3);
  78. Sprite8(x,y,8,XpSprite+(xs->t<<3),Port,A_NORMAL);
  79. DrawSStr(x+8,y,(char *)xs->d);
  80. if (!r) {
  81. SCR_RECT sr={{XP_X1,y,XP_X2-1,y+XP_H-1}};
  82. ScrRectFill(&sr,ScrRect,A_XOR);
  83. }
  84. y+=XP_H;
  85. n--;
  86. }
  87. xs++; r--;
  88. } while (n || xs->i<=0);
  89. DrawChar(XP_X1+1,y-XP_H,DNARR,A_XOR);
  90. }
  91. void XpNeg(XP_C *xc) {
  92. XP_S *xs=xc->s+xc->sel;
  93. int z,z0=xs->i,d=0x8000|(0x8000u>>z0);
  94. xs++;
  95. z=xs->i;
  96. if (z<0) d=~d;
  97. while ((z>0?xs->i:-xs->i)>z0) {
  98. if (z>0) xs->i|=d;
  99. else {
  100. xs->i&=d;
  101. if (xs->i-8>0) xs->i|=0x8000;
  102. }
  103. xs++;
  104. }
  105. }
  106. typedef int (*__attribute__((stkparm)) XPLOOP_CB)(XP_C *xc,int key,void *ctx);
  107. enum { XPLCB_CONT=0, XPLCB_QUIT=-1, XPLCB_BREAK=1, XPLCB_OPENDIR=2 };
  108. #define DEFINE_XPLOOP_CB(n) int __attribute__((stkparm)) n(XP_C *xc,int key,void *ctx)
  109. DEFINE_XPLOOP_CB(std_callback) {
  110. return XPLCB_CONT;
  111. }
  112. DEFINE_XPLOOP_CB(onlyfiles_callback) {
  113. return key==KEY_ENTER && xc->s[xc->sel].t==2 ? XPLCB_OPENDIR : XPLCB_CONT;
  114. }
  115. XP_S *XpLoop(XP_C *xc,int y,XPLOOP_CB callback,void *ctx) {
  116. int k,z;
  117. if (!xc->s->i) return 0;
  118. if (!callback) callback=std_callback;
  119. DrawFrame(XP_X1-1,y-1,XP_X2,y+XP_H*XP_N);
  120. do {
  121. int cb_ret;
  122. SCR_RECT sr={{XP_X1,y,XP_X2-1,y+XP_H*XP_N-1}};
  123. //LCD_save(Port);
  124. ScrRectFill2(&sr,A_REVERSE);
  125. //asm("0: bra 0b");
  126. XpDisp(xc,y);
  127. callback(xc,0,ctx);
  128. k=WaitLoop(NULL);
  129. if ((cb_ret=callback(xc,k,ctx))) k=0;
  130. if (cb_ret==XPLCB_OPENDIR) k=KEY_RIGHT;
  131. #define xps_sel (xc->s[xc->sel])
  132. if (k==KEY_UP) xc->sel=XpMove(xc,-1);
  133. else if (k==KEY_DOWN) xc->sel=XpMove(xc,1);
  134. else if (k==(KEY_2ND|KEY_UP)) xc->sel=XpMove(xc,1-XP_N);
  135. else if (k==(KEY_2ND|KEY_DOWN)) xc->sel=XpMove(xc,XP_N-1);
  136. else if (k==KEY_LEFT) {
  137. if ((z=xps_sel.i)>=2)
  138. do xc->sel=XpMove(xc,-1); while ((unsigned)xps_sel.i>=(unsigned)z);
  139. else if (xps_sel.t==1)
  140. xps_sel.t=2,XpNeg(xc);
  141. } else if (k==KEY_RIGHT && xps_sel.t==2)
  142. xps_sel.t=1,XpNeg(xc);
  143. else if (k==KEY_ENTER)
  144. return &xps_sel;
  145. z=xc->sel;
  146. if (xc->sh>z) xc->sh=z;
  147. if (xc->sh<(z=XpMove(xc,1-XP_N))) xc->sh=z;
  148. } while (k!=KEY_ESC);
  149. return NULL;
  150. }
  151. long XpFatSub(XP_S *xs,char *acc,char *cfold) {
  152. SYM_ENTRY *e=SymFindFirst(NULL,FO_RECURSE|FO_SKIP_TEMPS);
  153. int n=0,n2=0,f=1;
  154. while (e) {
  155. long i=0x00010002;
  156. if (!(e->flags.flags_n&SF_FOLDER)) {
  157. CESI p=HeapDeref(e->handle);
  158. if (p[1+*(unsigned int *)p]!=TEXT_TAG) goto nxt;
  159. i=(f>=0?0xC0020003:0x00020003);
  160. /* if (p[4]=='P') {
  161. char *q=strchr(p+5,'\r');
  162. if (q) {
  163. n2+=((q-(char *)p)-5)+1;
  164. if (acc) strncpy(acc,p+5,(q-(char *)p)-5),e=(SYM_ENTRY *)acc,acc+=((q-(char *)p)-5),*acc++=0;
  165. }
  166. }*/
  167. f++;
  168. } else {
  169. if (!f) {
  170. n--;
  171. if (xs) xs--;
  172. }
  173. f=0;
  174. if (!strcmp(e->name,cfold))
  175. f=0x8000,i--;
  176. }
  177. if (xs) {
  178. *(long *)&xs->i=i;
  179. xs->d=(void *)e->name;
  180. xs++;
  181. }
  182. n++;
  183. nxt:
  184. e=SymFindNext();
  185. }
  186. if (!f) {
  187. n--;
  188. if (xs) xs--;
  189. }
  190. if (xs) xs->i=0;
  191. return n+((long)n2<<16);
  192. }
  193. XP_C *XpLoadFat(char *cfold) {
  194. long r=XpFatSub(NULL,NULL,cfold);
  195. int n=(int)r,n2=(int)(r>>16);
  196. XP_C *xc=malloc(sizeof(XP_C)+(n+2)*sizeof(XP_S)+n2);
  197. XP_S *xs;
  198. if (!xc) return xc;
  199. xs=(XP_S *)(xc+1);
  200. xs->i=0; xs++; xc->s=xs;
  201. XpFatSub(xs,(char *)(xs+(n+1)),cfold);
  202. xc->sh=0; xc->sel=0; xc->msel=n-1;
  203. return xc;
  204. }
  205. XP_C *XpLoadList(char **list,int n) {
  206. XP_C *xc=malloc(sizeof(XP_C)+(n+2)*sizeof(XP_S));
  207. XP_S *xs;
  208. if (!xc) return xc;
  209. xs=(XP_S *)(xc+1);
  210. xs->i=0; xs++; xc->s=xs;
  211. xc->sh=0; xc->sel=0; xc->msel=n-1;
  212. while (n--)
  213. xs->i=1,xs->t=0,xs->d=*list++,xs++;
  214. xs->i=0;
  215. return xc;
  216. }