- tabular output\r
- debugger should use outlining\r
- support nested incremental layouts more efficiently\r
-- make-pane should not need world-theme\r
- only redraw dirty gadgets\r
- find out why so many small bignums get consed\r
- use incremental strategy for all pack layouts where possible\r
! sprites is a vector.
TUPLE: font ascent descent height handle sprites ;
+M: font = eq? ;
+
: flush-font ( font -- )
#! Only do this after re-creating a GL context!
dup font-sprites [ ] subset free-sprites
first3 >r open-face dup 0 r> 6 shift
dpi dpi FT_Set_Char_Size freetype-error <font> ;
-: lookup-font ( font style ptsize -- font )
+: lookup-font ( { font style ptsize } -- font )
#! Cache open fonts.
- 3array open-fonts get [ open-font ] cache ;
+ open-fonts get [ open-font ] cache ;
: load-glyph ( font char -- glyph )
>r font-handle r> dupd 0 FT_Load_Char
\r
: <underline> ( -- gadget )\r
<gadget>\r
- dup << gradient f @{ @{ 64 64 64 }@ @{ 255 255 255 }@ }@ >>\r
- interior set-paint-prop\r
+ << gradient f @{ @{ 64 64 64 }@ @{ 255 255 255 }@ }@ >>\r
+ over set-gadget-interior\r
@{ 0 10 0 }@ over set-gadget-dim\r
@{ 1 0 0 }@ over set-gadget-orientation ;\r
\r
\r
: page-theme\r
dup @{ 204 204 255 }@ background set-paint-prop\r
- dup << gradient f @{ @{ 204 204 255 }@ @{ 255 204 255 }@ }@ >>\r
- interior set-paint-prop\r
+ << gradient f @{ @{ 204 204 255 }@ @{ 255 204 255 }@ }@ >>\r
+ over set-gadget-interior\r
dup "Sans Serif" font set-paint-prop\r
16 font-size set-paint-prop ;\r
\r
"* Learning more"\r
"--"\r
"Hopefully this tutorial has sparked your interest in Factor."\r
- ""\r
+ "" \r
"You can learn more by reading the Factor developer's handbook:"\r
""\r
"http://factor.sourceforge.net/handbook.pdf"\r
! See http://factor.sf.net/license.txt for BSD license.
IN: gadgets-books
USING: gadgets gadgets-buttons gadgets-labels gadgets-layouts
-gadgets-theme generic kernel lists math namespaces sequences ;
+gadgets-theme generic kernel lists math namespaces sequences
+styles ;
TUPLE: book page ;
[ book-browser? ] find-parent book-browser-book ;
: <book-button> ( polygon quot -- button )
- \ find-book swons >r <polygon-gadget> dup icon-theme r>
+ \ find-book swons >r gray swap <polygon-gadget> r>
<bevel-button> ;
: <book-buttons> ( book -- gadget )
! An editor gadget wraps a line editor object and passes
! gestures to the line editor.
-TUPLE: editor line caret ;
+TUPLE: editor line caret font color ;
: scroll>caret ( editor -- ) editor-caret scroll-to ;
: set-caret-x ( x editor -- )
#! Move the caret to a clicked location.
dup [
- gadget-font line-text get x>offset set-caret-pos
+ label-font* line-text get x>offset set-caret-pos
] with-editor ;
: click-editor ( editor -- )
dup editor-actions ;
: offset>x ( gadget offset str -- x )
- head-slice >r gadget-font r> string-width ;
+ head-slice >r label-font* r> string-width ;
: caret-loc ( editor -- x y )
dup editor-line [ caret-pos line-text get ] bind offset>x
dup editor-caret over caret-dim swap set-gadget-dim
dup editor-caret swap caret-loc swap set-rect-loc ;
-M: editor label-text ( editor -- string )
- editor-text ;
+M: editor label-text editor-text ;
+
+M: editor label-color editor-color ;
+
+M: editor label-font editor-font ;
+
+M: editor set-label-text set-editor-text ;
+
+M: editor set-label-color set-editor-color ;
+
+M: editor set-label-font set-editor-font ;
M: editor draw-gadget* ( editor -- ) draw-label ;
: rect-union ( rect rect -- rect )
2rect-extent vmax >r vmin r> <extent-rect> ;
-! A gadget is a rectangle, a paint, a mapping of gestures to
-! actions, and a reference to the gadget's parent.
TUPLE: gadget
- paint gestures visible? relayout? root?
- parent children orientation ;
+ parent children orientation
+ gestures visible? relayout? root?
+ interior boundary ;
: show-gadget t swap set-gadget-visible? ;
! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: gadgets-labels
-USING: arrays freetype gadgets gadgets-layouts generic
-hashtables io kernel math namespaces opengl sequences styles ;
+USING: arrays freetype gadgets gadgets-layouts gadgets-theme
+generic hashtables io kernel math namespaces opengl sequences
+styles ;
! A label gadget draws a string.
-TUPLE: label text ;
+TUPLE: label text font color ;
C: label ( text -- label )
- dup delegate>gadget [ set-label-text ] keep ;
+ dup delegate>gadget
+ [ set-label-text ] keep
+ dup label-theme ;
: set-label-text* ( text label -- )
2dup label-text =
[ 2dup [ set-label-text ] keep relayout ] unless 2drop ;
+: label-font* ( label -- font )
+ label-font lookup-font ;
+
: label-size ( gadget text -- dim )
- dup gadget-font dup font-height >r
+ dup label-font* dup font-height >r
swap label-text string-width r> 0 3array ;
M: label pref-dim ( label -- dim )
label-size ;
: draw-label ( label -- )
- dup foreground paint-prop gl-color
- dup gadget-font swap label-text draw-string ;
+ dup label-color gl-color
+ dup label-font* swap label-text draw-string ;
M: label draw-gadget* ( label -- ) draw-label ;
1/2 <x-splitter> ;
: <status-bar> ( -- gadget )
- "" <label> dup solid-interior dup reverse-video-theme ;
+ "" <label> dup reverse-video-theme ;
: listener-application ( -- )
t t <pane> dup pane global set-hash
IN: gadgets-outliner
USING: arrays gadgets gadgets-borders gadgets-buttons
gadgets-labels gadgets-layouts gadgets-panes gadgets-theme
-generic io kernel lists sequences ;
+generic io kernel lists sequences styles ;
! Outliner gadget.
TUPLE: outliner quot ;
[ outliner? ] find-parent ;
: <expand-arrow> ( ? -- gadget )
- arrow-right arrow-down ? <polygon-gadget>
- dup icon-theme <border> ;
+ arrow-right arrow-down ? gray swap <polygon-gadget> <border> ;
: <expand-button> ( ? -- gadget )
#! If true, the button expands, otherwise it collapses.
styles vectors ;
IN: gadgets
-: paint-prop* ( gadget key -- value ) swap gadget-paint ?hash ;
-
-: paint-prop ( gadget key -- value )
- over [
- 2dup paint-prop* dup
- [ 2nip ] [ drop >r gadget-parent r> paint-prop ] if
- ] [
- 2drop f
- ] if ;
-
GENERIC: draw-gadget* ( gadget -- )
M: gadget draw-gadget* ( gadget -- ) drop ;
-SYMBOL: interior
-SYMBOL: boundary
-
GENERIC: draw-interior ( gadget interior -- )
+
GENERIC: draw-boundary ( gadget boundary -- )
SYMBOL: clip
DEFER: draw-gadget
: (draw-gadget) ( gadget -- )
- dup dup interior paint-prop* draw-interior
- dup dup boundary paint-prop* draw-boundary
- dup draw-gadget* ;
+ dup dup gadget-interior draw-interior
+ dup dup gadget-boundary draw-boundary
+ draw-gadget* ;
: do-clip ( gadget -- )
>absolute clip [ rect-intersect dup ] change
clip get over inside? [
[
dup do-clip
- [ dup (draw-gadget) ] with-translation
- visible-children [ draw-gadget ] each
+ dup [ (draw-gadget) ] with-translation
+ dup visible-children [ draw-gadget ] each
] with-scope
] when drop ;
-: init-paint ( gadget -- gestures )
- dup gadget-paint
- [ ] [ {{ }} clone dup rot set-gadget-paint ] ?if ;
-
-: set-paint-prop ( gadget value key -- )
- rot init-paint set-hash ;
-
-: add-paint ( gadget hash -- )
- dup [ >r init-paint r> hash-update ] [ 2drop ] if ;
-
! Pen paint properties
M: f draw-interior 2drop ;
M: f draw-boundary 2drop ;
! Solid fill/border
-TUPLE: solid ;
-
-: rect>screen ( shape -- x1 y1 x2 y2 )
- >r origin get dup r> rect-dim v+ [ first2 ] 2apply ;
+TUPLE: solid color ;
! Solid pen
M: solid draw-interior
- drop dup background paint-prop gl-color rect-dim gl-fill-rect ;
+ solid-color gl-color rect-dim gl-fill-rect ;
M: solid draw-boundary
- drop dup foreground paint-prop gl-color rect-dim gl-rect ;
+ solid-color gl-color rect-dim gl-rect ;
! Gradient pen
TUPLE: gradient colors ;
gl-gradient ;
! Polygon pen
-TUPLE: polygon points ;
+TUPLE: polygon color points ;
+
+: draw-polygon ( polygon quot -- )
+ >r dup polygon-color gl-color polygon-points r> each ; inline
M: polygon draw-boundary ( gadget polygon -- )
- swap foreground paint-prop gl-color
- polygon-points [ gl-poly ] each ;
+ [ gl-poly ] draw-polygon drop ;
M: polygon draw-interior ( gadget polygon -- )
- swap background paint-prop gl-color
- polygon-points [ gl-fill-poly ] each ;
+ [ gl-fill-poly ] draw-polygon drop ;
: arrow-up @{ @{ @{ 3 0 0 }@ @{ 6 6 0 }@ @{ 0 6 0 }@ }@ }@ ;
: arrow-right @{ @{ @{ 0 0 0 }@ @{ 6 3 0 }@ @{ 0 6 0 }@ }@ }@ ;
: arrow-|left
@{ @{ @{ 1 0 0 }@ @{ 1 6 0 }@ }@ }@ arrow-left append ;
-: <polygon-gadget> ( points -- gadget )
+: <polygon-gadget> ( color points -- gadget )
dup @{ 0 0 0 }@ [ max-dim vmax ] reduce
>r <polygon> <gadget> r> over set-rect-dim
- dup rot interior set-paint-prop ;
-
-: gadget-font ( gadget -- font )
- [ font paint-prop ] keep
- [ font-style paint-prop ] keep
- [ font-size paint-prop ] keep
- >r lookup-font r> drop ;
+ [ set-gadget-interior ] keep ;
pane-input set-editor-text ;
: <input-button> ( string -- button )
- dup <label> swap [ nip pane get replace-input ] curry
+ dup <label> dup editor-theme
+ swap [ nip pane get replace-input ] curry
<roll-button> ;
: print-input ( string pane -- )
- [
- <input-button> dup bold font-style set-paint-prop gadget.
- ] with-stream* ;
+ [ <input-button> gadget. ] with-stream* ;
: pane-return ( pane -- )
dup pane-input dup [
: make-pane ( quot -- pane )
#! Execute the quotation with output to an output-only pane.
- f f <pane> dup world-theme [ swap with-stream ] keep ; inline
+ f f <pane> [ swap with-stream ] keep ; inline
: with-pane ( pane quot -- )
#! Clear the pane and run the quotation in a scope with
command-button-object dup word? [ synopsis ] [ summary ] if ;
: init-commands ( gadget -- gadget )
- dup presented paint-prop [ <command-button> ] when* ;
+ ( dup presented paint-prop [ <command-button> ] when* ) ;
: <styled-label> ( style text -- label )
- <label> dup rot dup [ alist>hash ] when add-paint ;
+ <label> nip ; ! dup rot dup [ alist>hash ] when add-paint ;
: <presentation> ( style text -- presentation )
gadget pick assoc dup
: slider-vertical? gadget-orientation @{ 0 1 0 }@ = ;
: <slide-button> ( orientation polygon amount -- )
- >r <polygon-gadget> dup icon-theme r>
+ >r gray swap <polygon-gadget> r>
[ swap slide-by-line ] curry <repeat-button>
[ set-gadget-orientation ] keep ;
[ gadget-parent divider-motion ] [ drag 1 ] set-action ;
C: divider ( -- divider )
- dup delegate>gadget dup divider-theme dup divider-actions ;
+ dup delegate>gadget
+ dup reverse-video-theme
+ dup divider-actions ;
C: splitter ( first second split vector -- splitter )
[ delegate>pack ] keep
IN: gadgets-buttons
DEFER: <button-paint>
+IN: gadgets-labels
+DEFER: set-label-color
+DEFER: set-label-font
+
IN: gadgets-theme
USING: arrays gadgets kernel sequences styles ;
-: solid-interior ( gadget -- )
- << solid >> interior set-paint-prop ;
+: solid-black << solid f @{ 0 0 0 }@ >> ;
+
+: solid-white << solid f @{ 255 255 255 }@ >> ;
+
+: solid-interior solid-white swap set-gadget-interior ;
-: solid-boundary ( gadget -- )
- << solid >> boundary set-paint-prop ;
+: solid-boundary solid-black swap set-gadget-boundary ;
: plain-gradient
<< gradient f @{
: bevel-button-theme ( gadget -- )
plain-gradient rollover-gradient pressed-gradient
- <button-paint> interior set-paint-prop ;
+ <button-paint> swap set-gadget-interior ;
: thumb-theme ( thumb -- )
- plain-gradient interior set-paint-prop ;
-
-: editor-theme ( editor -- )
- bold font-style set-paint-prop ;
+ plain-gradient swap set-gadget-interior ;
: roll-button-theme ( button -- )
- dup f f << solid >> << solid >> <button-paint> boundary set-paint-prop
- dup f f f << solid >> <button-paint> interior set-paint-prop
- @{ 236 230 232 }@ background set-paint-prop ;
+ f solid-black solid-black <button-paint> over set-gadget-boundary
+ f f << solid f @{ 236 230 232 }@ >> <button-paint> swap set-gadget-interior ;
: caret-theme ( caret -- )
- dup solid-interior
- red background set-paint-prop ;
+ << solid f @{ 255 0 0 }@ >> swap set-gadget-interior ;
: elevator-theme ( elevator -- )
- dup << gradient f @{
+ << gradient f @{
@{ 64 64 64 }@
@{ 96 96 96 }@
@{ 128 128 128 }@
- }@ >> interior set-paint-prop
- light-gray background set-paint-prop ;
+ }@ >> swap set-gadget-interior ;
: reverse-video-theme ( gadget -- )
- dup black background set-paint-prop
- white foreground set-paint-prop ;
-
-: divider-theme ( divider -- )
- dup solid-interior reverse-video-theme ;
+ solid-black swap set-gadget-interior ;
: display-title-theme
- dup @{ 216 232 255 }@ background set-paint-prop
- solid-interior ;
+ << solid f @{ 216 232 255 }@ >> swap set-gadget-interior ;
: menu-theme ( menu -- )
dup solid-boundary
<< gradient f @{ @{ 216 216 216 }@ @{ 255 255 255 }@ }@ >>
- interior set-paint-prop ;
-
-: icon-theme ( gadget -- )
- dup gray background set-paint-prop
- gray foreground set-paint-prop ;
-
-: world-theme
- {{
- [[ background @{ 255 255 255 }@ ]]
- [[ foreground @{ 0 0 0 }@ ]]
- [[ font "Monospaced" ]]
- [[ font-size 12 ]]
- [[ font-style plain ]]
- }} add-paint ;
+ swap set-gadget-interior ;
+
+: label-theme ( label -- )
+ @{ 0 0 0 }@ over set-label-color
+ @{ "Monospaced" plain 12 }@ swap set-label-font ;
+
+: editor-theme ( editor -- )
+ @{ 0 0 0 }@ over set-label-color
+ @{ "Monospaced" bold 12 }@ swap set-label-font ;
first-time get [
<world> world set
world get solid-interior
- world get world-theme
@{ 800 600 0 }@ world get set-gadget-dim
<hand> hand set
listener-application