racket/collects/guibuilder/slider-guage.rkt
2010-04-27 16:50:15 -06:00

194 lines
5.5 KiB
Racket

(module slider-guage mzscheme
(require (prefix mred: mred)
mzlib/class
mzlib/file
mzlib/pretty
mzlib/etc
mzlib/list
"utils.ss"
"base.ss"
"feature.ss")
(define gb:make-slider-snip%
(lambda (cl cn)
(class cl
(inherit-field vertical-layout?)
(inherit get-label get-callback-names gb-need-recalc-size)
(field
[init-value 0]
[min-value 0]
[max-value 10]
[arrow-size 10]
[height arrow-size]
[line-height 3]
[min-width 50]
[darrow (list (make-object mred:point% 0 0)
(make-object mred:point% arrow-size 0)
(make-object mred:point% (quotient arrow-size 2) (quotient arrow-size 2)))]
[rarrow (list (make-object mred:point% 0 0)
(make-object mred:point% 0 arrow-size)
(make-object mred:point% (quotient arrow-size 2) (quotient arrow-size 2)))])
(public*
[slider-install
(lambda (mn mx in)
(set! min-value mn)
(set! max-value mx)
(set! init-value in))])
(override*
[get-frame%
(lambda ()
(class (super get-frame%)
(inherit-field controls)
(super-new)
(private-field
[min-val (make-number-control controls "Minimum:" 0 (lambda () -10000) (lambda () 10000)
(lambda (x)
(set! min-value x)
(send max-val check)
(send init-val check)
(gb-need-recalc-size)))]
[max-val (make-number-control controls "Maximum:" 10 (lambda () (send min-val get-val)) (lambda () 10000)
(lambda (x)
(set! max-value x)
(send init-val check)
(gb-need-recalc-size)))]
[init-val (make-number-control controls "Initial:" 0 (lambda () (send min-val get-val))
(lambda () (send max-val get-val))
(lambda (x)
(set! init-value x)
(gb-need-recalc-size)))])))]
[get-classname (lambda () cn)]
[init-name (lambda () (new-name "slider"))]
[init-vertical-layout? (lambda () #f)]
[get-min-body-size
(lambda (dc)
(if vertical-layout?
(values height min-width)
(values min-width height)))]
[draw-body
(lambda (dc x y w h)
(let ([percent (/ (- init-value min-value) (- max-value min-value))])
(if vertical-layout?
(begin
(send dc draw-rectangle
(+ x (/ arrow-size 2)) (+ y (/ arrow-size 2))
line-height (- h arrow-size))
(send dc draw-polygon rarrow x (+ y (* percent (- h arrow-size)))))
(begin
(send dc draw-rectangle
(+ x (/ arrow-size 2)) (+ y (/ arrow-size 2))
(- w arrow-size) line-height)
(send dc draw-polygon darrow (+ x (* percent (- w arrow-size))) y)))))]
[gb-get-default-class (lambda () 'slider%)]
[gb-instantiate-arguments
(lambda ()
(list*
`[min-value ,min-value]
`[max-value ,max-value]
`[init-value ,init-value]
(super gb-instantiate-arguments)))]
[copy
(lambda ()
(let ([o (super copy)])
(send o slider-install min-value max-value init-value)
o))]
[write
(lambda (stream)
(super write stream)
(send stream put min-value)
(send stream put max-value)
(send stream put init-value))]
[read
(lambda (stream version)
(super read stream version)
(slider-install (send stream get-exact)
(send stream get-exact)
(send stream get-exact)))])
(super-new))))
(define gb:slider-snip% (gb:make-slider-snip%
(gb:make-layout-snip%
(gb:make-callback-snip%
(gb:make-text-labelled-snip% gb:atomic-snip%
"Slider")))
"gb:slider"))
(register-class gb:slider-snip% "gb:slider")
(define gb:make-gauge-snip%
(lambda (cl cn)
(class cl
(inherit-field vertical-layout?)
(inherit get-label gb-need-recalc-size)
(field
[max-value 10]
[min-height 10]
[min-width 50])
(public*
[gauge-install
(lambda (mx)
(set! max-value mx))])
(override*
[get-frame%
(lambda ()
(class (super get-frame%)
(inherit-field controls)
(super-new)
(private-field
[max-val (make-number-control controls "Maximum:" 10 (lambda () 1) (lambda () 10000)
(lambda (x)
(set! max-value x)
(gb-need-recalc-size)))])))]
[get-classname (lambda () cn)]
[init-name (lambda () (new-name "gauge"))]
[init-vertical-layout? (lambda () #f)]
[get-min-body-size
(lambda (dc)
(if vertical-layout?
(values min-height min-width)
(values min-width min-height)))]
[draw-body
(lambda (dc x y w h)
(send dc draw-rectangle x y w h)
(let ([b (send dc get-brush)])
(send dc set-brush (send mred:the-brush-list find-or-create-brush "BLACK" 'solid))
(send dc draw-rectangle
x (if vertical-layout? (+ y (* 0.75 h)) y)
(if vertical-layout? w (* 0.25 w)) (if vertical-layout? (* 0.25 h) h))
(send dc set-brush b)))]
[gb-get-default-class (lambda () 'gauge%)]
[gb-instantiate-arguments
(lambda ()
(list*
`[range ,max-value]
(super gb-instantiate-arguments)))]
[copy
(lambda ()
(let ([o (super copy)])
(send o gauge-install max-value)
o))]
[write
(lambda (stream)
(super write stream)
(send stream put max-value))]
[read
(lambda (stream version)
(super read stream version)
(gauge-install (send stream get-exact)))])
(super-new))))
(define gb:gauge-snip% (gb:make-gauge-snip%
(gb:make-layout-snip%
(gb:make-text-labelled-snip% gb:atomic-snip%
"Gauge"))
"gb:gauge"))
(register-class gb:gauge-snip% "gb:gauge")
(provide gb:slider-snip%
gb:gauge-snip%))