graft*/ungraft* refactoring
							parent
							
								
									d8a0c08de9
								
							
						
					
					
						commit
						cef837184b
					
				| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					USING: dlists ui.gadgets kernel ui namespaces io.streams.string
 | 
				
			||||||
 | 
					io ;
 | 
				
			||||||
 | 
					IN: tools.test.ui
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					! We can't print to stdio here because that might be a pane
 | 
				
			||||||
 | 
					! stream, and our graft-queue rebinding here would be captured
 | 
				
			||||||
 | 
					! by code adding children to the pane...
 | 
				
			||||||
 | 
					: with-grafted-gadget ( gadget quot -- )
 | 
				
			||||||
 | 
					    [
 | 
				
			||||||
 | 
					        <dlist> \ graft-queue [
 | 
				
			||||||
 | 
					            over
 | 
				
			||||||
 | 
					            graft notify-queued
 | 
				
			||||||
 | 
					            swap slip
 | 
				
			||||||
 | 
					            ungraft notify-queued
 | 
				
			||||||
 | 
					        ] with-variable
 | 
				
			||||||
 | 
					    ] string-out print ;
 | 
				
			||||||
| 
						 | 
					@ -62,7 +62,6 @@ M: cocoa-ui-backend set-title ( string world -- )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
M: cocoa-ui-backend (open-world-window) ( world -- )
 | 
					M: cocoa-ui-backend (open-world-window) ( world -- )
 | 
				
			||||||
    dup gadget-window
 | 
					    dup gadget-window
 | 
				
			||||||
    dup start-world
 | 
					 | 
				
			||||||
    dup auto-position
 | 
					    dup auto-position
 | 
				
			||||||
    world-handle second f -> makeKeyAndOrderFront: ;
 | 
					    world-handle second f -> makeKeyAndOrderFront: ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
IN: temporary
 | 
					IN: temporary
 | 
				
			||||||
USING: ui.commands ui.gadgets.buttons ui.gadgets.labels
 | 
					USING: ui.commands ui.gadgets.buttons ui.gadgets.labels
 | 
				
			||||||
ui.gadgets tools.test namespaces sequences kernel models ;
 | 
					ui.gadgets tools.test namespaces sequences kernel models
 | 
				
			||||||
 | 
					tools.test.inference ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TUPLE: foo-gadget ;
 | 
					TUPLE: foo-gadget ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,6 +28,12 @@ T{ foo-gadget } <toolbar> "t" set
 | 
				
			||||||
    } <radio-buttons> "religion" set
 | 
					    } <radio-buttons> "religion" set
 | 
				
			||||||
] unit-test
 | 
					] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{ 2 1 } [ <radio-buttons> ] unit-test-effect
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{ 2 1 } [ <toggle-buttons> ] unit-test-effect
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{ 2 1 } [ <checkbox> ] unit-test-effect
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ 0 ] [
 | 
					[ 0 ] [
 | 
				
			||||||
    "religion" get gadget-child radio-control-value
 | 
					    "religion" get gadget-child radio-control-value
 | 
				
			||||||
] unit-test
 | 
					] unit-test
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
USING: ui.gadgets.editors tools.test kernel io io.streams.plain
 | 
					USING: ui.gadgets.editors tools.test kernel io io.streams.plain
 | 
				
			||||||
io.streams.string definitions namespaces ui.gadgets
 | 
					io.streams.string definitions namespaces ui.gadgets
 | 
				
			||||||
ui.gadgets.grids prettyprint documents ui.gestures ;
 | 
					ui.gadgets.grids prettyprint documents ui.gestures
 | 
				
			||||||
 | 
					tools.test.inference ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ t ] [
 | 
					[ t ] [
 | 
				
			||||||
    <editor> "editor" set
 | 
					    <editor> "editor" set
 | 
				
			||||||
| 
						 | 
					@ -36,3 +37,5 @@ ui.gadgets.grids prettyprint documents ui.gestures ;
 | 
				
			||||||
    "editor" get position-caret
 | 
					    "editor" get position-caret
 | 
				
			||||||
    "editor" get ungraft*
 | 
					    "editor" get ungraft*
 | 
				
			||||||
] unit-test
 | 
					] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{ 0 1 } [ <editor> ] unit-test-effect
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,10 +2,9 @@
 | 
				
			||||||
! See http://factorcode.org/license.txt for BSD license.
 | 
					! See http://factorcode.org/license.txt for BSD license.
 | 
				
			||||||
USING: arrays documents ui.clipboards ui.commands ui.gadgets
 | 
					USING: arrays documents ui.clipboards ui.commands ui.gadgets
 | 
				
			||||||
ui.gadgets.borders ui.gadgets.buttons ui.gadgets.labels
 | 
					ui.gadgets.borders ui.gadgets.buttons ui.gadgets.labels
 | 
				
			||||||
ui.gadgets.scrollers ui.gadgets.theme
 | 
					ui.gadgets.scrollers ui.gadgets.theme ui.render ui.gestures io
 | 
				
			||||||
ui.render ui.gestures io kernel math models namespaces opengl
 | 
					kernel math models namespaces opengl opengl.gl sequences strings
 | 
				
			||||||
opengl.gl sequences strings io.styles math.vectors sorting
 | 
					io.styles math.vectors sorting colors combinators ;
 | 
				
			||||||
colors combinators ;
 | 
					 | 
				
			||||||
IN: ui.gadgets.editors
 | 
					IN: ui.gadgets.editors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TUPLE: editor
 | 
					TUPLE: editor
 | 
				
			||||||
| 
						 | 
					@ -129,7 +128,7 @@ M: editor model-changed
 | 
				
			||||||
    line-height 0 swap 2array ;
 | 
					    line-height 0 swap 2array ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: scroll>caret ( editor -- )
 | 
					: scroll>caret ( editor -- )
 | 
				
			||||||
    dup gadget-grafted? [
 | 
					    dup gadget-status second [
 | 
				
			||||||
        dup caret-loc over caret-dim { 1 0 } v+ <rect>
 | 
					        dup caret-loc over caret-dim { 1 0 } v+ <rect>
 | 
				
			||||||
        over scroll>rect
 | 
					        over scroll>rect
 | 
				
			||||||
    ] when drop ;
 | 
					    ] when drop ;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,8 @@
 | 
				
			||||||
IN: temporary
 | 
					IN: temporary
 | 
				
			||||||
USING: ui.gadgets ui.gadgets.packs ui.gadgets.worlds tools.test
 | 
					USING: ui.gadgets ui.gadgets.packs ui.gadgets.worlds tools.test
 | 
				
			||||||
namespaces models kernel ;
 | 
					namespaces models kernel tools.test.inference dlists math
 | 
				
			||||||
 | 
					math.parser ui sequences hashtables assocs io arrays
 | 
				
			||||||
 | 
					prettyprint io.streams.string ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ T{ rect f { 10 10 } { 20 20 } } ]
 | 
					[ T{ rect f { 10 10 } { 20 20 } } ]
 | 
				
			||||||
