Skip to content

Commit 0bd2215

Browse files
committed
BUTTONS!
1 parent cfc752c commit 0bd2215

File tree

1 file changed

+61
-9
lines changed

1 file changed

+61
-9
lines changed

idmt.rkt

Lines changed: 61 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
racket/serialize
1313
racket/stxparam
1414
racket/splicing
15+
racket/match
1516
(for-syntax racket/base
1617
racket/syntax
1718
syntax/parse))
@@ -162,12 +163,18 @@
162163
[else default]))])
163164
get-min-extent
164165
get-max-extent
166+
set-current-extent
167+
get-current-extent
165168
draw
166169
on-mouse-event
167170
on-keyboard-event))
168171

169172
(define-base-idmt* base$ object% (idmt<$>)
170173
(super-new)
174+
(define-state x #f)
175+
(define-state y #f)
176+
(define-state width #f)
177+
(define-state height #f)
171178
(define/public (add-data key val)
172179
(void))
173180
(define/public (draw dc x y w h)
@@ -179,7 +186,14 @@
179186
(define/public (on-keyboard-event event)
180187
(void))
181188
(define/public (get-max-extent)
182-
(values +inf.0 +inf.0)))
189+
(values +inf.0 +inf.0))
190+
(define/public (set-current-extent nx ny nw nh)
191+
(set! x nx)
192+
(set! y ny)
193+
(set! width nw)
194+
(set! height nh))
195+
(define/public (get-current-extent)
196+
(values x y width height)))
183197

184198
(define idmt-canvas%
185199
(class canvas%
@@ -189,11 +203,14 @@
189203
(super-new [min-width (exact-ceiling min-width)]
190204
[min-height (exact-ceiling min-height)]
191205
[paint-callback (λ (c dc)
206+
(send idmt set-current-extent 0 0 (send c get-width) (send c get-height))
192207
(send idmt draw dc 0 0 (send c get-width) (send c get-height)))])
193208
(define/override (on-event event)
194-
(send idmt on-mouse-event event))
209+
(send idmt on-mouse-event event)
210+
(send this refresh))
195211
(define/override (on-char event)
196-
(send idmt on-keyboard-event event))))
212+
(send idmt on-keyboard-event event)
213+
(send this refresh))))
197214

198215
(define-idmt widget$ base$
199216
(super-new)
@@ -205,7 +222,9 @@
205222
(define/override (get-min-extent)
206223
(values (* 2 vert-margin) (* 2 horiz-margin)))
207224
(define/public (register-parent other)
208-
(set! parent other)))
225+
(set! parent other))
226+
(define/public (get-child-extent child)
227+
(error 'get-child-extent "IDMT does not have children")))
209228

210229
(define-idmt list-widget$ widget$
211230
(super-new)
@@ -241,10 +260,18 @@
241260
(send i draw dc x y w item-height)
242261
(values (+ y item-height)))
243262
(void))
263+
(define/override (set-current-extent x y w h)
264+
(super set-current-extent x y w h)
265+
(define item-height (if (empty? idmt-list) #f (/ h (length idmt-list))))
266+
(for/fold ([y y])
267+
([i (in-list idmt-list)])
268+
(send i set-current-extent x y w item-height)
269+
(values (+ y item-height)))
270+
(void))
244271
(define/override (on-mouse-event event)
245-
(define x (send event get-x))
246-
(define y (send event get-y))
247-
(void)))
272+
(super on-mouse-event event)
273+
(for/list ([i (in-list idmt-list)])
274+
(send i on-mouse-event event))))
248275

249276
(define-idmt horizontal-block$ list-widget$
250277
(super-new)
@@ -298,20 +325,45 @@
298325
(define-state down-color "Gainsboro")
299326
(define-state hover-color "LightGray")
300327
(define/override (on-mouse-event event)
301-
(displayln "button mouse event"))
328+
(define-values (x y w h)
329+
(send this get-current-extent))
330+
(define x-max (+ x w))
331+
(define y-max (+ y h))
332+
(define mouse-x (send event get-x))
333+
(define mouse-y (send event get-y))
334+
(match mouse-state
335+
[(or 'up 'hover)
336+
(if (and (<= x mouse-x x-max)
337+
(<= y mouse-y y-max))
338+
(set! mouse-state 'hover)
339+
(set! mouse-state 'up))]))
302340
(define/override (get-min-extent)
303341
(define-values (b-w b-h)
304342
(super get-min-extent))
305343
(define-values (w h)
306344
(send label* get-min-extent))
307345
(values (+ b-w w) (+ b-h h)))
308346
(define/override (draw dc x y w h)
347+
(define old-brush (send dc get-brush))
348+
(send dc set-brush
349+
(new brush% [color (make-object color%
350+
(match mouse-state
351+
['up up-color]
352+
['hover hover-color]
353+
['down down-color]))]))
309354
(send dc draw-rectangle
310355
(+ x horiz-margin) (+ y vert-margin)
311356
(- w (* 2 horiz-margin)) (- h (* 2 vert-margin)))
312357
(send label* draw dc
313358
(+ x horiz-margin) (+ y vert-margin)
314-
(- w (* 2 horiz-margin)) (- h (* 2 vert-margin)))))
359+
(- w (* 2 horiz-margin)) (- h (* 2 vert-margin)))
360+
(send dc set-brush old-brush)))
361+
362+
(define-idmt toggle$ widget$
363+
(super-new))
364+
365+
(define-idmt radio$ list-widget$
366+
(super-new))
315367

316368
(define-idmt field$ widget$
317369
(super-new))

0 commit comments

Comments
 (0)