UI layout management work

cvs
Slava Pestov 2005-03-10 22:57:22 +00:00
parent 1bcac74906
commit 181a8d9ff4
13 changed files with 267 additions and 179 deletions

View File

@ -88,6 +88,7 @@ cpu "x86" = "mini" get not and [
"/library/tools/jedit-wire.factor"
"/library/tools/profiler.factor"
"/library/tools/walker.factor"
"/library/tools/annotations.factor"
"/library/tools/jedit.factor"
"/library/bootstrap/image.factor"
@ -125,6 +126,11 @@ cpu "x86" = "mini" get not and [
"/library/ui/gestures.factor"
"/library/ui/hand.factor"
"/library/ui/layouts.factor"
"/library/ui/piles.factor"
"/library/ui/shelves.factor"
"/library/ui/borders.factor"
"/library/ui/stacks.factor"
"/library/ui/frames.factor"
"/library/ui/world.factor"
"/library/ui/labels.factor"
"/library/ui/buttons.factor"

View File

@ -9,6 +9,12 @@ USE: math-internals
USE: lists
USE: kernel
: interpret ( quot -- )
#! The quotation is called with each word as its executed.
done? [ drop ] [ [ next swap call ] keep interpret ] ifte ;
: run ( -- ) [ do ] interpret ;
: test-interpreter
init-interpreter meta-cf set run meta-d get ;

View File

@ -0,0 +1,26 @@
! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: words
! The annotation words let you flag a word for either tracing
! or single-stepping. Note that currently, words referring to
! annotated words cannot be compiled; and annotating a word has
! no effect of compiled calls to that word.
USING: interpreter kernel lists stdio strings ;
: annotate ( word quot -- ) #! Quotation: ( word def -- def )
over [ word-def swap call ] keep set-word-def ;
: (watch) >r "==> " swap word-name cat2 \ print r> cons cons ;
: watch ( word -- )
#! Cause a message to be printed out when the word is
#! executed. To undo the effect of this, reload the
#! word with \ foo reload.
[ (watch) ] annotate ;
: (break) [ walk ] cons ;
: break ( word -- )
#! Cause the word to start the code walker when executed.
[ nip (break) ] annotate ;

View File

@ -5,7 +5,7 @@ USING: errors kernel lists math namespaces prettyprint stdio
strings vectors words ;
! A Factor interpreter written in Factor. Used by compiler for
! partial evaluation, also for trace and step.
! partial evaluation, also by the walker.
! Meta-stacks
SYMBOL: meta-r
@ -36,15 +36,11 @@ SYMBOL: meta-cf
meta-n [ ] change
meta-c [ ] change ;
: done-cf? ( -- ? )
meta-cf get not ;
: done? ( -- ? )
done-cf? meta-r get vector-length 0 = and ;
: done-cf? ( -- ? ) meta-cf get not ;
: done? ( -- ? ) done-cf? meta-r get vector-length 0 = and ;
! Callframe.
: up ( -- )
pop-r meta-cf set ;
: up ( -- ) pop-r meta-cf set ;
: next ( -- obj )
meta-cf get [ meta-cf [ uncons ] change ] [ up next ] ifte ;
@ -68,23 +64,14 @@ SYMBOL: meta-cf
dup compound? [ word-def meta-call ] [ host-word ] ifte
] ?ifte ;
: do ( obj -- )
dup word? [ meta-word ] [ push-d ] ifte ;
: do ( obj -- ) dup word? [ meta-word ] [ push-d ] ifte ;
: meta-word-1 ( word -- )
dup "meta-word" word-prop [ call ] [ host-word ] ?ifte ;
: do-1 ( obj -- )
dup word? [ meta-word-1 ] [ push-d ] ifte ;
: do-1 ( obj -- ) dup word? [ meta-word-1 ] [ push-d ] ifte ;
: interpret ( quot -- )
#! The quotation is called with each word as its executed.
done? [ drop ] [ [ next swap call ] keep interpret ] ifte ;
: run ( -- ) [ do ] interpret ;
: set-meta-word ( word quot -- )
"meta-word" set-word-prop ;
: set-meta-word ( word quot -- ) "meta-word" set-word-prop ;
\ datastack [ meta-d get clone push-d ] set-meta-word
\ set-datastack [ pop-d clone meta-d set ] set-meta-word
@ -99,3 +86,5 @@ SYMBOL: meta-cf
\ call [ pop-d meta-call ] set-meta-word
\ execute [ pop-d meta-word ] set-meta-word
\ ifte [ pop-d pop-d pop-d [ nip ] [ drop ] ifte meta-call ] set-meta-word
FORGET: set-meta-word

View File

@ -4,8 +4,6 @@ IN: interpreter
USING: errors kernel listener lists math namespaces prettyprint
stdio strings vectors words ;
! Some useful tools
: &s
#! Print stepper data stack.
meta-d get {.} ;
@ -23,7 +21,7 @@ stdio strings vectors words ;
meta-c get [.] ;
: &get ( var -- value )
#! Print stepper variable value.
#! Get stepper variable value.
meta-n get (get) ;
: stack-report ( -- )
@ -41,7 +39,7 @@ stdio strings vectors words ;
stack-report meta-cf get . ;
: step
#! Step into current word.
#! Step over current word.
[ next do-1 report ] not-done ;
: into
@ -49,23 +47,23 @@ stdio strings vectors words ;
[ next do report ] not-done ;
: walk-banner ( -- )
"The following words control the single-stepper:" print
[ &s &r &n &c ] [ prettyprint-word " " write ] each
"show stepper stacks." print
\ &get prettyprint-word
" ( var -- value ) inspects the stepper namestack." print
\ step prettyprint-word " -- single step over" print
\ into prettyprint-word " -- single step into" print
\ run prettyprint-word " -- run until end" print
\ exit prettyprint-word " -- exit single-stepper" print
report ;
: walk-listener walk-banner "walk" listener-prompt set listener ;
: walk ( quot -- )
#! Single-step through execution of a quotation.
[
"walk" listener-prompt set
init-interpreter
meta-cf set
walk-banner
listener
] with-scope ;
datastack meta-d set
walk-listener
meta-d get
] with-scope set-datastack ;

