allow radio-box% to have no selected buttons

svn: r17865

original commit: a09e671f347d4f1d2b5f8937df5ab26f135f7f5f
This commit is contained in:
Matthew Flatt 2010-01-28 17:51:30 +00:00
parent d5be68f049
commit 0b0c06b56e
6 changed files with 43 additions and 24 deletions

View File

@ -117,7 +117,7 @@
(unless (and (integer? i) (exact? i) (not (negative? i))) (unless (and (integer? i) (exact? i) (not (negative? i)))
(raise-type-error (who->name who) (raise-type-error (who->name who)
(if false-ok? (if false-ok?
"non-negative exact integeror #f" "non-negative exact integer or #f"
"non-negative exact integer" ) "non-negative exact integer" )
i)))) i))))

View File

@ -264,40 +264,47 @@
(check-container-parent cwho parent) (check-container-parent cwho parent)
(check-callback cwho callback) (check-callback cwho callback)
(check-orientation cwho style) (check-orientation cwho style)
(check-non-negative-integer cwho selection))) (check-non-negative-integer/false cwho selection)))
(private-field (private-field
[wx #f]) [wx #f])
(private (private
[check-button [check-button
(lambda (method n) (lambda (method n false-ok?)
(check-non-negative-integer `(method radio-box% ,method) n) ((if false-ok?
(unless (< n (length chcs)) check-non-negative-integer/false
(raise-mismatch-error (who->name `(method radio-box% ,method)) "no such button: " n)))]) check-non-negative-integer)
`(method radio-box% ,method) n)
(when n
(unless (< n (length chcs))
(raise-mismatch-error (who->name `(method radio-box% ,method)) "no such button: " n))))])
(override (override
[enable (entry-point [enable (entry-point
(case-lambda (case-lambda
[(on?) (send wx enable on?)] [(on?) (send wx enable on?)]
[(which on?) (check-button 'enable which) [(which on?) (check-button 'enable which #f)
(send wx enable which on?)]))] (send wx enable which on?)]))]
[is-enabled? (entry-point [is-enabled? (entry-point
(case-lambda (case-lambda
[() (send wx is-enabled?)] [() (send wx is-enabled?)]
[(which) (check-button 'is-enabled? which) [(which) (check-button 'is-enabled? which #f)
(send wx is-enabled? which)]))]) (send wx is-enabled? which)]))])
(public (public
[get-number (lambda () (length chcs))] [get-number (lambda () (length chcs))]
[get-item-label (lambda (n) [get-item-label (lambda (n)
(check-button 'get-item-label n) (check-button 'get-item-label n #f)
(list-ref chcs n))] (list-ref chcs n))]
[get-item-plain-label (lambda (n) [get-item-plain-label (lambda (n)
(check-button 'get-item-plain-label n) (check-button 'get-item-plain-label n #f)
(wx:label->plain-label (list-ref chcs n)))] (wx:label->plain-label (list-ref chcs n)))]
[get-selection (entry-point (lambda () (send wx get-selection)))] [get-selection (entry-point (lambda () (let ([v (send wx get-selection)])
(if (equal? v -1)
#f
v))))]
[set-selection (entry-point [set-selection (entry-point
(lambda (v) (lambda (v)
(check-button 'set-selection v) (check-button 'set-selection v #t)
(send wx set-selection v)))]) (send wx set-selection (or v -1))))])
(sequence (sequence
(as-entry (as-entry
(lambda () (lambda ()
@ -317,7 +324,7 @@
(length choices)) (length choices))
selection)))) selection))))
label parent callback #f))) label parent callback #f)))
(when (positive? selection) (when (or (not selection) (positive? selection))
(set-selection selection))))) (set-selection selection)))))
(define slider% (define slider%

View File

@ -203,7 +203,7 @@ information@|details|, even if the editor currently has delayed refreshing (see
monitor @|whatsit| changes.}) monitor @|whatsit| changes.})
(define (MonitorCallbackX a b c d) (define (MonitorCallbackX a b c d)
(MonitorMethod a b @elem{the @|d|callback procedure (provided as an initialization argument)} c)) (MonitorMethod a b @elem{the @|d| callback procedure (provided as an initialization argument)} c))
(define (MonitorCallback a b c) (define (MonitorCallback a b c)
(MonitorCallbackX a b c "control")) (MonitorCallbackX a b c "control"))

View File