[
 | 
					[
 | 
				
			||||||
| 
						 | 
					@ -49,11 +51,11 @@ C: <fooey> fooey
 | 
				
			||||||
    "a" get "b" get add-gadget
 | 
					    "a" get "b" get add-gadget
 | 
				
			||||||
    <gadget> "c" set
 | 
					    <gadget> "c" set
 | 
				
			||||||
    "b" get "c" get add-gadget
 | 
					    "b" get "c" get add-gadget
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    ! position a and b
 | 
					    ! position a and b
 | 
				
			||||||
    { 100 200 } "a" get set-rect-loc
 | 
					    { 100 200 } "a" get set-rect-loc
 | 
				
			||||||
    { 200 100 } "b" get set-rect-loc
 | 
					    { 200 100 } "b" get set-rect-loc
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    ! give c a loc, it doesn't matter
 | 
					    ! give c a loc, it doesn't matter
 | 
				
			||||||
    { -1000 23 } "c" get set-rect-loc
 | 
					    { -1000 23 } "c" get set-rect-loc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -108,3 +110,95 @@ C: <fooey> fooey
 | 
				
			||||||
{ 1 1 } "g4" get set-rect-dim
 | 
					{ 1 1 } "g4" get set-rect-dim
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ t ] [ { 25 25 } "g1" get pick-up "g4" get eq? ] unit-test
 | 
					[ t ] [ { 25 25 } "g1" get pick-up "g4" get eq? ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TUPLE: mock-gadget graft-called ungraft-called ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: <mock-gadget>
 | 
				
			||||||
 | 
					    0 0 mock-gadget construct-boa <gadget> over set-delegate ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					M: mock-gadget graft*
 | 
				
			||||||
 | 
					    dup mock-gadget-graft-called 1+
 | 
				
			||||||
 | 
					    swap set-mock-gadget-graft-called ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					M: mock-gadget ungraft*
 | 
				
			||||||
 | 
					    dup mock-gadget-ungraft-called 1+
 | 
				
			||||||
 | 
					    swap set-mock-gadget-ungraft-called ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					! We can't print to stdio here because that might be a pane
 | 
				
			||||||
 | 
					! stream, and our graft-queue rebinding here would be captured
 | 
				
			||||||
 | 
					! by code adding children to the pane...
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					    <dlist> \ graft-queue [
 | 
				
			||||||
 | 
					        [ ] [ <mock-gadget> dup queue-graft unqueue-graft ] unit-test
 | 
				
			||||||
 | 
					        [ t ] [ graft-queue dlist-empty? ] unit-test
 | 
				
			||||||
 | 
					    ] with-variable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <dlist> \ graft-queue [
 | 
				
			||||||
 | 
					        [ t ] [ graft-queue dlist-empty? ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <mock-gadget> "g" set
 | 
				
			||||||
 | 
					        [ ] [ "g" get queue-graft ] unit-test
 | 
				
			||||||
 | 
					        [ f ] [ graft-queue dlist-empty? ] unit-test
 | 
				
			||||||
 | 
					        [ { f t } ] [ "g" get gadget-status ] unit-test
 | 
				
			||||||
 | 
					        [ ] [ "g" get graft-later ] unit-test
 | 
				
			||||||
 | 
					        [ { f t } ] [ "g" get gadget-status ] unit-test
 | 
				
			||||||
 | 
					        [ ] [ "g" get ungraft-later ] unit-test
 | 
				
			||||||
 | 
					        [ { f f } ] [ "g" get gadget-status ] unit-test
 | 
				
			||||||
 | 
					        [ t ] [ graft-queue dlist-empty? ] unit-test
 | 
				
			||||||
 | 
					        [ ] [ "g" get ungraft-later ] unit-test
 | 
				
			||||||
 | 
					        [ ] [ "g" get graft-later ] unit-test
 | 
				
			||||||
 | 
					        [ ] [ notify-queued ] unit-test
 | 
				
			||||||
 | 
					        [ { t t } ] [ "g" get gadget-status ] unit-test
 | 
				
			||||||
 | 
					        [ t ] [ graft-queue dlist-empty? ] unit-test
 | 
				
			||||||
 | 
					        [ ] [ "g" get graft-later ] unit-test
 | 
				
			||||||
 | 
					        [ 1 ] [ "g" get mock-gadget-graft-called ] unit-test
 | 
				
			||||||
 | 
					        [ ] [ "g" get ungraft-later ] unit-test
 | 
				
			||||||
 | 
					        [ { t f } ] [ "g" get gadget-status ] unit-test
 | 
				
			||||||
 | 
					        [ ] [ notify-queued ] unit-test
 | 
				
			||||||
 | 
					        [ 1 ] [ "g" get mock-gadget-ungraft-called ] unit-test
 | 
				
			||||||
 | 
					        [ { f f } ] [ "g" get gadget-status ] unit-test
 | 
				
			||||||
 | 
					    ] with-variable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    : add-some-children
 | 
				
			||||||
 | 
					        3 [
 | 
				
			||||||
 | 
					            <mock-gadget> over <model> over set-gadget-model
 | 
				
			||||||
 | 
					            dup "g" get add-gadget
 | 
				
			||||||
 | 
					            swap 1+ number>string set
 | 
				
			||||||
 | 
					        ] each ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    : status-flags
 | 
				
			||||||
 | 
					        { "g" "1" "2" "3" } [ get gadget-status ] map prune ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    : notify-combo ( ? ? -- )
 | 
				
			||||||
 | 
					        nl "===== Combo: " write 2dup 2array . nl
 | 
				
			||||||
 | 
					        <dlist> \ graft-queue [
 | 
				
			||||||
 | 
					            <mock-gadget> "g" set
 | 
				
			||||||
 | 
					            [ ] [ add-some-children ] unit-test
 | 
				
			||||||
 | 
					            [ V{ { f f } } ] [ status-flags ] unit-test
 | 
				
			||||||
 | 
					            [ ] [ "g" get graft ] unit-test
 | 
				
			||||||
 | 
					            [ V{ { f t } } ] [ status-flags ] unit-test
 | 
				
			||||||
 | 
					            dup [ [ ] [ notify-queued ] unit-test ] when
 | 
				
			||||||
 | 
					            [ ] [ "g" get clear-gadget ] unit-test
 | 
				
			||||||
 | 
					            [ [ 1 ] [ graft-queue dlist-length ] unit-test ] unless
 | 
				
			||||||
 | 
					            [ [ ] [ notify-queued ] unit-test ] when
 | 
				
			||||||
 | 
					            [ ] [ add-some-children ] unit-test
 | 
				
			||||||
 | 
					            [ { f t } ] [ "1" get gadget-status ] unit-test
 | 
				
			||||||
 | 
					            [ { f t } ] [ "2" get gadget-status ] unit-test
 | 
				
			||||||
 | 
					            [ { f t } ] [ "3" get gadget-status ] unit-test
 | 
				
			||||||
 | 
					            [ ] [ [ "x" print notify ] graft-queue swap dlist-slurp ] unit-test
 | 
				
			||||||
 | 
					            [ ] [ notify-queued ] unit-test
 | 
				
			||||||
 | 
					            [ V{ { t t } } ] [ status-flags ] unit-test
 | 
				
			||||||
 | 
					        ] with-variable ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    { { f f } { f t } { t f } { t t } } [ notify-combo ] assoc-each
 | 
				
			||||||
 | 
					] string-out print
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{ 0 1 } [ <gadget> ] unit-test-effect
 | 
				
			||||||
 | 
					{ 1 0 } [ unparent ] unit-test-effect
 | 
				
			||||||
 | 
					{ 2 0 } [ add-gadget ] unit-test-effect
 | 
				
			||||||
 | 
					{ 2 0 } [ add-gadgets ] unit-test-effect
 | 
				
			||||||
 | 
					{ 1 0 } [ clear-gadget ] unit-test-effect
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{ 1 0 } [ relayout ] unit-test-effect
 | 
				
			||||||
 | 
					{ 1 0 } [ relayout-1 ] unit-test-effect
 | 
				
			||||||
 | 
					{ 1 1 } [ pref-dim ] unit-test-effect
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -42,7 +42,7 @@ M: array rect-dim drop { 0 0 } ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TUPLE: gadget
 | 
					TUPLE: gadget
 | 
				
			||||||
pref-dim parent children orientation state focus
 | 
					pref-dim parent children orientation state focus
 | 
				
			||||||
visible? root? clipped? grafted?
 | 
					visible? root? clipped? status
 | 
				
			||||||
interior boundary
 | 
					interior boundary
 | 
				
			||||||
model ;
 | 
					model ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -59,10 +59,11 @@ M: gadget model-changed drop ;
 | 
				
			||||||
: <zero-rect> ( -- rect ) { 0 0 } dup <rect> ;
 | 
					: <zero-rect> ( -- rect ) { 0 0 } dup <rect> ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: <gadget> ( -- gadget )
 | 
					: <gadget> ( -- gadget )
 | 
				
			||||||
    <zero-rect> { 0 1 } t {
 | 
					    <zero-rect> { 0 1 } t { f f } {
 | 
				
			||||||
        set-delegate
 | 
					        set-delegate
 | 
				
			||||||
        set-gadget-orientation
 | 
					        set-gadget-orientation
 | 
				
			||||||
        set-gadget-visible?
 | 
					        set-gadget-visible?
 | 
				
			||||||
 | 
					        set-gadget-status
 | 
				
			||||||
    } gadget construct ;
 | 
					    } gadget construct ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: construct-gadget ( class -- tuple )
 | 
					: construct-gadget ( class -- tuple )
 | 
				
			||||||
| 
						 | 
					@ -173,13 +174,13 @@ M: array gadget-text*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: forget-pref-dim ( gadget -- ) f swap set-gadget-pref-dim ;
 | 
					: forget-pref-dim ( gadget -- ) f swap set-gadget-pref-dim ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: invalid ( -- queue ) \ invalid get-global ;
 | 
					: layout-queue ( -- queue ) \ layout-queue get ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: add-invalid ( gadget -- )
 | 
					: layout-later ( gadget -- )
 | 
				
			||||||
    #! When unit testing gadgets without the UI running, the
 | 
					    #! When unit testing gadgets without the UI running, the
 | 
				
			||||||
    #! invalid queue is not initialized and we simply ignore
 | 
					    #! invalid queue is not initialized and we simply ignore
 | 
				
			||||||
    #! invalidation requests.
 | 
					    #! invalidation requests.
 | 
				
			||||||
    invalid [ push-front ] [ drop ] if* ;
 | 
					    layout-queue [ push-front ] [ drop ] if* ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DEFER: relayout
 | 
					DEFER: relayout
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -187,7 +188,7 @@ DEFER: relayout
 | 
				
			||||||
    \ invalidate* over set-gadget-state
 | 
					    \ invalidate* over set-gadget-state
 | 
				
			||||||
    dup forget-pref-dim
 | 
					    dup forget-pref-dim
 | 
				
			||||||
    dup gadget-root?
 | 
					    dup gadget-root?
 | 
				
			||||||
    [ add-invalid ] [ gadget-parent [ relayout ] when* ] if ;
 | 
					    [ layout-later ] [ gadget-parent [ relayout ] when* ] if ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: relayout ( gadget -- )
 | 
					: relayout ( gadget -- )
 | 
				
			||||||
    dup gadget-state \ invalidate* eq?
 | 
					    dup gadget-state \ invalidate* eq?
 | 
				
			||||||
| 
						 | 
					@ -195,7 +196,7 @@ DEFER: relayout
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: relayout-1 ( gadget -- )
 | 
					: relayout-1 ( gadget -- )
 | 
				
			||||||
    dup gadget-state
 | 
					    dup gadget-state
 | 
				
			||||||
    [ drop ] [ dup invalidate add-invalid ] if ;
 | 
					    [ drop ] [ dup invalidate layout-later ] if ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: show-gadget t swap set-gadget-visible? ;
 | 
					: show-gadget t swap set-gadget-visible? ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -241,27 +242,70 @@ M: gadget layout* drop ;
 | 
				
			||||||
        dup [ layout ] each-child
 | 
					        dup [ layout ] each-child
 | 
				
			||||||
    ] when drop ;
 | 
					    ] when drop ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: graft-queue \ graft-queue get ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: unqueue-graft ( gadget -- )
 | 
				
			||||||
 | 
					    dup graft-queue dlist-delete [ "Not queued" throw ] unless
 | 
				
			||||||
 | 
					    dup gadget-status first { t t } { f f } ?
 | 
				
			||||||
 | 
					    swap set-gadget-status ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: queue-graft ( gadget -- )
 | 
				
			||||||
 | 
					    { f t } over set-gadget-status
 | 
				
			||||||
 | 
					    graft-queue push-front ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: queue-ungraft ( gadget -- )
 | 
				
			||||||
 | 
					    { t f } over set-gadget-status
 | 
				
			||||||
 | 
					    graft-queue push-front ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: graft-later ( gadget -- )
 | 
				
			||||||
 | 
					    dup gadget-status {
 | 
				
			||||||
 | 
					        { { f t } [ drop ] }
 | 
				
			||||||
 | 
					        { { t t } [ drop ] }
 | 
				
			||||||
 | 
					        { { t f } [ unqueue-graft ] }
 | 
				
			||||||
 | 
					        { { f f } [ queue-graft ] }
 | 
				
			||||||
 | 
					    } case ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: ungraft-later ( gadget -- )
 | 
				
			||||||
 | 
					    dup gadget-status {
 | 
				
			||||||
 | 
					        { { f f } [ drop ] }
 | 
				
			||||||
 | 
					        { { t f } [ drop ] }
 | 
				
			||||||
 | 
					        { { f t } [ unqueue-graft ] }
 | 
				
			||||||
 | 
					        { { t t } [ queue-ungraft ] }
 | 
				
			||||||
 | 
					    } case ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GENERIC: graft* ( gadget -- )
 | 
					GENERIC: graft* ( gadget -- )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
