arrows in the UI, and various cleanups

cvs
Slava Pestov 2005-09-27 04:24:42 +00:00
parent 8ea8d65c1f
commit b9165cd02c
19 changed files with 159 additions and 103 deletions

View File

@ -17,11 +17,15 @@
+ ui:
- tabular output
- arrows in outliner and scrollbars
- completion
- debugger should use outlining
- support nested incremental layouts more efficiently
- make-pane should not need world-theme
- fix up the min thumb size hack
- long lines of text fail in draw-surface
- only redraw dirty gadgets
- faster mouse tracking
- off-by-one error in pick-up?
- closing ui does not stop timers
- adding/removing timers automatically for animated gadgets

View File

@ -33,8 +33,8 @@ M: general-list tutorial-line
: <page> ( list -- gadget )
[ tutorial-line ] map
<pile> 1 over set-pack-fill [ add-gadgets ] keep
empty-border ;
make-pile 1 over set-pack-fill
gap-border ;
: tutorial-pages
[

View File

@ -3,12 +3,14 @@
IN: styles
! Colors are RGB triples.
: black @{ 0 0 0 }@ ;
: gray @{ 128 128 128 }@ ;
: white @{ 255 255 255 }@ ;
: red @{ 255 0 0 }@ ;
: green @{ 0 255 0 }@ ;
: blue @{ 0 0 255 }@ ;
: black @{ 0 0 0 }@ ;
: dark-gray @{ 64 64 64 }@ ;
: gray @{ 128 128 128 }@ ;
: light-gray @{ 192 192 192 }@ ;
: white @{ 255 255 255 }@ ;
: red @{ 255 0 0 }@ ;
: green @{ 0 255 0 }@ ;
: blue @{ 0 0 255 }@ ;
SYMBOL: foreground ! Used for text and outline shapes.
SYMBOL: background ! Used for filled shapes.

View File

@ -14,7 +14,7 @@ USE: memory
[ t ] [
[ "Hello" throw ] catch drop
global [ "error" get ] bind
global [ error get ] bind
"Hello" =
] unit-test

View File

@ -5,6 +5,9 @@ USING: generic inspector kernel kernel-internals lists math
namespaces parser prettyprint sequences io sequences-internals
strings vectors words ;
SYMBOL: error
SYMBOL: error-continuation
: expired-error. ( obj -- )
"Object did not survive image save/load: " write . ;
@ -100,10 +103,12 @@ M: string error. ( error -- ) print ;
M: object error. ( error -- ) . ;
: :s ( -- ) "error-datastack" get stack. ;
: :r ( -- ) "error-callstack" get stack. ;
: :s ( -- ) error-continuation get continuation-data stack. ;
: :get ( var -- value ) "error-namestack" get (get) ;
: :r ( -- ) error-continuation get continuation-call stack. ;
: :get ( var -- value )
error-continuation get continuation-name (get) ;
: debug-help ( -- )
":s :r show stacks at time of error." print
@ -122,21 +127,10 @@ M: object error. ( error -- ) . ;
#! and return to the caller.
[ print-error debug-help ] recover ;
: save-error ( error ds rs ns cs -- )
#! Save the stacks and parser state for post-mortem
#! inspection after an error.
global [
"error-catchstack" set
"error-namestack" set
"error-callstack" set
"error-datastack" set
"error" set
] bind ;
: save-error ( error continuation -- )
global [ error-continuation set error set ] bind ;
: init-error-handler ( -- )
( kernel calls on error )
[
datastack dupd callstack namestack catchstack
save-error rethrow
] 5 setenv
[ dup continuation save-error rethrow ] 5 setenv
kernel-error 12 setenv ;

View File

@ -51,9 +51,6 @@ DEFER: describe
#! Outlining word browser.
vocabs [ f over [ words. ] curry write-outliner ] each ;
: stack. ( seq -- seq )
reverse-slice >array describe ;
: usage. ( word -- )
#! Outlining usages browser.
usage [ usage. ] object-outline ;
@ -62,5 +59,8 @@ DEFER: describe
#! Outlining call hierarchy browser.
uses [ uses. ] object-outline ;
: stack. ( seq -- seq )
reverse-slice >array describe ;
: .s datastack stack. ;
: .r callstack stack. ;

View File

@ -2,24 +2,17 @@
! See http://factor.sf.net/license.txt for BSD license.
IN: gadgets-books
USING: gadgets gadgets-buttons gadgets-labels gadgets-layouts
generic kernel lists math matrices sequences ;
generic kernel lists math matrices namespaces sequences ;
TUPLE: book page ;
C: book ( pages -- book )
<gadget> over set-delegate
0 over set-book-page
[ add-gadgets ] keep ;
M: book pref-dim ( book -- dim )
gadget-children [ pref-dim ] map @{ 0 0 0 }@ [ vmax ] reduce ;
<stack> over set-delegate
0 over set-book-page [ add-gadgets ] keep ;
M: book layout* ( book -- )
dup rect-dim over gadget-children [
f over set-gadget-visible?
@{ 0 0 0 }@ over set-rect-loc
set-gadget-dim
] each-with
dup delegate layout*
dup gadget-children [ f swap set-gadget-visible? ] each
dup book-page swap gadget-children nth
[ t swap set-gadget-visible? ] when* ;
@ -42,12 +35,11 @@ TUPLE: book-browser book ;
: <book-buttons> ( book -- gadget )
[
{ "|<" [ find-book first-page ] }
{ "<" [ find-book prev-page ] }
{ ">" [ find-book next-page ] }
{ ">|" [ find-book last-page ] }
] [ first2 >r <label> r> <button> ] map
<shelf> [ add-gadgets ] keep ;
|left <polygon-gadget> [ find-book first-page ] <button> ,
left <polygon-gadget> [ find-book prev-page ] <button> ,
right <polygon-gadget> [ find-book next-page ] <button> ,
right| <polygon-gadget> [ find-book last-page ] <button> ,
] { } make make-shelf ;
C: book-browser ( book -- gadget )
<frame> over set-delegate

