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