41
library/ui/borders.factor Normal file
View File

@ -0,0 +1,41 @@
! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: gadgets
USING: errors generic hashtables kernel lists math namespaces
sdl ;
! A border lays out its children on top of each other, all with
! a 5-pixel padding.
TUPLE: border size ;
C: border ( child delegate size -- border )
[ set-border-size ] keep
[ set-delegate ] keep
[ over [ add-gadget ] [ 2drop ] ifte ] keep ;
: empty-border ( child -- border )
<empty-gadget> 5 <border> ;
: line-border ( child -- border )
0 0 0 0 <etched-rect> <gadget> 5 <border> ;
: filled-border ( child -- border )
0 0 0 0 <plain-rect> <gadget> 5 <border> ;
: gadget-child gadget-children car ;
: layout-border-x/y ( border -- )
dup border-size dup rot gadget-child move-gadget ;
: layout-border-w/h ( border -- )
[ border-size 2 * ] keep
[ shape-w over - ] keep
[ shape-h rot - ] keep
gadget-child resize-gadget ;
M: border pref-size ( border -- w h )
[ border-size 2 * ] keep
gadget-child pref-size >r over + r> rot + ;
M: border layout* ( border -- )
dup layout-border-x/y layout-border-w/h ;

View File

@ -86,7 +86,8 @@ C: editor ( text -- )
1 swap shape-h ;
M: editor user-input* ( ch field -- ? )
[ insert-char ] with-editor t ;
[ [ insert-char ] with-editor ] keep
[ scroll>bottom ] swap handle-gesture drop t ;
M: editor layout* ( field -- )
dup [ editor-text shape-size ] keep resize-gadget

41
library/ui/frames.factor Normal file
View File

@ -0,0 +1,41 @@
USING: gadgets kernel lists math namespaces sdl ;
! A frame arranges left/right/top/bottom gadgets around a
! center gadget, which gets any leftover space.
TUPLE: frame gap left right top bottom center ;
C: frame ( gap center -- frame )
[ set-frame-gap ] keep
[ set-frame-center ] keep
[ <empty-gadget> swap set-frame-left ] keep
[ <empty-gadget> swap set-frame-right ] keep
[ <empty-gadget> swap set-frame-top ] keep
[ <empty-gadget> swap set-frame-bottom ] keep ;
: frame-major ( glue -- list )
[
dup frame-top , dup frame-center , frame-bottom ,
] make-list ;
: frame-minor ( glue -- list )
[
dup frame-left , dup frame-center , frame-right ,
] make-list ;
: max-h pref-size nip height [ max ] change ;
: max-w pref-size drop width [ max ] change ;
: add-h pref-size nip height [ + ] change ;
: add-w pref-size drop width [ + ] change ;
M: frame pref-size ( glue -- w h )
[
dup frame-major [ max-w ] each
dup frame-minor [ max-h ] each
dup frame-left add-w
dup frame-right add-w
dup frame-top add-h
dup frame-bottom add-h
] with-pref-size ;

View File

