-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathcanvas-double-click.rkt
46 lines (33 loc) · 1.31 KB
/
canvas-double-click.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#lang racket/gui
(provide
;; a class extension for canvas$ that deals with single- and double-clicks
;; augment on-click and on-double-click to add the respective functionality
;; each calls on-paint afterwards
canvas-double-click%)
(require 7GUI/Macros/7state) ;; it improves readability
(define DOUBLE-CLICK-INTERVAL (send (new keymap%) get-double-click-interval))
(define canvas-double-click%
(class canvas%
(inherit on-paint)
(define/pubment (on-click x y)
(inner (void) on-click x y)
(on-paint))
(define/pubment (on-double-click x y)
(inner (void) on-double-click x y)
(on-paint))
(define-state *single-click? #f
(λ (pdc) (if pdc (send timer start DOUBLE-CLICK-INTERVAL) (send timer stop))))
(define *evt 0)
(define (call f) (f (send *evt get-x) (send *evt get-y)))
(define (timer-cb)
(when *single-click? (call (λ x (on-click . x))))
(set! *single-click? #f))
(define timer (new timer% [notify-callback timer-cb]))
(define/overment (on-event evt)
(cond
[(eq? (send evt get-event-type) 'left-down)
(set! *evt evt)
(set! *single-click? (not *single-click?))
(unless *single-click? (call (λ x (on-double-click . x))))]
[else (inner (void) on-event evt)]))
(super-new)))