View File

@ -6,19 +6,24 @@ math namespaces vectors ;
TUPLE: border size ;
C: border ( child delegate size -- border )
C: border ( delegate size -- border )
[ set-border-size ] keep
[ set-delegate ] keep
[ add-gadget ] keep ;
[ set-delegate ] keep ;
: make-border ( child delegate size -- boder )
<border> [ add-gadget ] keep ;
: empty-border ( child -- border )
<gadget> @{ 5 5 0 }@ <border> ;
<gadget> @{ 0 0 0 }@ make-border ;
: gap-border ( child -- border )
<gadget> @{ 5 5 0 }@ make-border ;
: line-border ( child -- border )
<etched-gadget> @{ 5 5 0 }@ <border> ;
<etched-gadget> @{ 5 5 0 }@ make-border ;
: bevel-border ( child -- border )
<bevel-gadget> @{ 5 5 0 }@ <border> ;
<bevel-gadget> @{ 5 5 0 }@ make-border ;
: layout-border-loc ( border -- )
dup border-size swap gadget-child set-rect-loc ;

View File

@ -11,12 +11,8 @@ lists math namespaces sdl sequences sequences styles threads ;
: button-pressed? ( button -- ? )
#! Return true if the mouse was clicked on the button, and
#! is currently over the button.
dup mouse-over? [
1 button-down?
[ hand hand-clicked child? ] [ drop f ] if
] [
drop f
] if ;
dup mouse-over? 1 button-down? and
[ hand hand-clicked child? ] [ drop f ] if ;
: button-update ( button -- )
dup dup mouse-over? rollover set-paint-prop
@ -52,11 +48,12 @@ lists math namespaces sdl sequences sequences styles threads ;
TUPLE: button ;
C: button ( gadget quot -- button )
rot bevel-border over set-delegate
dup button-theme [ swap button-gestures ] keep ;
<bevel-gadget> @{ 5 5 0 }@ <border> over set-delegate
dup button-theme [ swap button-gestures ] keep
[ add-gadget ] keep ;
: <roll-button> ( gadget quot -- button )
>r dup roll-button-theme dup r> button-gestures ;
>r empty-border dup roll-button-theme dup r> button-gestures ;
: repeat-button-down ( button -- )
dup 100 add-timer button-clicked ;