M: gadget graft* drop ;
 | 
					M: gadget graft* drop ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					! : graft ( gadget -- )
 | 
				
			||||||
 | 
					!     dup gadget-grafted? [
 | 
				
			||||||
 | 
					!         drop
 | 
				
			||||||
 | 
					!     ] [
 | 
				
			||||||
 | 
					!         t over set-gadget-grafted?
 | 
				
			||||||
 | 
					!         dup graft*
 | 
				
			||||||
 | 
					!         dup activate-control
 | 
				
			||||||
 | 
					!         [ graft ] each-child
 | 
				
			||||||
 | 
					!     ] if ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: graft ( gadget -- )
 | 
					: graft ( gadget -- )
 | 
				
			||||||
    t over set-gadget-grafted?
 | 
					    dup graft-later [ graft ] each-child ;
 | 
				
			||||||
    dup graft*
 | 
					 | 
				
			||||||
    dup activate-control
 | 
					 | 
				
			||||||
    [ graft ] each-child ;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
GENERIC: ungraft* ( gadget -- )
 | 
					GENERIC: ungraft* ( gadget -- )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
M: gadget ungraft* drop ;
 | 
					M: gadget ungraft* drop ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					! : ungraft ( gadget -- )
 | 
				
			||||||
 | 
					!     dup gadget-grafted? [
 | 
				
			||||||
 | 
					!         dup [ ungraft ] each-child
 | 
				
			||||||
 | 
					!         dup deactivate-control
 | 
				
			||||||
 | 
					!         dup ungraft*
 | 
				
			||||||
 | 
					!         f swap set-gadget-grafted?
 | 
				
			||||||
 | 
					!     ] [
 | 
				
			||||||
 | 
					!         drop ! "Fuck you" throw
 | 
				
			||||||
 | 
					!     ] if ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: ungraft ( gadget -- )
 | 
					: ungraft ( gadget -- )
 | 
				
			||||||
    dup gadget-grafted? [
 | 
					    dup [ ungraft ] each-child ungraft-later ;
 | 
				
			||||||
        dup [ ungraft ] each-child
 | 
					 | 
				
			||||||
        dup deactivate-control
 | 
					 | 
				
			||||||
        dup ungraft*
 | 
					 | 
				
			||||||
        f over set-gadget-grafted?
 | 
					 | 
				
			||||||
    ] when drop ;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
: (unparent) ( gadget -- )
 | 
					: (unparent) ( gadget -- )
 | 
				
			||||||
    dup ungraft
 | 
					    dup ungraft
 | 
				
			||||||
