2006-05-19 21:08:42 -04:00
|
|
|
! Copyright (C) 2006 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
IN: gadgets-tracks
|
2006-05-31 18:45:11 -04:00
|
|
|
USING: gadgets gadgets-theme generic io kernel
|
2006-05-25 23:25:00 -04:00
|
|
|
math namespaces sequences words ;
|
2006-05-19 21:08:42 -04:00
|
|
|
|
2006-05-20 02:13:44 -04:00
|
|
|
TUPLE: divider ;
|
|
|
|
|
|
|
|
: divider-# ( divider -- n )
|
|
|
|
dup gadget-parent gadget-children index 2 /i ;
|
2006-05-19 21:08:42 -04:00
|
|
|
|
2006-06-23 00:06:53 -04:00
|
|
|
: divider-size { 8 8 } ;
|
2006-05-19 21:08:42 -04:00
|
|
|
|
|
|
|
M: divider pref-dim* drop divider-size ;
|
|
|
|
|
|
|
|
TUPLE: track sizes saved-sizes ;
|
|
|
|
|
|
|
|
C: track ( orientation -- track )
|
2006-06-29 01:54:11 -04:00
|
|
|
[ delegate>pack ] keep
|
|
|
|
1 over set-pack-fill
|
2006-06-23 02:25:08 -04:00
|
|
|
t over set-gadget-clipped? ;
|
2006-05-19 21:08:42 -04:00
|
|
|
|
2006-05-23 01:43:08 -04:00
|
|
|
: divider-sizes ( seq -- dim )
|
2006-06-09 19:58:11 -04:00
|
|
|
length 1 [-] divider-size n*v ;
|
2006-05-23 01:43:08 -04:00
|
|
|
|
2006-05-19 21:08:42 -04:00
|
|
|
: track-dim ( track -- dim )
|
|
|
|
#! Space available for content (minus dividers)
|
2006-05-23 01:43:08 -04:00
|
|
|
dup rect-dim swap track-sizes divider-sizes v- ;
|
2006-05-19 21:08:42 -04:00
|
|
|
|
|
|
|
: track-layout ( track -- sizes )
|
|
|
|
dup track-dim swap track-sizes
|
|
|
|
[ [ over n*v , ] [ divider-size , ] interleave ] { } make
|
|
|
|
nip ;
|
|
|
|
|
2006-08-15 03:01:24 -04:00
|
|
|
M: track layout*
|
2006-08-23 22:14:53 -04:00
|
|
|
dup track-layout pack-layout ;
|
2006-05-19 21:08:42 -04:00
|
|
|
|
2006-05-23 01:43:08 -04:00
|
|
|
: track-pref-dims ( dims sizes -- dims )
|
|
|
|
[ [ dup zero? [ nip ] [ v/n ] if ] 2map max-dim ] keep
|
2006-05-26 03:29:41 -04:00
|
|
|
divider-sizes v+ [ >fixnum ] map ;
|
2006-05-23 01:43:08 -04:00
|
|
|
|
2006-08-15 03:01:24 -04:00
|
|
|
M: track pref-dim*
|
2006-05-23 01:43:08 -04:00
|
|
|
[
|
|
|
|
dup gadget-children
|
2006-07-29 20:36:25 -04:00
|
|
|
2 group [ first ] map pref-dims
|
2006-05-23 01:43:08 -04:00
|
|
|
dup rot track-sizes track-pref-dims >r max-dim r>
|
|
|
|
] keep gadget-orientation set-axis ;
|
|
|
|
|
2006-05-19 21:08:42 -04:00
|
|
|
: divider-delta ( track -- delta )
|
|
|
|
#! How far the divider has moved along the track?
|
2006-06-23 00:06:53 -04:00
|
|
|
drag-loc over track-dim { 1 1 } vmax v/
|
2006-05-19 21:08:42 -04:00
|
|
|
swap gadget-orientation v. ;
|
|
|
|
|
|
|
|
: save-sizes ( track -- )
|
|
|
|
dup track-sizes clone swap set-track-saved-sizes ;
|
|
|
|
|
|
|
|
: restore-sizes ( track -- )
|
|
|
|
dup track-saved-sizes clone swap set-track-sizes ;
|
|
|
|
|
2006-05-30 18:57:34 -04:00
|
|
|
: set-nth-0 ( n seq -- old ) 2dup nth >r 0 -rot set-nth r> ;
|
|
|
|
|
2006-07-28 03:54:46 -04:00
|
|
|
: +nth ( delta n seq -- ) [ + ] change-nth ;
|
2006-05-30 18:57:34 -04:00
|
|
|
|
|
|
|
: clamp-nth ( i j sizes -- ) [ set-nth-0 swap ] keep +nth ;
|
|
|
|
|
|
|
|
: clamp-up? ( delta n sizes -- ? ) nth + 0 < ;
|
|
|
|
|
|
|
|
: clamp-down? ( delta n sizes -- ? ) >r 1+ r> nth swap - 0 < ;
|
|
|
|
|
|
|
|
: change-last-size ( delta n sizes -- )
|
|
|
|
#! Its a bit simpler to resize the last divider since we
|
|
|
|
#! don't have to adjust the next one.
|
|
|
|
3dup clamp-up? [ set-nth-0 2drop ] [ +nth ] if ;
|
|
|
|
|
|
|
|
: change-inner-size ( delta n sizes -- )
|
|
|
|
#! When changing a divider which isn't the last, we have to
|
|
|
|
#! resize the next area, too.
|
|
|
|
{
|
|
|
|
{ [ 3dup clamp-up? ] [ >r dup 1+ swap r> clamp-nth drop ] }
|
|
|
|
{ [ 3dup clamp-down? ] [ >r dup 1+ r> clamp-nth drop ] }
|
|
|
|
{ [ t ] [ pick neg pick 1+ pick +nth +nth ] }
|
|
|
|
} cond ;
|
|
|
|
|
|
|
|
: change-size ( delta n sizes -- )
|
|
|
|
over 1+ over length =
|
|
|
|
[ change-last-size ] [ change-inner-size ] if ;
|
|
|
|
|
2006-05-19 21:08:42 -04:00
|
|
|
: change-divider ( delta n track -- )
|
2006-05-30 18:57:34 -04:00
|
|
|
[ dup restore-sizes track-sizes change-size ] keep
|
|
|
|
relayout-1 ;
|
2006-05-19 21:08:42 -04:00
|
|
|
|
|
|
|
: divider-motion ( divider -- )
|
|
|
|
dup gadget-parent divider-delta
|
|
|
|
over divider-# rot gadget-parent change-divider ;
|
|
|
|
|
2006-07-19 17:00:57 -04:00
|
|
|
divider H{
|
|
|
|
{ T{ button-down } [ gadget-parent save-sizes ] }
|
|
|
|
{ T{ button-up } [ drop ] }
|
|
|
|
{ T{ drag } [ divider-motion ] }
|
|
|
|
} set-gestures
|
2006-05-19 21:08:42 -04:00
|
|
|
|
2006-05-20 02:13:44 -04:00
|
|
|
C: divider ( -- divider )
|
2006-08-28 18:14:54 -04:00
|
|
|
dup delegate>gadget ;
|
2006-05-19 21:08:42 -04:00
|
|
|
|
|
|
|
: normalize-sizes ( sizes -- sizes )
|
|
|
|
dup sum swap [ swap / ] map-with ;
|
|
|
|
|
|
|
|
: track-add-size ( sizes -- sizes )
|
|
|
|
dup length 1 max recip add normalize-sizes ;
|
|
|
|
|
|
|
|
: add-divider ( track -- )
|
2006-05-20 02:13:44 -04:00
|
|
|
dup track-sizes empty?
|
|
|
|
[ drop ] [ <divider> swap add-gadget ] if ;
|
2006-05-19 21:08:42 -04:00
|
|
|
|
|
|
|
: track-add ( gadget track -- )
|
|
|
|
dup add-divider [ add-gadget ] keep
|
|
|
|
dup track-sizes track-add-size swap set-track-sizes ;
|
|
|
|
|
2006-10-04 23:30:17 -04:00
|
|
|
: remove-divider ( n track -- )
|
|
|
|
2dup gadget-children length = [ >r 1- r> ] when
|
|
|
|
nth-gadget unparent ;
|
|
|
|
|
|
|
|
: track-remove-size ( n track -- )
|
|
|
|
[ >r 2 /i r> track-sizes remove-nth normalize-sizes ] keep
|
|
|
|
set-track-sizes ;
|
|
|
|
|
2006-05-20 02:13:44 -04:00
|
|
|
: track-remove@ ( n track -- )
|
|
|
|
2dup nth-gadget unparent
|
2006-10-04 23:30:17 -04:00
|
|
|
dup gadget-children empty? [ 2dup remove-divider ] unless
|
|
|
|
[ track-remove-size ] keep
|
|
|
|
relayout-1 ;
|
2006-05-20 02:13:44 -04:00
|
|
|
|
2006-05-19 21:08:42 -04:00
|
|
|
: track-remove ( gadget track -- )
|
2006-05-20 02:13:44 -04:00
|
|
|
[ gadget-children index ] keep track-remove@ ;
|
2006-05-25 23:25:00 -04:00
|
|
|
|
|
|
|
: build-track ( track specs -- )
|
2006-06-29 01:54:11 -04:00
|
|
|
#! Specs is an array of quadruples { quot post setter loc }.
|
2006-05-25 23:25:00 -04:00
|
|
|
#! The setter has stack effect ( new gadget -- ),
|
|
|
|
#! the loc is a ratio from 0 to 1.
|
2006-07-28 18:00:14 -04:00
|
|
|
[ swap [ [ drop track-add ] build-spec ] with-gadget ] 2keep
|
2006-07-28 16:07:22 -04:00
|
|
|
[ peek ] map swap set-track-sizes ; inline
|
2006-05-25 23:25:00 -04:00
|
|
|
|
|
|
|
: make-track ( specs orientation -- gadget )
|
2006-07-28 16:07:22 -04:00
|
|
|
<track> [ swap build-track ] keep ; inline
|
2006-05-25 23:25:00 -04:00
|
|
|
|
|
|
|
: make-track* ( gadget specs orientation -- gadget )
|
2006-07-28 16:07:22 -04:00
|
|
|
<track> pick [ set-delegate build-track ] keep ; inline
|