2005-03-22 21:20:58 -05:00
|
|
|
! Copyright (C) 2005 Slava Pestov.
|
|
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
2005-08-31 21:06:13 -04:00
|
|
|
IN: gadgets-layouts
|
2005-09-11 20:46:55 -04:00
|
|
|
USING: arrays gadgets generic kernel lists math namespaces
|
|
|
|
sequences ;
|
2005-03-10 17:57:22 -05:00
|
|
|
|
2005-08-25 15:27:38 -04:00
|
|
|
! A frame arranges gadgets in a 3x3 grid, where the center
|
|
|
|
! gadgets gets left-over space.
|
|
|
|
TUPLE: frame grid ;
|
2005-07-19 17:40:32 -04:00
|
|
|
|
2005-09-27 14:12:17 -04:00
|
|
|
: <frame-grid>
|
2005-10-29 23:25:38 -04:00
|
|
|
{ { f f f } { f f f } { f f f } } [ clone ] map ;
|
2005-09-27 14:12:17 -04:00
|
|
|
|
|
|
|
: @center 1 1 ;
|
|
|
|
: @left 0 1 ;
|
|
|
|
: @right 2 1 ;
|
|
|
|
: @top 1 0 ;
|
|
|
|
: @bottom 1 2 ;
|
|
|
|
|
|
|
|
: @top-left 0 0 ;
|
|
|
|
: @top-right 2 0 ;
|
|
|
|
: @bottom-left 0 2 ;
|
|
|
|
: @bottom-right 2 2 ;
|
2005-03-10 22:52:55 -05:00
|
|
|
|
|
|
|
C: frame ( -- frame )
|
2005-10-09 21:27:14 -04:00
|
|
|
dup delegate>gadget <frame-grid> over set-frame-grid ;
|
2005-09-28 23:29:00 -04:00
|
|
|
|
2005-10-09 21:27:14 -04:00
|
|
|
: delegate>frame ( tuple -- ) <frame> swap set-delegate ;
|
2005-03-10 17:57:22 -05:00
|
|
|
|
2005-08-25 15:27:38 -04:00
|
|
|
: frame-child ( frame i j -- gadget ) rot frame-grid nth nth ;
|
2005-03-10 22:52:55 -05:00
|
|
|
|
2005-09-27 14:12:17 -04:00
|
|
|
: frame-add ( gadget frame i j -- )
|
|
|
|
#! Add a gadget to a frame. Use this with frames instead
|
|
|
|
#! of add-gadget.
|
|
|
|
>r >r over [ over add-gadget ] when* r> r>
|
|
|
|
3dup frame-child unparent rot frame-grid nth set-nth ;
|
|
|
|
|
|
|
|
: frame-remove ( frame i j -- )
|
|
|
|
#! Remove a gadget from a frame. Use this with frames
|
|
|
|
#! instead of unparent.
|
|
|
|
>r >r >r f r> r> r> frame-add ;
|
2005-08-26 18:18:07 -04:00
|
|
|
|
2005-08-25 15:27:38 -04:00
|
|
|
: reduce-grid ( grid -- seq )
|
2005-09-27 00:24:42 -04:00
|
|
|
[ max-dim ] map ;
|
2005-07-12 20:30:05 -04:00
|
|
|
|
2005-08-25 15:27:38 -04:00
|
|
|
: frame-pref-dim ( grid -- dim )
|
2005-10-29 23:25:38 -04:00
|
|
|
reduce-grid { 0 0 0 } [ v+ ] reduce ;
|
2005-03-10 22:52:55 -05:00
|
|
|
|
2005-08-25 15:27:38 -04:00
|
|
|
: pref-dim-grid ( grid -- grid )
|
2005-10-29 23:25:38 -04:00
|
|
|
[ [ [ pref-dim ] [ { 0 0 0 } ] if* ] map ] map ;
|
2005-03-10 22:52:55 -05:00
|
|
|
|
2005-08-25 15:27:38 -04:00
|
|
|
M: frame pref-dim ( frame -- dim )
|
|
|
|
frame-grid pref-dim-grid
|
2005-08-26 01:29:12 -04:00
|
|
|
dup flip frame-pref-dim first
|
|
|
|
swap frame-pref-dim second
|
2005-09-11 20:46:55 -04:00
|
|
|
0 3array ;
|
2005-03-10 22:52:55 -05:00
|
|
|
|
2005-08-25 15:27:38 -04:00
|
|
|
: frame-layout ( horiz vert -- grid )
|
2005-09-11 20:46:55 -04:00
|
|
|
[ swap [ swap 0 3array ] map-with ] map-with ;
|
2005-03-10 22:52:55 -05:00
|
|
|
|
2005-08-25 15:27:38 -04:00
|
|
|
: do-grid ( dim-grid gadget-grid quot -- )
|
2005-08-25 20:28:56 -04:00
|
|
|
-rot [
|
2005-09-24 15:21:17 -04:00
|
|
|
[ dup [ pick call ] [ 2drop ] if ] 2each
|
2005-08-25 20:28:56 -04:00
|
|
|
] 2each drop ; inline
|
2005-03-10 22:52:55 -05:00
|
|
|
|
2005-08-25 15:27:38 -04:00
|
|
|
: position-grid ( gadgets horiz vert -- )
|
2005-09-16 20:49:24 -04:00
|
|
|
[ 0 [ + ] accumulate ] 2apply
|
2005-08-25 15:27:38 -04:00
|
|
|
frame-layout swap [ set-rect-loc ] do-grid ;
|
2005-03-10 22:52:55 -05:00
|
|
|
|
2005-08-25 15:27:38 -04:00
|
|
|
: resize-grid ( gadgets horiz vert -- )
|
|
|
|
frame-layout swap [ set-gadget-dim ] do-grid ;
|
2005-03-10 17:57:22 -05:00
|
|
|
|
2005-08-25 20:28:56 -04:00
|
|
|
: (fill-center) ( vec n -- )
|
|
|
|
over first pick third + - 0 max 1 rot set-nth ;
|
|
|
|
|
|
|
|
: fill-center ( horiz vert dim -- )
|
|
|
|
tuck second (fill-center) first (fill-center) ;
|
|
|
|
|
2005-08-25 15:27:38 -04:00
|
|
|
M: frame layout* ( frame -- dim )
|
2005-08-25 20:28:56 -04:00
|
|
|
[
|
|
|
|
frame-grid dup pref-dim-grid
|
2005-08-26 01:29:12 -04:00
|
|
|
dup flip reduce-grid [ first ] map
|
|
|
|
swap reduce-grid [ second ] map
|
2005-08-25 20:28:56 -04:00
|
|
|
2dup
|
|
|
|
] keep rect-dim fill-center 3dup position-grid resize-grid ;
|