Improved UI listener and editor

release
slava 2006-07-25 04:14:59 +00:00
parent d3d7d053fd
commit 1a8058a8bd
7 changed files with 67 additions and 39 deletions

View File

@ -63,8 +63,14 @@ M: model set-model ( value model -- )
: set-model* ( value model -- ) : set-model* ( value model -- )
2dup model-value = [ 2drop ] [ set-model ] if ; 2dup model-value = [ 2drop ] [ set-model ] if ;
: ((change-model)) ( model quot -- newvalue model )
over >r >r model-value r> call r> ; inline
: change-model ( model quot -- ) : change-model ( model quot -- )
over >r >r model-value r> call r> set-model ; inline ((change-model)) set-model ; inline
: (change-model) ( model quot -- )
((change-model)) set-model-value ; inline
: delegate>model ( obj -- ) : delegate>model ( obj -- )
f <model> swap set-delegate ; f <model> swap set-delegate ;
@ -127,8 +133,11 @@ C: history ( value -- history )
V{ } clone over set-history-back V{ } clone over set-history-back
V{ } clone over set-history-forward ; V{ } clone over set-history-forward ;
: (add-history) ( history vector -- ) G: (add-history) ( history vector -- )
swap model-value dup [ swap push ] [ 2drop ] if ; 1 standard-combination ;
M: history (add-history) ( history vector -- )
swap model-value [ 2drop ] [ swap push ] if ;
: go-back/forward ( history to from -- ) : go-back/forward ( history to from -- )
dup empty? dup empty?
@ -141,6 +150,8 @@ C: history ( value -- history )
: go-forward ( history -- ) : go-forward ( history -- )
dup history-back over history-forward go-back/forward ; dup history-back over history-forward go-back/forward ;
: add-history ( history -- ) GENERIC: add-history ( history -- )
M: history add-history ( history -- )
0 over history-forward set-length 0 over history-forward set-length
dup history-back (add-history) ; dup history-back (add-history) ;

View File

