1#-------------------------------------------------------------------------
2#
3#  TableEditor test case for Traits UI
4#
5#  Written by: David C. Morrill
6#
7#  Date: 07/05/2005
8#
9#  (c) Copyright 2005 by Enthought, Inc.
10#  Copyright (c) 2007, Enthought, Inc.
11#  License: BSD Style.
12#
13#-------------------------------------------------------------------------
14
15#-------------------------------------------------------------------------
16#  Imports:
17#-------------------------------------------------------------------------
18
19from traits.api \
20    import HasStrictTraits, Str, Int, Regex, List, Instance
21
22from traitsui.api \
23    import View, Group, Item, TableEditor, EnumEditor
24
25from traitsui.table_column \
26    import ObjectColumn
27
28from traitsui.table_filter \
29    import TableFilter, RuleTableFilter, RuleFilterTemplate, \
30    MenuFilterTemplate, EvalFilterTemplate
31
32#-------------------------------------------------------------------------
33#  'Person' class:
34#-------------------------------------------------------------------------
35
36
37class Person(HasStrictTraits):
38
39    #-------------------------------------------------------------------------
40    #  Trait definitions:
41    #-------------------------------------------------------------------------
42
43    name = Str()
44    age = Int()
45    phone = Regex(value='000-0000', regex='\d\d\d[-]\d\d\d\d')
46    state = Str()
47
48    #-------------------------------------------------------------------------
49    #  Traits view definition:
50    #-------------------------------------------------------------------------
51
52    traits_view = View('name', 'age', 'phone', 'state',
53                       title='Create new person',
54                       width=0.18,
55                       buttons=['OK', 'Cancel'])
56
57#-------------------------------------------------------------------------
58#  Sample data:
59#-------------------------------------------------------------------------
60
61people = [
62    Person(name='Dave', age=39, phone='555-1212'),
63    Person(name='Mike', age=28, phone='555-3526'),
64    Person(name='Joe', age=34, phone='555-6943'),
65    Person(name='Tom', age=22, phone='555-7586'),
66    Person(name='Dick', age=63, phone='555-3895'),
67    Person(name='Harry', age=46, phone='555-3285'),
68    Person(name='Sally', age=43, phone='555-8797'),
69    Person(name='Fields', age=31, phone='555-3547')
70]
71
72#-------------------------------------------------------------------------
73#  'AgeFilter' class:
74#-------------------------------------------------------------------------
75
76
77class AgeFilter(TableFilter):
78
79    #-------------------------------------------------------------------------
80    #  Trait definitions:
81    #-------------------------------------------------------------------------
82
83    name = "Age filter"
84    _name = "Age filter"
85
86    age = Int(0)
87
88    #-------------------------------------------------------------------------
89    #  Traits view definitions:
90    #-------------------------------------------------------------------------
91
92    #filter_view = Group( 'age{Age >=}' )
93
94    #-------------------------------------------------------------------------
95    #  Returns whether an object passes the filter or not:
96    #-------------------------------------------------------------------------
97
98    def filter(self, person):
99        """ Returns whether an object passes the filter or not.
100        """
101        return (person.age >= self.age)
102
103    #-------------------------------------------------------------------------
104    #  Returns a user readable description of what the filter does:
105    #-------------------------------------------------------------------------
106
107    def description(self):
108        """ Returns a user readable description of what the filter does.
109        """
110        return 'Age >= %d' % self.age
111
112    def _age_changed(self, old, new):
113        self.name = self.description()
114        print('AgeFilter _age_changed', self.name)
115
116#-------------------------------------------------------------------------
117#  'NameFilter' class:
118#-------------------------------------------------------------------------
119
120
121class NameFilter(TableFilter):
122
123    #-------------------------------------------------------------------------
124    #  Trait definitions:
125    #-------------------------------------------------------------------------
126
127    mname = Str()
128
129    #-------------------------------------------------------------------------
130    #  Traits view definitions:
131    #-------------------------------------------------------------------------
132
133    filter_view = Group('mname{Name contains}')
134
135    #-------------------------------------------------------------------------
136    #  Returns whether an object passes the filter or not:
137    #-------------------------------------------------------------------------
138
139    def filter(self, person):
140        """ Returns whether an object passes the filter or not.
141        """
142        return (person.name.lower().find(self.mname.lower()) >= 0)
143
144    #-------------------------------------------------------------------------
145    #  Returns a user readable description of what the filter does:
146    #-------------------------------------------------------------------------
147
148    def description(self):
149        """ Returns a user readable description of what the filter does.
150        """
151        return "Name contains '%s'" % self.mname
152
153#-------------------------------------------------------------------------
154#  Table editor definition:
155#-------------------------------------------------------------------------
156
157filters = [
158    AgeFilter(
159        age=30),
160    NameFilter(
161        mname='d'),
162    EvalFilterTemplate,
163    MenuFilterTemplate,
164    RuleFilterTemplate,
165]
166
167
168def evaluate_value(v):
169    print('evaluate_value', v)
170    return str(v)
171#-------------------------------------------------------------------------
172#  'TableTest' class:
173#-------------------------------------------------------------------------
174
175
176class TableTest(HasStrictTraits):
177
178    #-------------------------------------------------------------------------
179    #  Trait definitions:
180    #-------------------------------------------------------------------------
181
182    #people = Instance( Person )
183    people = List(Person)
184
185    #-------------------------------------------------------------------------
186    #  Traits view definitions:
187    #-------------------------------------------------------------------------
188
189    _valid_states = List(["AL", "AR", "AZ", "AK"])
190
191    _state_editor = EnumEditor(
192        name="_valid_states",
193        evaluate=evaluate_value,
194        object='table_editor_object'
195    )
196
197    table_editor = TableEditor(
198        columns=[ObjectColumn(name='name'),
199                 ObjectColumn(name='age'),
200                 ObjectColumn(name='phone'),
201                 ObjectColumn(name='state',
202                              editor=_state_editor), ],
203        editable=True,
204        deletable=True,
205        sortable=True,
206        sort_model=True,
207        show_lines=True,
208        orientation='vertical',
209        show_column_labels=True,
210        edit_view=View(['name', 'age', 'phone', 'state', '|[]'],
211                       resizable=True),
212        filter=None,
213        filters=filters,
214        row_factory=Person
215    )
216
217    traits_view = View(
218        [Item('people',
219              id='people',
220              editor=table_editor),
221         '|[]<>'],
222        title='Table Editor Test',
223        id='traitsui.tests.table_editor_test',
224        dock='horizontal',
225        width=.4,
226        height=.3,
227        resizable=True,
228        kind='live')
229
230
231#-------------------------------------------------------------------------
232#  Run the tests:
233#-------------------------------------------------------------------------
234
235if __name__ == '__main__':
236    tt = TableTest(people=people)
237    tt.configure_traits()
238    for p in tt.people:
239        p.print_traits()
240        print('--------------')
241