splitter control in the UI works, improving panes, various UI cleanups

cvs
Slava Pestov 2005-06-26 00:39:53 +00:00
parent 3c5ebd288a
commit 49769678d1
14 changed files with 93 additions and 58 deletions

View File

@ -64,7 +64,7 @@ M: general-list contains? ( obj list -- ? )
2dup contains? [ nip ] [ cons ] ifte ; 2dup contains? [ nip ] [ cons ] ifte ;
M: general-list reverse ( list -- list ) M: general-list reverse ( list -- list )
[ ] swap [ swons ] each ; [ ] [ swons ] reduce ;
M: f map ( list quot -- list ) drop ; M: f map ( list quot -- list ) drop ;

View File

@ -32,6 +32,9 @@ G: each ( seq quot -- | quot: elt -- )
: each-with ( obj seq quot -- | quot: obj elt -- ) : each-with ( obj seq quot -- | quot: obj elt -- )
swap [ with ] each 2drop ; inline swap [ with ] each 2drop ; inline
: reduce ( list identity quot -- value | quot: x y -- z )
swapd each ; inline
G: tree-each ( obj quot -- | quot: elt -- ) G: tree-each ( obj quot -- | quot: elt -- )
[ over ] [ type ] ; inline [ over ] [ type ] ; inline
@ -44,6 +47,9 @@ G: map ( seq quot -- seq | quot: elt -- elt )
: map-with ( obj list quot -- list | quot: obj elt -- elt ) : map-with ( obj list quot -- list | quot: obj elt -- elt )
swap [ with rot ] map 2nip ; inline swap [ with rot ] map 2nip ; inline
: accumulate ( list identity quot -- values | quot: x y -- z )
rot [ pick >r swap call r> ] map-with nip ; inline
G: 2map ( seq seq quot -- seq | quot: elt elt -- elt ) G: 2map ( seq seq quot -- seq | quot: elt elt -- elt )
[ over ] [ type ] ; inline [ over ] [ type ] ; inline

View File

@ -17,8 +17,11 @@ vectors ;
: vmin ( v v -- v ) [ min ] 2map ; : vmin ( v v -- v ) [ min ] 2map ;
: vneg ( v -- v ) [ neg ] map ; : vneg ( v -- v ) [ neg ] map ;
: sum ( v -- n ) 0 swap [ + ] each ; : sum ( v -- n ) 0 [ + ] reduce ;
: product 1 swap [ * ] each ; : product 1 [ * ] reduce ;
: set-axis ( x y axis -- v )
2dup v* >r >r drop dup r> v* v- r> v+ ;
! Later, this will fixed when 2each works properly ! Later, this will fixed when 2each works properly
! : v. ( v v -- x ) 0 swap [ conjugate * + ] 2each ; ! : v. ( v v -- x ) 0 swap [ conjugate * + ] 2each ;

View File

@ -43,13 +43,6 @@ SYMBOL: surface
[ set-rect-y ] keep [ set-rect-y ] keep
[ set-rect-x ] keep ; [ set-rect-x ] keep ;
: black [ 0 0 0 ] ;
: gray [ 128 128 128 ] ;
: white [ 255 255 255 ] ;
: red [ 255 0 0 ] ;
: green [ 0 255 0 ] ;
: blue [ 0 0 255 ] ;
: with-pixels ( quot -- ) : with-pixels ( quot -- )
width get [ width get [
height get [ height get [

View File

@ -20,7 +20,7 @@ M: object digit> not-a-number ;
dup empty? [ dup empty? [
not-a-number not-a-number
] [ ] [
0 swap [ digit> pick digit+ ] each nip 0 [ digit> pick digit+ ] reduce nip
] ifte ; ] ifte ;
: base> ( str base -- num ) : base> ( str base -- num )

View File

@ -1,5 +1,5 @@
IN: temporary IN: temporary
USING: lists sequences test vectors ; USING: lists math sequences test vectors ;
[ [ 1 2 3 4 ] ] [ 1 5 <range> >list ] unit-test [ [ 1 2 3 4 ] ] [ 1 5 <range> >list ] unit-test
[ 3 ] [ 1 4 <range> length ] unit-test [ 3 ] [ 1 4 <range> length ] unit-test
@ -14,3 +14,8 @@ USING: lists sequences test vectors ;
[ "cba" ] [ 3 "abcdef" head-slice reverse ] unit-test [ "cba" ] [ 3 "abcdef" head-slice reverse ] unit-test
[ 1 2 3 ] [ 1 2 3 3vector 3unseq ] unit-test [ 1 2 3 ] [ 1 2 3 3vector 3unseq ] unit-test
[ 5040 ] [ [ 1 2 3 4 5 6 7 ] 1 [ * ] reduce ] unit-test
[ [ 1 1 2 6 24 120 720 ] ]
[ [ 1 2 3 4 5 6 7 ] 1 [ * ] accumilate ] unit-test

8
library/ui/colors.factor Normal file
View File

@ -0,0 +1,8 @@
IN: gadgets
: black [ 0 0 0 ] ;
: gray [ 128 128 128 ] ;
: white [ 255 255 255 ] ;
: red [ 255 0 0 ] ;
: green [ 0 255 0 ] ;
: blue [ 0 0 255 ] ;

View File

@ -90,11 +90,3 @@ M: gadget layout*
GENERIC: user-input* ( ch gadget -- ? ) GENERIC: user-input* ( ch gadget -- ? )
M: gadget user-input* 2drop t ; M: gadget user-input* 2drop t ;
GENERIC: orientation ( gadget -- vector )
: orient* ( x y axis -- v )
2dup v* >r >r drop dup r> v* v- r> v+ ;
: orient ( x y gadget -- vec )
orientation orient* ;

View File

@ -16,4 +16,10 @@ global [
}} world get set-gadget-paint }} world get set-gadget-paint
1024 768 world get resize-gadget 1024 768 world get resize-gadget
<plain-gadget> world get add-gadget
<console> "Stack display goes here" <label> <y-splitter>
3/4 over set-splitter-split
world get add-gadget
] bind ] bind

