2006-06-12 02:41:19 -04:00
|
|
|
! Copyright (C) 2006 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
IN: gadgets-search
|
2006-08-31 22:16:59 -04:00
|
|
|
USING: arrays gadgets gadgets-frames gadgets-labels
|
|
|
|
gadgets-panes gadgets-scrolling gadgets-text gadgets-theme
|
2006-09-05 01:29:26 -04:00
|
|
|
generic help tools kernel models sequences words
|
2006-10-05 02:10:49 -04:00
|
|
|
gadgets-borders gadgets-lists namespaces ;
|
2006-06-12 02:41:19 -04:00
|
|
|
|
2006-07-19 18:46:33 -04:00
|
|
|
TUPLE: search-gadget input ;
|
2006-06-12 02:41:19 -04:00
|
|
|
|
2006-07-19 18:46:33 -04:00
|
|
|
: <search-pane> ( model quot -- )
|
|
|
|
[ over empty? [ 2drop ] [ call ] if ] curry
|
|
|
|
<pane-control> ;
|
2006-06-12 02:41:19 -04:00
|
|
|
|
2006-08-31 22:16:59 -04:00
|
|
|
: <search-bar> ( field -- gadget )
|
|
|
|
{
|
|
|
|
{ [ "Search: " <label> ] f f @left }
|
|
|
|
{ f f f @center }
|
|
|
|
} make-frame ;
|
|
|
|
|
2006-06-12 02:41:19 -04:00
|
|
|
C: search-gadget ( quot -- )
|
2006-07-19 18:46:33 -04:00
|
|
|
>r f <model> dup r> {
|
2006-08-31 22:16:59 -04:00
|
|
|
{ [ <field> ] set-search-gadget-input [ <search-bar> ] @top }
|
2006-07-19 18:46:33 -04:00
|
|
|
{ [ swap <search-pane> <scroller> ] f f @center }
|
2006-06-12 02:41:19 -04:00
|
|
|
} make-frame* ;
|
|
|
|
|
|
|
|
M: search-gadget focusable-child* search-gadget-input ;
|
2006-10-05 02:10:49 -04:00
|
|
|
|
|
|
|
|
|
|
|
! Here is the new one
|
|
|
|
TUPLE: live-search field list model producer action presenter ;
|
|
|
|
|
|
|
|
: find-live-search [ live-search? ] find-parent ;
|
|
|
|
|
|
|
|
: find-search-list find-live-search live-search-list ;
|
|
|
|
|
|
|
|
: update-live-search ( live-search -- )
|
|
|
|
dup live-search-field editor-text
|
|
|
|
over live-search-producer call
|
|
|
|
swap live-search-model set-model ;
|
|
|
|
|
|
|
|
TUPLE: search-field ;
|
|
|
|
|
|
|
|
C: search-field ( string -- gadget )
|
|
|
|
<editor> over set-gadget-delegate
|
|
|
|
dup dup set-control-self
|
|
|
|
[ set-editor-text ] keep ;
|
|
|
|
|
|
|
|
M: search-field model-changed
|
|
|
|
dup find-live-search update-live-search
|
|
|
|
delegate model-changed ;
|
|
|
|
|
|
|
|
search-field H{
|
|
|
|
{ T{ key-down f f "UP" } [ find-search-list select-prev ] }
|
|
|
|
{ T{ key-down f f "DOWN" } [ find-search-list select-next ] }
|
|
|
|
{ T{ key-down f f "RETURN" } [ find-search-list call-action ] }
|
|
|
|
} set-gestures
|
|
|
|
|
|
|
|
: <search-list>
|
|
|
|
gadget get live-search-model
|
|
|
|
gadget get live-search-presenter
|
|
|
|
gadget get live-search-action
|
|
|
|
<list> ;
|
|
|
|
|
|
|
|
C: live-search ( string action producer presenter -- gadget )
|
|
|
|
[ set-live-search-presenter ] keep
|
|
|
|
[ set-live-search-producer ] keep
|
|
|
|
[ set-live-search-action ] keep
|
|
|
|
f <model> over set-live-search-model
|
|
|
|
{
|
|
|
|
{
|
|
|
|
[ <search-field> ]
|
|
|
|
set-live-search-field
|
|
|
|
f
|
|
|
|
@top
|
|
|
|
}
|
|
|
|
{
|
|
|
|
[ <search-list> ]
|
|
|
|
set-live-search-list
|
|
|
|
[ <scroller> ]
|
|
|
|
@center
|
|
|
|
}
|
|
|
|
} make-frame* ;
|
|
|
|
|
|
|
|
M: live-search focusable-child* live-search-field ;
|
|
|
|
|
|
|
|
: <word-search> ( string action -- gadget )
|
|
|
|
\ third add*
|
|
|
|
all-words
|
|
|
|
[ completions ] curry
|
|
|
|
[ [ completion. ] make-pane ]
|
|
|
|
<live-search> ;
|