1# Copyright (c) 2007, Enthought, Inc. 2# License: BSD Style. 3 4# tree_editor.py -- Example of a tree editor 5 6# --[Imports]-------------------------------------------------------------- 7 8from traits.api \ 9 import HasTraits, Str, Regex, List, Instance 10from traitsui.api \ 11 import TreeEditor, TreeNode, View, Item, VSplit, \ 12 HGroup, Handler, Group 13from traitsui.menu \ 14 import Menu, Action, Separator 15try: 16 from traitsui.wx.tree_editor \ 17 import NewAction, CopyAction, CutAction, \ 18 PasteAction, DeleteAction, RenameAction 19except RuntimeError: 20 from traitsui.qt4.tree_editor \ 21 import NewAction, CopyAction, CutAction, \ 22 PasteAction, DeleteAction, RenameAction 23# --[Code]----------------------------------------------------------------- 24 25# DATA CLASSES 26 27 28class Employee(HasTraits): 29 name = Str('<unknown>') 30 title = Str() 31 phone = Regex(regex=r'\d\d\d-\d\d\d\d') 32 33 def default_title(self): 34 self.title = 'Senior Engineer' 35 36 37class Department(HasTraits): 38 name = Str('<unknown>') 39 employees = List(Employee) 40 41 42class Company(HasTraits): 43 name = Str('<unknown>') 44 departments = List(Department) 45 employees = List(Employee) 46 47 48class Owner(HasTraits): 49 name = Str('<unknown>') 50 company = Instance(Company) 51 52# INSTANCES 53 54 55jason = Employee( 56 name='Jason', 57 title='Engineer', 58 phone='536-1057') 59 60mike = Employee( 61 name='Mike', 62 title='Sr. Marketing Analyst', 63 phone='536-1057') 64 65dave = Employee( 66 name='Dave', 67 title='Sr. Engineer', 68 phone='536-1057') 69 70susan = Employee( 71 name='Susan', 72 title='Engineer', 73 phone='536-1057') 74 75betty = Employee( 76 name='Betty', 77 title='Marketing Analyst') 78 79owner = Owner( 80 name='wile', 81 company=Company( 82 name='Acme Labs, Inc.', 83 departments=[ 84 Department( 85 name='Marketing', 86 employees=[mike, betty] 87 ), 88 Department( 89 name='Engineering', 90 employees=[dave, susan, jason] 91 ) 92 ], 93 employees=[dave, susan, mike, betty, jason] 94 ) 95) 96 97# View for objects that aren't edited 98no_view = View() 99 100# Actions used by tree editor context menu 101 102def_title_action = Action(name='Default title', 103 action='object.default') 104 105dept_action = Action( 106 name='Department', 107 action='handler.employee_department(editor,object)') 108 109# View used by tree editor 110employee_view = View( 111 VSplit( 112 HGroup('3', 'name'), 113 HGroup('9', 'title'), 114 HGroup('phone'), 115 id='vsplit'), 116 id='traits.doc.example.treeeditor', 117 dock='vertical') 118 119 120class TreeHandler(Handler): 121 122 def employee_department(self, editor, object): 123 dept = editor.get_parent(object) 124 print('%s works in the %s department.' % (object.name, dept.name)) 125 126 127# Tree editor 128tree_editor = TreeEditor( 129 nodes=[ 130 TreeNode(node_for=[Company], 131 auto_open=True, 132 children='', 133 label='name', 134 view=View(Group('name', 135 orientation='vertical', 136 show_left=True))), 137 TreeNode(node_for=[Company], 138 auto_open=True, 139 children='departments', 140 label='=Departments', 141 view=no_view, 142 add=[Department]), 143 TreeNode(node_for=[Company], 144 auto_open=True, 145 children='employees', 146 label='=Employees', 147 view=no_view, 148 add=[Employee]), 149 TreeNode(node_for=[Department], 150 auto_open=True, 151 children='employees', 152 label='name', 153 menu=Menu(NewAction, 154 Separator(), 155 DeleteAction, 156 Separator(), 157 RenameAction, 158 Separator(), 159 CopyAction, 160 CutAction, 161 PasteAction), 162 view=View(Group('name', 163 orientation='vertical', 164 show_left=True)), 165 add=[Employee]), 166 TreeNode(node_for=[Employee], 167 auto_open=True, 168 label='name', 169 menu=Menu(NewAction, 170 Separator(), 171 def_title_action, 172 dept_action, 173 Separator(), 174 CopyAction, 175 CutAction, 176 PasteAction, 177 Separator(), 178 DeleteAction, 179 Separator(), 180 RenameAction), 181 view=employee_view) 182 ] 183) 184# The main view 185view = View( 186 Group( 187 Item( 188 name='company', 189 id='company', 190 editor=tree_editor, 191 resizable=True), 192 orientation='vertical', 193 show_labels=True, 194 show_left=True, ), 195 title='Company Structure', 196 id='traitsui.tests.tree_editor_test', 197 dock='horizontal', 198 drop_class=HasTraits, 199 handler=TreeHandler(), 200 buttons=['Undo', 'OK', 'Cancel'], 201 resizable=True, 202 width=.3, 203 height=.3) 204 205if __name__ == '__main__': 206 owner.configure_traits(view=view) 207