! 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 optimizer models ; : shuffle-in dup shuffle-in-d swap shuffle-in-r append ; : shuffle-out dup shuffle-out-d swap shuffle-out-r append ; 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 shuffle-in swap shuffle-out [ swap index ] map-with ; : shuffled-endpoints ( w seq seq -- seq ) [ [ 30 * 15 + ] 2apply >r dupd 2array 0 r> 2array 2array ] 2map nip ; : draw-shuffle ( gadget seq seq -- ) >r >r rect-dim first r> r> shuffled-endpoints [ first2 gl-line ] each ; M: shuffle-gadget draw-gadget* { 0 0 0 1 } gl-color dup shuffle-gadget-value shuffled-offsets [ length ] keep draw-shuffle ; : shuffle-dim ( shuffle -- node ) dup shuffle-in length swap shuffle-out length max 30 * 10 swap 2array ; M: shuffle-gadget pref-dim* dup delegate pref-dim swap shuffle-gadget-value shuffle-dim vmax ; TUPLE: height-gadget value skew ; C: height-gadget ( value skew -- gadget ) [ set-height-gadget-skew ] keep [ set-height-gadget-value ] keep dup delegate>gadget ; M: height-gadget pref-dim* dup height-gadget-value swap height-gadget-skew abs + 30 * 10 swap 2array ; : height-offsets ( value skew -- seq seq ) [ abs swap [ [ + ] map-with ] keep ] keep 0 < [ swap ] when ; M: height-gadget draw-gadget* { 0 0 0 1 } gl-color dup height-gadget-value over height-gadget-skew height-offsets draw-shuffle ; TUPLE: node-gadget value ; C: node-gadget ( gadget node -- gadget ) [ set-node-gadget-value ] keep swap over set-gadget-delegate ; M: node-gadget pref-dim* dup delegate pref-dim swap node-gadget-value node-shuffle shuffle-dim vmax ; GENERIC: node>gadget ( node -- gadget ) M: #call node>gadget [ node-param word-name