]> gitweb.factorcode.org Git - factor.git/blob - basis/ui/gadgets/search-tables/search-tables.factor
78c21ad2ab9dd07b6cf3699468ebace668131418
[factor.git] / basis / ui / gadgets / search-tables / search-tables.factor
1 ! Copyright (C) 2008, 2009 Slava Pestov
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors combinators.short-circuit kernel models
4 models.search ui.baseline-alignment ui.gadgets
5 ui.gadgets.borders ui.gadgets.buttons ui.gadgets.editors
6 ui.gadgets.scrollers ui.gadgets.tables ui.gadgets.tracks
7 ui.gestures ui.pens ui.pens.image ui.theme.images ;
8 IN: ui.gadgets.search-tables
9
10 TUPLE: search-table < track table field ;
11
12 : find-search-table ( gadget -- search-table/f )
13     [ search-table? ] find-parent ;
14
15 TUPLE: search-field < track field ;
16
17 : clear-search-field ( search-field -- )
18     field>> editor>> clear-editor ;
19
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> ;
23
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 ;
28
29 : <search-field> ( model -- gadget )
30     horizontal search-field new-track
31         0 >>fill
32         { 5 5 } >>gap
33         +baseline+ >>align
34         swap <model-field> 10 >>min-cols "Search" >>default-text
35         [ >>field ] keep 1 track-add
36         dup <clear-button> f track-add ;
37
38 M: search-field focusable-child* field>> ;
39
40 : pass-to-table ( gesture gadget -- ? )
41     find-search-table table>> handle-gesture ;
42
43 M: search-field handle-gesture
44     over key-gesture? [
45         { [ pass-to-table ] [ call-next-method ] } 2&&
46     ] [ call-next-method ] if ;
47
48 :: <search-table> ( values renderer quot -- gadget )
49     f <model> :> search
50     vertical search-table new-track
51         values >>model
52         search <search-field> >>field
53         dup field>> { 2 2 } <filled-border> f track-add
54         values search quot <string-search>
55         renderer <table> f >>takes-focus? >>table
56         dup table>> <scroller> 1 track-add ; inline
57
58 M: search-table model-changed
59     nip field>> clear-search-field ;
60
61 M: search-table focusable-child* field>> ;