View File

@ -74,7 +74,8 @@ TUPLE: editor line caret ;
[[ [ gain-focus ] [ focus-editor ] ]]
[[ [ lose-focus ] [ unfocus-editor ] ]]
[[ [ button-down 1 ] [ click-editor ] ]]
[[ [ "BACKSPACE" ] [ [ backspace ] with-editor ] ]]
[[ [ "BACKSPACE" ] [ [ delete-prev ] with-editor ] ]]
[[ [ "DELETE" ] [ [ delete-next ] with-editor ] ]]
[[ [ "LEFT" ] [ [ left ] with-editor ] ]]
[[ [ "RIGHT" ] [ [ right ] with-editor ] ]]
[[ [ "CTRL" "k" ] [ [ line-clear ] with-editor ] ]]

View File

@ -33,7 +33,7 @@ C: frame ( -- frame )
: get-bottom ( frame -- gadget ) 1 2 frame-child ;
: reduce-grid ( grid -- seq )
[ @{ 0 0 0 }@ [ vmax ] reduce ] map ;
[ max-dim ] map ;
: frame-pref-dim ( grid -- dim )
reduce-grid @{ 0 0 0 }@ [ v+ ] reduce ;

View File

@ -21,9 +21,11 @@ M: array rect-dim drop @{ 0 0 0 }@ ;
: >absolute ( rect -- rect )
rect-bounds >r origin get v+ r> <rect> ;
: |v-| ( vec vec -- vec ) v- [ 0 max ] map ;
: intersect ( rect rect -- rect )
[ rect-extent ] 2apply swapd vmin >r vmax dup r>
swap v- @{ 0 0 0 }@ vmax <rect> ;
swap |v-| <rect> ;
: intersects? ( rect/point rect -- ? )
[ rect-extent ] 2apply swapd vmin >r vmax r> v-
@ -73,3 +75,5 @@ M: gadget children-on ( rect/point gadget -- list )
[ nip pick-up ] [ rot 2drop ] if
] with-scope
] [ 2drop f ] if ;
: max-dim ( dims -- dim ) @{ 0 0 0 }@ [ vmax ] reduce ;

View File

@ -98,13 +98,16 @@ C: pack ( vector -- pack )
: <pile> ( -- pack ) @{ 0 1 0 }@ <pack> ;
: make-pile ( children -- pack ) <pile> [ add-gadgets ] keep ;
: <shelf> ( -- pack ) @{ 1 0 0 }@ <pack> ;
: make-shelf ( children -- pack ) <shelf> [ add-gadgets ] keep ;
M: pack pref-dim ( pack -- dim )
[
[
pref-dims
[ @{ 0 0 0 }@ [ vmax ] reduce ] keep
pref-dims [ max-dim ] keep
[ @{ 0 0 0 }@ [ v+ ] reduce ] keep length 1 - 0 max
] keep pack-gap n*v v+
] keep pack-vector set-axis ;

View File

@ -106,10 +106,15 @@ SYMBOL: history-index
>r line-text get head r> append
line-text set ;
: backspace ( -- )
: delete-prev ( -- )
#! Call this in the line editor scope.
caret get dup 0 = [ drop ] [ 1- 1 line-remove ] if ;
: delete-next ( -- )
#! Call this in the line editor scope.
caret get dup line-text get length =
[ drop ] [ 1 line-remove ] if ;
: left ( -- )
#! Call this in the line editor scope.
caret [ 1- 0 max ] change ;

View File

@ -16,7 +16,7 @@ gadgets-labels generic kernel lists math namespaces sequences ;
: fit-bounds ( loc dim max -- loc )
#! Adjust loc to fit inside max.
swap v- @{ 0 0 0 }@ vmax vmin ;
swap |v-| vmin ;
: menu-loc ( menu -- loc )
hand rect-loc swap rect-dim world get rect-dim fit-bounds ;
@ -31,7 +31,7 @@ gadgets-labels generic kernel lists math namespaces sequences ;
#! Given an association list mapping labels to quotations.
#! Prepend a call to hide-menu to each quotation.
[ uncons \ hide-glass swons >r <label> r> <roll-button> ] map
<pile> 1 over set-pack-fill [ add-gadgets ] keep ;
make-pile 1 over set-pack-fill ;
: menu-theme ( menu -- )
<< solid >> interior set-paint-prop ;