@ -28,138 +28,3 @@ sdl ;
[ 0 x set 0 y set call ] with-scope ; inline
: default-gap 3 ;
! A pile is a box that lays out its contents vertically.
TUPLE: pile align gap fill ;
C: pile ( align gap fill -- pile )
#! align: 0 left aligns, 1/2 center, 1 right.
#! gap: between each child.
#! fill: 0 leaves default width, 1 fills to pile width.
[ <empty-gadget> swap set-delegate ] keep
[ set-pile-fill ] keep
[ set-pile-gap ] keep
[ set-pile-align ] keep ;
: <default-pile> 1/2 default-gap 0 <pile> ;
: <line-pile> 0 0 1 <pile> ;
M: pile pref-size ( pile -- w h )
[
dup pile-gap swap gadget-children
[ length 1 - 0 max * height set ] keep
[
pref-size
height [ + ] change
width [ max ] change
] each
] with-pref-size ;
: w- swap shape-w swap pref-size drop - ;
: pile-x/y ( pile gadget offset -- )
rot pile-align * >fixnum y get rot move-gadget ;
: pile-w/h ( pile gadget offset -- )
rot dup pile-gap y [ + ] change
pile-fill * >fixnum over pref-size dup y [ + ] change
>r + r> rot resize-gadget ;
: vertically ( pile gadget -- ) 2dup w- 3dup pile-x/y pile-w/h ;
M: pile layout* ( pile -- )
[
dup gadget-children [ vertically ] each-with
] with-layout ;
! A shelf is a box that lays out its contents horizontally.
TUPLE: shelf gap align fill ;
C: shelf ( align gap fill -- shelf )
<empty-gadget> over set-delegate
[ set-shelf-fill ] keep
[ set-shelf-gap ] keep
[ set-shelf-align ] keep ;
: <default-shelf> 1/2 default-gap 0 <shelf> ;
: <line-shelf> 0 0 1 <shelf> ;
M: shelf pref-size ( pile -- w h )
[
dup shelf-gap swap gadget-children
[ length 1 - 0 max * width set ] keep
[
pref-size
height [ max ] change
width [ + ] change
] each
] with-pref-size ;
: h- swap shape-h swap pref-size nip - ;
: shelf-x/y rot shelf-align * >fixnum >r x get r> rot move-gadget ;
: shelf-w/h ( pile gadget offset -- )
rot dup shelf-gap x [ + ] change
shelf-fill * >fixnum >r dup pref-size over x [ + ] change
r> drop rot resize-gadget ;
: horizontally ( pile gadget -- )
2dup h- 3dup shelf-x/y shelf-w/h ;
M: shelf layout* ( pile -- )
[
dup gadget-children [ horizontally ] each-with
] with-layout ;
! A border lays out its children on top of each other, all with
! a 5-pixel padding.
TUPLE: border size ;
C: border ( child delegate size -- border )
[ set-border-size ] keep
[ set-delegate ] keep
[ over [ add-gadget ] [ 2drop ] ifte ] keep ;
: empty-border ( child -- border )
<empty-gadget> 5 <border> ;
: line-border ( child -- border )
0 0 0 0 <etched-rect> <gadget> 5 <border> ;
: filled-border ( child -- border )
0 0 0 0 <plain-rect> <gadget> 5 <border> ;
: gadget-child gadget-children car ;
: layout-border-x/y ( border -- )
dup border-size dup rot gadget-child move-gadget ;
: layout-border-w/h ( border -- )
[ border-size 2 * ] keep
[ shape-w over - ] keep
[ shape-h rot - ] keep
gadget-child resize-gadget ;
M: border pref-size ( border -- w h )
[ border-size 2 * ] keep
gadget-child pref-size >r over + r> rot + ;
M: border layout* ( border -- )
dup layout-border-x/y layout-border-w/h ;
! A stack just lays out all its children on top of each other.
TUPLE: stack ;
C: stack ( list -- stack )
<empty-gadget> over set-delegate
swap [ over add-gadget ] each ;
: max-size ( stack -- w h )
[
[
dup
shape-w width [ max ] change
shape-h height [ max ] change
] each
] with-pref-size ;
M: stack pref-size gadget-children max-size ;
M: stack layout* ( stack -- )
dup gadget-children [
>r dup shape-w over shape-h r> resize-gadget
] each drop ;

45
library/ui/piles.factor Normal file
View File

@ -0,0 +1,45 @@
! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: gadgets
USING: errors generic hashtables kernel lists math namespaces
sdl ;
! A pile is a box that lays out its contents vertically.
TUPLE: pile align gap fill ;
C: pile ( align gap fill -- pile )
#! align: 0 left aligns, 1/2 center, 1 right.
#! gap: between each child.
#! fill: 0 leaves default width, 1 fills to pile width.
[ <empty-gadget> swap set-delegate ] keep
[ set-pile-fill ] keep
[ set-pile-gap ] keep
[ set-pile-align ] keep ;
: <default-pile> 1/2 default-gap 0 <pile> ;
: <line-pile> 0 0 1 <pile> ;
M: pile pref-size ( pile -- w h )
[
dup pile-gap swap gadget-children
[ length 1 - 0 max * height set ] keep
[
pref-size
height [ + ] change
width [ max ] change
] each
] with-pref-size ;
: w- swap shape-w swap pref-size drop - ;
: pile-x/y ( pile gadget offset -- )
rot pile-align * >fixnum y get rot move-gadget ;
: pile-w/h ( pile gadget offset -- )
rot dup pile-gap y [ + ] change
pile-fill * >fixnum over pref-size dup y [ + ] change
>r + r> rot resize-gadget ;
: vertically ( pile gadget -- ) 2dup w- 3dup pile-x/y pile-w/h ;
M: pile layout* ( pile -- )
[
dup gadget-children [ vertically ] each-with
] with-layout ;