@ -58,7 +58,11 @@ sequences ;
3dup next-elt >r prev-elt r> 3dup next-elt >r prev-elt r>
r> editor-select ; r> editor-select ;
: select-all ( editor -- ) T{ doc-elt } select-elt ;
editor H{ editor H{
{ T{ key-down f f "RETURN" } [ "\n" swap user-input ] }
{ T{ key-down f { S+ } "RETURN" } [ "\n" swap user-input ] }
{ T{ button-down } [ editor-mouse-down ] } { T{ button-down } [ editor-mouse-down ] }
{ T{ drag } [ editor-mouse-drag ] } { T{ drag } [ editor-mouse-drag ] }
{ T{ gain-focus } [ focus-editor ] } { T{ gain-focus } [ focus-editor ] }

View File

@ -127,3 +127,14 @@ C: document ( -- document )
: clear-doc ( document -- ) : clear-doc ( document -- )
"" swap set-doc-text ; "" swap set-doc-text ;
M: document (add-history) ( document vector -- )
>r model-value dup { "" } sequence=
[ r> 2drop ] [ r> push-new ] if ;
M: document add-history ( document -- )
#! Add the new entry at the end of the history, and avoid
#! duplicates.
dup history-back dup
pick history-forward <reversed> nappend
(add-history) ;

View File

@ -11,16 +11,22 @@ font color caret-color selection-color
caret mark caret mark
focused? ; focused? ;
: init-editor-models ( editor -- ) TUPLE: loc-monitor editor ;
dup control-self over editor-caret add-connection
dup control-self swap editor-mark add-connection ; M: loc-monitor model-changed ( obj -- )
loc-monitor-editor control-self relayout-1 ;
: <loc> ( editor -- loc )
<loc-monitor> { 0 0 } <model> [ add-connection ] keep ;
: init-editor-locs ( editor -- )
dup <loc> over set-editor-caret
dup <loc> swap set-editor-mark ;
C: editor ( document -- editor ) C: editor ( document -- editor )
dup <document> delegate>control dup <document> delegate>control
dup dup set-control-self dup dup set-control-self
{ 0 0 } <model> over set-editor-caret dup init-editor-locs
{ 0 0 } <model> over set-editor-mark
dup init-editor-models
dup editor-theme ; dup editor-theme ;
: activate-editor-model ( editor model -- ) : activate-editor-model ( editor model -- )
@ -40,14 +46,16 @@ M: editor ungraft* ( editor -- )
dup control-self swap control-model remove-connection ; dup control-self swap control-model remove-connection ;
M: editor model-changed ( editor -- ) M: editor model-changed ( editor -- )
#! Document changed control-self dup control-model
control-self relayout ; over editor-caret [ over validate-loc ] (change-model)
over editor-mark [ over validate-loc ] (change-model)
drop relayout ;
: editor-caret* editor-caret model-value ; : editor-caret* editor-caret model-value ;
: editor-mark* editor-mark model-value ; : editor-mark* editor-mark model-value ;
: change-caret ( editor quot -- ) : change-caret ( editor quot -- | quot: caret doc -- caret )
over >r >r dup editor-caret* swap control-model r> call r> over >r >r dup editor-caret* swap control-model r> call r>
[ control-model validate-loc ] keep [ control-model validate-loc ] keep
editor-caret set-model ; inline editor-caret set-model ; inline

View File

@ -1,7 +1,7 @@
! Copyright (C) 2006 Slava Pestov ! Copyright (C) 2006 Slava Pestov
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
IN: gadgets-text IN: gadgets-text
USING: gadgets gadgets-controls generic kernel models ; USING: gadgets gadgets-controls generic kernel models sequences ;
TUPLE: field model quot ; TUPLE: field model quot ;
@ -19,7 +19,8 @@ C: field ( model quot -- field )
[ editor-text ] keep [ editor-text ] keep
dup field-model [ dupd set-model ] when* dup field-model [ dupd set-model ] when*
dup field-quot [ dupd call ] when* dup field-quot [ dupd call ] when*
control-model dup add-history clear-doc ; dup control-model add-history
select-all ;
field H{ field H{
{ T{ key-down f { C+ } "p" } [ field-prev ] } { T{ key-down f { C+ } "p" } [ field-prev ] }

View File

@ -1,8 +1,8 @@
! Copyright (C) 2006 Slava Pestov. ! Copyright (C) 2006 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
IN: gadgets-text IN: gadgets-text
USING: gadgets gadgets-controls gadgets-panes io kernel USING: gadgets gadgets-controls gadgets-panes hashtables help io
namespaces prettyprint styles threads ; kernel namespaces prettyprint styles threads ;
TUPLE: interactor output continuation ; TUPLE: interactor output continuation ;
@ -27,14 +27,15 @@ SYMBOL: structured-input
: print-input ( string interactor -- ) : print-input ( string interactor -- )
interactor-output [ interactor-output [
dup [ H{ { font-style bold } } [
<input> presented set dup <input> presented associate
bold font-style set [ write ] with-nesting terpri
] make-hash format terpri ] with-style
] with-stream* ; ] with-stream* ;
: interactor-commit ( gadget -- ) : interactor-commit ( gadget -- )
dup field-commit dup field-commit
over control-model clear-doc
swap 2dup print-input interactor-eval ; swap 2dup print-input interactor-eval ;
interactor H{ interactor H{

View File

@ -31,34 +31,26 @@ TUPLE: listener-gadget input output stack ;
>r <pane-control> <scroller> r> f <tile> ; >r <pane-control> <scroller> r> f <tile> ;
: <stack-tile> ( model title -- gadget ) : <stack-tile> ( model title -- gadget )
[ [ 32 margin set stack. ] with-scope ] swap <pane-tile> ; [ stack. ] swap <pane-tile> ;
: <listener-input> ( listener -- gadget ) : <listener-input> ( -- gadget )
listener-gadget-input <scroller> "Input" f <tile> ; gadget get listener-gadget-output <interactor> ;
: <stack-display> ( listener -- gadget ) : <stack-display> ( -- gadget )
listener-gadget-stack "Stack" <stack-tile> ; gadget get listener-gadget-stack "Stack" <stack-tile> ;
: <listener-bar> ( listener -- gadget )
dup {
{ [ <listener-input> ] f f 2/3 }
{ [ <stack-display> ] f f 1/3 }
} { 1 0 } make-track ;
: init-listener ( listener -- ) : init-listener ( listener -- )
f <model> over set-listener-gadget-stack f <model> swap set-listener-gadget-stack ;
<scrolling-pane> over set-listener-gadget-output
dup listener-gadget-output <interactor>
swap set-listener-gadget-input ;
C: listener-gadget ( -- gadget ) C: listener-gadget ( -- gadget )
dup init-listener { dup init-listener {
{ [ gadget get listener-gadget-output <scroller> ] f f 5/6 } { [ <scrolling-pane> ] set-listener-gadget-output [ <scroller> ] 4/6 }
{ [ gadget get <listener-bar> ] f f 1/6 } { [ <stack-display> ] f f 1/6 }
{ [ <listener-input> ] set-listener-gadget-input [ <scroller> ] 1/6 }
} { 0 1 } make-track* dup start-listener ; } { 0 1 } make-track* dup start-listener ;
M: listener-gadget pref-dim* M: listener-gadget pref-dim*
delegate pref-dim* { 700 500 } vmax ; delegate pref-dim* { 500 600 } vmax ;
M: listener-gadget focusable-child* ( listener -- gadget ) M: listener-gadget focusable-child* ( listener -- gadget )
listener-gadget-input ; listener-gadget-input ;