View File

@ -7,15 +7,20 @@ sequences io strings threads ;
! A pane is an area that can display text. ! A pane is an area that can display text.
! output: pile ! output: pile
! current: label ! current: shelf
! input: editor ! input: editor
TUPLE: pane output current input continuation ; TUPLE: pane output active current input continuation ;
: add-output 2dup set-pane-output add-gadget ; : add-output 2dup set-pane-output add-gadget ;
: add-input 2dup set-pane-input add-gadget ; : add-input 2dup set-pane-input add-gadget ;
: <active-line> ( current input -- line ) : <active-line> ( input current -- line )
<line-shelf> [ tuck add-gadget add-gadget ] keep ; <line-shelf> [ add-gadget ] keep [ add-gadget ] keep ;
: init-active-line ( pane -- )
dup pane-active [ unparent ] when*
[ dup pane-input swap pane-current <active-line> ] keep
2dup set-pane-active add-gadget ;
: pane-paint ( pane -- ) : pane-paint ( pane -- )
[[ "Monospaced" 12 ]] font set-paint-prop ; [[ "Monospaced" 12 ]] font set-paint-prop ;
@ -43,22 +48,18 @@ TUPLE: pane output current input continuation ;
C: pane ( -- pane ) C: pane ( -- pane )
<line-pile> over set-delegate <line-pile> over set-delegate
<line-pile> over add-output <line-pile> over add-output
"" <label> dup pick set-pane-current >r "" <label> over set-pane-current
"" <editor> dup pick set-pane-input r> "" <editor> over set-pane-input
<active-line> over add-gadget dup init-active-line
dup pane-paint dup pane-paint
dup pane-actions ; dup pane-actions ;
: add-line ( text pane -- )
>r <label> r> pane-output add-gadget ;
: pane-write-1 ( text pane -- ) : pane-write-1 ( text pane -- )
pane-current dup label-text rot append over set-label-text >r <label> r> pane-current add-gadget ;
relayout ;
: pane-terpri ( pane -- ) : pane-terpri ( pane -- )
dup pane-current dup label-text rot add-line dup pane-current over pane-output add-gadget
"" over set-label-text relayout ; <line-shelf> over set-pane-current init-active-line ;
: pane-write ( pane list -- ) : pane-write ( pane list -- )
2dup car swap pane-write-1 2dup car swap pane-write-1
@ -81,12 +82,12 @@ M: pane stream-write-attr ( string style stream -- )
M: pane stream-close ( stream -- ) drop ; M: pane stream-close ( stream -- ) drop ;
: <console> ( -- pane ) : <console> ( -- pane )
<pane> dup [ <pane> dup
[ clear print-banner listener ] in-thread [ [ clear print-banner listener ] in-thread ] with-stream
] with-stream ; <scroller> ;
: console ( -- ) : console ( -- )
#! Open an UI console window. #! Open an UI console window.
<console> <scroller> "Listener" <tile> world get [ <console> "Listener" <tile> world get [
shape-size rect> 3/4 * >rect rot resize-gadget shape-size rect> 3/4 * >rect rot resize-gadget
] 2keep add-gadget ; ] 2keep add-gadget ;

View File

@ -78,7 +78,7 @@ TUPLE: slider viewport thumb vector ;
: <thumb> ( -- thumb ) : <thumb> ( -- thumb )
<plain-gadget> <plain-gadget>
dup t reverse-video set-paint-prop dup gray background set-paint-prop
dup thumb-actions ; dup thumb-actions ;
: add-thumb ( thumb slider -- ) : add-thumb ( thumb slider -- )

View File

