home *** CD-ROM | disk | FTP | other *** search
/ Falcon 030 Power 2 / F030_POWER2.iso / ST_STE / MAGS / ICTARI03.ARJ / ictari.03 / GFA / GFA_CODE / CLOCK.GFA (.txt) next >
GFA-BASIC Atari  |  1993-05-10  |  6KB  |  270 lines

  1. ' CLOCK v3
  2. ' A multi tasking clock accessory with switching between analog and digital
  3. ' clocks when the FULLER is clicked. If accessory selected again when already
  4. ' open a time setting dialog will appear.
  5. '
  6. ' Requires CLOCK3.RSC to be present in program directory
  7. '
  8. ' (c) Ian Rae 22/08/92 - commented 5/5/93 :-)
  9. '
  10. $m40528                 ! Random number - seems to work!
  11. ap_id&=APPL_INIT()
  12. @init
  13. @main
  14. '
  15. > PROCEDURE init
  16.   IF XBIOS(4)<>2
  17.     ALERT 1," | High resolution only... | Sorry about that...",1,"Hmmm",a%
  18.     DO
  19.       ~EVNT_TIMER(-1)
  20.     LOOP
  21.   ENDIF
  22.   IF RSRC_LOAD("clock3.rsc")=0
  23.     ALERT 1," Can't find CLOCK3.RSC... | | Take Yourself outside|   and have a word!",1," OK ",a%
  24.     DO
  25.       ~EVNT_TIMER(-1)
  26.     LOOP
  27.   ENDIF
  28.   ~RSRC_GADDR(0,0,adr%)
  29.   '
  30.   IF ap_id&<>0
  31.     me_id&=MENU_REGISTER(ap_id&,"  MT Clock")
  32.   ENDIF
  33.   open!=FALSE
  34.   analog!=TRUE
  35. RETURN
  36. > PROCEDURE main
  37.   IF ap_id&<>0
  38.     DO                                  ! We are and accessory
  39.       evnt%=EVNT_MULTI(&X110000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000)
  40.       IF BTST(evnt%,5) AND open!        ! A timer event, update clock
  41.         @dotime(FALSE)
  42.       ELSE
  43.         message                         ! a message event, process it
  44.       ENDIF
  45.     LOOP
  46.   ELSE
  47.     TITLEW #1,LEFT$(TIME$,5)            ! Not an accessory so open
  48.     OPENW #1,10,50,82,100,&X1111        ! a window and use ON MENU
  49.     handle&=W_HAND(#1)                  ! to handle it
  50.     ON MENU MESSAGE GOSUB message
  51.     EVERY 200 GOSUB dotime
  52.     exit!=FALSE
  53.     REPEAT
  54.       ON MENU
  55.     UNTIL exit!
  56.   ENDIF
  57. RETURN
  58. > PROCEDURE message
  59.   x&=MENU(5)
  60.   y&=MENU(6)
  61.   w&=MENU(7)
  62.   h&=MENU(8)
  63.   '
  64.   SELECT MENU(1)
  65.   CASE 21               ! topped
  66.     TOPW #1
  67.   CASE 23               ! Fulled ( switch between analog and digital
  68.     analog!=NOT analog!
  69.     ~WIND_GET(handle&,5,wx&,wy&,ww&,wh&)
  70.     IF analog!
  71.       ~WIND_SET(handle&,5,wx&,wy&,82,100)
  72.     ELSE
  73.       ~WIND_SET(handle&,5,wx&,wy&,82,20)
  74.     ENDIF
  75.   CASE 20               !
  76.     @dotime(TRUE)
  77.   CASE 22,41            ! Closed clicked or acc close recieved
  78.     CLOSEW #1
  79.     exit!=TRUE
  80.     open!=FALSE
  81.   CASE 28               ! Moved
  82.     IF analog!
  83.       ~WIND_SET(handle&,5,x&,y&,82,100)
  84.     ELSE
  85.       ~WIND_SET(handle&,5,x&,y&,82,20)
  86.     ENDIF
  87.   CASE 40               ! Acc open
  88.     IF open!            ! If already open then display set time dialog
  89.       timeset
  90.     ELSE
  91.       open!=TRUE
  92.       TITLEW #1,LEFT$(TIME$,5)  ! Display time in title bar
  93.       IF analog!
  94.         OPENW #1,10,50,82,100,&X1111
  95.       ELSE
  96.         OPENW #1,10,50,82,20,&X1111
  97.       ENDIF
  98.       handle&=W_HAND(#1)
  99.     ENDIF
  100.   ENDSELECT
  101. RETURN
  102. > PROCEDURE dotime(redraw!)       ! redraw TRUE if we need to redraw
  103.   hours&=VAL(LEFT$(TIME$,2))    ! FALSE if we just updating time
  104.   mins&=VAL(MID$(TIME$,4,2))
  105.   IF hours&>12
  106.     hours&=hours&-12
  107.   ENDIF
  108.   IF (mins&<>oldm&) OR redraw!
  109.     TITLEW #1,LEFT$(TIME$,5)
  110.     IF analog!
  111.       hdeg#=(360*hours&)/12+(mins&*0.5)
  112.       mdeg#=(360*mins&)/60
  113.       ~WIND_UPDATE(1)                           ! Grab mouse control
  114.       ~WIND_GET(handle&,11,x&,y&,w&,h&)
  115.       ~WIND_GET(handle&,4,wx&,wy&,ww&,wh&)
  116.       REPEAT
  117.         IF RC_INTERSECT(wx&,wy&,ww&,wh&,x&,y&,w&,h&)    ! get clipping
  118.           CLIP x&,y&,w&,h& OFFSET wx&,wy&               ! rectangles
  119.           @drawclock(hdeg#,mdeg#)                         ! draw it all
  120.           CLIP 0,0,WORK_OUT(0),WORK_OUT(1)
  121.         ENDIF
  122.         ~WIND_GET(handle&,12,x&,y&,w&,h&)
  123.       UNTIL w&=0 AND h&=0
  124.       ~WIND_UPDATE(0)                           ! release mouse control
  125.     ENDIF
  126.   ENDIF
  127.   oldm&=mins&
  128. RETURN
  129. > PROCEDURE drawclock(hdeg#,mdeg#)  ! Can't be bothered with trig and stuff
  130.   DEFFILL 0,0                   ! so I'll cheat and use the logo type stuff
  131.   PBOX 0,0,82,80
  132.   CIRCLE 40,40,30
  133.   DEFTEXT 1,0,0,6
  134.   TEXT 32,8,"12"
  135.   TEXT 37,78,"6"
  136.   TEXT 1,43,"9"
  137.   TEXT 71,43,"3"
  138.   SETDRAW 40,40,hdeg#
  139.   DRAW "PU FD 20 PD"
  140.   x#=DRAW(0)
  141.   y#=DRAW(1)
  142.   DRAW "RT 170 FD 10 DA 40,40"
  143.   SETDRAW x#,y#,hdeg#
  144.   DRAW "LT 170 FD 10 DA 40,40"
  145.   SETDRAW 40,40,mdeg#
  146.   DRAW "PU FD 28 PD"
  147.   x#=DRAW(0)
  148.   y#=DRAW(1)
  149.   DRAW "RT 175 FD 15 DA 40,40"
  150.   SETDRAW x#,y#,mdeg#
  151.   DRAW "LT 175 FD 15 DA 40,40"
  152. RETURN
  153. > PROCEDURE timeset       ! open up the timeset dialog, this proc is MESSY
  154.   exit!=FALSE
  155.   ~FORM_CENTER(adr%,x&,y&,w&,h&)
  156.   ~FORM_DIAL(0,x&,y&,w&,h&,x&,y&,w&,h&) ! prepare draw area
  157.   '
  158.   ' set up initial time...
  159.   '
  160.   h1&=VAL(LEFT$(TIME$,1))
  161.   h2&=VAL(MID$(TIME$,2,1))
  162.   m1&=VAL(MID$(TIME$,4,1))
  163.   m2&=VAL(MID$(TIME$,5,1))
  164.   t$="        "
  165.   '
  166.   CHAR{{OB_SPEC(adr%,13)}}=STR$(h1&)
  167.   CHAR{{OB_SPEC(adr%,14)}}=STR$(h2&)
  168.   CHAR{{OB_SPEC(adr%,15)}}=STR$(m1&)
  169.   CHAR{{OB_SPEC(adr%,16)}}=STR$(m2&)
  170.   ~OBJC_DRAW(adr%,0,3,x&,y&,w&,h&)
  171.   '
  172.   REPEAT
  173.     but%=FORM_DO(adr%,0)
  174.     SELECT but%
  175.       '
  176.     CASE 5                        !h1down
  177.       DEC h1&
  178.       IF h1&<0
  179.         h1&=2
  180.       ENDIF
  181.       CHAR{{OB_SPEC(adr%,13)}}=STR$(h1&)
  182.       ~OBJC_DRAW(adr%,13,0,x&,y&,w&,h&)
  183.       PAUSE 5
  184.       '
  185.     CASE 6                        !h2down
  186.       DEC h2&
  187.       IF h2&<0
  188.         h2&=9
  189.       ENDIF
  190.       CHAR{{OB_SPEC(adr%,14)}}=STR$(h2&)
  191.       ~OBJC_DRAW(adr%,14,0,x&,y&,w&,h&)
  192.       PAUSE 5
  193.       '
  194.     CASE 7                        !m1down
  195.       DEC m1&
  196.       IF m1&<0
  197.         m1&=5
  198.       ENDIF
  199.       CHAR{{OB_SPEC(adr%,15)}}=STR$(m1&)
  200.       ~OBJC_DRAW(adr%,15,0,x&,y&,w&,h&)
  201.       PAUSE 5
  202.       '
  203.     CASE 8                        !m2 down
  204.       DEC m2&
  205.       IF m2&<0
  206.         m2&=9
  207.       ENDIF
  208.       CHAR{{OB_SPEC(adr%,16)}}=STR$(m2&)
  209.       ~OBJC_DRAW(adr%,16,0,x&,y&,w&,h&)
  210.       PAUSE 5
  211.       '
  212.     CASE 9                        ! h1 up
  213.       INC h1&
  214.       IF h1&>2
  215.         h1&=0
  216.       ENDIF
  217.       IF h1&>1 AND h2&>3
  218.         h1&=0
  219.       ENDIF
  220.       CHAR{{OB_SPEC(adr%,13)}}=STR$(h1&)
  221.       ~OBJC_DRAW(adr%,13,0,x&,y&,w&,h&)
  222.       PAUSE 5
  223.       '
  224.     CASE 10                       ! h2 up
  225.       INC h2&
  226.       IF h2&>9
  227.         h2&=0
  228.       ENDIF
  229.       CHAR{{OB_SPEC(adr%,14)}}=STR$(h2&)
  230.       ~OBJC_DRAW(adr%,14,0,x&,y&,w&,h&)
  231.       PAUSE 5
  232.       '
  233.     CASE 11                       ! m1 up
  234.       INC m1&
  235.       IF m1&>5
  236.         m1&=0
  237.       ENDIF
  238.       CHAR{{OB_SPEC(adr%,15)}}=STR$(m1&)
  239.       ~OBJC_DRAW(adr%,15,0,x&,y&,w&,h&)
  240.       PAUSE 5
  241.       '
  242.     CASE 12                       ! m2 up
  243.       INC m2&
  244.       IF m2&>9
  245.         m2&=0
  246.       ENDIF
  247.       CHAR{{OB_SPEC(adr%,16)}}=STR$(m2&)
  248.       ~OBJC_DRAW(adr%,16,0,x&,y&,w&,h&)
  249.       PAUSE 5
  250.       '
  251.     CASE 18                         ! OK
  252.       set!=TRUE
  253.       exit!=TRUE
  254.       '
  255.     CASE 19                         ! Cancel
  256.       set!=FALSE
  257.       exit!=TRUE
  258.     ENDSELECT
  259.   UNTIL exit!
  260.   '
  261.   ~FORM_DIAL(3,x&,y&,w&,h&,x&,y&,w&,h&) ! redraw area...
  262.   '
  263.   OB_STATE(adr%,18)=0               ! Deselect OK and Cancel buttons
  264.   OB_STATE(adr%,19)=0
  265.   IF set!
  266.     t$=STR$(h1&)+STR$(h2&)+":"+STR$(m1&)+STR$(m2&)+":00"    ! Set the time !
  267.     TIME$=t$
  268.   ENDIF
  269. RETURN
  270.