1 ! Copyright (C) 2008, 2009 Slava Pestov
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors kernel delegate fry sequences models
4 combinators.short-circuit models.search models.delay calendar locals
5 ui.gestures ui.pens ui.pens.image ui.gadgets.editors ui.gadgets.labels
6 ui.gadgets.scrollers ui.gadgets.tables ui.gadgets.tracks
7 ui.gadgets.borders ui.gadgets.buttons ui.baseline-alignment ui.gadgets ;
8 IN: ui.gadgets.search-tables
10 TUPLE: search-table < track table field ;
12 : find-search-table ( gadget -- search-table/f )
13 [ search-table? ] find-parent ;
15 TUPLE: search-field < track field ;
17 : clear-search-field ( search-field -- )
18 field>> editor>> clear-editor ;
20 : <clear-button-pen> ( -- pen )
21 "clear-button" theme-image <image-pen> dup
22 "clear-button-clicked" theme-image <image-pen> dup dup <button-pen> ;
24 : <clear-button> ( search-field -- button )
25 [ f ] dip '[ drop _ clear-search-field ] <button>
26 <clear-button-pen> >>interior
27 dup dup interior>> pen-pref-dim >>min-dim ;
29 : <search-field> ( model -- gadget )
30 horizontal search-field new-track
33 swap <model-field> 10 >>min-cols >>field
34 dup field>> "Search:" label-on-left 1 track-add
35 dup <clear-button> f track-add ;
37 M: search-field focusable-child* field>> ;
39 : pass-to-table ( gesture gadget -- ? )
40 find-search-table table>> handle-gesture ;
42 M: search-field handle-gesture
44 { [ pass-to-table ] [ call-next-method ] } 2&&
45 ] [ call-next-method ] if ;
47 ! A protocol with customizable slots
48 SLOT-PROTOCOL: table-protocol
66 CONSULT: table-protocol search-table table>> ;
68 :: <search-table> ( values renderer quot -- gadget )
70 vertical search-table new-track
72 search <search-field> >>field
73 dup field>> { 2 2 } <filled-border> f track-add
74 values search 500 milliseconds <delay> quot <string-search>
75 renderer <table> f >>takes-focus? >>table
76 dup table>> <scroller> 1 track-add ;
78 M: search-table model-changed
79 nip field>> clear-search-field ;
81 M: search-table focusable-child* field>> ;