198
195
self.tagtree = self.req.get_tag_tree()
199
196
self.tagtreeview = self.tv_factory.tags_treeview(self.tagtree)
201
self.tagtreeview.get_selection().connect('changed', \
198
self.tagtreeview.get_selection().connect('changed',
202
199
self.on_select_tag)
203
self.tagtreeview.connect('button-press-event', \
200
self.tagtreeview.connect('button-press-event',
204
201
self.on_tag_treeview_button_press_event)
205
self.tagtreeview.connect('key-press-event', \
202
self.tagtreeview.connect('key-press-event',
206
203
self.on_tag_treeview_key_press_event)
207
self.tagtreeview.connect('node-expanded', \
204
self.tagtreeview.connect('node-expanded',
208
205
self.on_tag_expanded)
209
self.tagtreeview.connect('node-collapsed', \
206
self.tagtreeview.connect('node-collapsed',
210
207
self.on_tag_collapsed)
211
208
self.sidebar_container.add(self.tagtreeview)
210
for path_t in self.config.get("expanded_tags"):
211
#the tuple was stored as a string. we have to reconstruct it
213
for p in path_t[1:-1].split(","):
218
self.tagtreeview.expand_node(path)
213
220
# expanding search tag does not work automatically, request it
214
221
self.expand_search_tag()
347
354
self.window.connect("destroy", self.quit)
349
356
# Active tasks TreeView
350
self.vtree_panes['active'].connect('row-activated', \
357
self.vtree_panes['active'].connect('row-activated',
351
358
self.on_edit_active_task)
352
self.vtree_panes['active'].connect('button-press-event', \
359
self.vtree_panes['active'].connect('button-press-event',
353
360
self.on_task_treeview_button_press_event)
354
self.vtree_panes['active'].connect('key-press-event', \
361
self.vtree_panes['active'].connect('key-press-event',
355
362
self.on_task_treeview_key_press_event)
356
self.vtree_panes['active'].connect('node-expanded', \
363
self.vtree_panes['active'].connect('node-expanded',
357
364
self.on_task_expanded)
358
self.vtree_panes['active'].connect('node-collapsed', \
365
self.vtree_panes['active'].connect('node-collapsed',
359
366
self.on_task_collapsed)
361
368
b_signals = BackendSignals()
362
369
b_signals.connect(b_signals.BACKEND_FAILED, self.on_backend_failed)
363
b_signals.connect(b_signals.BACKEND_STATE_TOGGLED, \
370
b_signals.connect(b_signals.BACKEND_STATE_TOGGLED,
364
371
self.remove_backend_infobar)
365
b_signals.connect(b_signals.INTERACTION_REQUESTED, \
372
b_signals.connect(b_signals.INTERACTION_REQUESTED,
366
373
self.on_backend_needing_interaction)
367
374
# Selection changes
368
375
self.selection = self.vtree_panes['active'].get_selection()
402
409
### HELPER FUNCTIONS ########################################################
403
410
def open_preferences(self, widget):
404
411
self.vmanager.open_preferences(self.config)
406
413
def open_plugins(self, widget):
407
414
self.vmanager.configure_plugins()
508
515
self.vtree_panes['active'].collapse_node(path)
510
for path_t in self.config.get("expanded_tags"):
511
#the tuple was stored as a string. we have to reconstruct it
513
for p in path_t[1:-1].split(","):
518
self.tagtreeview.expand_node(path)
520
517
self.set_view(self.config.get("view"))
522
519
def open_task(req, t):
563
560
def set_view(self, viewname):
564
561
if viewname == 'default':
565
self.req.unapply_global_filter(self.activetree,'workview')
562
self.req.unapply_global_filter(self.activetree, 'workview')
567
564
elif viewname == 'workview':
568
self.req.apply_global_filter(self.activetree,'workview')
565
self.req.apply_global_filter(self.activetree, 'workview')
571
568
raise Exception('Cannot set the view %s' %viewname)
583
580
parenthesis = _("no active tasks")
585
parenthesis = ngettext("%(tasks)d active task", \
586
"%(tasks)d active tasks", \
582
parenthesis = ngettext("%(tasks)d active task",
583
"%(tasks)d active tasks",
587
584
count) % {'tasks': count}
588
585
self.window.set_title("%s - "%parenthesis + info.NAME)
610
607
### SIGNAL CALLBACKS ##########################################################
611
608
# Typically, reaction to user input & interactions with the GUI
614
610
def on_sort_column_changed(self, model):
615
611
sort_column, sort_order = model.get_sort_column_id()
688
684
self.vtree_panes['closed'] = \
689
685
self.tv_factory.closed_tasks_treeview(ctree)
690
686
# Closed tasks TreeView
691
self.vtree_panes['closed'].connect('row-activated', \
687
self.vtree_panes['closed'].connect('row-activated',
692
688
self.on_edit_done_task)
693
self.vtree_panes['closed'].connect('button-press-event', \
689
self.vtree_panes['closed'].connect('button-press-event',
694
690
self.on_closed_task_treeview_button_press_event)
695
self.vtree_panes['closed'].connect('key-press-event', \
691
self.vtree_panes['closed'].connect('key-press-event',
696
692
self.on_closed_task_treeview_key_press_event)
698
694
self.closed_selection = self.vtree_panes['closed'].get_selection()
980
976
def on_delete_tasks(self, widget=None, tid=None):
981
977
#If we don't have a parameter, then take the selection in the treeview
983
#tid_to_delete is a [project,task] tuple
979
#tid_to_delete is a [project, task] tuple
984
980
tids_todelete = self.get_selected_tasks()
985
981
if not tids_todelete:
1110
1106
task.set_status(Task.STA_DISMISSED)
1111
1107
self.close_all_task_editors(uid)
1113
def apply_filter_on_panes(self, filter_name,refresh=True):
1109
def apply_filter_on_panes(self, filter_name, refresh=True):
1114
1110
""" Apply filters for every pane: active tasks, closed tasks """
1115
1111
for pane in self.vtree_panes:
1116
1112
vtree = self.req.get_tasks_tree(name=pane, refresh=False)
1117
1113
vtree.apply_filter(filter_name, refresh=refresh)
1119
def unapply_filter_on_panes(self, filter_name,refresh=True):
1115
def unapply_filter_on_panes(self, filter_name, refresh=True):
1120
1116
""" Apply filters for every pane: active tasks, closed tasks """
1121
1117
for pane in self.vtree_panes:
1122
1118
vtree = self.req.get_tasks_tree(name=pane, refresh=False)
1131
1127
#When you click on a tag, you want to unselect the tasks
1132
1128
new_taglist = self.get_selected_tags()
1134
1130
for tagname in self.applied_tags:
1135
1131
if tagname not in new_taglist:
1136
self.unapply_filter_on_panes(tagname,refresh=False)
1132
self.unapply_filter_on_panes(tagname, refresh=False)
1138
1134
for tagname in new_taglist:
1139
1135
if tagname not in self.applied_tags:
1140
1136
self.apply_filter_on_panes(tagname)
1143
1139
tag = self.req.get_tag(tagname)
1144
1140
if tag.is_search_tag():
1145
1141
self.quickadd_entry.set_text(tag.get_attribute("query"))
1147
1143
self.applied_tags = new_taglist
1149
1145
def on_taskdone_cursor_changed(self, selection=None):
1434
1430
infobar = self._new_infobar(backend_id)
1435
1431
infobar.set_error_code(error_code)
1437
def on_backend_needing_interaction(self, sender, backend_id, description, \
1433
def on_backend_needing_interaction(self, sender, backend_id, description,
1438
1434
interaction_type, callback):
1440
1436
Signal callback.
1481
1477
if not backend or (backend and backend.is_enabled()):
1482
1478
#remove old infobar related to backend_id, if any
1483
1479
if self.vbox_toolbars:
1484
self.vbox_toolbars.foreach(self.__remove_backend_infobar, \
1480
self.vbox_toolbars.foreach(self.__remove_backend_infobar,
1487
1483
def _new_infobar(self, backend_id):