(require-library "graphics.ss" "graphics") (define pi 3.1415926) (define make-timer (lambda (seconds) (open-graphics) (let* ((v (open-viewport "Countdown Timer" 500 500)) (red (make-rgb 1 0 0)) (middle (make-posn 250 250)) (radius 200)) ((draw-viewport v) red) ((draw-string v) (make-posn 20 20) (string-append "Pause " (number->string seconds) " seconds")) (clear-segments v middle radius seconds) (close-viewport v) (close-graphics)))) (define clear-segments (lambda (v middle radius seconds) (let* ((step-angle (/ pi 90)) (offset-seconds 3) (seconds-per-step (/ (- seconds offset-seconds) 180)) (radius (+ radius 1)) (phi0 (- (/ pi 2))) (clear-segment (lambda (i) (let* ((phi1 (+ phi0 (* i step-angle))) (phi2 (+ phi1 step-angle))) ((clear-solid-polygon v) (list (make-posn 0 0) (make-posn (* radius (cos phi1)) (* radius (sin phi1))) (make-posn (* radius (cos phi2)) (* radius (sin phi2)))) middle))))) (let loop ((step 0)) (if (<= step 180) (begin (thread (lambda () (clear-segment step))) (sleep seconds-per-step) (loop (+ step 1))))) ((draw-viewport v) (make-rgb 0 1 0)) (get-mouse-click v)))) (define pause (lambda (minutes) (make-timer (round (* 60 minutes)))))