original commit: 99004429b9b3d0f2666381ab96e405b462b768d2
This commit is contained in:
Matthew Flatt 2002-09-17 13:33:53 +00:00
parent dc8c541117
commit 621f81aaeb
2 changed files with 161 additions and 82 deletions

View File

@ -1726,7 +1726,7 @@
(define callback call-back)
(define tabs tab-labels)
(define tabs (map wx:label->plain-label tab-labels))
(define tab-widths #f)
(define tab-height #f)
@ -1734,12 +1734,14 @@
(inherit get-dc get-client-size get-mred
set-min-width set-min-height)
(rename [super-on-size on-size])
(define selected 1)
(define selected 0)
(define tracking-pos #f)
(define tracking-hit? #f)
(define regions #f)
(define redo-regions? #f)
(define/private (compute-sizes)
(let ([dc (get-dc)])
@ -1748,7 +1750,7 @@
(cons w h)))
tabs)])
(set! tab-widths (map car w+hs))
(let ([th (ceiling (+ (* 2 tab-v-space) (apply max (map cdr w+hs))))])
(let ([th (ceiling (+ (* 2 tab-v-space) (apply max 0 (map cdr w+hs))))])
(set! tab-height (if (even? th) th (add1 th)))))))
(define/private (get-total-width)
@ -1759,43 +1761,37 @@
[(tw) (get-total-width)])
(/ (- w tw) 2)))
(define/override (on-event e)
(cond
[(and (send e button-down?) tab-widths)
(set! tracking-pos (find-click (send e get-x) (send e get-y)))
(when tracking-pos
(set! tracking-hit? #t)
(update-tracking))]
[(and (send e dragging?) tracking-pos)
(let ([hit? (equal? tracking-pos (find-click (send e get-x) (send e get-y)))])
(unless (eq? tracking-hit? hit?)
(set! tracking-hit? hit?)
(update-tracking)))]
[(and (send e button-up?) tracking-pos
(equal? tracking-pos (find-click (send e get-x) (send e get-y)))
(not (= tracking-pos selected)))
;; Button released for final selection
(let* ([dc (get-dc)]
[r (make-object wx:region% dc)]
[old-rgn (list-ref regions selected)])
(set! selected tracking-pos)
(set! tracking-pos #f)
(set! tracking-hit? #f)
(send r union old-rgn)
(setup-regions)
(let ([new-rgn (list-ref regions selected)])
;; Union the new and old regions and repaint:
(send r union new-rgn)
(send dc set-clipping-region r)
(on-paint)
(send dc set-clipping-region #f)
(callback this (make-object wx:control-event% 'tab-group))))]
;; otherwise, turn off tracking...
[else
(when tracking-hit?
(set! tracking-hit? #f)
(update-tracking))
(set! tracking-pos #f)]))
(define/override on-event
(entry-point
(lambda (e)
(cond
[(and (send e button-down?) tab-widths)
(set! tracking-pos (find-click (send e get-x) (send e get-y)))
(when tracking-pos
(set! tracking-hit? #t)
(update-tracking))]
[(and (send e dragging?) tracking-pos)
(let ([hit? (equal? tracking-pos (find-click (send e get-x) (send e get-y)))])
(unless (eq? tracking-hit? hit?)
(set! tracking-hit? hit?)
(update-tracking)))]
[(and (send e button-up?) tracking-pos
(equal? tracking-pos (find-click (send e get-x) (send e get-y)))
(not (= tracking-pos selected)))
;; Button released for final selection
(let ([new tracking-pos])
(set! tracking-pos #f)
(set! tracking-hit? #f)
(set-selection new)
(as-exit
(lambda ()
(callback this (make-object wx:control-event% 'tab-panel)))))]
;; otherwise, turn off tracking...
[else
(when tracking-hit?
(set! tracking-hit? #f)
(update-tracking))
(set! tracking-pos #f)]))))
(define/private (update-tracking)
(let ([dc (get-dc)])
@ -1806,7 +1802,7 @@
(define tmp-rgn #f)
(define/private (find-click x y)
(unless regions (setup-regions))
(ready-regions)
(unless tmp-rgn
(set! tmp-rgn (make-object wx:region% (get-dc))))
(let loop ([rl regions][pos 0])
@ -1832,8 +1828,12 @@
regions
(map (lambda (x)
(make-object wx:region% dc))
tabs))))))
tabs))))
(set! redo-regions? #f)))
(define/private (ready-regions)
(unless (and regions (not redo-regions?))
(setup-regions)))
(define (draw-once dc w light? dark? inset)
(let ([init-x (get-init-x)])
@ -1851,13 +1851,13 @@
(when light?
(send dc draw-line 0 tab-height x tab-height)
(send dc draw-line 0 (add1 tab-height) x (add1 tab-height))))
(let ([short (if (not (= (sub1 pos) selected))
(let ([short (if (or (= pos 0) (= pos selected))
0
(/ tab-height 2))])
(when light?
(send dc draw-line (+ x short) (- tab-height short) (+ x tab-height) 0)
(send dc draw-line (+ x short 1) (- tab-height short) (+ x tab-height 1) 0))
(list (list (+ x short inset) (- tab-height short -2 inset))
(list (list (+ x short -2 inset) (- tab-height short -2 inset))
(list (+ x tab-height inset) inset))))
;; top line
(begin
@ -1866,9 +1866,9 @@
(send dc draw-line (+ x tab-height) 1 next-x 1))
(list (list (+ 1 next-x (- inset)) inset)))
;; right line
(let ([short (if (or (= pos selected) (null? (cdr l)))
0
(/ tab-height 2))])
(let ([short (if (= (add1 pos) selected)
(/ tab-height 2)
0)])
(when dark?
(send dc draw-line (add1 next-x) 1 (- (+ next-x tab-height) short 1) (- tab-height short 1))
(send dc draw-line next-x 1 (- (+ next-x tab-height) short 2) (- tab-height short 1)))
@ -1883,39 +1883,87 @@
(list (list (+ next-x inset) (+ 2 tab-height (- inset))))))
(loop next-x (cdr l) (cdr wl) (add1 pos))))))))
(define/override (on-paint)
(unless tab-widths
(compute-sizes))
(let ([dc (get-dc)])
(send dc set-background bg-color)
(send dc set-font font)
(send dc clear)
(send dc set-origin 0 2)
(when (and tracking-pos tracking-hit?)
(let ([b (send dc get-brush)])
(send dc set-brush dark-brush)
(send dc set-pen trans-pen)
(send dc draw-polygon (map (lambda (x) (make-object wx:point% (car x) (cadr x)))
(list-ref (draw-once #f 0 #f #f 1) tracking-pos)))
(send dc set-brush b)))
(let-values ([(w h) (my-get-client-size)])
(send dc set-pen light-pen)
(draw-once dc w #t #f 0)
(when (> h tab-height)
(send dc draw-line 0 tab-height 0 h)
(send dc draw-line 1 tab-height 1 h))
(send dc set-pen dark-pen)
(draw-once dc w #f #t 0)
(when (> h tab-height)
(send dc draw-line (- w 1) tab-height (- w 1) h)
(send dc draw-line (- w 2) tab-height (- w 2) h)
(send dc draw-line 0 (- h 3) w (- h 3))
(send dc draw-line 0 (- h 4) w (- h 4))))
(send dc set-origin 0 0)))
(define/override on-paint
(entry-point
(lambda ()
(unless tab-widths
(compute-sizes))
(let ([dc (get-dc)])
(send dc set-background bg-color)
(send dc set-font font)
(send dc clear)
(send dc set-origin 0 2)
(when (and tracking-pos tracking-hit?)
(let ([b (send dc get-brush)])
(send dc set-brush dark-brush)
(send dc set-pen trans-pen)
(send dc draw-polygon (map (lambda (x) (make-object wx:point% (car x) (cadr x)))
(list-ref (draw-once #f 0 #f #f 1) tracking-pos)))
(send dc set-brush b)))
(let-values ([(w h) (my-get-client-size)])
(send dc set-pen light-pen)
(draw-once dc w #t #f 0)
(when (> h tab-height)
(send dc draw-line 0 tab-height 0 h)
(send dc draw-line 1 tab-height 1 h))
(send dc set-pen dark-pen)
(draw-once dc w #f #t 0)
(when (> h tab-height)
(send dc draw-line (- w 1) tab-height (- w 1) h)
(send dc draw-line (- w 2) tab-height (- w 2) h)
(send dc draw-line 0 (- h 3) w (- h 3))
(send dc draw-line 0 (- h 4) w (- h 4))))
(send dc set-origin 0 0)))))
(define/override (on-size w h)
(set! redo-regions? #t)
(super-on-size w h))
(define/private (my-get-client-size)
(get-two-int-values (lambda (a b) (get-client-size a b))))
(define/public (get-selection)
selected)
(define/public (set-selection i)
(as-entry
(lambda ()
(ready-regions)
(when (< -1 i (length regions))
(let* ([dc (get-dc)]
[r (make-object wx:region% dc)]
[old-rgn (list-ref regions selected)])
(set! selected i)
(send r union old-rgn)
(setup-regions)
(let ([new-rgn (list-ref regions selected)])
;; Union the new and old regions and repaint:
(send r union new-rgn)
(send dc set-clipping-region r)
(on-paint)
(send dc set-clipping-region #f)))))))
(define -append
(entry-point
(lambda (s)
(set! tabs (append tabs (list (wx:label->plain-label s))))
(set! tab-widths #f)
(set! regions #f)
(on-paint))))
(public (-append append))
(define/public (delete i)
(as-entry
(lambda ()
(set! tabs (let loop ([pos 0][l tabs])
(if (= i pos)
(cdr tabs)
(cons (car tabs) (loop (add1 pos) (cdr tabs))))))
(set! selected (min selected (max 0 (sub1 (length tabs)))))
(set! regions #f)
(set! tab-widths #f)
(on-paint))))
(super-instantiate (mred proxy parent))
(compute-sizes)
@ -4511,12 +4559,14 @@
(define tab-panel%
(class vertical-panel%
(init choices callback)
(init choices parent callback [style null])
(let ([cwho '(constructor tab-panel)])
(unless (and (list? choices) (andmap label-string? choices))
(raise-type-error (who->name cwho) "list of strings (up to 200 characters)" choices))
(check-callback cwho callback))
(super-instantiate ())
(check-callback cwho callback)
(check-container-parent cwho parent)
(check-style cwho #f '() style))
(super-instantiate (parent null))
(define tabs (make-object tab-group% #f choices this (lambda (c e) (callback this e))))
(send (mred->wx this) set-first-child-is-hidden)
@ -4526,9 +4576,10 @@
[get-number (lambda () (length save-choices))]
[append (entry-point
(lambda (n)
(check-label-string '(method tab-group% append) n)
(set! save-choices (list-append save-choices (list (string->immutable-string n))))
(as-exit (lambda () (send (mred->wx tabs) append n)))))]
(check-label-string '(method tab-panel% append) n)
(let ([n (string->immutable-string n)])
(set! save-choices (list-append save-choices (list n)))
(as-exit (lambda () (send (mred->wx tabs) append n))))))]
[get-selection (lambda () (and (pair? save-choices)
(send (mred->wx tabs) get-selection)))]
[set-selection (entry-point

View File

@ -591,6 +591,11 @@
"initial & starting"
'(multiple)))
(define tab (make-object tab-panel%
'("Appl\351" "B&anana") ip2 void))
(make-object button% "OK" tab void)
(add-testers2 "Horiz Slider" sh)
(add-testers2 "Vert Slider" sv)
(add-testers2 "Horiz Gauge" gh)
@ -598,6 +603,7 @@
; (add-testers2 "Text Message" cmt)
; (add-testers2 "Image Message" cmi)
(add-testers2 "Text" txt)
(add-testers2 "Tab" tab)
(add-change-label "Horiz Slider" sh lp2 #f OTHER-LABEL)
(add-change-label "Vert Slider" sv lp2 #f OTHER-LABEL)
@ -1718,6 +1724,25 @@
;----------------------------------------------------------------------
(define (test-tab-panel)
(define f (make-object frame% "Tabby"))
(define p (make-object tab-panel% '("App&le" "B&anana" "Co&conut")
f
(lambda (p e)
(send m set-label (format "Selected: ~a" (send p get-selection))))))
(define count 3)
(define m (make-object message% (format "Selected: ~a" (send p get-selection)) p))
(make-object button% "Append" p (lambda (b e)
(send p append (format "N&ew ~a" count))
(set! count (add1 count))))
(make-object button% "Delete" p (lambda (b e)
(send p delete 0)))
(send f show #t))
;----------------------------------------------------------------------
(define (message-boxes)
(define (check expected got)
(unless (eq? expected got)
@ -1862,6 +1887,9 @@
(make-object button% "Make Gauge Frame" gsp (lambda (b e) (gauge-frame)))
(make-object vertical-pane% gsp) ; filler
(make-object button% "Make Slider Frame" gsp (lambda (b e) (slider-frame)))
(make-object vertical-pane% gsp) ; filler
(make-object button% "Make Tab Panel" gsp (lambda (b e) (test-tab-panel)))
(define tp (make-object horizontal-pane% ap))
(send tp stretchable-width #f)
(make-object button% "Make Text Frame" tp (lambda (b e) (text-frame '(single))))