PROGRAM Example_One
! -------------------------------------------------------------------------
!
! Demonstration of ButtonLib
!
!    Responding to buttons using the polling technique.  Polling is used
!    when you want to process something in your program, while at the same
!    time check if the user selects a button.  In this example the main 
!    program processes a flashing message at the bottom of the screen,
!    while simulaneously checking for button selections.
!
!--------------------------------------------------------------------------

   LIBRARY "{UsrLib}ButtonLib*"

   DECLARE FUNCTION PollButtons
   SET MODE "HIGH16"
   ASK MAX CURSOR MR, MC
   SET BACK "BLACK"

   CALL TITLE

   ! *******************
   ! Define your buttons
   ! *******************
   LET A$ = " F-1 "
   LET C$ = CHR$(315)
   LET P$ = "Draw a Rosette"
   LET X = 27
   LET Y = 10
   CALL CreateButton(A$, C$, P$, Y, X)     ! Button 1

   LET A$ = " F-2 "
   LET C$ = CHR$(316)
   LET P$ = "Draw a Sierpinski triangle"
   LET X = 27
   LET Y = 13
   CALL CreateButton(A$, C$, P$, Y, X)     ! Button 2

   LET A$ = " F-3 "
   LET C$ = CHR$(317)
   LET P$ = "Quit"
   LET X = 27
   LET Y = 16
   CALL CreateButton(A$, C$, P$, Y, X)     ! Button 3

   ! ***************************************************
   ! Define flashing message at the bottom of the screen
   ! ***************************************************
   LET A$ = "... Select a button with MOUSE, or press FUNCTION KEY ..."
   LET L = LEN(A$)
   LET BlinkON  = .5
   LET BlinkOFF = .2

   ! ***************
   ! Enter menu loop
   ! ***************
   DO

      ! ******************
      ! Enter polling loop
      ! ******************
      DO

         ! ************************
         ! Display flashing message
         ! ************************
         LET Start = TIME
         SET CURSOR MR, (MC-L)/2
         SET COLOR "RED"
         PRINT A$;
         SET COLOR "WHITE"

         ! ************************
         ! Poll buttons for a while
         ! ************************
         DO
            LET X = PollButtons
         LOOP UNTIL X <> 0 OR TIME - Start > BlinkON

         ! **********************
         ! User selected a button
         !   Leave polling loop
         ! **********************
         IF X <> 0 THEN EXIT DO

         ! **********************
         ! Clear flashing message
         ! **********************
         LET Start = TIME
         SET COLOR "RED"
         SET CURSOR MR, (MC-L)/2
         PRINT REPEAT$(" ", L);
         SET COLOR "WHITE"

         ! ************************
         ! Poll buttons for a while
         ! ************************
         DO
            LET X = PollButtons
         LOOP UNTIL X <> 0 OR TIME - Start > BlinkOFF

      LOOP UNTIL X <> 0

      ! ********************************
      ! Show selected button for a while
      ! ********************************
      PAUSE .5
      CLEAR
   
      ! *******************
      ! Clear input buffers
      ! *******************
      CALL ClearBuffers

      ! *******************************
      ! Process user's button selection
      ! *******************************
      SELECT CASE X
   
         CASE 1
            CALL Rosette
         CASE 2
            CALL Sierpinski_Triangle
         CASE 3
            CLEAR
            SET COLOR "YELLOW"
            LET A$ = "That's all folks"
            SET CURSOR 7,(MC-LEN(A$))/2
            PRINT "That's all folks." 
            EXIT DO
         CASE ELSE
   
      END SELECT

      ! ************************************
      ! Display title and menu buttons again
      ! ************************************
      CALL TITLE
      CALL RenderButtons

   LOOP

   ! ******************
   ! Get rid of buttons
   ! ******************
   CALL PurgeButtons




END




SUB TITLE

   ASK MAX CURSOR MR, MC

   SET COLOR "GREEN"
   LET A$ = "ButtonLib POLLING DEMONSTRATION"
   SET CURSOR 5, (MC-LEN(A$))/2
   PRINT A$
   SET COLOR "WHITE"

END SUB





