! calculator ! evolbug [2015] FN.DEF xcolor(c$) GR.COLOR 255, HEX(MID$(c$,0,2)), HEX(MID$(c$,3,4)), HEX(MID$(c$,5,6)) FN.END FN.DEF touched (obj,px,py) GR.SCREEN w, h sw = w / 240 sh = h / 320 GR.GET.VALUE obj,"left",l,"top",t,"right",r,"bottom",b IF px > l*sw & px < r*sw & py > t*sh & py < b*sh FN.RTN 1 ENDIF FN.RTN 0 FN.END ARRAY.LOAD b$[]~ "1","2","3","+"~ "4","5","6","-"~ "7","8","9","*"~ "CE","0","=","/" DIM btn[16] % buttons GR.OPEN 255,255,255,255,0,1 % calculator base GR.SCREEN w, h sw = w / 240 sh = h / 320 GR.SCALE sw, sh xcolor("bdbdbd") GR.RECT r,2, 2, 238, 75 % display GR.COLOR 255, 30,30,255 GR.TEXT.ALIGN 2 GR.TEXT.DRAW fwarn,120,15,"15 digit limit" GR.HIDE fwarn GR.TEXT.ALIGN 1 GR.TEXT.SIZE 20 LIST.CREATE n,ls w = 59 : h = 59 FOR y = 1 TO 4 : FOR x = 1 TO 4 px = x * 59 - 56.7 : py = y * 59 + 23 xcolor("bdbdbd") % buttons GR.RECT btn[(y-1)*4+x],px,py,px+w,py+h xcolor("ffffff") % text GR.TEXT.DRAW t, px+(w/3),py+h-(h/3), b$[(y-1)*4+x] LIST.ADD ls, t NEXT : NEXT GR.GROUP.LIST gp,ls curr$ = "" LIST.CREATE n, snum LIST.CREATE s, sope GR.TEXT.DRAW disp, 8, 47, curr$ GR.RENDER DO DO GR.TOUCH to, tx, ty UNTIL to = 1 FOR i = 1 TO 16 tch = touched(btn[i], tx, ty) IF tch : t = i : ENDIF NEXT GR.RENDER DO GR.TOUCH to, tx, ty UNTIL to = 0 GR.HIDE pad GR.RENDER IF t <> 0 IF f=1 : curr$="" : ENDIF IF MOD(t,4) = 0 IF !f IF curr$ <> "" LIST.ADD snum, VAL(curr$) ELSE LIST.ADD snum,0 ENDIF LIST.ADD sope, b$[t] curr$ = "" GR.MODIFY disp, "text", curr$ ENDIF ELSEIF t = 15 IF f = 1 D_U.CONTINUE ENDIF f = 1 IF curr$ <> "" LIST.ADD snum, VAL(curr$) ELSE LIST.ADD snum,0 ENDIF LIST.SIZE snum, l LIST.GET snum, 1, v1 FOR i = 2 TO l LIST.GET snum, i, v LIST.GET sope, i - 1, op$ IF op$ = "+" v1 = v1 + v ELSEIF op$ = "-" v1 = v1 - v ELSEIF op$ = "*" v1 = v1 * v ELSEIF op$ = "/" v1 = v1 / v ENDIF NEXT curr$ = str$ (v1) GR.MODIFY disp, "text", curr$ LIST.CLEAR sope LIST.CLEAR snum ELSEIF t=13 LIST.CLEAR sope LIST.CLEAR snum curr$ = "" GR.MODIFY disp, "text", curr$ ELSE f = 0 IF LEN(curr$) < 15 THEN curr$ = curr$ + b$[t] GR.MODIFY disp, "text", curr$ ELSE GR.SHOW fwarn GR.RENDER PAUSE 500 GR.HIDE fwarn ENDIF ENDIF GR.RENDER t = 0 ENDIF UNTIL 0 ONERROR: END