View File

@ -1,3 +1,5 @@
! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: gadgets
USING: generic kernel lists math namespaces threads ;
@ -19,20 +21,13 @@ TUPLE: viewport x y ;
[ set-viewport-y ] keep
relayout ;
: scroll>bottom ( viewport -- )
1 swap scroll-viewport ;
: viewport-actions ( viewport -- )
[
[[ [ scroll>bottom ] [ scroll>bottom ] ]]
] swap add-actions ;
: scroll>bottom ( viewport -- ) 1 swap scroll-viewport ;
C: viewport ( content -- viewport )
[ <empty-gadget> swap set-delegate ] keep
[ add-gadget ] keep
0 over set-viewport-x
0 over set-viewport-y
dup viewport-actions ;
0 over set-viewport-y ;
M: viewport pref-size gadget-child pref-size ;
@ -43,9 +38,6 @@ M: viewport layout* ( viewport -- )
] keep prefer
] each-with ;
: scroll>bottom ( viewport -- )
dup viewport-h swap scroll-viewport ;
! A slider scrolls a viewport.
! The offset slot is the y co-ordinate of the mouse relative to
@ -119,8 +111,17 @@ TUPLE: scroller viewport slider ;
: add-viewport 2dup set-scroller-viewport add-gadget ;
: add-slider 2dup set-scroller-slider add-gadget ;
: viewport>bottom 1 swap scroll-viewport ;
: scroll>bottom ( scroller -- )
dup scroller-slider relayout
scroller-viewport viewport>bottom ;
: scroller-actions ( scroller -- )
[ scroll>bottom ] [ scroll>bottom ] set-action ;
C: scroller ( gadget -- scroller )
#! Wrap a scrolling pane around the gadget.
[ <line-shelf> swap set-delegate ] keep
[ >r <viewport> r> add-viewport ] keep
[ dup scroller-viewport <slider> swap add-slider ] keep ;
[ dup scroller-viewport <slider> swap add-slider ] keep
dup scroller-actions ;

42
library/ui/shelves.factor Normal file
View File

@ -0,0 +1,42 @@
! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: gadgets
USING: errors generic hashtables kernel lists math namespaces
sdl ;
! A shelf is a box that lays out its contents horizontally.
TUPLE: shelf gap align fill ;
C: shelf ( align gap fill -- shelf )
<empty-gadget> over set-delegate
[ set-shelf-fill ] keep
[ set-shelf-gap ] keep
[ set-shelf-align ] keep ;
: <default-shelf> 1/2 default-gap 0 <shelf> ;
: <line-shelf> 0 0 1 <shelf> ;
M: shelf pref-size ( pile -- w h )
[
dup shelf-gap swap gadget-children
[ length 1 - 0 max * width set ] keep
[
pref-size
height [ max ] change
width [ + ] change
] each
] with-pref-size ;
: h- swap shape-h swap pref-size nip - ;
: shelf-x/y rot shelf-align * >fixnum >r x get r> rot move-gadget ;
: shelf-w/h ( shelf gadget offset -- )
rot dup shelf-gap x [ + ] change
shelf-fill * >fixnum >r dup pref-size over x [ + ] change
r> + rot resize-gadget ;
: horizontally ( shelf gadget -- )
2dup h- 3dup shelf-x/y shelf-w/h ;
M: shelf layout* ( pile -- )
[
dup gadget-children [ horizontally ] each-with
] with-layout ;

27
library/ui/stacks.factor Normal file
View File

@ -0,0 +1,27 @@
! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: gadgets
USING: errors generic hashtables kernel lists math namespaces
sdl ;
! A stack just lays out all its children on top of each other.
TUPLE: stack ;
C: stack ( list -- stack )
<empty-gadget> over set-delegate
swap [ over add-gadget ] each ;
: max-size ( stack -- w h )
[
[
dup
shape-w width [ max ] change
shape-h height [ max ] change
] each
] with-pref-size ;
M: stack pref-size gadget-children max-size ;
M: stack layout* ( stack -- )
dup gadget-children [
>r dup shape-w over shape-h r> resize-gadget
] each drop ;