@ -28,7 +28,7 @@ Whenever the user changes the selected radio button, the radio box's
'vertical-label 'horizontal-label 'vertical-label 'horizontal-label
'deleted)) 'deleted))
'(vertical)] '(vertical)]
[selection exact-nonnegative-integer? 0] [selection (or/c exact-nonnegative-integer? #f) 0]
[font (is-a?/c font%) normal-control-font] [font (is-a?/c font%) normal-control-font]
[enabled any/c #t] [enabled any/c #t]
[vert-margin (integer-in 0 1000) 2] [vert-margin (integer-in 0 1000) 2]
@ -64,8 +64,9 @@ The @scheme[style] argument must include either @scheme['vertical] for a
@HVLabelNote[@scheme[style]]{radio box} @DeletedStyleNote[@scheme[style] @scheme[parent]]{radio box} @HVLabelNote[@scheme[style]]{radio box} @DeletedStyleNote[@scheme[style] @scheme[parent]]{radio box}
By default, the first radio button is initially selected. If By default, the first radio button is initially selected. If
@scheme[selection] is positive, it is passed to @method[radio-box% @scheme[selection] is positive or @scheme[#f], it is passed to
set-selection] to set the initial radio button selection. @method[radio-box% set-selection] to set the initial radio button
selection.
@FontKWs[@scheme[font]] @WindowKWs[@scheme[enabled]] @SubareaKWs[] @AreaKWs[] @FontKWs[@scheme[font]] @WindowKWs[@scheme[enabled]] @SubareaKWs[] @AreaKWs[]
@ -115,10 +116,10 @@ Returns the number of radio buttons in the radio box.
} }
@defmethod[(get-selection) @defmethod[(get-selection)
exact-nonnegative-integer?]{ (or/c exact-nonnegative-integer? #f)]{
Gets the position of the selected radio button. Radio buttons are Gets the position of the selected radio button, returning @scheme[#f]
numbered from @scheme[0]. if no button is selected. Radio buttons are numbered from @scheme[0].
} }
@ -139,10 +140,11 @@ box, @|MismatchExn|.
} }
@defmethod[(set-selection [n exact-nonnegative-integer?]) @defmethod[(set-selection [n (or/c exact-nonnegative-integer? #f)])
void?]{ void?]{
Sets the selected radio button by position. (The control's callback Sets the selected radio button by position, or deselects all radio
buttons if @scheme[n] is @scheme[#f]. (The control's callback
procedure is @italic{not} invoked.) Radio buttons are numbered from procedure is @italic{not} invoked.) Radio buttons are numbered from
@scheme[0]. If @scheme[n] is equal to or larger than the number of @scheme[0]. If @scheme[n] is equal to or larger than the number of
radio buttons in the radio box, @|MismatchExn|. radio buttons in the radio box, @|MismatchExn|.

View File

@ -1299,6 +1299,7 @@
(define mismatch-err (mk-err exn:fail:contract?)) (define mismatch-err (mk-err exn:fail:contract?))
(define do-sel (lambda (sel n) (for-each (lambda (rb) (sel rb (n rb))) rbs))) (define do-sel (lambda (sel n) (for-each (lambda (rb) (sel rb (n rb))) rbs)))
(define sel-false (lambda (sel) (do-sel sel (lambda (rb) #f))))
(define sel-minus (lambda (sel) (do-sel (type-err sel) (lambda (rb) -1)))) (define sel-minus (lambda (sel) (do-sel (type-err sel) (lambda (rb) -1))))
(define sel-first (lambda (sel) (do-sel sel (lambda (rb) 0)))) (define sel-first (lambda (sel) (do-sel sel (lambda (rb) 0))))
(define sel-middle (lambda (sel) (do-sel sel (lambda (rb) (floor (/ (send rb get-number) 2)))))) (define sel-middle (lambda (sel) (do-sel sel (lambda (rb) (floor (/ (send rb get-number) 2))))))
@ -1311,7 +1312,9 @@
(make-object button% (format "Select First~a" title) hp2 (lambda (b e) (sel-first sel))) (make-object button% (format "Select First~a" title) hp2 (lambda (b e) (sel-first sel)))
(make-object button% (format "Select Middle ~a" title) hp2 (lambda (b e) (sel-middle sel))) (make-object button% (format "Select Middle ~a" title) hp2 (lambda (b e) (sel-middle sel)))
(make-object button% (format "Select Last~a" title) hp2 (lambda (b e) (sel-last sel))) (make-object button% (format "Select Last~a" title) hp2 (lambda (b e) (sel-last sel)))
(make-object button% (format "Select N~a" title) hp2 (lambda (b e) (sel-N sel)))) (make-object button% (format "Select N~a" title) hp2 (lambda (b e) (sel-N sel)))
(when (equal? title "")
(make-object button% (format "Select #f~a" title) hp2 (lambda (b e) (sel-false sel)))))
(make-selectors "" normal-sel) (make-selectors "" normal-sel)
(make-selectors " by Simulate" simulate-sel) (make-selectors " by Simulate" simulate-sel)
(make-object button% "Check" p (make-object button% "Check" p

View File

@ -1,3 +1,10 @@
Version 4.2.4.1
Changed radio-box% to allow #f as a selection so that no buttons are
selected
----------------------------------------------------------------------
Version 4.2.4, January 2010 Version 4.2.4, January 2010
Minor bug fixes Minor bug fixes