1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import wx
20 import wx.lib.agw.customtreectrl as customtreectrl
21
22 from timelinelib.db.exceptions import TimelineIOError
23 from timelinelib.db.observer import STATE_CHANGE_CATEGORY
24 from timelinelib.wxgui.dialogs.categoryeditor import WxCategoryEdtiorDialog
25 from timelinelib.wxgui.utils import _ask_question
26 from timelinelib.wxgui.utils import category_tree
27 import timelinelib.wxgui.utils as gui_utils
28
29
30 NO_CHECKBOX_TYPE = 0
31 CHECKBOX_TYPE = 1
32
33
35
36 - def __init__(self, parent, fn_handle_db_error):
37 style = wx.BORDER_SUNKEN
38 agwStyle = (customtreectrl.TR_HIDE_ROOT |
39 customtreectrl.TR_HAS_VARIABLE_ROW_HEIGHT |
40 customtreectrl.TR_LINES_AT_ROOT |
41 customtreectrl.TR_HAS_BUTTONS)
42 if version_str_to_tuple(wx.__version__) < (2, 8, 11, 0):
43 customtreectrl.CustomTreeCtrl.__init__(self, parent, style=style|agwStyle)
44 else:
45 customtreectrl.CustomTreeCtrl.__init__(self, parent, style=style, agwStyle=agwStyle)
46 self._create_gui()
47 self.controller = CategoriesTreeController(self, fn_handle_db_error)
48
51
54
56 self.DeleteAllItems()
57 self.root = self.AddRoot("")
58 self._update_categories_from_tree(tree, self.root, view_properties)
59 self.ExpandAll()
60
62 item = self.GetSelection()
63 if item is None:
64 return None
65 category = self.GetPyData(item)
66 return category
67
70
72
73 self.mnu = wx.Menu()
74 self.mnu_edit = wx.MenuItem(self.mnu, wx.ID_ANY, _("Edit..."))
75 self.Bind(wx.EVT_MENU, self._mnu_edit_on_click, self.mnu_edit)
76 self.mnu.AppendItem(self.mnu_edit)
77 self.mnu_add = wx.MenuItem(self.mnu, wx.ID_ANY, _("Add..."))
78 self.Bind(wx.EVT_MENU, self._mnu_add_on_click, self.mnu_add)
79 self.mnu.AppendItem(self.mnu_add)
80 self.mnu_delete = wx.MenuItem(self.mnu, wx.ID_ANY, _("Delete"))
81 self.Bind(wx.EVT_MENU, self._mnu_delete_on_click, self.mnu_delete)
82 self.mnu.AppendItem(self.mnu_delete)
83
84 self.Bind(customtreectrl.EVT_TREE_ITEM_CHECKED,
85 self._on_tree_item_checked, self)
86 self.Bind(wx.EVT_RIGHT_DOWN, self._on_right_down)
87 self.Bind(wx.EVT_KEY_DOWN, self._on_key_down)
88
90 enable_if_item = [self.mnu_edit, self.mnu_delete]
91 enable = self.get_selected_category() is not None
92 for menu_item in enable_if_item:
93 menu_item.Enable(enable)
94
96 for (cat, subtree) in tree:
97 legend_panel = wx.Panel(self, size=(10, 10))
98 legend_panel.SetBackgroundColour(cat.color)
99 if view_properties:
100 ct_type = CHECKBOX_TYPE
101 else:
102 ct_type = NO_CHECKBOX_TYPE
103 item = self.AppendItem(root_item, cat.name, ct_type=ct_type,
104 wnd=legend_panel, data=cat)
105 if view_properties:
106 visible = view_properties.category_visible(cat)
107 self.CheckItem2(item, visible)
108 self._update_categories_from_tree(subtree, item, view_properties)
109
111 (item, flags) = self.HitTest(e.GetPosition())
112 if item is not None:
113 self.SelectItem(item, True)
114 self._update_menu_enableness()
115 self.PopupMenu(self.mnu)
116
118 if self.GetFirstVisibleItem() is None:
119 return
120 keycode = e.GetKeyCode()
121 if keycode == wx.WXK_DELETE:
122 self.controller.delete_selected_category()
123 e.Skip()
124
127
130
133
135 tree_item = e.GetItem()
136 cat = tree_item.GetData()
137 tree_item_checked = tree_item.IsChecked()
138 self.controller.check_category(cat, tree_item_checked)
139
140
142
143 - def __init__(self, view, fn_handle_db_error):
144 self.view = view
145 self.db = None
146 self.timeline_view = None
147 self.fn_handle_db_error = fn_handle_db_error
148
150 self._change_active_db(db)
151 self.timeline_view = None
152 self._update_category_tree()
153
155 if view is None:
156 new_timeline = None
157 else:
158 new_timeline = view.get_timeline()
159 self._change_active_db(new_timeline)
160 self.timeline_view = view
161 self._update_category_tree()
162
165
170
175
182
186
193
197
213
214
218 gui_utils.show_modal(create_category_editor, fn_handle_db_error)
219
220
224 gui_utils.show_modal(create_category_editor, fn_handle_db_error)
225
226
228 delete_warning = _("Are you sure you want to "
229 "delete category '%s'?") % cat.name
230 if cat.parent is None:
231 update_warning = _("Events belonging to '%s' will no longer "
232 "belong to a category.") % cat.name
233 else:
234 update_warning = _("Events belonging to '%s' will now belong "
235 "to '%s'.") % (cat.name, cat.parent.name)
236 question = "%s\n\n%s" % (delete_warning, update_warning)
237 if _ask_question(question, parent_ctrl) == wx.YES:
238 try:
239 db.delete_category(cat)
240 except TimelineIOError, e:
241 fn_handle_db_error(e)
242
243
245 """
246 >>> version_str_to_tuple("0.4.44.3")
247 (0, 4, 44, 3)
248 """
249 return tuple([int(x) for x in version_str.split(".")])
250