From 612a6999c9322a38f06c9e279717eed9ae053f6a Mon Sep 17 00:00:00 2001 From: John Benediktsson Date: Wed, 19 Feb 2020 19:54:53 -0800 Subject: [PATCH] ui.gadgets.panes: change approach to nested-pane-stream. --- basis/ui/gadgets/panes/panes.factor | 167 ++++++++++++++-------------- 1 file changed, 82 insertions(+), 85 deletions(-) diff --git a/basis/ui/gadgets/panes/panes.factor b/basis/ui/gadgets/panes/panes.factor index 6cfcbe1112..d9b42677e1 100644 --- a/basis/ui/gadgets/panes/panes.factor +++ b/basis/ui/gadgets/panes/panes.factor @@ -2,14 +2,15 @@ ! See http://factorcode.org/license.txt for BSD license. USING: accessors assocs classes combinators destructors documents.private fonts fry io io.styles kernel locals math -math.rectangles math.vectors models namespaces sequences sorting -splitting strings ui.baseline-alignment ui.clipboards ui.gadgets -ui.gadgets.borders ui.gadgets.grid-lines ui.gadgets.grids -ui.gadgets.icons ui.gadgets.incremental ui.gadgets.labels -ui.gadgets.menus ui.gadgets.packs ui.gadgets.paragraphs -ui.gadgets.presentations ui.gadgets.private ui.gadgets.scrollers -ui.gadgets.tracks ui.gestures ui.images ui.pens.solid ui.render -ui.theme ui.traverse unicode ; +math.rectangles math.vectors models namespaces sequences sets +sorting splitting strings ui.baseline-alignment ui.clipboards +ui.gadgets ui.gadgets.borders ui.gadgets.grid-lines +ui.gadgets.grids ui.gadgets.icons ui.gadgets.incremental +ui.gadgets.labels ui.gadgets.menus ui.gadgets.packs +ui.gadgets.paragraphs ui.gadgets.presentations +ui.gadgets.private ui.gadgets.scrollers ui.gadgets.tracks +ui.gestures ui.images ui.pens.solid ui.render ui.theme +ui.traverse unicode ; FROM: io.styles => foreground background ; FROM: ui.gadgets.wrappers => ; IN: ui.gadgets.panes @@ -18,13 +19,16 @@ TUPLE: pane < track output current input last-line prototype scrolls? selection-color caret mark selecting? ; -TUPLE: pane-stream pane ; +TUPLE: pane-stream pane parent ; INSTANCE: pane-stream output-stream -C: pane-stream +: ( pane -- pane-stream ) + f pane-stream boa ; M: pane-stream stream-element-type drop +character+ ; +DEFER: write-gadget + +baseline+ >>align >>prototype ; inline @@ -97,21 +100,23 @@ M: pane selected-children add-incremental ] [ next-line ] bi ; -: smash-pane ( pane -- gadget ) +GENERIC: smash-pane ( pane -- gadget ) + +M: pane smash-pane [ pane-nl ] [ output>> smash-line ] bi ; -GENERIC: pane-write ( str gadget -- ) -GENERIC: pane-write1 ( char gadget -- ) -GENERIC: pane-format ( str style gadget -- ) +GENERIC: pane-line ( str style gadget -- ) -M: pane pane-write - [ pane-nl ] [ current>> pane-write ] - bi-curry interleave ; - -M: pane pane-format - [ nip pane-nl ] [ current>> pane-format ] +: pane-format ( lines style pane -- ) + [ nip pane-nl ] [ current>> pane-line ] bi-curry bi-curry interleave ; +: pane-write ( lines pane -- ) + H{ } swap pane-format ; + +: pane-write1 ( char pane -- ) + [ 1string H{ } ] dip current>> pane-line ; + : do-pane-stream ( pane-stream quot -- ) [ pane>> ] dip keep scroll-pane ; inline @@ -119,7 +124,7 @@ M: pane-stream stream-nl [ pane-nl ] do-pane-stream ; M: pane-stream stream-write1 - [ current>> pane-write1 ] do-pane-stream ; + [ pane-write1 ] do-pane-stream ; : split-pane ( str quot: ( str -- ) -- ) '[ @@ -134,7 +139,12 @@ M: pane-stream stream-write M: pane-stream stream-format [ '[ _ _ pane-format ] split-pane ] do-pane-stream ; -M: pane-stream dispose drop ; +M: pane-stream dispose + dup parent>> [ + [ pane>> smash-pane ] dip write-gadget + ] [ drop ] if* ; + +! M: pane-stream dispose drop ; M: pane-stream stream-flush drop ; @@ -167,12 +177,9 @@ M: object write-gadget M: filter-writer write-gadget stream>> write-gadget ; -M: pane-stream write-gadget ( gadget pane-stream -- ) +M: pane-stream write-gadget pane>> current>> swap add-gadget drop ; -M: style-stream write-gadget - stream>> write-gadget ; - : print-gadget ( gadget stream -- ) [ write-gadget ] [ nip stream-nl ] 2bi ; @@ -190,7 +197,7 @@ M: style-stream write-gadget with-output-stream* ; inline : make-pane ( quot -- gadget ) - [ ] dip [ with-pane ] [ drop smash-pane ] 2bi ; inline + [ ] dip '[ _ with-pane ] keep smash-pane ; inline TUPLE: pane-control < pane quot ; @@ -243,16 +250,13 @@ MEMO:: specified-font ( name style size foreground background -- font ) : apply-background-style ( style gadget -- style gadget ) background [ >>interior ] apply-style ; -: style-label ( style gadget -- gadget ) +: apply-character-style ( style gadget -- gadget ) apply-font-style apply-background-style - apply-presentation-style apply-image-style + apply-presentation-style nip ; inline -: ( style text -- gadget ) -