@ -1,21 +1,33 @@
! Copyright (C) 2005 Slava Pestov. ! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license. ! See http://factor.sf.net/license.txt for BSD license.
IN: gadgets IN: gadgets
USING: generic kernel lists matrices namespaces sequences ; USING: generic kernel lists math matrices namespaces sequences ;
TUPLE: divider splitter ; TUPLE: divider splitter ;
C: divider ( -- divider )
<plain-gadget> over set-delegate
dup t reverse-video set-paint-prop ;
: divider-size { 8 8 0 } ; : divider-size { 8 8 0 } ;
M: divider pref-size drop divider-size 3unseq drop ; M: divider pref-size drop divider-size 3unseq drop ;
TUPLE: splitter vector split ; TUPLE: splitter vector split ;
M: splitter orientation splitter-vector ; : hand>split ( splitter -- n )
hand relative hand hand-click-rel v- divider-size 1/2 v*n v+ ;
: divider-motion ( splitter -- )
dup hand>split
over shape-dim { 1 1 1 } vmax v/ over splitter-vector v.
0 max 1 min over set-splitter-split relayout ;
: divider-actions ( thumb -- )
dup [ drop ] [ button-down 1 ] set-action
dup [ drop ] [ button-up 1 ] set-action
[ gadget-parent divider-motion ] [ drag 1 ] set-action ;
C: divider ( -- divider )
<plain-gadget> over set-delegate
dup t reverse-video set-paint-prop
dup divider-actions ;
C: splitter ( first second vector -- splitter ) C: splitter ( first second vector -- splitter )
<empty-gadget> over set-delegate <empty-gadget> over set-delegate
@ -26,16 +38,16 @@ C: splitter ( first second vector -- splitter )
[ add-gadget ] keep [ add-gadget ] keep
1/2 over set-splitter-split ; 1/2 over set-splitter-split ;
: <x-splitter> { 1 0 0 } <splitter> ; : <x-splitter> { 0 1 0 } <splitter> ;
: <y-splitter> { 0 1 0 } <splitter> ; : <y-splitter> { 1 0 0 } <splitter> ;
M: splitter pref-size M: splitter pref-size
[ [
gadget-children [ pref-dim ] map gadget-children [ pref-dim ] map
dup { 0 0 0 } swap [ vmax ] each dup { 0 0 0 } [ vmax ] reduce
swap { 0 0 0 } swap [ v+ ] each swap { 0 0 0 } [ v+ ] reduce
] keep orient 3unseq drop ; ] keep splitter-vector set-axis 3unseq drop ;
: splitter-part ( splitter -- vec ) : splitter-part ( splitter -- vec )
dup splitter-split swap shape-dim n*v divider-size 1/2 v*n v- ; dup splitter-split swap shape-dim n*v divider-size 1/2 v*n v- ;
@ -47,10 +59,22 @@ M: splitter pref-size
dup shape-dim swap splitter-part v- , dup shape-dim swap splitter-part v- ,
] make-list ; ] make-list ;
: packed-locs ( axis sizes gadget -- )
>r
{ 0 0 0 } [ v+ ] accumulate
[ { 0 0 0 } swap rot set-axis ] map-with
r> gadget-children zip [ uncons set-gadget-loc ] each ;
: packed-dims ( axis sizes gadget -- dims )
[
shape-dim swap [ >r 2dup r> rot set-axis ] map 2nip
] keep gadget-children zip [ uncons set-gadget-dim ] each ;
: layout-divider ( assoc -- ) : layout-divider ( assoc -- )
[ uncons set-gadget-dim ] each ; [ uncons set-gadget-dim ] each ;
: packed-layout ( axis sizes gadgets -- )
3dup packed-locs packed-dims ;
M: splitter layout* ( splitter -- ) M: splitter layout* ( splitter -- )
[ dup splitter-vector over splitter-layout rot packed-layout ;
dup splitter-layout [ nip ( { 0 0 0 } rot orient ) ] map-with
] keep gadget-children zip layout-divider ;

View File

@ -15,4 +15,4 @@ SYMBOL: root-menu
[[ "Exit" [ f world get set-world-running? ] ]] [[ "Exit" [ f world get set-world-running? ] ]]
] root-menu set ] root-menu set
world get [ drop show-root-menu ] [ button-down 1 ] set-action ! world get [ drop show-root-menu ] [ button-down 1 ] set-action

View File

@ -11,11 +11,8 @@ threads sequences ;
! open at any one time. ! open at any one time.
TUPLE: world running? hand menu ; TUPLE: world running? hand menu ;
: <world-box> ( -- box )
<plain-gadget> ;
C: world ( -- world ) C: world ( -- world )
<world-box> over set-delegate f <stack> over set-delegate
t over set-world-running? t over set-world-running?
dup <hand> over set-world-hand ; dup <hand> over set-world-hand ;