|
12 | 12 | racket/serialize |
13 | 13 | racket/stxparam |
14 | 14 | racket/splicing |
| 15 | + racket/match |
15 | 16 | (for-syntax racket/base |
16 | 17 | racket/syntax |
17 | 18 | syntax/parse)) |
|
162 | 163 | [else default]))]) |
163 | 164 | get-min-extent |
164 | 165 | get-max-extent |
| 166 | + set-current-extent |
| 167 | + get-current-extent |
165 | 168 | draw |
166 | 169 | on-mouse-event |
167 | 170 | on-keyboard-event)) |
168 | 171 |
|
169 | 172 | (define-base-idmt* base$ object% (idmt<$>) |
170 | 173 | (super-new) |
| 174 | + (define-state x #f) |
| 175 | + (define-state y #f) |
| 176 | + (define-state width #f) |
| 177 | + (define-state height #f) |
171 | 178 | (define/public (add-data key val) |
172 | 179 | (void)) |
173 | 180 | (define/public (draw dc x y w h) |
|
179 | 186 | (define/public (on-keyboard-event event) |
180 | 187 | (void)) |
181 | 188 | (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))) |
183 | 197 |
|
184 | 198 | (define idmt-canvas% |
185 | 199 | (class canvas% |
|
189 | 203 | (super-new [min-width (exact-ceiling min-width)] |
190 | 204 | [min-height (exact-ceiling min-height)] |
191 | 205 | [paint-callback (λ (c dc) |
| 206 | + (send idmt set-current-extent 0 0 (send c get-width) (send c get-height)) |
192 | 207 | (send idmt draw dc 0 0 (send c get-width) (send c get-height)))]) |
193 | 208 | (define/override (on-event event) |
194 | | - (send idmt on-mouse-event event)) |
| 209 | + (send idmt on-mouse-event event) |
| 210 | + (send this refresh)) |
195 | 211 | (define/override (on-char event) |
196 | | - (send idmt on-keyboard-event event)))) |
| 212 | + (send idmt on-keyboard-event event) |
| 213 | + (send this refresh)))) |
197 | 214 |
|
198 | 215 | (define-idmt widget$ base$ |
199 | 216 | (super-new) |
|
205 | 222 | (define/override (get-min-extent) |
206 | 223 | (values (* 2 vert-margin) (* 2 horiz-margin))) |
207 | 224 | (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"))) |
209 | 228 |
|
210 | 229 | (define-idmt list-widget$ widget$ |
211 | 230 | (super-new) |
|
241 | 260 | (send i draw dc x y w item-height) |
242 | 261 | (values (+ y item-height))) |
243 | 262 | (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)) |
244 | 271 | (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)))) |
248 | 275 |
|
249 | 276 | (define-idmt horizontal-block$ list-widget$ |
250 | 277 | (super-new) |
|
298 | 325 | (define-state down-color "Gainsboro") |
299 | 326 | (define-state hover-color "LightGray") |
300 | 327 | (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))])) |
302 | 340 | (define/override (get-min-extent) |
303 | 341 | (define-values (b-w b-h) |
304 | 342 | (super get-min-extent)) |
305 | 343 | (define-values (w h) |
306 | 344 | (send label* get-min-extent)) |
307 | 345 | (values (+ b-w w) (+ b-h h))) |
308 | 346 | (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]))])) |
309 | 354 | (send dc draw-rectangle |
310 | 355 | (+ x horiz-margin) (+ y vert-margin) |
311 | 356 | (- w (* 2 horiz-margin)) (- h (* 2 vert-margin))) |
312 | 357 | (send label* draw dc |
313 | 358 | (+ 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)) |
315 | 367 |
|
316 | 368 | (define-idmt field$ widget$ |
317 | 369 | (super-new)) |
|
0 commit comments