(module die racket (require racket/gui racket/class) (provide die%) (define die% (class canvas% (inherit get-dc get-client-size refresh) (init-field [digit #f]) (define/public (set-digit d) (unless (equal? digit d) (set! digit d) (refresh))) (init-field [dim? #f]) (define/public (set-dim d) (unless (equal? dim? d) (set! dim? d) (refresh))) (define/override (on-paint) (let ([dc (get-dc)]) (let-values ([(w h) (get-client-size)]) (when digit (send dc set-pen (send the-pen-list find-or-create-pen (if dim? "dark gray" "black") 1 'solid)) (send dc set-brush (send the-brush-list find-or-create-brush "white" 'solid)) (send dc draw-rounded-rectangle 0 0 w h) (send dc set-brush (send the-brush-list find-or-create-brush (if dim? "dark gray" "black") 'solid)) (let ([draw-circle (lambda (mx my) (send dc draw-ellipse (- (* mx w) (/ w 12)) (- (* my h) (/ h 12)) (/ w 6) (/ h 6)))] [in (- 1/3 1/24)] [out (+ 2/3 1/24)] [draw-text (lambda (str) (let-values ([(tw th _1 _2) (send dc get-text-extent str)]) (send dc draw-text str (- (/ w 2) (/ tw 2)) (- (/ h 2) (/ th 2)))))]) (case digit [(1) (draw-circle 1/2 1/2)] [(2) (draw-circle in in) (draw-circle out out)] [(3) (draw-circle in in) (draw-circle 1/2 1/2) (draw-circle out out)] [(4) (draw-circle in in) (draw-circle in out) (draw-circle out in) (draw-circle out out)] [(5) (draw-circle in in) (draw-circle in out) (draw-circle 1/2 1/2) (draw-circle out in) (draw-circle out out)] [(6) (draw-circle in in) (draw-circle in 1/2) (draw-circle in out) (draw-circle out in) (draw-circle out 1/2) (draw-circle out out)] [(10) (draw-text "10")] [(20) (draw-text "20")])))))) (super-new (style '(transparent))) (send (get-dc) set-smoothing 'aligned) (inherit min-width min-height stretchable-width stretchable-height) (min-width 48) (min-height 48) (stretchable-width #f) (stretchable-height #f))))