View File

@ -33,7 +33,8 @@ TUPLE: outliner gadget quot pile expanded? ;
: find-outliner [ outliner? ] find-parent ;
: <expand-button> ( -- gadget )
"+" <label> [ find-outliner toggle-outliner ] <roll-button> ;
right <polygon-gadget>
[ find-outliner toggle-outliner ] <roll-button> ;
C: outliner ( gadget quot -- gadget )
#! The quotation generates child gadgets.

View File

@ -1,8 +1,9 @@
! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: gadgets
USING: generic hashtables io kernel lists math matrices
namespaces sdl sequences strings styles vectors ;
USING: alien arrays gadgets-layouts generic hashtables io kernel
lists math matrices namespaces sdl sequences strings styles
vectors ;
SYMBOL: clip
@ -137,17 +138,15 @@ TUPLE: bevel width ;
SYMBOL: bevel-1
SYMBOL: bevel-2
: bevel-up ( gadget -- rgb )
dup reverse-video paint-prop bevel-1 bevel-2 ? paint-prop rgb ;
: bevel-down ( gadget -- rgb )
dup reverse-video paint-prop bevel-2 bevel-1 ? paint-prop rgb ;
: bevel-color ( gadget ? -- rgb )
>r dup reverse-video paint-prop bevel-1 bevel-2
r> [ swap ] when ? paint-prop rgb ;
: draw-bevel ( v1 v2 gadget -- )
[ >r x1/x2/y1 r> bevel-up hlineColor ] keep
[ >r x1/x2/y2 r> bevel-down hlineColor ] keep
[ >r x1/y1/y2 r> bevel-up vlineColor ] keep
[ >r x2/y1/y2 r> bevel-down vlineColor ] keep
[ >r x1/x2/y1 r> f bevel-color hlineColor ] keep
[ >r x1/x2/y2 r> t bevel-color hlineColor ] keep
[ >r x1/y1/y2 r> f bevel-color vlineColor ] keep
[ >r x2/y1/y2 r> t bevel-color vlineColor ] keep
3drop ;
M: bevel draw-boundary ( gadget boundary -- )
@ -172,8 +171,49 @@ M: gadget draw-gadget* ( gadget -- )
: <bevel-gadget> ( -- gadget )
<plain-gadget> dup << bevel f 2 >> boundary set-paint-prop ;
: draw-line ( from to color -- )
>r >r >r surface get r> first2 r> first2 r> rgb lineColor ;
! Polygon pen
TUPLE: polygon points ;
: draw-fanout ( from tos color -- )
-rot [ >r 2dup r> rot draw-line ] each 2drop ;
: >short-array ( seq -- short-array )
dup length <short-array> over length [
[ tuck >r >r swap nth r> r> swap set-short-nth ] 3keep
] repeat nip ;
: polygon-x/y ( polygon -- vx vy n )
polygon-points [
origin get swap [ v+ ] map-with
dup [ first ] map swap [ second ] map
[ >short-array ] 2apply
] keep length ;
: (polygon) ( gadget polygon -- surface vx vy n gadget )
swap >r surface get swap polygon-x/y r> ;
M: polygon draw-boundary ( gadget polygon -- )
(polygon) fg rgb polygonColor ;
M: polygon draw-interior ( gadget polygon -- )
(polygon) bg rgb filledPolygonColor ;
: up @{ @{ 4 0 0 }@ @{ 8 8 0 }@ @{ 0 8 0 }@ }@ ;
: right @{ @{ 0 0 0 }@ @{ 8 4 0 }@ @{ 0 8 0 }@ }@ ;
: down @{ @{ 0 0 0 }@ @{ 8 0 0 }@ @{ 4 8 0 }@ }@ ;
: left @{ @{ 0 4 0 }@ @{ 8 0 0 }@ @{ 8 8 0 }@ }@ ;
: right|
@{
@{ 0 0 0 }@ @{ 0 8 0 }@ @{ 8 4 0 }@
@{ 8 8 0 }@ @{ 8 0 0 }@ @{ 8 4 0 }@
}@ ;
: |left
@{
@{ 8 0 0 }@ @{ 8 8 0 }@ @{ 0 4 0 }@
@{ 0 8 0 }@ @{ 0 0 0 }@ @{ 0 4 0 }@
}@ ;
: <polygon-gadget> ( points -- gadget )
dup max-dim >r <polygon> <gadget> r> over set-rect-dim
dup rot interior set-paint-prop
dup gray background set-paint-prop
dup light-gray rollover-bg set-paint-prop ;

