- opengl rendering\r
- text selection\r
- clipboard support\r
+- clicking outside menu doesn't close\r
\r
+ tutorial:\r
\r
USING: gadgets generic kernel lists math matrices namespaces sdl\r
sequences strings styles ;\r
\r
-: <title> ( text -- gadget )\r
+: <slide-title> ( text -- gadget )\r
<label> dup 36 font-size set-paint-prop ;\r
\r
: <underline> ( -- gadget )\r
\r
: <page> ( list -- gadget )\r
0 1 <pile>\r
- over car <title> over add-gadget\r
+ over car <slide-title> over add-gadget\r
<underline> over add-gadget\r
swap cdr [ tutorial-line over add-gadget ] each\r
empty-border ;\r
""\r
[ "-1 sqrt ." ]\r
""\r
- [ "M{ { 10 3 } { 7 5 } { -2 0 } }M M{ { 11 2 } { 4 8 } }M m." ]\r
+ [ "{ { 10 3 } { 7 5 } { -2 0 } }" ]\r
+ [ "{ { 11 2 } { 4 8 } } m." ]\r
""\r
"... and there is much more for the math geeks."\r
] [\r
: pprint-short ( object -- string )
[
1 line-limit set
- 5 length-limit set
+ 20 length-limit set
2 nesting-limit set
string-limit on
pprint
inspector-help
terpri
"inspector " listener-prompt set
+ [ inspector-stack get "Inspector history:" ] callstack-hook set
{ } clone inspector-stack set
(inspect)
listener
SYMBOL: listener-prompt
SYMBOL: quit-flag
+
SYMBOL: listener-hook
+SYMBOL: datastack-hook
+SYMBOL: callstack-hook
global [ " " listener-prompt set ] bind
: listen ( -- )
#! Wait for user input, and execute.
+ listener-hook get call
listener-prompt get write flush [
read-multiline
- [ call listener-hook get call ] [ bye ] ifte
+ [ call ] [ bye ] ifte
] try ;
: listener ( -- )
#! Print stepper data stack.
meta-d get stack. ;
+: meta-r*
+ #! Stepper call stack, as well as the currently
+ #! executing quotation.
+ [ meta-r get % meta-executing get , meta-cf get , ] { } make ;
+
: &r
#! Print stepper call stack, as well as the currently
#! executing quotation.
- meta-cf get short. meta-executing get . meta-r get stack. ;
+ meta-r* stack. ;
: &get ( var -- value )
#! Get stepper variable value.
: walk-listener walk-banner "walk " listener-prompt set listener ;
: init-walk ( quot callstack namestack -- )
+ [ meta-d get "Stepper data stack:" ] datastack-hook set
+ [ meta-r* "Stepper return stack:" ] callstack-hook set
init-interpreter
meta-n set
meta-r set
: add-top ( gadget frame -- ) 1 0 set-frame-child ;
: add-bottom ( gadget frame -- ) 1 2 set-frame-child ;
+: get-center ( frame -- gadget ) 1 1 frame-child ;
+: get-left ( frame -- gadget ) 0 1 frame-child ;
+: get-right ( frame -- gadget ) 2 1 frame-child ;
+: get-top ( frame -- gadget ) 1 0 frame-child ;
+: get-bottom ( frame -- gadget ) 1 2 frame-child ;
+
: reduce-grid ( grid -- seq )
[ { 0 0 0 } [ vmax ] reduce ] map ;
--- /dev/null
+! Copyright (C) 2005 Slava Pestov.
+! See http://factor.sf.net/license.txt for BSD license.
+IN: help
+DEFER: <tutorial-button>
+
+IN: gadgets
+USING: generic help io kernel listener lists math namespaces
+prettyprint sdl sequences shells styles threads words ;
+
+SYMBOL: datastack-display
+SYMBOL: callstack-display
+
+TUPLE: display title pane ;
+
+: <display-title> ( text -- label )
+ <label>
+ dup << solid f >> interior set-paint-prop
+ dup { 216 232 255 } background set-paint-prop ;
+
+: add-display-title ( title display -- )
+ 2dup set-display-title add-top ;
+
+C: display ( -- display )
+ <frame> over set-delegate
+ "" <display-title> over add-display-title
+ <line-pile> 2dup swap set-display-pane
+ <scroller> over add-center ;
+
+: present-stack ( seq title display -- )
+ [ display-title set-label-text ] keep
+ [
+ display-pane
+ dup clear-gadget swap reverse-slice [
+ dup presented swons unit swap unparse-short
+ <presentation> swap add-gadget
+ ] each-with
+ ] keep relayout ;
+
+: ui-listener-hook ( -- )
+ datastack-hook get call datastack-display get present-stack
+ callstack-hook get call callstack-display get present-stack ;
+
+: listener-thread
+ pane get [
+ [ datastack "Data stack:" ] datastack-hook set
+ [ callstack "Return stack:" ] callstack-hook set
+ [ ui-listener-hook ] listener-hook set
+ <tutorial-button> gadget.
+ tty
+ ] with-stream* ;
+
+: <stack-display> ( -- gadget )
+ <display> dup datastack-display set
+ <display> dup callstack-display set
+ 1/2 <x-splitter> ;
+
+: listener-application ( -- )
+ <pane> dup pane set <scroller>
+ <stack-display>
+ 2/3 <x-splitter> add-layer
+ [ clear listener-thread ] in-thread
+ pane get request-focus ;
"/library/ui/buttons.factor"
"/library/ui/line-editor.factor"
"/library/ui/events.factor"
+ "/library/ui/sliders.factor"
"/library/ui/scrolling.factor"
"/library/ui/editors.factor"
"/library/ui/menus.factor"
"/library/ui/panes.factor"
"/library/ui/presentations.factor"
"/library/ui/books.factor"
+ "/library/ui/listener.factor"
"/library/ui/ui.factor"
] [
dup print run-resource
[ dup pane-input swap pane-current <active-line> ] keep
2dup set-pane-active add-gadget ;
-: pane-paint ( pane -- )
- "Monospaced" font set-paint-prop ;
-
: pop-continuation ( pane -- quot )
dup pane-continuation f rot set-pane-continuation ;
: elements. ( quot -- )
[
- 1 nesting-limit set
+ 2 nesting-limit set
5 length-limit set
<block pprint-elements block> t newline
] with-pprint ;
<line-shelf> over set-pane-current
"" <editor> over set-pane-input
dup init-active-line
- dup pane-paint
dup pane-actions ;
M: pane focusable-child* ( pane -- editor )
! A viewport can be scrolled.
TUPLE: viewport origin bottom? ;
-! A slider scrolls a viewport.
-TUPLE: slider thumb vector ;
-
! A scroller combines a viewport with two x and y sliders.
TUPLE: scroller viewport x y ;
: fix-scroll ( origin viewport -- origin )
dup rect-dim swap viewport-dim v- vmax { 0 0 0 } vmin ;
-: scroll-viewport ( origin viewport -- )
- [ fix-scroll ] keep [ set-viewport-origin ] keep relayout ;
-
C: viewport ( content -- viewport )
<gadget> over set-delegate
t over set-gadget-root?
M: viewport focusable-child* ( viewport -- gadget )
gadget-child ;
-: visible-portion ( viewport -- vector )
- dup rect-dim { 1 1 1 } vmax
- swap viewport-dim { 1 1 1 } vmax
- v/ { 1 1 1 } vmin ;
-
-: slider-scroller ( slider -- scroller )
- [ scroller? ] find-parent ;
-
-: slider-viewport ( slider -- viewport )
- slider-scroller scroller-viewport ;
-
-: >thumb ( pos slider -- pos )
- slider-viewport visible-portion v* ;
-
-: >viewport ( pos slider -- pos )
- slider-viewport visible-portion v/ ;
-
-: slider-current ( slider -- pos )
- dup slider-viewport viewport-origin*
- dup rot slider-vector v* v- ;
+: update-slider ( slider scroller -- )
+ dup rect-dim pick slider-vector v. pick set-slider-page
+ dup viewport-dim over rect-dim vmax pick slider-vector v. pick set-slider-max
+ slider-viewport dup viewport-origin over fix-scroll vneg pick slider-vector v. pick set-slider-value
+ drop slider-elevator relayout ;
-: slider-pos ( slider pos -- pos )
- hand pick relative v+ over slider-vector v* swap >viewport ;
+: update-sliders ( scroller -- )
+ dup scroller-x over update-slider
+ dup scroller-y swap update-slider ;
: scroll ( origin scroller -- )
- [ scroller-viewport scroll-viewport ] keep
- dup scroller-x relayout scroller-y relayout ;
-
-: slider-click ( slider pos -- )
- dupd slider-pos over slider-current v+
- swap slider-scroller scroll ;
-
-: slider-motion ( slider -- )
- hand hand-click-rel slider-click ;
-
-: thumb-actions ( thumb -- )
- dup [ drop ] [ button-down 1 ] set-action
- dup [ drop ] [ button-up 1 ] set-action
- [ gadget-parent slider-motion ] [ drag 1 ] set-action ;
-
-: <thumb> ( -- thumb )
- <bevel-gadget>
- t over set-gadget-root?
- dup { 192 192 192 } background set-paint-prop
- dup thumb-actions ;
-
-: add-thumb ( thumb slider -- )
- 2dup add-gadget set-slider-thumb ;
-
-: slider-actions ( slider -- )
- [ { 0 0 0 } slider-click ] [ button-down 1 ] set-action ;
-
-C: slider ( vector -- slider )
- <plain-gadget> over set-delegate
- dup { 128 128 128 } background set-paint-prop
- [ set-slider-vector ] keep
- <thumb> over add-thumb
- dup slider-actions ;
-
-: <x-slider> ( -- slider ) { 1 0 0 } <slider> ;
-
-: <y-slider> ( -- slider ) { 0 1 0 } <slider> ;
-
-: thumb-loc ( slider -- loc )
- dup slider-viewport
- dup viewport-origin* swap fix-scroll
- vneg swap >thumb ;
-
-: slider-dim { 12 12 12 } ;
-
-: thumb-dim ( slider -- h )
- [ rect-dim dup ] keep >thumb slider-dim vmax vmin ;
-
-M: slider pref-dim drop slider-dim ;
-
-M: slider layout* ( slider -- )
- dup thumb-loc over slider-vector v*
- over slider-thumb set-rect-loc
- dup thumb-dim over slider-vector v* slider-dim vmax
- swap slider-thumb set-gadget-dim ;
+ [
+ scroller-viewport [ fix-scroll ] keep
+ [ set-viewport-origin ] keep
+ ] keep relayout ;
: add-viewport 2dup set-scroller-viewport add-center ;
: add-y-slider 2dup set-scroller-y add-right ;
: (scroll>bottom) ( scroller -- )
- t over scroller-viewport set-viewport-bottom?
- dup scroller-x relayout scroller-y relayout ;
+ t swap scroller-viewport set-viewport-bottom? ;
: scroll>bottom ( gadget -- )
[ scroll>bottom ] swap handle-gesture drop ;
: scroll-by ( scroller amount -- )
over scroller-viewport viewport-origin v+ swap scroll ;
+: scroll-up-line { 0 32 0 } scroll-by ;
+
+: scroll-down-line { 0 -32 0 } scroll-by ;
+
: scroller-actions ( scroller -- )
dup [ (scroll>bottom) ] [ scroll>bottom ] set-action
- dup [ { 0 32 0 } scroll-by ] [ button-down 4 ] set-action
- [ { 0 -32 0 } scroll-by ] [ button-down 5 ] set-action ;
+ dup [ scroll-up-line ] [ button-down 4 ] set-action
+ [ scroll-down-line ] [ button-down 5 ] set-action ;
C: scroller ( gadget -- scroller )
#! Wrap a scrolling pane around the gadget.
M: scroller focusable-child* ( viewport -- gadget )
scroller-viewport ;
+
+M: scroller layout* ( scroller -- )
+ dup update-sliders delegate layout* ;
--- /dev/null
+! Copyright (C) 2005 Slava Pestov.
+! See http://factor.sf.net/license.txt for BSD license.
+IN: gadgets
+USING: generic kernel lists math matrices namespaces sequences
+threads vectors styles ;
+
+! An elevator has a thumb that may be moved up and down.
+TUPLE: elevator ;
+
+: find-elevator [ elevator? ] find-parent ;
+
+! A slider scrolls a viewport.
+TUPLE: slider vector elevator thumb value max page ;
+
+: find-slider [ slider? ] find-parent ;
+
+: elevator-click ( elevator pos -- )
+ 2drop ;
+
+: elevator-motion ( elevator -- )
+ hand hand-click-rel elevator-click ;
+
+: thumb-actions ( thumb -- )
+ dup [ drop ] button-gestures
+ [ find-elevator elevator-motion ] [ drag 1 ] set-action ;
+
+: <thumb> ( -- thumb )
+ <bevel-gadget>
+ t over set-gadget-root?
+ dup button-theme
+ dup thumb-actions ;
+
+: elevator-theme ( elevator -- )
+ dup << solid f >> interior set-paint-prop
+ { 128 128 128 } background set-paint-prop ;
+
+: elevator-actions ( elevator -- )
+ [ { 0 0 0 } elevator-click ] [ button-down 1 ] set-action ;
+
+C: elevator ( -- elevator )
+ <plain-gadget> over set-delegate
+ dup elevator-theme dup elevator-actions ;
+
+: >thumb ( n slider -- n )
+ [ slider-max 1 max / ] keep
+ dup slider-elevator rect-dim swap slider-vector v. * ;
+
+: thumb-loc ( slider -- loc ) dup slider-value swap >thumb ;
+
+: thumb-dim ( slider -- h ) dup slider-page swap >thumb ;
+
+: thumb-min { 12 12 0 } ;
+
+: layout-thumb ( slider -- )
+ dup thumb-loc over slider-vector n*v
+ over slider-thumb set-rect-loc
+ dup thumb-dim over slider-vector n*v thumb-min vmax
+ swap slider-thumb set-rect-dim ;
+
+M: elevator layout* ( elevator -- )
+ find-slider layout-thumb ;
+
+M: elevator pref-dim drop thumb-min ;
+
+: <empty-button> ( quot -- )
+ >r <bevel-gadget> { 12 12 0 } over set-gadget-dim
+ dup button-theme dup r> button-gestures ;
+
+: <up-button> [ drop ] <empty-button> ;
+
+: add-up { 1 1 1 } over slider-vector v- 2unseq set-frame-child ;
+
+: <down-button> [ drop ] <empty-button> ;
+
+: add-down { 1 1 1 } over slider-vector v+ 2unseq set-frame-child ;
+
+: add-elevator 2dup set-slider-elevator add-center ;
+
+: add-thumb 2dup slider-elevator add-gadget set-slider-thumb ;
+
+C: slider ( vector -- slider )
+ [ set-slider-vector ] keep
+ <frame> over set-delegate
+ 0 over set-slider-value
+ 0 over set-slider-page
+ 0 over set-slider-max
+ <elevator> over add-elevator
+ <up-button> over add-up
+ <down-button> over add-down
+ <thumb> over add-thumb
+ dup slider-actions ;
+
+: <x-slider> ( -- slider ) { 1 0 0 } <slider> ;
+
+: <y-slider> ( -- slider ) { 0 1 0 } <slider> ;
! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
-IN: help
-DEFER: <tutorial-button>
-
IN: gadgets
-USING: generic help io kernel listener math namespaces
-prettyprint sdl sequences styles threads words shells ;
-
-SYMBOL: stack-display
-
-: ui.s ( -- )
- stack-display get dup pane-clear [ .s ] with-stream* ;
-
-: listener-thread
- pane get [
- [ ui.s ] listener-hook set <tutorial-button> gadget. tty
- ] with-stream* ;
-
-: listener-application
- <pane> dup pane set <scroller>
- <pane> dup stack-display set <scroller>
- 5/6 <x-splitter> add-layer
- [ clear listener-thread ] in-thread
- pane get request-focus ;
+USING: generic help io kernel listener lists math namespaces
+prettyprint sdl sequences shells styles threads words ;
: init-world
global [
<world> world set
- { 700 800 0 } world get set-gadget-dim
+ { 600 800 0 } world get set-gadget-dim
{{
[[ background { 255 255 255 } ]]
[[ rollover-bg { 236 230 232 } ]]
[[ bevel-1 { 160 160 160 } ]]
- [[ bevel-2 { 216 216 216 } ]]
+ [[ bevel-2 { 232 232 232 } ]]
[[ foreground { 0 0 0 } ]]
[[ reverse-video f ]]
- [[ font "Sans Serif" ]]
+ [[ font "Monospaced" ]]
[[ font-size 12 ]]
[[ font-style plain ]]
}} world get set-gadget-paint