#lang racket/gui
(require plot
(planet williams/animated-canvas/animated-canvas)
(planet williams/science/histogram))
(define histogram-widget%
(class vertical-panel%
(init-field label)
(init-field n)
(init-field min-range)
(init-field max-range)
(init parent)
(init (font normal-control-font))
(super-instantiate (parent))
(define message
(instantiate message%
(label this)))
(define canvas
(instantiate animated-canvas%
(this)
(style '(border))))
(send this reflow-container)
(define histogram
(make-histogram-with-ranges-uniform n min-range max-range))
(define (draw-histogram (scale 1))
(let* ((dc (send canvas get-dc))
(width (send canvas get-width))
(height (send canvas get-height))
(n (histogram-n histogram))
(bins (histogram-bins histogram))
(ranges (histogram-ranges histogram))
(rects
(for/list ((i (in-range n)))
(let ((x0 (vector-ref ranges i))
(x1 (vector-ref ranges (+ i 1)))
(y (vector-ref bins i)))
(vector (ivl x0 x1) (ivl 0 y))))))
(plot/dc (rectangles rects)
dc 0 0 width height
#:x-min (vector-ref ranges 0)
#:x-max (vector-ref ranges (- (vector-length ranges) 1))
#:x-label "x"
#:y-min 0
#:y-max (histogram-max histogram)
#:y-label "Count"))
(send canvas swap-bitmaps))
(define/public (reset)
(set! histogram
(make-histogram-with-ranges-uniform n min-range max-range))
(draw-histogram))
(define/public (set-value value)
(histogram-increment! histogram value)
(draw-histogram))))
(provide (all-defined-out))