diff --git a/basis/ui/gadgets/tables/tables.factor b/basis/ui/gadgets/tables/tables.factor index dce47fc11d..91ba8df94a 100644 --- a/basis/ui/gadgets/tables/tables.factor +++ b/basis/ui/gadgets/tables/tables.factor @@ -209,8 +209,7 @@ M: table model-changed : thin-row-rect ( table row -- rect ) row-rect [ { 0 1 } v* ] change-dim ; -: (select-row) ( table row -- ) - over validate-row +: (select-row) ( table n -- ) [ [ thin-row-rect ] [ drop ] 2bi scroll>rect ] [ >>selected-index relayout-1 ] 2bi ; @@ -232,8 +231,14 @@ M: table model-changed hand-click# get 2 = [ row-action ] [ update-selected-value ] if ; -: select-row ( table row -- ) - [ (select-row) ] [ drop update-selected-value ] 2bi ; +: show-row-summary ( row table -- ) + [ renderer>> row-value ] keep show-summary ; + +: select-row ( table n -- ) + over validate-row + [ (select-row) ] + [ drop update-selected-value ] + [ over nth-row drop swap show-row-summary ] 2tri ; : prev-row ( table -- ) dup selected-index>> [ 1- ] [ 0 ] if* select-row ; @@ -253,9 +258,6 @@ M: table model-changed : valid-row? ( row table -- ? ) control-value length 1- 0 swap between? ; -: show-row-summary ( row table -- ) - [ renderer>> row-value ] keep show-summary ; - : if-mouse-row ( table true false -- ) [ [ mouse-row ] keep 2dup valid-row? ] [ ] [ '[ nip @ ] ] tri* if ; inline diff --git a/basis/ui/gadgets/wrappers/wrappers.factor b/basis/ui/gadgets/wrappers/wrappers.factor index b750e3c2a4..01585d01db 100644 --- a/basis/ui/gadgets/wrappers/wrappers.factor +++ b/basis/ui/gadgets/wrappers/wrappers.factor @@ -1,4 +1,4 @@ -! Copyright (C) 2005, 2008 Slava Pestov. +! Copyright (C) 2005, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: accessors ui.gadgets kernel ; @@ -8,7 +8,7 @@ TUPLE: wrapper < gadget ; : new-wrapper ( child class -- wrapper ) new-gadget swap add-gadget ; -: ( child -- border ) wrapper new-wrapper ; +: ( child -- wrapper ) wrapper new-wrapper ; M: wrapper pref-dim* ( wrapper -- dim ) gadget-child pref-dim ; diff --git a/basis/ui/gestures/gestures.factor b/basis/ui/gestures/gestures.factor index b74a36bc0b..19f813736a 100644 --- a/basis/ui/gestures/gestures.factor +++ b/basis/ui/gestures/gestures.factor @@ -34,9 +34,11 @@ M: send-gesture send-queued-gesture TUPLE: propagate-gesture gesture gadget ; +: resend-gesture ( gesture gadget -- ? ) + [ handle-gesture ] with each-parent ; + M: propagate-gesture send-queued-gesture - [ gesture>> ] [ gadget>> ] bi - [ handle-gesture ] with each-parent drop ; + [ gesture>> ] [ gadget>> ] bi resend-gesture drop ; : propagate-gesture ( gesture gadget -- ) \ propagate-gesture queue-gesture ; diff --git a/basis/ui/tools/listener/listener.factor b/basis/ui/tools/listener/listener.factor index a030fa5311..fd07a75693 100644 --- a/basis/ui/tools/listener/listener.factor +++ b/basis/ui/tools/listener/listener.factor @@ -1,6 +1,6 @@ ! Copyright (C) 2005, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: inspector help help.markup io io.styles kernel models +USING: inspector kernel help help.markup io io.styles models strings namespaces parser quotations sequences vocabs words continuations prettyprint listener debugger threads boxes concurrency.flags math arrays generic accessors combinators @@ -11,14 +11,15 @@ ui.commands ui.gadgets ui.gadgets.editors ui.gadgets.labelled ui.gadgets.panes ui.gadgets.buttons ui.gadgets.scrollers ui.gadgets.packs ui.gadgets.tracks ui.gadgets.borders ui.gadgets.frames ui.gadgets.grids ui.gadgets.status-bar -ui.gestures ui.operations ui.tools.browser +ui.gadgets.wrappers ui.gestures ui.operations ui.tools.browser ui.tools.debugger ui.tools.inspector ui.tools.common ui ; IN: ui.tools.listener ! If waiting is t, we're waiting for user input, and invoking ! evaluate-input resumes the thread. TUPLE: interactor < source-editor -output history flag mailbox thread waiting help ; +output history flag mailbox thread waiting help +completion-popup ; : register-self ( interactor -- ) >>mailbox @@ -411,4 +412,69 @@ M: listener-gadget graft* [ call-next-method ] [ restart-listener ] bi ; M: listener-gadget ungraft* - [ com-end ] [ call-next-method ] bi ; \ No newline at end of file + [ com-end ] [ call-next-method ] bi ; + +! Foo +: ( model -- gadget ) + [ summary ] ; + +SINGLETON: completion-renderer +M: completion-renderer row-columns drop name>> 1array ; +M: completion-renderer row-value drop ; + +: ( interactor quot -- table ) + [ one-word-elt 1/3 seconds ] dip + '[ [ { } ] [ @ keys 20 short head ] if-empty ] + completion-renderer >>renderer ; + +TUPLE: completion-popup < wrapper interactor ; + +: ( interactor quot -- popup ) + dupd + + + { 300 300 } >>min-dim + { 300 300 } >>max-dim + completion-popup new-wrapper + white >>interior + swap >>interactor ; + +: hide-completion-popup ( popup -- ) + interactor>> f >>completion-popup find-world hide-glass ; + +completion-popup H{ + { T{ key-down f f "ESC" } [ hide-completion-popup ] } +} set-gestures + +: ( interactor -- table ) + [ words-matching ] ; + +: ( interactor -- table ) + [ vocabs-matching ] ; + +: show-completion-popup ( interactor popup -- ) + [ >>completion-popup ] keep + [ find-world ] dip + { 0 0 } show-glass ; + +: word-completion-popup ( interactor -- ) + dup show-completion-popup ; + +: pass-to-popup? ( gesture interactor -- ? ) + [ [ key-down? ] [ key-up? ] bi or ] + [ completion-popup>> ] + bi* and ; + +M: interactor handle-gesture + 2dup pass-to-popup? [ + 2dup completion-popup>> + focusable-child resend-gesture + [ call-next-method ] [ 2drop f ] if + ] [ call-next-method ] if ; + +: test-it ( interactor -- ) + dup show-completion-popup ; + +interactor "completion" f { + { T{ key-down f f "TAB" } word-completion-popup } +} define-command-map \ No newline at end of file diff --git a/basis/ui/tools/profiler/profiler.factor b/basis/ui/tools/profiler/profiler.factor index bb6635a0f1..d5a4dcdea9 100644 --- a/basis/ui/tools/profiler/profiler.factor +++ b/basis/ui/tools/profiler/profiler.factor @@ -22,15 +22,19 @@ generic class ; { 700 400 } profiler-gadget set-tool-dim -SINGLETON: word-renderer +SINGLETONS: word-renderer vocab-renderer ; +UNION: profiler-renderer word-renderer vocab-renderer ; ! Value is a { word count } pair -M: word-renderer row-columns +M: profiler-renderer row-columns drop [ [ present ] map ] [ { "All" "" } ] if* ; -M: word-renderer row-value +M: profiler-renderer row-value drop dup [ first ] when ; +M: vocab-renderer row-value + call-next-method dup [ vocab ] when ; + SINGLETON: method-renderer ! Value is a { method-body count } pair @@ -53,7 +57,6 @@ M: method-renderer row-value drop first ; : ( model -- table ) [ match? ] - word-renderer >>renderer { 0 1 } >>column-alignment 0 >>filled-column ; @@ -102,9 +105,11 @@ M: method-renderer row-value drop first ; { 1 0 } profiler vocabs>> profiler vocab>> >>selected-value + vocab-renderer >>renderer "Vocabularies" 1/2 track-add profiler + word-renderer >>renderer "Words" 1/2 track-add ; @@ -113,10 +118,12 @@ M: method-renderer row-value drop first ; { 1 0 } profiler profiler generic>> >>selected-value + word-renderer >>renderer "Generic words" 1/2 track-add profiler profiler class>> >>selected-value + word-renderer >>renderer "Classes" 1/2 track-add 1/2 track-add