| 
						 | 
					@ -272,7 +316,14 @@ M: gadget ungraft* drop ;
 | 
				
			||||||
    tuck gadget-focus eq?
 | 
					    tuck gadget-focus eq?
 | 
				
			||||||
    [ f swap set-gadget-focus ] [ drop ] if ;
 | 
					    [ f swap set-gadget-focus ] [ drop ] if ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SYMBOL: in-layout?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: not-in-layout
 | 
				
			||||||
 | 
					    in-layout? get
 | 
				
			||||||
 | 
					    [ "Cannot add/remove gadgets in layout*" throw ] when ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: unparent ( gadget -- )
 | 
					: unparent ( gadget -- )
 | 
				
			||||||
 | 
					    not-in-layout
 | 
				
			||||||
    [
 | 
					    [
 | 
				
			||||||
        dup gadget-parent dup [
 | 
					        dup gadget-parent dup [
 | 
				
			||||||
            over (unparent)
 | 
					            over (unparent)
 | 
				
			||||||
| 
						 | 
					@ -290,6 +341,7 @@ M: gadget ungraft* drop ;
 | 
				
			||||||
    f swap set-gadget-children ;
 | 
					    f swap set-gadget-children ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: clear-gadget ( gadget -- )
 | 
					: clear-gadget ( gadget -- )
 | 
				
			||||||
 | 
					    not-in-layout
 | 
				
			||||||
    dup (clear-gadget) relayout ;
 | 
					    dup (clear-gadget) relayout ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: ((add-gadget)) ( gadget box -- )
 | 
					: ((add-gadget)) ( gadget box -- )
 | 
				
			||||||
| 
						 | 
					@ -299,12 +351,14 @@ M: gadget ungraft* drop ;
 | 
				
			||||||
    over unparent
 | 
					    over unparent
 | 
				
			||||||
    dup pick set-gadget-parent
 | 
					    dup pick set-gadget-parent
 | 
				
			||||||
    [ ((add-gadget)) ] 2keep
 | 
					    [ ((add-gadget)) ] 2keep
 | 
				
			||||||
    gadget-grafted? [ graft ] [ drop ] if ;
 | 
					    gadget-status second [ graft ] [ drop ] if ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: add-gadget ( gadget parent -- )
 | 
					: add-gadget ( gadget parent -- )
 | 
				
			||||||
 | 
					    not-in-layout
 | 
				
			||||||
    [ (add-gadget) ] keep relayout ;
 | 
					    [ (add-gadget) ] keep relayout ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: add-gadgets ( seq parent -- )
 | 
					: add-gadgets ( seq parent -- )
 | 
				
			||||||
 | 
					    not-in-layout
 | 
				
			||||||
    swap [ over (add-gadget) ] each relayout ;
 | 
					    swap [ over (add-gadget) ] each relayout ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: parents ( gadget -- seq )
 | 
					: parents ( gadget -- seq )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -42,6 +42,7 @@ M: incremental pref-dim*
 | 
				
			||||||
    dup forget-pref-dim dup pref-dim over set-rect-dim layout ;
 | 
					    dup forget-pref-dim dup pref-dim over set-rect-dim layout ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: add-incremental ( gadget incremental -- )
 | 
					: add-incremental ( gadget incremental -- )
 | 
				
			||||||
 | 
					    not-in-layout
 | 
				
			||||||
    2dup (add-gadget)
 | 
					    2dup (add-gadget)
 | 
				
			||||||
    over prefer-incremental
 | 
					    over prefer-incremental
 | 
				
			||||||
    2dup incremental-loc
 | 
					    2dup incremental-loc
 | 
				
			||||||
| 
						 | 
					@ -50,6 +51,7 @@ M: incremental pref-dim*
 | 
				
			||||||
    gadget-parent [ invalidate* ] when* ;
 | 
					    gadget-parent [ invalidate* ] when* ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: clear-incremental ( incremental -- )
 | 
					: clear-incremental ( incremental -- )
 | 
				
			||||||
 | 
					    not-in-layout
 | 
				
			||||||
    dup (clear-gadget) dup forget-pref-dim
 | 
					    dup (clear-gadget) dup forget-pref-dim
 | 
				
			||||||
    { 0 0 } over set-incremental-cursor
 | 
					    { 0 0 } over set-incremental-cursor
 | 
				
			||||||
    gadget-parent [ relayout ] when* ;
 | 
					    gadget-parent [ relayout ] when* ;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,8 @@
 | 
				
			||||||
IN: temporary
 | 
					IN: temporary
 | 
				
			||||||
USING: alien ui.gadgets.panes ui.gadgets namespaces
 | 
					USING: alien ui.gadgets.panes ui.gadgets namespaces
 | 
				
			||||||
kernel sequences io io.streams.string tools.test prettyprint
 | 
					kernel sequences io io.streams.string tools.test prettyprint
 | 
				
			||||||
definitions help help.syntax help.markup splitting ;
 | 
					definitions help help.syntax help.markup splitting
 | 
				
			||||||
 | 
					tools.test.ui models ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: #children "pane" get gadget-children length ;
 | 
					: #children "pane" get gadget-children length ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,3 +34,7 @@ ARTICLE: "test-article" "This is a test article"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<pane> [ \ = see ] with-pane
 | 
					<pane> [ \ = see ] with-pane
 | 
				
			||||||
<pane> [ \ = help ] with-pane
 | 
					<pane> [ \ = help ] with-pane
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ ] [
 | 
				
			||||||
 | 
					    \ = <model> [ see ] <pane-control> [ ] with-grafted-gadget
 | 
				
			||||||
 | 
					] unit-test
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,8 @@ IN: temporary
 | 
				
			||||||
USING: ui.gadgets ui.gadgets.scrollers
 | 
					USING: ui.gadgets ui.gadgets.scrollers
 | 
				
			||||||
namespaces tools.test kernel models ui.gadgets.viewports
 | 
					namespaces tools.test kernel models ui.gadgets.viewports
 | 
				
			||||||
ui.gadgets.labels ui.gadgets.grids ui.gadgets.frames
 | 
					ui.gadgets.labels ui.gadgets.grids ui.gadgets.frames
 | 
				
			||||||
ui.gadgets.sliders math math.vectors arrays sequences ;
 | 
					ui.gadgets.sliders math math.vectors arrays sequences
 | 
				
			||||||
 | 
					tools.test.inference tools.test.ui ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ ] [
 | 
					[ ] [
 | 
				
			||||||
    <gadget> "g" set
 | 
					    <gadget> "g" set
 | 
				
			||||||
| 
						 | 
					@ -20,12 +21,14 @@ ui.gadgets.sliders math math.vectors arrays sequences ;
 | 
				
			||||||
[ ] [
 | 
					[ ] [
 | 
				
			||||||
    <gadget> dup "g" set
 | 
					    <gadget> dup "g" set
 | 
				
			||||||
    10 1 0 100 <range> 20 1 0 100 <range> 2array <compose>
 | 
					    10 1 0 100 <range> 20 1 0 100 <range> 2array <compose>
 | 
				
			||||||
    <viewport> "v" set 
 | 
					    <viewport> "v" set
 | 
				
			||||||
] unit-test
 | 
					] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ { 10 20 } ] [ "v" get gadget-model range-value ] unit-test
 | 
					"v" get [
 | 
				
			||||||
 | 
					    [ { 10 20 } ] [ "v" get gadget-model range-value ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ { 10 20 } ] [ "g" get rect-loc vneg { 3 3 } v+ ] unit-test
 | 
					    [ { 10 20 } ] [ "g" get rect-loc vneg { 3 3 } v+ ] unit-test
 | 
				
			||||||
 | 
					] with-grafted-gadget
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ ] [
 | 
					[ ] [
 | 
				
			||||||
    <gadget> { 100 100 } over set-rect-dim
 | 
					    <gadget> { 100 100 } over set-rect-dim
 | 
				
			||||||
| 
						 | 
					@ -36,27 +39,25 @@ ui.gadgets.sliders math math.vectors arrays sequences ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ ] [ "s" get layout ] unit-test
 | 
					[ ] [ "s" get layout ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ ] [ "s" get graft ] unit-test
 | 
					"s" get [
 | 
				
			||||||
 | 
					    [ { 34 34 } ] [ "s" get scroller-viewport rect-dim ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ { 34 34 } ] [ "s" get scroller-viewport rect-dim ] unit-test
 | 
					    [ { 106 106 } ] [ "s" get scroller-viewport viewport-dim ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ { 106 106 } ] [ "s" get scroller-viewport viewport-dim ] unit-test
 | 
					    [ ] [ { 0 0 } "s" get scroll ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ ] [ { 0 0 } "s" get scroll ] unit-test
 | 
					    [ { 0 0 } ] [ "s" get gadget-model range-min-value ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ { 0 0 } ] [ "s" get gadget-model range-min-value ] unit-test
 | 
					    [ { 106 106 } ] [ "s" get gadget-model range-max-value ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ { 106 106 } ] [ "s" get gadget-model range-max-value ] unit-test
 | 
					    [ ] [ { 10 20 } "s" get scroll ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ ] [ { 10 20 } "s" get scroll ] unit-test
 | 
					    [ { 10 20 } ] [ "s" get gadget-model range-value ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ { 10 20 } ] [ "s" get gadget-model range-value ] unit-test
 | 
					    [ { 10 20 } ] [ "s" get scroller-viewport gadget-model range-value ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ { 10 20 } ] [ "s" get scroller-viewport gadget-model range-value ] unit-test
 | 
					    [ { 10 20 } ] [ "g" get rect-loc vneg { 3 3 } v+ ] unit-test
 | 
				
			||||||
 | 
					] with-grafted-gadget
 | 
				
			||||||
[ { 10 20 } ] [ "g" get rect-loc vneg { 3 3 } v+ ] unit-test
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[ ] [ "s" get ungraft ] unit-test
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
<gadget> { 600 400 } over set-rect-dim "g1" set
 | 
					<gadget> { 600 400 } over set-rect-dim "g1" set
 | 
				
			||||||
<gadget> { 600 10 } over set-rect-dim "g2" set
 | 
					<gadget> { 600 10 } over set-rect-dim "g2" set
 | 
				
			||||||
| 
						 | 
					@ -84,3 +85,5 @@ dup layout
 | 
				
			||||||
[ f ] [ "s" get scroller-viewport find-scroller* ] unit-test
 | 
					[ f ] [ "s" get scroller-viewport find-scroller* ] unit-test
 | 
				
			||||||
[ t ] [ "s" get @right grid-child slider? ] unit-test
 | 
					[ t ] [ "s" get @right grid-child slider? ] unit-test
 | 
				
			||||||
[ f ] [ "s" get @right grid-child find-scroller* ] unit-test
 | 
					[ f ] [ "s" get @right grid-child find-scroller* ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{ 1 1 } [ <scroller> ] unit-test-effect
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,7 @@ scroller H{
 | 
				
			||||||
    { T{ mouse-scroll } [ do-mouse-scroll ] }
 | 
					    { T{ mouse-scroll } [ do-mouse-scroll ] }
 | 
				
			||||||
} set-gestures
 | 
					} set-gestures
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: viewport, ( -- )
 | 
					: viewport, ( child -- )
 | 
				
			||||||
    g gadget-model <viewport>
 | 
					    g gadget-model <viewport>
 | 
				
			||||||
    g-> set-scroller-viewport @center frame, ;
 | 
					    g-> set-scroller-viewport @center frame, ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -106,7 +106,7 @@ scroller H{
 | 
				
			||||||
    dup scroller-viewport viewport-dim { 0 1 } v* swap scroll ;
 | 
					    dup scroller-viewport viewport-dim { 0 1 } v* swap scroll ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: scroll>bottom ( gadget -- )
 | 
					: scroll>bottom ( gadget -- )
 | 
				
			||||||
    find-scroller* [
 | 
					    find-scroller [
 | 
				
			||||||
        t over set-scroller-follows relayout-1
 | 
					        t over set-scroller-follows relayout-1
 | 
				
			||||||
    ] when* ;
 | 
					    ] when* ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -131,7 +131,7 @@ M: elevator layout*
 | 
				
			||||||
: slide-by-line ( amount slider -- )
 | 
					: slide-by-line ( amount slider -- )
 | 
				
			||||||
    [ slider-line * ] keep slide-by ;
 | 
					    [ slider-line * ] keep slide-by ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: <slide-button> ( vector polygon amount -- )
 | 
					: <slide-button> ( vector polygon amount -- button )
 | 
				
			||||||
    >r gray swap <polygon-gadget> r>
 | 
					    >r gray swap <polygon-gadget> r>
 | 
				
			||||||
    [ swap find-slider slide-by-line ] curry <repeat-button>
 | 
					    [ swap find-slider slide-by-line ] curry <repeat-button>
 | 
				
			||||||
    [ set-gadget-orientation ] keep ;
 | 
					    [ set-gadget-orientation ] keep ;
 | 
				
			||||||
| 
						 | 
					@ -144,7 +144,7 @@ M: elevator layout*
 | 
				
			||||||
: <left-button> { 0 1 } arrow-left -1 <slide-button> ;
 | 
					: <left-button> { 0 1 } arrow-left -1 <slide-button> ;
 | 
				
			||||||
: <right-button> { 0 1 } arrow-right 1 <slide-button> ;
 | 
					: <right-button> { 0 1 } arrow-right 1 <slide-button> ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: build-x-slider ( slider -- slider )
 | 
					: build-x-slider ( slider -- )
 | 
				
			||||||
    [
 | 
					    [
 | 
				
			||||||
        <left-button> @left frame,
 | 
					        <left-button> @left frame,
 | 
				
			||||||
        { 0 1 } elevator,
 | 
					        { 0 1 } elevator,
 | 
				
			||||||
| 
						 | 
					@ -154,7 +154,7 @@ M: elevator layout*
 | 
				
			||||||
: <up-button> { 1 0 } arrow-up -1 <slide-button> ;
 | 
					: <up-button> { 1 0 } arrow-up -1 <slide-button> ;
 | 
				
			||||||
: <down-button> { 1 0 } arrow-down 1 <slide-button> ;
 | 
					: <down-button> { 1 0 } arrow-down 1 <slide-button> ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: build-y-slider ( slider -- slider )
 | 
					: build-y-slider ( slider -- )
 | 
				
			||||||
    [
 | 
					    [
 | 
				
			||||||
        <up-button> @top frame,
 | 
					        <up-button> @top frame,
 | 
				
			||||||
        { 1 0 } elevator,
 | 
					        { 1 0 } elevator,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,8 +16,7 @@ TUPLE: viewport ;
 | 
				
			||||||
: <viewport> ( content model -- viewport )
 | 
					: <viewport> ( content model -- viewport )
 | 
				
			||||||
    <gadget> viewport construct-control
 | 
					    <gadget> viewport construct-control
 | 
				
			||||||
    t over set-gadget-clipped?
 | 
					    t over set-gadget-clipped?
 | 
				
			||||||
    [ add-gadget ] keep
 | 
					    [ add-gadget ] keep ;
 | 
				
			||||||
    [ model-changed ] keep ;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
M: viewport layout*
 | 
					M: viewport layout*
 | 
				
			||||||
    dup rect-dim viewport-gap 2 v*n v-
 | 
					    dup rect-dim viewport-gap 2 v*n v-
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -112,12 +112,6 @@ world H{
 | 
				
			||||||
    { T{ button-up f { A+ } 1 } [ T{ button-up f f 2 } swap resend-button-up ] }
 | 
					    { T{ button-up f { A+ } 1 } [ T{ button-up f f 2 } swap resend-button-up ] }
 | 
				
			||||||
} set-gestures
 | 
					} set-gestures
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: start-world ( world -- )
 | 
					 | 
				
			||||||
    dup graft
 | 
					 | 
				
			||||||
    dup relayout
 | 
					 | 
				
			||||||
    dup world-title over set-title
 | 
					 | 
				
			||||||
    request-focus ;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
: close-global ( world global -- )
 | 
					: close-global ( world global -- )
 | 
				
			||||||
    dup get-global find-world rot eq?
 | 
					    dup get-global find-world rot eq?
 | 
				
			||||||
    [ f swap set-global ] [ drop ] if ;
 | 
					    [ f swap set-global ] [ drop ] if ;
 | 
				
			||||||
| 
						 | 
					@ -126,3 +120,8 @@ world H{
 | 
				
			||||||
    drop-prefix <reversed>
 | 
					    drop-prefix <reversed>
 | 
				
			||||||
    T{ lose-focus } swap each-gesture
 | 
					    T{ lose-focus } swap each-gesture
 | 
				
			||||||
    T{ gain-focus } swap each-gesture ;
 | 
					    T{ gain-focus } swap each-gesture ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					M: world graft*
 | 
				
			||||||
 | 
					    dup (open-world-window)
 | 
				
			||||||
 | 
					    dup world-title over set-title
 | 
				
			||||||
 | 
					    request-focus ;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,9 +13,9 @@ HELP: gadget
 | 
				
			||||||
        { { $link gadget-visible? } " - a boolean indicating if the gadget should display and receive user input." }
 | 
					        { { $link gadget-visible? } " - a boolean indicating if the gadget should display and receive user input." }
 | 
				
			||||||
        { { $link gadget-root? } " - if set to " { $link t } ", layout changes in this gadget will not propagate to the gadget's parent." }
 | 
					        { { $link gadget-root? } " - if set to " { $link t } ", layout changes in this gadget will not propagate to the gadget's parent." }
 | 
				
			||||||
        { { $link gadget-clipped? } " - a boolean indicating if clipping will be enabled when drawing this gadget's children." }
 | 
					        { { $link gadget-clipped? } " - a boolean indicating if clipping will be enabled when drawing this gadget's children." }
 | 
				
			||||||
        { { $link gadget-grafted? } " - if set to " { $link t } ", the gadget is parented in a native window." }
 | 
					 | 
				
			||||||
        { { $link gadget-interior } " - an object whose class implements the " { $link draw-interior } " generic word." }
 | 
					        { { $link gadget-interior } " - an object whose class implements the " { $link draw-interior } " generic word." }
 | 
				
			||||||
        { { $link gadget-boundary } " - an object whose class implements the " { $link draw-boundary } " generic word." }
 | 
					        { { $link gadget-boundary } " - an object whose class implements the " { $link draw-boundary } " generic word." }
 | 
				
			||||||
 | 
					        { { $link gadget-model } " - XXX" }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
"Gadgets delegate to " { $link rect } " instances holding their location and dimensions." }
 | 
					"Gadgets delegate to " { $link rect } " instances holding their location and dimensions." }
 | 
				
			||||||
{ $notes
 | 
					{ $notes
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
					IN: temporary
 | 
				
			||||||
 | 
					USING: tools.test tools.test.ui ui.tools.browser
 | 
				
			||||||
 | 
					tools.test.inference ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{ 0 1 } [ <browser-gadget> ] unit-test-effect
 | 
				
			||||||
 | 
					[ ] [ <browser-gadget> [ ] with-grafted-gadget ] unit-test
 | 
				
			||||||
| 
						 | 
					@ -1,35 +1,39 @@
 | 
				
			||||||
USING: continuations documents ui.tools.interactor
 | 
					USING: continuations documents ui.tools.interactor
 | 
				
			||||||
ui.tools.listener hashtables kernel namespaces parser sequences
 | 
					ui.tools.listener hashtables kernel namespaces parser sequences
 | 
				
			||||||
timers tools.test ui.commands ui.gadgets ui.gadgets.editors
 | 
					timers tools.test ui.commands ui.gadgets ui.gadgets.editors
 | 
				
			||||||
ui.gadgets.panes vocabs words ;
 | 
					ui.gadgets.panes vocabs words tools.test.ui ;
 | 
				
			||||||
IN: temporary
 | 
					IN: temporary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
timers [ init-timers ] unless
 | 
					timers [ init-timers ] unless
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ f ] [ "word" source-editor command-map empty? ] unit-test
 | 
					[ f ] [ "word" source-editor command-map empty? ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<listener-gadget> "listener" set
 | 
					[ ] [ <listener-gadget> [ ] with-grafted-gadget ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{ "kernel" } [ vocab-words ] map use associate
 | 
					[ ] [ <listener-gadget> "listener" set ] unit-test
 | 
				
			||||||
"listener" get listener-gadget-input set-interactor-vars
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ "dup" ] [ \ dup "listener" get word-completion-string ] unit-test
 | 
					"listener" get [
 | 
				
			||||||
 | 
					    { "kernel" } [ vocab-words ] map use associate
 | 
				
			||||||
 | 
					    "listener" get listener-gadget-input set-interactor-vars
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ "USE: words word-name" ]
 | 
					    [ "dup" ] [ \ dup "listener" get word-completion-string ] unit-test
 | 
				
			||||||
[ \ word-name "listener" get word-completion-string ] unit-test
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
<pane> <interactor> "i" set
 | 
					    [ "USE: words word-name" ]
 | 
				
			||||||
H{ } "i" get set-interactor-vars
 | 
					    [ \ word-name "listener" get word-completion-string ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ t ] [ "i" get interactor? ] unit-test
 | 
					    <pane> <interactor> "i" set
 | 
				
			||||||
 | 
					    H{ } "i" get set-interactor-vars
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ ] [ "SYMBOL:" "i" get set-editor-string ] unit-test
 | 
					    [ t ] [ "i" get interactor? ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ ] [
 | 
					    [ ] [ "SYMBOL:" "i" get set-editor-string ] unit-test
 | 
				
			||||||
    "i" get [ "SYMBOL:" parse ] catch go-to-error
 | 
					 | 
				
			||||||
] unit-test
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ t ] [
 | 
					    [ ] [
 | 
				
			||||||
    "i" get gadget-model doc-end
 | 
					        "i" get [ "SYMBOL:" parse ] catch go-to-error
 | 
				
			||||||
    "i" get editor-caret* =
 | 
					    ] unit-test
 | 
				
			||||||
] unit-test
 | 
					
 | 
				
			||||||
 | 
					    [ t ] [
 | 
				
			||||||
 | 
					        "i" get gadget-model doc-end
 | 
				
			||||||
 | 
					        "i" get editor-caret* =
 | 
				
			||||||
 | 
					    ] unit-test
 | 
				
			||||||
 | 
					] with-grafted-gadget
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
USING: assocs ui.tools.search help.topics io.files io.styles
 | 
					USING: assocs ui.tools.search help.topics io.files io.styles
 | 
				
			||||||
kernel namespaces sequences source-files threads timers
 | 
					kernel namespaces sequences source-files threads timers
 | 
				
			||||||
tools.test ui.gadgets ui.gestures vocabs
 | 
					tools.test ui.gadgets ui.gestures vocabs
 | 
				
			||||||
vocabs.loader words ;
 | 
					vocabs.loader words tools.test.ui debugger ;
 | 
				
			||||||
IN: temporary
 | 
					IN: temporary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
timers get [ init-timers ] unless
 | 
					timers get [ init-timers ] unless
 | 
				
			||||||
| 
						 | 
					@ -12,12 +12,16 @@ timers get [ init-timers ] unless
 | 
				
			||||||
    T{ key-down f { C+ } "x" } swap search-gesture
 | 
					    T{ key-down f { C+ } "x" } swap search-gesture
 | 
				
			||||||
] unit-test
 | 
					] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: assert-non-empty empty? f assert= ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: update-live-search ( search -- seq )
 | 
				
			||||||
 | 
					    dup [
 | 
				
			||||||
 | 
					        300 sleep do-timers
 | 
				
			||||||
 | 
					        live-search-list control-value
 | 
				
			||||||
 | 
					    ] with-grafted-gadget ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: test-live-search ( gadget quot -- ? )
 | 
					: test-live-search ( gadget quot -- ? )
 | 
				
			||||||
    >r dup graft 300 sleep do-timers
 | 
					   >r update-live-search dup assert-non-empty r> all? ;
 | 
				
			||||||
    dup live-search-list control-value
 | 
					 | 
				
			||||||
    dup empty? [ "Empty" throw ] when
 | 
					 | 
				
			||||||
    r> all?
 | 
					 | 
				
			||||||
    >r ungraft r> ;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ t ] [
 | 
					[ t ] [
 | 
				
			||||||
    "swp" all-words f <definition-search>
 | 
					    "swp" all-words f <definition-search>
 | 
				
			||||||
| 
						 | 
					@ -26,11 +30,12 @@ timers get [ init-timers ] unless
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ t ] [
 | 
					[ t ] [
 | 
				
			||||||
    "" all-words t <definition-search>
 | 
					    "" all-words t <definition-search>
 | 
				
			||||||
    dup graft
 | 
					    dup [
 | 
				
			||||||
    { "set-word-prop" } over live-search-field set-control-value
 | 
					        { "set-word-prop" } over live-search-field set-control-value
 | 
				
			||||||
    300 sleep
 | 
					        300 sleep
 | 
				
			||||||
    do-timers
 | 
					        do-timers
 | 
				
			||||||
    search-value \ set-word-prop eq?
 | 
					        search-value \ set-word-prop eq?
 | 
				
			||||||
 | 
					    ] with-grafted-gadget
 | 
				
			||||||
] unit-test
 | 
					] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ t ] [
 | 
					[ t ] [
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,14 +2,14 @@ USING: ui.tools ui.tools.interactor ui.tools.listener
 | 
				
			||||||
ui.tools.search ui.tools.workspace kernel models namespaces
 | 
					ui.tools.search ui.tools.workspace kernel models namespaces
 | 
				
			||||||
sequences timers tools.test ui.gadgets ui.gadgets.buttons
 | 
					sequences timers tools.test ui.gadgets ui.gadgets.buttons
 | 
				
			||||||
ui.gadgets.labelled ui.gadgets.presentations
 | 
					ui.gadgets.labelled ui.gadgets.presentations
 | 
				
			||||||
ui.gadgets.scrollers vocabs ;
 | 
					ui.gadgets.scrollers vocabs tools.test.ui ui ;
 | 
				
			||||||
IN: temporary
 | 
					IN: temporary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[
 | 
					[
 | 
				
			||||||
    [ f ] [
 | 
					    [ f ] [
 | 
				
			||||||
        0 <model> <gadget> [ set-gadget-model ] keep gadget set
 | 
					        0 <model> <gadget> [ set-gadget-model ] keep gadget set
 | 
				
			||||||
        <workspace-tabs> gadget-children empty?
 | 
					        <workspace-tabs> gadget-children empty?
 | 
				
			||||||
    ] unit-test 
 | 
					    ] unit-test
 | 
				
			||||||
] with-scope
 | 
					] with-scope
 | 
				
			||||||
 | 
					
 | 
				
			||||||
timers get [ init-timers ] unless
 | 
					timers get [ init-timers ] unless
 | 
				
			||||||
| 
						 | 
					@ -31,24 +31,29 @@ timers get [ init-timers ] unless
 | 
				
			||||||
    "w" get hide-popup
 | 
					    "w" get hide-popup
 | 
				
			||||||
] unit-test
 | 
					] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ ] [
 | 
					[ ] [ <workspace> [ ] with-grafted-gadget ] unit-test
 | 
				
			||||||
    <workspace> "w" set
 | 
					 | 
				
			||||||
    "w" get graft
 | 
					 | 
				
			||||||
    "w" get "kernel" vocab show-vocab-words
 | 
					 | 
				
			||||||
] unit-test
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
"w" get workspace-popup closable-gadget-content
 | 
					"w" get [
 | 
				
			||||||
live-search-list gadget-child "p" set
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ t ] [ "p" get presentation? ] unit-test
 | 
					    [ ] [ "w" get "kernel" vocab show-vocab-words ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"p" get <operations-menu> gadget-child gadget-child "c" set
 | 
					    [ ] [ notify-queued ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ t ] [ "c" get button? ] unit-test
 | 
					    [ ] [ "w" get workspace-popup closable-gadget-content
 | 
				
			||||||
 | 
					    live-search-list gadget-child "p" set ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ ] [
 | 
					    [ t ] [ "p" get presentation? ] unit-test
 | 
				
			||||||
    "w" get workspace-listener listener-gadget-input
 | 
					 | 
				
			||||||
    3 handle-parse-error
 | 
					 | 
				
			||||||
] unit-test
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ ] [ "w" get ungraft ] unit-test
 | 
					    [ ] [ "p" get <operations-menu> gadget-child gadget-child "c" set ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    [ ] [ notify-queued ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    [ t ] [ "c" get button? ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    [ ] [
 | 
				
			||||||
 | 
					        "w" get workspace-listener listener-gadget-input
 | 
				
			||||||
 | 
					        3 handle-parse-error
 | 
				
			||||||
 | 
					    ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    [ ] [ notify-queued ] unit-test
 | 
				
			||||||
 | 
					] with-grafted-gadget
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,15 +12,6 @@ vocabs.loader tools.test ui.gadgets.buttons
 | 
				
			||||||
ui.gadgets.status-bar mirrors ;
 | 
					ui.gadgets.status-bar mirrors ;
 | 
				
			||||||
IN: ui.tools
 | 
					IN: ui.tools
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: workspace-tabs ( -- seq )
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        <stack-display>
 | 
					 | 
				
			||||||
        <browser-gadget>
 | 
					 | 
				
			||||||
        <inspector-gadget>
 | 
					 | 
				
			||||||
        <walker>
 | 
					 | 
				
			||||||
        <profiler-gadget>
 | 
					 | 
				
			||||||
    } ;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
: <workspace-tabs> ( -- tabs )
 | 
					: <workspace-tabs> ( -- tabs )
 | 
				
			||||||
    g gadget-model
 | 
					    g gadget-model
 | 
				
			||||||
    "tool-switching" workspace command-map
 | 
					    "tool-switching" workspace command-map
 | 
				
			||||||
| 
						 | 
					@ -28,7 +19,13 @@ IN: ui.tools
 | 
				
			||||||
    <toggle-buttons> ;
 | 
					    <toggle-buttons> ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: <workspace-book> ( -- gadget )
 | 
					: <workspace-book> ( -- gadget )
 | 
				
			||||||
    workspace-tabs [ execute ] map g gadget-model <book> ;
 | 
					    [
 | 
				
			||||||
 | 
					        <stack-display> ,
 | 
				
			||||||
 | 
					        <browser-gadget> ,
 | 
				
			||||||
 | 
					        <inspector-gadget> ,
 | 
				
			||||||
 | 
					        <walker> ,
 | 
				
			||||||
 | 
					        <profiler-gadget> ,
 | 
				
			||||||
 | 
					    ] { } make g gadget-model <book> ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: <workspace> ( -- workspace )
 | 
					: <workspace> ( -- workspace )
 | 
				
			||||||
    0 <model> { 0 1 } <track> workspace construct-control [
 | 
					    0 <model> { 0 1 } <track> workspace construct-control [
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,15 +5,15 @@ ui.commands ui.gadgets ui.gadgets.labelled
 | 
				
			||||||
ui.gadgets.tracks ui.gestures ;
 | 
					ui.gadgets.tracks ui.gestures ;
 | 
				
			||||||
IN: ui.tools.traceback
 | 
					IN: ui.tools.traceback
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: <callstack-display> ( model -- )
 | 
					: <callstack-display> ( model -- gadget )
 | 
				
			||||||
    [ [ continuation-call callstack. ] when* ]
 | 
					    [ [ continuation-call callstack. ] when* ]
 | 
				
			||||||
    "Call stack" <labelled-pane> ;
 | 
					    "Call stack" <labelled-pane> ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: <datastack-display> ( model -- )
 | 
					: <datastack-display> ( model -- gadget )
 | 
				
			||||||
    [ [ continuation-data stack. ] when* ]
 | 
					    [ [ continuation-data stack. ] when* ]
 | 
				
			||||||
    "Data stack" <labelled-pane> ;
 | 
					    "Data stack" <labelled-pane> ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: <retainstack-display> ( model -- )
 | 
					: <retainstack-display> ( model -- gadget )
 | 
				
			||||||
    [ [ continuation-retain stack. ] when* ]
 | 
					    [ [ continuation-retain stack. ] when* ]
 | 
				
			||||||
    "Retain stack" <labelled-pane> ;
 | 
					    "Retain stack" <labelled-pane> ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,4 @@
 | 
				
			||||||
 | 
					IN: temporary
 | 
				
			||||||
 | 
					USING: tools.test tools.test.inference ui.tools ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{ 0 1 } [ <workspace> ] unit-test-effect
 | 
				
			||||||
| 
						 | 
					@ -18,11 +18,6 @@ HELP: find-window
 | 
				
			||||||
{ $values { "quot" "a quotation with stack effect " { $snippet "( world -- ? )" } } { "world" "a " { $link world } " or " { $link f } } }
 | 
					{ $values { "quot" "a quotation with stack effect " { $snippet "( world -- ? )" } } { "world" "a " { $link world } " or " { $link f } } }
 | 
				
			||||||
{ $description "Finds a native window whose world satisfies the quotation, outputting " { $link f } " if no such world could be found. The front-most native window is checked first." } ;
 | 
					{ $description "Finds a native window whose world satisfies the quotation, outputting " { $link f } " if no such world could be found. The front-most native window is checked first." } ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
HELP: start-world
 | 
					 | 
				
			||||||
{ $values { "world" world } }
 | 
					 | 
				
			||||||
{ $description "Starts a world." }
 | 
					 | 
				
			||||||
{ $notes "This word should be called by the UI backend after " { $link register-window } ", but before making the world's containing window visible on the screen." } ;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
HELP: register-window
 | 
					HELP: register-window
 | 
				
			||||||
{ $values { "world" world } { "handle" "a baackend-specific handle" } }
 | 
					{ $values { "world" world } { "handle" "a baackend-specific handle" } }
 | 
				
			||||||
{ $description "Adds a window to the global " { $link windows } " variable." }
 | 
					{ $description "Adds a window to the global " { $link windows } " variable." }
 | 
				
			||||||
| 
						 | 
					@ -174,7 +169,6 @@ ARTICLE: "ui-backend-windows" "UI backend window management"
 | 
				
			||||||
{ $subsection open-world-window }
 | 
					{ $subsection open-world-window }
 | 
				
			||||||
"This word should create a native window, store some kind of handle in the " { $link world-handle } " slot, then call two words:"
 | 
					"This word should create a native window, store some kind of handle in the " { $link world-handle } " slot, then call two words:"
 | 
				
			||||||
{ $subsection register-window }
 | 
					{ $subsection register-window }
 | 
				
			||||||
{ $subsection start-world }
 | 
					 | 
				
			||||||
"The following words must also be implemented:"
 | 
					"The following words must also be implemented:"
 | 
				
			||||||
{ $subsection set-title }
 | 
					{ $subsection set-title }
 | 
				
			||||||
{ $subsection raise-window }
 | 
					{ $subsection raise-window }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,7 +3,8 @@
 | 
				
			||||||
USING: arrays assocs io kernel math models namespaces
 | 
					USING: arrays assocs io kernel math models namespaces
 | 
				
			||||||
prettyprint dlists sequences threads sequences words timers
 | 
					prettyprint dlists sequences threads sequences words timers
 | 
				
			||||||
debugger ui.gadgets ui.gadgets.worlds ui.gadgets.tracks
 | 
					debugger ui.gadgets ui.gadgets.worlds ui.gadgets.tracks
 | 
				
			||||||
ui.gestures ui.backend ui.render continuations init ;
 | 
					ui.gestures ui.backend ui.render continuations init
 | 
				
			||||||
 | 
					combinators ;
 | 
				
			||||||
IN: ui
 | 
					IN: ui
 | 
				
			||||||
 | 
					
 | 
				
			||||||
! Assoc mapping aliens to gadgets
 | 
					! Assoc mapping aliens to gadgets
 | 
				
			||||||
| 
						 | 
					@ -53,25 +54,23 @@ SYMBOL: windows
 | 
				
			||||||
    reset-world ;
 | 
					    reset-world ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: open-world-window ( world -- )
 | 
					: open-world-window ( world -- )
 | 
				
			||||||
    dup pref-dim over set-gadget-dim
 | 
					    dup pref-dim over set-gadget-dim dup relayout graft ;
 | 
				
			||||||
    dup (open-world-window)
 | 
					 | 
				
			||||||
    draw-world ;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
: open-window ( gadget title -- )
 | 
					: open-window ( gadget title -- )
 | 
				
			||||||
    >r [ 1 track, ] { 0 1 } make-track r>
 | 
					    >r [ 1 track, ] { 0 1 } make-track r>
 | 
				
			||||||
    f <world> open-world-window ;
 | 
					    f <world> open-world-window ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: find-window ( quot -- world )
 | 
					: find-window ( quot -- world )
 | 
				
			||||||
    windows get 1 <column>
 | 
					    windows get values
 | 
				
			||||||
    [ gadget-child swap call ] curry* find-last nip ; inline
 | 
					    [ gadget-child swap call ] curry* find-last nip ; inline
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: restore-windows ( -- )
 | 
					: restore-windows ( -- )
 | 
				
			||||||
    windows get [ 1 <column> >array ] keep delete-all
 | 
					    windows get [ values ] keep delete-all
 | 
				
			||||||
    [ dup reset-world (open-world-window) ] each
 | 
					    [ dup reset-world (open-world-window) ] each
 | 
				
			||||||
    forget-rollover ;
 | 
					    forget-rollover ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: restore-windows? ( -- ? )
 | 
					: restore-windows? ( -- ? )
 | 
				
			||||||
    windows get [ empty? not ] [ f ] if* ;
 | 
					    windows get empty? not ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: update-hand ( world -- )
 | 
					: update-hand ( world -- )
 | 
				
			||||||
    dup hand-world get-global eq?
 | 
					    dup hand-world get-global eq?
 | 
				
			||||||
| 
						 | 
					@ -79,7 +78,8 @@ SYMBOL: windows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: layout-queued ( -- seq )
 | 
					: layout-queued ( -- seq )
 | 
				
			||||||
    [
 | 
					    [
 | 
				
			||||||
        invalid [
 | 
					        in-layout? on
 | 
				
			||||||
 | 
					        layout-queue [
 | 
				
			||||||
            dup layout find-world [ , ] when*
 | 
					            dup layout find-world [ , ] when*
 | 
				
			||||||
        ] dlist-slurp
 | 
					        ] dlist-slurp
 | 
				
			||||||
    ] { } make ;
 | 
					    ] { } make ;
 | 
				
			||||||
| 
						 | 
					@ -87,24 +87,40 @@ SYMBOL: windows
 | 
				
			||||||
SYMBOL: ui-hook
 | 
					SYMBOL: ui-hook
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: init-ui ( -- )
 | 
					: init-ui ( -- )
 | 
				
			||||||
    <dlist> \ invalid set-global
 | 
					    <dlist> \ graft-queue set-global
 | 
				
			||||||
 | 
					    <dlist> \ layout-queue set-global
 | 
				
			||||||
    V{ } clone windows set-global ;
 | 
					    V{ } clone windows set-global ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: redraw-worlds ( seq -- )
 | 
				
			||||||
 | 
					    [ dup update-hand draw-world ] each ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: notify ( gadget -- )
 | 
				
			||||||
 | 
					    dup gadget-status {
 | 
				
			||||||
 | 
					        { { f t } [ dup activate-control dup graft* ] }
 | 
				
			||||||
 | 
					        { { t f } [ dup activate-control dup ungraft* ] }
 | 
				
			||||||
 | 
					    } case
 | 
				
			||||||
 | 
					    dup gadget-status first { f f } { t t } ?
 | 
				
			||||||
 | 
					    swap set-gadget-status ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: notify-queued ( -- )
 | 
				
			||||||
 | 
					    graft-queue [ notify ] dlist-slurp ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: ui-step ( -- )
 | 
				
			||||||
 | 
					    [
 | 
				
			||||||
 | 
					        do-timers
 | 
				
			||||||
 | 
					        notify-queued
 | 
				
			||||||
 | 
					        layout-queued
 | 
				
			||||||
 | 
					        redraw-worlds
 | 
				
			||||||
 | 
					        10 sleep
 | 
				
			||||||
 | 
					    ] assert-depth ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: start-ui ( -- )
 | 
					: start-ui ( -- )
 | 
				
			||||||
    init-timers
 | 
					    init-timers
 | 
				
			||||||
    restore-windows? [
 | 
					    restore-windows? [
 | 
				
			||||||
        restore-windows
 | 
					        restore-windows
 | 
				
			||||||
    ] [
 | 
					    ] [
 | 
				
			||||||
        init-ui ui-hook get call
 | 
					        init-ui ui-hook get call
 | 
				
			||||||
    ] if ;
 | 
					    ] if ui-step ;
 | 
				
			||||||
 | 
					 | 
				
			||||||
: redraw-worlds ( seq -- )
 | 
					 | 
				
			||||||
    [ dup update-hand draw-world ] each ;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
: ui-step ( -- )
 | 
					 | 
				
			||||||
    [
 | 
					 | 
				
			||||||
        do-timers layout-queued redraw-worlds 10 sleep
 | 
					 | 
				
			||||||
    ] assert-depth ;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
: ui-running ( quot -- )
 | 
					: ui-running ( quot -- )
 | 
				
			||||||
    t \ ui-running set-global
 | 
					    t \ ui-running set-global
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -340,17 +340,23 @@ SYMBOL: hWnd
 | 
				
			||||||
        ] ui-try
 | 
					        ] ui-try
 | 
				
			||||||
     ] alien-callback ;
 | 
					     ] alien-callback ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: do-events ( -- )
 | 
					: peek-message? ( msg -- ? ) f 0 0 PM_REMOVE PeekMessage zero? ;
 | 
				
			||||||
    msg-obj get f 0 0 PM_REMOVE PeekMessage 
 | 
					
 | 
				
			||||||
    zero? not [
 | 
					: do-events ( msg -- )
 | 
				
			||||||
        msg-obj get MSG-message WM_QUIT = [
 | 
					    {
 | 
				
			||||||
            msg-obj get [ TranslateMessage drop ] keep DispatchMessage drop
 | 
					        { [ windows get empty? ] [ drop ] }
 | 
				
			||||||
        ] unless
 | 
					        { [ dup peek-message? ] [ >r [ ui-step ] ui-try r> do-events ] }
 | 
				
			||||||
    ] when ;
 | 
					        { [ dup MSG-message WM_QUIT = ] [ drop ] }
 | 
				
			||||||
 | 
					        { [ t ] [
 | 
				
			||||||
 | 
					            dup TranslateMessage drop
 | 
				
			||||||
 | 
					            dup DispatchMessage drop
 | 
				
			||||||
 | 
					            do-events
 | 
				
			||||||
 | 
					        ] }
 | 
				
			||||||
 | 
					    } cond ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: event-loop ( -- )
 | 
					: event-loop ( -- )
 | 
				
			||||||
    windows get empty? [
 | 
					    windows get empty? [
 | 
				
			||||||
        [ do-events ui-step ] ui-try event-loop
 | 
					        msg-obj get do-events
 | 
				
			||||||
    ] unless ;
 | 
					    ] unless ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: register-wndclassex ( -- class )
 | 
					: register-wndclassex ( -- class )
 | 
				
			||||||
| 
						 | 
					@ -414,8 +420,8 @@ M: windows-ui-backend (open-world-window) ( world -- )
 | 
				
			||||||
    [ rect-dim first2 create-window dup setup-gl ] keep
 | 
					    [ rect-dim first2 create-window dup setup-gl ] keep
 | 
				
			||||||
    [ f <win> ] keep
 | 
					    [ f <win> ] keep
 | 
				
			||||||
    [ swap win-hWnd register-window ] 2keep
 | 
					    [ swap win-hWnd register-window ] 2keep
 | 
				
			||||||
    [ set-world-handle ] 2keep 
 | 
					    dupd set-world-handle
 | 
				
			||||||
    start-world win-hWnd show-window ;
 | 
					    win-hWnd show-window ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
M: windows-ui-backend select-gl-context ( handle -- )
 | 
					M: windows-ui-backend select-gl-context ( handle -- )
 | 
				
			||||||
    [ win-hDC ] keep win-hRC wglMakeCurrent win32-error=0/f ;
 | 
					    [ win-hDC ] keep win-hRC wglMakeCurrent win32-error=0/f ;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -224,7 +224,6 @@ M: x11-ui-backend set-title ( string world -- )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
M: x11-ui-backend (open-world-window) ( world -- )
 | 
					M: x11-ui-backend (open-world-window) ( world -- )
 | 
				
			||||||
    dup gadget-window
 | 
					    dup gadget-window
 | 
				
			||||||
    dup start-world
 | 
					 | 
				
			||||||
    world-handle x11-handle-window dup set-closable map-window ;
 | 
					    world-handle x11-handle-window dup set-closable map-window ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
M: x11-ui-backend raise-window ( world -- )
 | 
					M: x11-ui-backend raise-window ( world -- )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue