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" {
|
2006-09-20 03:22:26 -04:00
|
|
|
{ "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 ;
|
|
|
|
|
2006-09-20 03:22:26 -04:00
|
|
|
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 ;
|