factor/library/ui/tools/dataflow.factor

218 lines
5.7 KiB
Factor
Raw Normal View History

2006-09-13 02:17:46 -04:00
! Copyright (C) 2006 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
IN: gadgets-dataflow
USING: namespaces arrays sequences io inference math kernel
generic prettyprint words gadgets opengl gadgets-panes
gadgets-labels gadgets-theme gadgets-presentations
gadgets-buttons gadgets-borders gadgets-scrolling
2006-09-15 21:29:58 -04:00
gadgets-frames gadgets-workspace optimizer models help ;
2006-09-13 02:17:46 -04:00
2006-09-15 21:29:58 -04:00
GENERIC: node>gadget* ( height node -- gadget )
GENERIC: node-presents ( node -- object )
2006-09-13 02:17:46 -04:00
2006-09-15 20:52:13 -04:00
! Representation of shuffle nodes
2006-09-13 02:17:46 -04:00
TUPLE: shuffle-gadget value ;
: literal-theme ( shuffle -- )
T{ solid f { 0.6 0.6 0.6 1.0 } } swap set-gadget-boundary ;
: word-theme ( shuffle -- )
T{ solid f { 1.0 0.6 0.6 1.0 } } swap set-gadget-boundary ;
C: shuffle-gadget ( node -- gadget )
[ set-shuffle-gadget-value ] keep
dup delegate>gadget ;
: shuffled-offsets ( shuffle -- seq )
2006-09-15 20:59:47 -04:00
dup effect-in swap effect-out [ swap index ] map-with ;
2006-09-13 02:17:46 -04:00
2006-09-15 20:52:13 -04:00
: shuffled-endpoints ( w h seq seq -- seq )
[ [ 30 * 15 + ] map ] 2apply
>r over r> [ - ] map-with >r [ - ] map-with r>
[ 0 swap 2array ] map >r [ 2array ] map-with r>
[ 2array ] 2map ;
2006-09-13 02:17:46 -04:00
: draw-shuffle ( gadget seq seq -- )
2006-10-12 18:09:30 -04:00
origin get [
>r >r rect-dim first2 r> r> shuffled-endpoints
[ first2 gl-line ] each
] with-translation ;
2006-09-13 02:17:46 -04:00
M: shuffle-gadget draw-gadget*
{ 0 0 0 1 } gl-color
dup shuffle-gadget-value
shuffled-offsets [ length ] keep
draw-shuffle ;
2006-09-15 20:52:13 -04:00
: node-dim ( n -- dim ) 30 * 10 swap 2array ;
: shuffle-dim ( shuffle -- dim )
2006-09-15 20:59:47 -04:00
dup effect-in length swap effect-out length max
2006-09-15 20:52:13 -04:00
node-dim ;
2006-09-13 02:17:46 -04:00
M: shuffle-gadget pref-dim*
2006-09-15 20:52:13 -04:00
shuffle-gadget-value shuffle-dim ;
2006-09-15 21:29:58 -04:00
M: #shuffle node>gadget* nip node-shuffle <shuffle-gadget> ;
M: #shuffle node-presents drop f ;
2006-09-13 02:17:46 -04:00
2006-09-15 20:52:13 -04:00
! Stack height underneath a node
TUPLE: height-gadget value ;
2006-09-13 02:17:46 -04:00
2006-09-15 20:52:13 -04:00
C: height-gadget ( value -- gadget )
2006-09-13 02:17:46 -04:00
[ set-height-gadget-value ] keep
dup delegate>gadget ;
M: height-gadget pref-dim*
2006-09-15 20:52:13 -04:00
height-gadget-value node-dim ;
2006-09-13 02:17:46 -04:00
M: height-gadget draw-gadget*
{ 0 0 0 1 } gl-color
2006-09-15 20:52:13 -04:00
dup height-gadget-value dup draw-shuffle ;
2006-09-13 02:17:46 -04:00
2006-09-15 20:52:13 -04:00
! Calls and pushes
TUPLE: node-gadget value height ;
2006-09-13 02:17:46 -04:00
2006-09-15 20:52:13 -04:00
C: node-gadget ( gadget node height -- gadget )
[ set-node-gadget-height ] keep
2006-09-13 02:17:46 -04:00
[ set-node-gadget-value ] keep
2006-09-15 20:52:13 -04:00
swap <default-border> over set-gadget-delegate
dup faint-boundary ;
2006-09-13 02:17:46 -04:00
M: node-gadget pref-dim*
dup delegate pref-dim
2006-09-15 20:52:13 -04:00
swap dup node-gadget-height [
node-dim
] [
node-gadget-value node-shuffle shuffle-dim
] ?if vmax ;
2006-09-13 02:17:46 -04:00
2006-09-15 21:29:58 -04:00
M: #call node>gadget*
2006-09-15 20:52:13 -04:00
nip
2006-09-13 02:17:46 -04:00
[ node-param word-name <label> ] keep
2006-09-15 21:29:58 -04:00
f <node-gadget> dup word-theme ;
2006-09-13 02:17:46 -04:00
2006-09-15 21:29:58 -04:00
M: #call node-presents node-param ;
M: #push node>gadget*
2006-09-15 20:52:13 -04:00
nip [
2006-09-13 02:17:46 -04:00
>#push< [ literalize unparse ] map " " join <label>
2006-09-15 20:52:13 -04:00
] keep f <node-gadget> dup literal-theme ;
2006-09-13 02:17:46 -04:00
2006-09-15 21:29:58 -04:00
M: #push node-presents >#push< first ;
! #if #dispatch #label etc
2006-09-13 02:17:46 -04:00
: <child-nodes> ( seq -- seq )
[ length ] keep
[
>r number>string "Child " swap append <label> r>
2006-10-10 01:07:11 -04:00
<presentation>
2006-09-13 02:17:46 -04:00
] 2map ;
2006-09-15 21:29:58 -04:00
: <node-presentation> ( node -- gadget )
class [ word-name <label> ] keep <link>
2006-10-10 01:07:11 -04:00
<presentation> ;
2006-09-15 21:29:58 -04:00
2006-09-15 20:52:13 -04:00
: default-node-content ( node -- gadget )
dup node-children <child-nodes>
2006-09-15 21:02:48 -04:00
swap class word-name <label> add* make-pile
2006-09-15 20:52:13 -04:00
{ 5 5 } over set-pack-gap ;
2006-09-15 21:29:58 -04:00
M: object node>gadget*
2006-09-15 20:52:13 -04:00
nip dup default-node-content swap f <node-gadget> ;
2006-09-15 21:29:58 -04:00
M: object node-presents
class <link> ;
UNION: full-height-node #if #dispatch #label #merge #return
#values #entry ;
2006-09-15 20:52:13 -04:00
2006-09-15 21:29:58 -04:00
M: full-height-node node>gadget*
2006-09-15 20:52:13 -04:00
dup default-node-content swap rot <node-gadget> ;
! Constructing the graphical representation; first we compute
! stack heights
SYMBOL: d-height
2006-09-15 21:02:48 -04:00
DEFER: (compute-heights)
2006-09-15 20:52:13 -04:00
: compute-child-heights ( node -- )
node-children dup empty? [
drop
] [
[
[ (compute-heights) d-height get ] { } make drop
] map supremum d-height set
] if ;
2006-09-13 02:17:46 -04:00
2006-09-14 16:15:39 -04:00
: (compute-heights) ( node -- )
[
2006-09-15 20:52:13 -04:00
d-height get over 2array ,
dup node-out-d length over node-in-d length -
d-height [ + ] change
2006-09-30 00:03:46 -04:00
dup compute-child-heights
2006-09-14 16:15:39 -04:00
node-successor (compute-heights)
] when* ;
2006-09-15 20:52:13 -04:00
: normalize-height ( seq -- seq )
[
[ dup first swap second node-in-d length - ] map infimum
] keep
[ first2 >r swap - r> 2array ] map-with ;
2006-09-13 02:17:46 -04:00
: compute-heights ( nodes -- pairs )
2006-09-15 20:52:13 -04:00
[ 0 d-height set (compute-heights) ] { } make
normalize-height ;
! Then we create gadgets for every node
2006-09-15 21:29:58 -04:00
: node>gadget ( height node -- gadget )
[ node>gadget* ] keep node-presents
2006-10-10 01:07:11 -04:00
[ <presentation> ] when* ;
2006-09-15 21:29:58 -04:00
2006-09-15 20:52:13 -04:00
: print-node ( d-height node -- )
dup full-height-node? [
node>gadget
] [
[ node-in-d length - <height-gadget> ] 2keep
node>gadget swap 2array
make-pile 1 over set-pack-fill
] if , ;
2006-09-13 02:17:46 -04:00
: <dataflow-graph> ( node -- gadget )
2006-09-15 20:52:13 -04:00
compute-heights [
dup empty? [ dup first first <height-gadget> , ] unless
[ first2 print-node ] each
] { } make
make-shelf 1 over set-pack-align ;
2006-09-13 02:17:46 -04:00
2006-09-15 20:52:13 -04:00
! The UI tool
2006-10-06 20:27:40 -04:00
TUPLE: dataflow-gadget history ;
2006-09-13 02:17:46 -04:00
2006-10-09 23:57:32 -04:00
dataflow-gadget "toolbar" {
{ "Back" T{ key-down f { C+ } "b" } [ dataflow-gadget-history go-back ] }
{ "Forward" T{ key-down f { C+ } "f" } [ dataflow-gadget-history go-forward ] }
2006-09-13 02:17:46 -04:00
} define-commands
: <dataflow-pane> ( history -- gadget )
gadget get dataflow-gadget-history
[ <dataflow-graph> gadget. ]
<pane-control> ;
C: dataflow-gadget ( -- gadget )
f <history> over set-dataflow-gadget-history {
{ [ <dataflow-pane> ] f [ <scroller> ] @center }
} make-frame* ;
2006-09-14 16:15:39 -04:00
M: dataflow-gadget call-tool* ( node dataflow -- )
dup dataflow-gadget-history add-history
dataflow-gadget-history set-model ;
M: dataflow-gadget tool-help drop "ui-dataflow" ;
2006-09-14 16:15:39 -04:00
IN: tools
: show-dataflow ( quot -- )
dataflow optimize dataflow-gadget call-tool ;