! 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 gadgets-frames gadgets-workspace optimizer models help ; GENERIC: node>gadget* ( height node -- gadget ) GENERIC: node-presents ( node -- object ) ! Representation of shuffle nodes 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 ) dup effect-in swap effect-out [ swap index ] map-with ; : 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 ; : draw-shuffle ( gadget seq seq -- ) origin get [ >r >r rect-dim first2 r> r> shuffled-endpoints [ first2 gl-line ] each ] with-translation ; M: shuffle-gadget draw-gadget* { 0 0 0 1 } gl-color dup shuffle-gadget-value shuffled-offsets [ length ] keep draw-shuffle ; : node-dim ( n -- dim ) 30 * 10 swap 2array ; : shuffle-dim ( shuffle -- dim ) dup effect-in length swap effect-out length max node-dim ; M: shuffle-gadget pref-dim* shuffle-gadget-value shuffle-dim ; M: #shuffle node>gadget* nip node-shuffle ; M: #shuffle node-presents drop f ; ! Stack height underneath a node TUPLE: height-gadget value ; C: height-gadget ( value -- gadget ) [ set-height-gadget-value ] keep dup delegate>gadget ; M: height-gadget pref-dim* height-gadget-value node-dim ; M: height-gadget draw-gadget* { 0 0 0 1 } gl-color dup height-gadget-value dup draw-shuffle ; ! Calls and pushes TUPLE: node-gadget value height ; C: node-gadget ( gadget node height -- gadget ) [ set-node-gadget-height ] keep [ set-node-gadget-value ] keep swap over set-gadget-delegate dup faint-boundary ; M: node-gadget pref-dim* dup delegate pref-dim swap dup node-gadget-height [ node-dim ] [ node-gadget-value node-shuffle shuffle-dim ] ?if vmax ; M: #call node>gadget* nip [ node-param word-name