SUB Rosette

   OPTION ANGLE DEGREES

   ASK MAX CURSOR MR, MC

   ! *********************************
   ! Scale screen for drawing rosettes
   ! *********************************
   LET XL = -1.4
   LET XR =  1.4
   LET YB = -1
   LET YT =  1
   SET WINDOW XL, XR, YB, YT

   CAll ClearBuffers

   ! ****************************
   ! Display message at top right
   ! ****************************
   SET COLOR "RED"
   LET A$ = "Press any key to stop"
   SET CURSOR 1, MC - LEN(A$) - 3
   PRINT A$;

   ! ***********************
   ! Draw a 19 point Rosette
   ! ***********************
   SET COLOR "WHITE"
   LET POINTS = 19

   LET DAngle = 360 / POINTS

   ! ********************************
   ! Move point one around the circle
   ! ********************************
   FOR A1 = 0 TO 360-DAngle STEP DAngle

      ! ********************************
      ! Move point two around the circle
      ! ********************************
      FOR A2 = A1+DAngle TO 360 STEP DAngle

         ! ****************************************************
         ! Draw a straight line between point one and point two
         ! ****************************************************
         LET X1 = COS(A1)
         LET Y1 = SIN(A1)
         LET X2 = COS(A2)
         LET Y2 = SIN(A2)
         PLOT LINES : X1,Y1; X2,Y2

         ! *****************************************
         ! See if user wants to stop drawing process
         ! *****************************************
         IF KEY INPUT THEN
            GET KEY K
            CALL ClearBuffers
            EXIT FOR
         END IF

      NEXT A2
      IF K <> 0 THEN EXIT FOR

   NEXT A1

   ! ***************************
   !  Remove old message at top
   ! right and display a new one
   ! ***************************
   SET COLOR "RED"
   SET CURSOR 1, MC - LEN(A$) - 3
   LET A$ = REPEAT$(" ", LEN(A$))
   PRINT A$;
   LET A$ = "Press any key for menu"
   SET CURSOR 1, MC - LEN(A$) - 3
   PRINT A$;

   ! ********************************
   ! Display pattern name at top left
   ! ********************************
   SET COLOR "GREEN"
   SET CURSOR 1,10
   PRINT "Rosette"
   SET COLOR "WHITE"

   CALL WaitForAnyKey

   CLEAR

END SUB  ! End of Rosette



   
SUB Sierpinski_Triangle

   OPTION ANGLE DEGREES

   ASK MAX CURSOR MR, MC

   ! ***************************
   ! Scale screen for Sierpinski
   ! ***************************
   LET XLeft   = -2
   LET XRight  =  2
   LET YBottom = -1
   LET YTop    =  2
   SET WINDOW XLeft, XRight, YBottom, YTop

   ! ****************************
   ! Display message at top right
   ! ****************************
   SET COLOR "RED"
   LET A$ = "Press any key to stop"
   SET CURSOR 1, MC/2 + (MC/2 - LEN(A$))/2
   PRINT A$;
   SET COLOR "WHITE"

   ! *********************************************
   ! Call recursive routine to draw the Sierpinski
   ! *********************************************
   LET X      = 0
   LET Y      = 0
   LET Radius = 1
   LET Level  = 6
   LET Q = 0             ! Quit flag

   DRAW Sierpinski(X, Y, Radius, Level, Q)

   ! ***************************
   !  Remove old message at top
   ! right and display a new one
   ! ***************************
   SET COLOR "RED"
   SET CURSOR 1, MC/2 + (MC/2 - LEN(A$))/2
   LET A$ = REPEAT$(" ", LEN(A$))
   PRINT A$;
   LET A$ = "Press any key for menu"
   SET CURSOR 1, MC/2 + (MC/2 - LEN(A$))/2
   PRINT A$;

   SET COLOR "GREEN"
   LET A$ = "Sierpinski Triangle"
   SET CURSOR 1,(MC/2 - LEN(A$))/2
   PRINT A$
   SET COLOR "WHITE"

   CALL WaitForAnyKey

   CLEAR

END SUB  ! End of Sierpinski_Triangle




PICTURE Sierpinski(xpos, ypos, R, Level,Q)

   OPTION ANGLE DEGREES

   IF KEY INPUT THEN
      GET KEY K
      LET Q = 1
   END IF

   IF Q = 1 THEN EXIT PICTURE

   DRAW Triangle WITH SCALE(R) * SHIFT(xpos,ypos)

   IF Level > 0 THEN

      DRAW Sierpinski(xpos+R*COS(90),  ypos+R*SIN(90),  0.5*R, Level-1,Q)
      DRAW Sierpinski(xpos+R*COS(210), ypos+R*SIN(210), 0.5*R, Level-1,Q)
      DRAW Sierpinski(xpos+R*COS(330), ypos+R*SIN(330), 0.5*R, Level-1,Q)

   END IF


END PICTURE  ! End of Sierpinski




PICTURE Triangle

   OPTION ANGLE DEGREES

   PLOT COS(30), SIN(30);
   PLOT COS(150), SIN(150);
   PLOT COS(270), SIN(270);
   PLOT COS(30), SIN(30)

END PICTURE




SUB WaitForAnyKey

   DO
      IF KEY INPUT THEN
         GET KEY X
         DO WHILE KEY INPUT
            GET KEY X
         LOOP
         EXIT DO
      END IF
   LOOP

END SUB



SUB ClearBuffers

   DO WHILE KEY INPUT
      GET KEY K
   LOOP

   DO
      GET MOUSE H, V, S
   LOOP WHILE S <> 0

END SUB





