factor/library/ui/gadgets/panes.factor

100 lines
2.8 KiB
Factor
Raw Normal View History

2006-06-07 23:51:28 -04:00
! Copyright (C) 2005, 2006 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
IN: gadgets-panes
USING: arrays gadgets gadgets-buttons gadgets-controls
gadgets-frames gadgets-grids gadgets-labels gadgets-scrolling
gadgets-theme generic hashtables io kernel math namespaces
sequences strings ;
2005-06-27 00:54:49 -04:00
TUPLE: pane output active current prototype ;
2005-06-27 00:54:49 -04:00
: add-output 2dup set-pane-output add-gadget ;
2005-12-16 21:12:35 -05:00
: init-line ( pane -- )
dup pane-prototype clone swap set-pane-current ;
: prepare-line ( pane -- )
dup init-line dup pane-active unparent
[ pane-current 1array make-shelf ] keep
2005-06-27 00:54:49 -04:00
2dup set-pane-active add-gadget ;
: pane-clear ( pane -- )
dup pane-output clear-incremental pane-current clear-gadget ;
2005-06-27 00:54:49 -04:00
2005-12-17 00:12:32 -05:00
C: pane ( -- pane )
<pile> over set-delegate
2005-12-17 00:12:32 -05:00
<shelf> over set-pane-prototype
<pile> <incremental> over add-output
2005-12-28 20:25:17 -05:00
dup prepare-line ;
2005-06-27 00:54:49 -04:00
2005-08-24 21:52:10 -04:00
: prepare-print ( current -- gadget )
#! Optimization: if line has 1 child, add the child.
dup gadget-children {
{ [ dup empty? ] [ 2drop "" <label> ] }
{ [ dup length 1 = ] [ nip first ] }
{ [ t ] [ drop ] }
} cond ;
2005-08-24 21:52:10 -04:00
2005-12-28 20:25:17 -05:00
: pane-write ( pane seq -- )
[ over pane-current stream-write ]
[ dup stream-terpri ] interleave drop ;
2005-06-27 00:54:49 -04:00
2005-12-28 20:25:17 -05:00
: pane-format ( style pane seq -- )
[ pick pick pane-current stream-format ]
[ dup stream-terpri ] interleave 2drop ;
2005-06-27 00:54:49 -04:00
2005-12-17 20:03:41 -05:00
: write-gadget ( gadget pane -- )
#! Print a gadget to the given pane.
pane-current add-gadget ;
: print-gadget ( gadget pane -- )
tuck write-gadget stream-terpri ;
2005-12-17 20:03:41 -05:00
: gadget. ( gadget -- )
#! Print a gadget to the current pane.
stdio get print-gadget ;
2005-12-17 20:03:41 -05:00
2005-06-27 00:54:49 -04:00
! Panes are streams.
M: pane stream-flush ( pane -- ) drop ;
: scroll-pane ( pane -- )
#! Only input panes scroll.
drop ;
! dup pane-input [ dup pane-active scroll>gadget ] when drop ;
2005-09-25 00:18:12 -04:00
2006-06-29 00:00:21 -04:00
M: pane stream-terpri ( pane -- )
dup pane-current prepare-print
over pane-output add-incremental
dup prepare-line
scroll-pane ;
M: pane stream-write1 ( char pane -- )
2005-12-16 21:12:35 -05:00
[ pane-current stream-write1 ] keep scroll-pane ;
2005-12-16 22:24:39 -05:00
M: pane stream-write ( string pane -- )
[ swap "\n" split pane-write ] keep scroll-pane ;
2005-06-27 00:54:49 -04:00
2005-12-16 21:12:35 -05:00
M: pane stream-format ( string style pane -- )
[ rot "\n" split pane-format ] keep scroll-pane ;
M: pane stream-close ( pane -- ) drop ;
2005-09-25 00:18:12 -04:00
M: pane with-stream-style ( quot style pane -- )
(with-stream-style) ;
: ?terpri
dup pane-current gadget-children empty?
[ dup stream-terpri ] unless drop ;
: with-pane ( pane quot -- )
#! Clear the pane and run the quotation in a scope with
#! stdio set to the pane.
over pane-clear over >r with-stream* r> ?terpri ; inline
2005-12-17 20:03:41 -05:00
: make-pane ( quot -- pane )
#! Execute the quotation with output to an output-only pane.
<pane> [ swap with-pane ] keep ; inline
: <pane-control> ( model quot -- pane )
[ with-pane ] curry <pane> swap <control> ;