macro-stepper: gui improvements

- give "?" of ?-arrows a white background
  - improved clickback replacement
  - fixed tack/untack

original commit: 75079ec421d46fed52a16afedf1f3272c5915565
This commit is contained in:
Ryan Culpepper 2010-11-08 21:37:33 -07:00
parent fcd4cc32c4
commit 0cad27438d

View File

@ -19,7 +19,7 @@
text:region-data-mixin
text:clickregion-mixin)
(define err (current-error-port))
(define arrow-cursor (make-object cursor% 'arrow))
(define arrow-brush
(send the-brush-list find-or-create-brush "white" 'solid))
@ -161,17 +161,17 @@
(define tacked-table (make-hasheq))
(define/override (on-event ev)
(define/override (on-local-event ev)
(case (send ev get-event-type)
((right-down)
(if (pair? (get-position-drawings hover-position))
(send (get-canvas) popup-menu
(make-tack/untack-menu)
(make-tack/untack-menu (get-position-drawings hover-position))
(send ev get-x)
(send ev get-y))
(super on-event ev)))
(super on-local-event ev)))
(else
(super on-event ev))))
(super on-local-event ev))))
(define/override (on-paint before? dc left top right bottom dx dy draw-caret)
(super on-paint before? dc left top right bottom dx dy draw-caret)
@ -179,26 +179,32 @@
(for ([draw (in-hash-keys tacked-table)])
(draw this dc left top right bottom dx dy))))
(define/private (make-tack/untack-menu)
(define/private (make-tack/untack-menu drawings)
(define menu (new popup-menu%))
(define keymap (get-keymap))
(define tack-item
(new menu-item% (label "Tack")
(parent menu)
(callback (lambda _ (tack))))
(callback (lambda _ (tack drawings)))))
(define untack-item
(new menu-item% (label "Untack")
(parent menu)
(callback (lambda _ (untack))))
(callback (lambda _ (untack drawings)))))
(send tack-item enable
(for/or ([d (in-list drawings)]) (not (unbox (drawing-tacked? d)))))
(send untack-item enable
(for/or ([d (in-list drawings)]) (unbox (drawing-tacked? d))))
(when (is-a? keymap keymap/popup<%>)
(new separator-menu-item% (parent menu))
(send keymap add-context-menu-items menu))
menu)
(define/private (tack)
(for ([d (get-position-drawings hover-position)])
(define/private (tack drawings)
(for ([d (in-list drawings)])
(hash-set! tacked-table (drawing-draw d) #t)
(set-box! (drawing-tacked? d) #t)))
(define/private (untack)
(for ([d (get-position-drawings hover-position)])
(define/private (untack drawings)
(for ([d (in-list drawings)])
(hash-remove! tacked-table (drawing-draw d))
(set-box! (drawing-tacked? d) #f)))))
@ -261,13 +267,16 @@
endx
(+ endy (/ fh 2))
dx dy)
(send dc set-text-mode 'transparent)
(when question?
(send dc set-font (?-font dc))
(send dc set-text-foreground color)
(send dc draw-text "?"
(+ endx dx fw)
(- (+ endy dy) fh)))))))])
(let* ([?x (+ endx dx fw)]
[?y (- (+ endy dy) fh)])
(send* dc
(set-brush billboard-brush)
(set-font (?-font dc))
(set-text-foreground color)
(draw-rounded-rectangle (- ?x _d) (- ?y _d)
(+ fw _d _d) (+ fh _d _d))
(draw-text "?" ?x ?y))))))))])
(add-hover-drawing from1 from2 draw tack-box)
(add-hover-drawing to1 to2 draw tack-box))))
@ -324,34 +333,56 @@ Like clickbacks, but:
(major problem w/ macro stepper and large expansions!)
- callback takes position of click, not (start, end)
- different rules for removal
- TODO: change cursor on mouse-over
- TODO: invoke callback on mouse-up
- TODO: extend to double-click
|#
(define text:clickregion-mixin
(mixin (text:region-data<%>) ()
(inherit get-region-mapping
(inherit get-admin
get-region-mapping
dc-location-to-editor-location
find-position)
(super-new)
(define clickbacks (get-region-mapping clickregion-key))
(define tracking #f)
(define/public (set-clickregion start end callback)
(if callback
(interval-map-set! clickbacks start end callback)
(interval-map-remove! clickbacks start end)))
(define/override (on-default-event ev)
(when (send ev button-down?)
(define/private (get-event-position ev)
(define gx (send ev get-x))
(define gy (send ev get-y))
(define-values (x y) (dc-location-to-editor-location gx gy))
(define pos (find-position x y))
(find-position x y))
(define/override (on-default-event ev)
(define admin (get-admin))
(when admin
(define pos (get-event-position ev))
(case (send ev get-event-type)
((left-down)
(set! tracking (interval-map-ref clickbacks pos #f))
(send admin update-cursor))
((left-up)
(when tracking
(let ([cb (interval-map-ref clickbacks pos #f)]
[tracking* tracking])
(set! tracking #f)
(when (eq? tracking* cb)
(cb pos)))
(send admin update-cursor)))))
(super on-default-event ev))
(define/override (adjust-cursor ev)
(define pos (get-event-position ev))
(define cb (interval-map-ref clickbacks pos #f))
(when cb (cb pos)))
(super on-default-event ev))))
(if cb
arrow-cursor
(super adjust-cursor ev)))))
#|
(define text:hover-identifier<%>