View File

@ -19,7 +19,7 @@ TUPLE: pane output active current input continuation scrolls? ;
: add-output 2dup set-pane-output add-gadget ;
: <active-line> ( current input -- line )
[ 2array ] [ 1array ] if* <shelf> [ add-gadgets ] keep ;
[ 2array ] [ 1array ] if* make-shelf ;
: init-active-line ( pane -- )
dup pane-active unparent

View File

@ -14,8 +14,6 @@ TUPLE: slider vector elevator thumb value max page ;
: find-slider [ slider? ] find-parent ;
: thumb-min @{ 12 12 0 }@ ;
: slider-scale ( slider -- n )
#! A scaling factor such that if x is a slider co-ordinate,
#! x*n is the screen position of the thumb, and conversely
@ -61,7 +59,7 @@ SYMBOL: slider-changed
: elevator-theme ( elevator -- )
dup << solid f >> interior set-paint-prop
@{ 128 128 128 }@ background set-paint-prop ;
light-gray background set-paint-prop ;
: slide-by ( amount gadget -- )
#! The gadget can be any child of a slider.
@ -83,32 +81,42 @@ C: elevator ( -- elevator )
<plain-gadget> over set-delegate
dup elevator-theme dup elevator-actions ;
: (layout-thumb) ( slider n -- n )
over slider-vector n*v swap slider-thumb ;
: thumb-loc ( slider -- loc )
dup slider-value swap slider>screen ;
: layout-thumb-loc ( slider -- )
dup thumb-loc (layout-thumb) set-rect-loc ;
: thumb-dim ( slider -- h )
dup slider-page swap slider>screen ;
: layout-thumb-dim ( slider -- )
dup dup thumb-dim (layout-thumb)
>r >r dup rect-dim r> rot slider-vector set-axis r>
set-gadget-dim ;
: 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-gadget-dim ;
dup layout-thumb-loc layout-thumb-dim ;
M: elevator layout* ( elevator -- )
find-slider layout-thumb ;
M: elevator pref-dim drop thumb-min ;
: slide-by-line ( -1/1 slider -- ) >r 32 * r> slide-by ;
: <up-button>
<gadget> [ -1 swap slide-by-line ] <repeat-button> ;
: slider-vertical? slider-vector @{ 0 1 0 }@ = ;
: <up-button> ( slider -- button )
slider-vertical? up left ? <polygon-gadget>
[ -1 swap slide-by-line ] <repeat-button> ;
: add-up @{ 1 1 1 }@ over slider-vector v- first2 set-frame-child ;
: <down-button>
<gadget> [ 1 swap slide-by-line ] <repeat-button> ;
: <down-button> ( slider -- button )
slider-vertical? down right ? <polygon-gadget>
[ 1 swap slide-by-line ] <repeat-button> ;
: add-down @{ 1 1 1 }@ over slider-vector v+ first2 set-frame-child ;
@ -123,8 +131,8 @@ C: slider ( vector -- slider )
0 over set-slider-page
0 over set-slider-max
<elevator> over add-elevator
<up-button> over add-up
<down-button> over add-down
dup <up-button> over add-up
dup <down-button> over add-down
<thumb> over add-thumb ;
: <x-slider> ( -- slider ) @{ 1 0 0 }@ <slider> ;