checkboxes

cvs
Slava Pestov 2005-02-08 01:10:02 +00:00
parent 7754dde558
commit 44420f200a
4 changed files with 45 additions and 18 deletions

View File

@ -42,20 +42,17 @@ USE: words
[[ [ button-up 1 ] [ my-hand shape-x my-hand shape-y pick move-gadget world get add-gadget ] ]] [[ [ button-up 1 ] [ my-hand shape-x my-hand shape-y pick move-gadget world get add-gadget ] ]]
}} swap set-gadget-gestures ; }} swap set-gadget-gestures ;
: filled? "filled" get checkbox-selected? ;
: <funny-rect> : <funny-rect>
<plain-rect> <gadget> dup moving-actions ; filled? [ <plain-rect> ] [ <hollow-rect> ] ifte <gadget> dup moving-actions ;
: <funny-ellipse> : <funny-ellipse>
<plain-ellipse> <gadget> dup moving-actions ; filled? [ <plain-ellipse> ] [ <hollow-ellipse> ] ifte <gadget> dup moving-actions ;
: <funny-line> : <funny-line>
<line> <gadget> dup moving-actions ; <line> <gadget> dup moving-actions ;
: check-box ( label -- checkbox )
0 0 0 0 <rectangle> <shelf>
[ >r <label> r> add-gadget ] keep
[ >r f bevel-border r> add-gadget ] keep ;
: make-shapes ( -- ) : make-shapes ( -- )
f world get set-gadget-children f world get set-gadget-children
@ -65,7 +62,7 @@ USE: words
"New Rectangle" [ drop 100 100 100 100 <funny-rect> dup [ 255 255 0 ] background set-paint-property world get add-gadget ] <button> "shelf" get add-gadget "New Rectangle" [ drop 100 100 100 100 <funny-rect> dup [ 255 255 0 ] background set-paint-property world get add-gadget ] <button> "shelf" get add-gadget
"New Ellipse" [ drop 100 100 200 100 <funny-ellipse> dup [ 0 255 0 ] background set-paint-property world get add-gadget ] <button> "shelf" get add-gadget "New Ellipse" [ drop 100 100 200 100 <funny-ellipse> dup [ 0 255 0 ] background set-paint-property world get add-gadget ] <button> "shelf" get add-gadget
"New Line" [ drop 100 100 200 100 <funny-line> dup [ 255 0 0 ] background set-paint-property world get add-gadget ] <button> "shelf" get add-gadget "New Line" [ drop 100 100 200 100 <funny-line> dup [ 255 0 0 ] background set-paint-property world get add-gadget ] <button> "shelf" get add-gadget
"A check box" [ drop ] <check-box> "shelf" get add-gadget "Filled?" <checkbox> dup "filled" set "shelf" get add-gadget
"shelf" get "pile" get add-gadget "shelf" get "pile" get add-gadget
"Welcome to Factor " version cat2 <label> "pile" get add-gadget "Welcome to Factor " version cat2 <label> "pile" get add-gadget

View File

@ -63,3 +63,11 @@ USING: gadgets kernel lists math namespaces test ;
[ 30 ] [ 110 110 -100 -200 <line> [ 20 30 rot move-shape ] keep shape-y ] unit-test [ 30 ] [ 110 110 -100 -200 <line> [ 20 30 rot move-shape ] keep shape-y ] unit-test
[ 10 ] [ 110 110 -100 -200 <line> [ 400 400 rot resize-shape ] keep shape-x ] unit-test [ 10 ] [ 110 110 -100 -200 <line> [ 400 400 rot resize-shape ] keep shape-x ] unit-test
[ 400 ] [ 110 110 -100 -200 <line> [ 400 400 rot resize-shape ] keep shape-w ] unit-test [ 400 ] [ 110 110 -100 -200 <line> [ 400 400 rot resize-shape ] keep shape-w ] unit-test
[ t ] [
[
100 x set
100 y set
#{ 110 115 }# << line 0 0 100 150 >> inside?
] with-scope
] unit-test

View File

@ -51,12 +51,32 @@ USING: generic kernel lists math namespaces sdl ;
: <button> ( label quot -- button ) : <button> ( label quot -- button )
>r <label> bevel-border dup r> button-actions ; >r <label> bevel-border dup r> button-actions ;
: <cross> ( w h -- cross ) : <check> ( w h -- cross )
2dup >r >r 0 0 r> r> <line> <gadget> 2dup >r >r 0 0 r> r> <line> <gadget>
>r tuck neg >r >r >r 0 r> r> r> <line> <gadget> r> 2list <stack> ; >r tuck neg >r >r >r 0 r> r> r> <line> <gadget> r>
2list <stack> ;
: <check-box> ( label quot -- checkbox ) TUPLE: checkbox bevel selected? delegate ;
>r 0 0 0 0 <rectangle> <shelf>
: init-checkbox-bevel ( bevel checkbox -- )
2dup set-checkbox-bevel add-gadget ;
: update-checkbox ( checkbox -- )
#! Really, there should only be one child.
dup checkbox-bevel gadget-children [ unparent ] each
dup checkbox-selected? [
11 11 <check>
] [
0 0 11 11 <rectangle> <gadget>
] ifte swap checkbox-bevel add-gadget ;
: toggle-checkbox ( checkbox -- )
dup checkbox-selected? not over set-checkbox-selected?
update-checkbox ;
C: checkbox ( label -- checkbox )
0 0 0 0 <rectangle> <shelf> over set-checkbox-delegate
[ >r <label> r> add-gadget ] keep [ >r <label> r> add-gadget ] keep
[ >r 11 11 <cross> bevel-border r> add-gadget ] keep dup [ f bevel-border swap init-checkbox-bevel ] keep
r> button-actions ; dup [ toggle-checkbox ] button-actions
dup update-checkbox ;

View File

@ -123,7 +123,9 @@ M: line shape-y dup line-y dup rot line-h + min ;
M: line shape-w line-w abs ; M: line shape-w line-w abs ;
M: line shape-h line-h abs ; M: line shape-h line-h abs ;
: line-pos ( line -- #{ x y }# ) dup line-x swap line-y rect> ; : line-pos ( line -- #{ x y }# )
dup line-x x get + swap line-y y get + rect> ;
: line-dir ( line -- #{ w h }# ) dup line-w swap line-h rect> ; : line-dir ( line -- #{ w h }# ) dup line-w swap line-h rect> ;
: move-line-x ( x line -- ) : move-line-x ( x line -- )
@ -159,11 +161,11 @@ M: line resize-shape ( w h line -- )
: line>screen ( shape -- x1 y1 x2 y2 ) : line>screen ( shape -- x1 y1 x2 y2 )
[ line-x x get + ] keep [ line-x x get + ] keep
[ line-y y get + ] keep [ line-y y get + ] keep
[ dup line-w swap line-x + pick + ] keep [ line-w pick + ] keep
dup line-h swap line-y + pick + ; line-h pick + ;
: line-inside? ( p d -- ? ) : line-inside? ( p d -- ? )
dupd proj - absq 2 < ; dupd proj - absq 4 < ;
M: line inside? ( point line -- ? ) M: line inside? ( point line -- ? )
2dup inside-rect? [ 2dup inside-rect? [