~parinporecha/gtg/config_parser_bug

« back to all changes in this revision

Viewing changes to GTG/gtk/browser/browser.py

  • Committer: Izidor Matušov
  • Date: 2013-02-25 07:35:07 UTC
  • Revision ID: izidor.matusov@gmail.com-20130225073507-vgts69uthx7z2run
PEP8ification by Nimit

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
""" The main window for GTG, listing tags, and open and closed tasks """
21
21
 
22
22
#=== IMPORT ===================================================================
23
 
#system imports
 
23
# system imports
24
24
import time
25
25
import threading
26
26
from webbrowser import open as openurl
30
30
import gobject
31
31
import gtk
32
32
 
33
 
#our own imports
 
33
# our own imports
34
34
from GTG import _, info, ngettext
35
35
from GTG.backends.backendsignals import BackendSignals
36
36
from GTG.core import CoreConfig
66
66
    __none_signal__ = (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, tuple())
67
67
    __gsignals__ = {'task-added-via-quick-add': __string_signal__,
68
68
                    'visibility-toggled': __none_signal__,
69
 
   }
 
69
                    }
70
70
 
71
71
    def __init__(self, requester, vmanager):
72
72
        gobject.GObject.__init__(self)
77
77
        self.tag_active = False
78
78
        self.applied_tags = []
79
79
 
80
 
        #treeviews handlers
 
80
        # treeviews handlers
81
81
        self.vtree_panes = {}
82
82
        self.tv_factory = TreeviewFactory(self.req, self.config)
83
83
        self.activetree = self.req.get_tasks_tree(name='active', refresh=False)
84
84
        self.vtree_panes['active'] = \
85
 
                self.tv_factory.active_tasks_treeview(self.activetree)
 
85
            self.tv_factory.active_tasks_treeview(self.activetree)
86
86
 
87
87
        ### YOU CAN DEFINE YOUR INTERNAL MECHANICS VARIABLES BELOW
88
88
        self.in_toggle_workview = False
107
107
        # Init non-glade widgets
108
108
        self._init_ui_widget()
109
109
 
110
 
        #Set the tooltip for the toolbar buttons
 
110
        # Set the tooltip for the toolbar buttons
111
111
        self._init_toolbar_tooltips()
112
112
 
113
113
        # Initialize "About" dialog
114
114
        self._init_about_dialog()
115
115
 
116
 
        #Create our dictionary and connect it
 
116
        # Create our dictionary and connect it
117
117
        self._init_signal_connections()
118
118
 
119
119
        # Define accelerator keys
127
127
        self.on_select_tag()
128
128
        self.browser_shown = False
129
129
 
130
 
        #Update the title when a task change
 
130
        # Update the title when a task change
131
131
        self.activetree.register_cllbck('node-added-inview',
132
 
            self._update_window_title)
 
132
                                        self._update_window_title)
133
133
        self.activetree.register_cllbck('node-deleted-inview',
134
 
            self._update_window_title)
 
134
                                        self._update_window_title)
135
135
        self._update_window_title()
136
136
 
137
137
### INIT HELPER FUNCTIONS #####################################################
197
197
        # The tags treeview
198
198
        self.tagtree = self.req.get_tag_tree()
199
199
        self.tagtreeview = self.tv_factory.tags_treeview(self.tagtree)
200
 
        #Tags treeview
 
200
        # Tags treeview
201
201
        self.tagtreeview.get_selection().connect('changed',
202
 
            self.on_select_tag)
 
202
                                                 self.on_select_tag)
203
203
        self.tagtreeview.connect('button-press-event',
204
 
            self.on_tag_treeview_button_press_event)
 
204
                                 self.on_tag_treeview_button_press_event)
205
205
        self.tagtreeview.connect('key-press-event',
206
 
            self.on_tag_treeview_key_press_event)
 
206
                                 self.on_tag_treeview_key_press_event)
207
207
        self.tagtreeview.connect('node-expanded',
208
 
            self.on_tag_expanded)
 
208
                                 self.on_tag_expanded)
209
209
        self.tagtreeview.connect('node-collapsed',
210
 
            self.on_tag_collapsed)
 
210
                                 self.on_tag_collapsed)
211
211
        self.sidebar_container.add(self.tagtreeview)
212
212
 
213
213
        for path_t in self.config.get("expanded_tags"):
214
 
            #the tuple was stored as a string. we have to reconstruct it
 
214
            # the tuple was stored as a string. we have to reconstruct it
215
215
            path = ()
216
216
            for p in path_t[1:-1].split(","):
217
217
                p = p.strip(" '")
236
236
            GnomeConfig.WORKVIEW_TOGGLE_TOOLTIP)
237
237
        self.quickadd_entry.set_tooltip_text(
238
238
            GnomeConfig.QUICKADD_ENTRY_TOOLTIP)
 
239
        quickadd_icon_tooltip = GnomeConfig.QUICKADD_ICON_TOOLTIP
239
240
        self.quickadd_entry.set_icon_tooltip_text(1,
240
 
            GnomeConfig.QUICKADD_ICON_TOOLTIP)
 
241
                                                  quickadd_icon_tooltip)
241
242
 
242
243
    def _init_about_dialog(self):
243
244
        """
258
259
        """
259
260
        SIGNAL_CONNECTIONS_DIC = {
260
261
            "on_add_task":
261
 
                self.on_add_task,
 
262
            self.on_add_task,
262
263
            "on_edit_active_task":
263
 
                self.on_edit_active_task,
 
264
            self.on_edit_active_task,
264
265
            "on_edit_done_task":
265
 
                self.on_edit_done_task,
 
266
            self.on_edit_done_task,
266
267
            "on_delete_task":
267
 
                self.on_delete_tasks,
 
268
            self.on_delete_tasks,
268
269
            "on_modify_tags":
269
 
                self.on_modify_tags,
 
270
            self.on_modify_tags,
270
271
            "on_mark_as_done":
271
 
                self.on_mark_as_done,
 
272
            self.on_mark_as_done,
272
273
            "on_mark_as_started":
273
 
                self.on_mark_as_started,
 
274
            self.on_mark_as_started,
274
275
            "on_start_for_tomorrow":
275
 
                self.on_start_for_tomorrow,
 
276
            self.on_start_for_tomorrow,
276
277
            "on_start_for_next_week":
277
 
                self.on_start_for_next_week,
 
278
            self.on_start_for_next_week,
278
279
            "on_start_for_next_month":
279
 
                self.on_start_for_next_month,
 
280
            self.on_start_for_next_month,
280
281
            "on_start_for_next_year":
281
 
                self.on_start_for_next_year,
 
282
            self.on_start_for_next_year,
282
283
            "on_start_clear":
283
 
                self.on_start_clear,
 
284
            self.on_start_clear,
284
285
            "on_set_due_today":
285
 
                self.on_set_due_today,
 
286
            self.on_set_due_today,
286
287
            "on_set_due_tomorrow":
287
 
                self.on_set_due_tomorrow,
 
288
            self.on_set_due_tomorrow,
288
289
            "on_set_due_next_week":
289
 
                self.on_set_due_next_week,
 
290
            self.on_set_due_next_week,
290
291
            "on_set_due_next_month":
291
 
                self.on_set_due_next_month,
 
292
            self.on_set_due_next_month,
292
293
            "on_set_due_next_year":
293
 
                self.on_set_due_next_year,
 
294
            self.on_set_due_next_year,
294
295
            "on_set_due_now":
295
 
                self.on_set_due_now,
 
296
            self.on_set_due_now,
296
297
            "on_set_due_soon":
297
 
                self.on_set_due_soon,
 
298
            self.on_set_due_soon,
298
299
            "on_set_due_someday":
299
 
                self.on_set_due_someday,
 
300
            self.on_set_due_someday,
300
301
            "on_set_due_clear":
301
 
                self.on_set_due_clear,
 
302
            self.on_set_due_clear,
302
303
            "on_dismiss_task":
303
 
                self.on_dismiss_task,
 
304
            self.on_dismiss_task,
304
305
            "on_move":
305
 
                self.on_move,
 
306
            self.on_move,
306
307
            "on_size_allocate":
307
 
                self.on_size_allocate,
 
308
            self.on_size_allocate,
308
309
            "gtk_main_quit":
309
 
                self.on_close,
 
310
            self.on_close,
310
311
            "on_add_subtask":
311
 
                self.on_add_subtask,
 
312
            self.on_add_subtask,
312
313
            "on_tagcontext_deactivate":
313
 
                self.on_tagcontext_deactivate,
 
314
            self.on_tagcontext_deactivate,
314
315
            "on_workview_toggled":
315
 
                self.on_workview_toggled,
 
316
            self.on_workview_toggled,
316
317
            "on_view_workview_toggled":
317
 
                self.on_workview_toggled,
 
318
            self.on_workview_toggled,
318
319
            "on_view_closed_toggled":
319
 
                self.on_closed_toggled,
 
320
            self.on_closed_toggled,
320
321
            "on_view_sidebar_toggled":
321
 
                self.on_sidebar_toggled,
 
322
            self.on_sidebar_toggled,
322
323
            "on_quickadd_field_activate":
323
 
                self.on_quickadd_activate,
 
324
            self.on_quickadd_activate,
324
325
            "on_quickadd_field_icon_press":
325
 
                self.on_quickadd_iconpress,
 
326
            self.on_quickadd_iconpress,
326
327
            "on_quickadd_field_changed":
327
 
                self.on_quickadd_changed,
 
328
            self.on_quickadd_changed,
328
329
            "on_quickadd_entrycompletion_action_activated":
329
 
                self.on_entrycompletion_action_activated,
 
330
            self.on_entrycompletion_action_activated,
330
331
            "on_view_quickadd_toggled":
331
 
                self.on_toggle_quickadd,
 
332
            self.on_toggle_quickadd,
332
333
            "on_view_toolbar_toggled":
333
 
                self.on_toolbar_toggled,
 
334
            self.on_toolbar_toggled,
334
335
            "on_about_clicked":
335
 
                self.on_about_clicked,
 
336
            self.on_about_clicked,
336
337
            "on_about_delete":
337
 
                self.on_about_close,
 
338
            self.on_about_close,
338
339
            "on_about_close":
339
 
                self.on_about_close,
 
340
            self.on_about_close,
340
341
            "on_documentation_clicked":
341
 
                lambda w: openurl(info.HELP_URI),
 
342
            lambda w: openurl(info.HELP_URI),
342
343
            "on_translate_clicked":
343
 
                lambda w: openurl(info.TRANSLATE_URL),
 
344
            lambda w: openurl(info.TRANSLATE_URL),
344
345
            "on_report_bug_clicked":
345
 
                lambda w: openurl(info.REPORT_BUG_URL),
 
346
            lambda w: openurl(info.REPORT_BUG_URL),
346
347
            "on_preferences_activate":
347
 
                self.open_preferences,
 
348
            self.open_preferences,
348
349
            "on_edit_plugins_activate":
349
 
                self.open_plugins,
 
350
            self.open_plugins,
350
351
            "on_edit_backends_activate":
351
 
                self.open_edit_backends,
 
352
            self.open_edit_backends,
352
353
        }
353
354
        self.builder.connect_signals(SIGNAL_CONNECTIONS_DIC)
354
355
 
357
358
 
358
359
        # Active tasks TreeView
359
360
        self.vtree_panes['active'].connect('row-activated',
360
 
            self.on_edit_active_task)
 
361
                                           self.on_edit_active_task)
 
362
        tsk_treeview_btn_press = self.on_task_treeview_button_press_event
361
363
        self.vtree_panes['active'].connect('button-press-event',
362
 
            self.on_task_treeview_button_press_event)
 
364
                                           tsk_treeview_btn_press)
 
365
        task_treeview_key_press = self.on_task_treeview_key_press_event
363
366
        self.vtree_panes['active'].connect('key-press-event',
364
 
            self.on_task_treeview_key_press_event)
 
367
                                           task_treeview_key_press)
365
368
        self.vtree_panes['active'].connect('node-expanded',
366
 
            self.on_task_expanded)
 
369
                                           self.on_task_expanded)
367
370
        self.vtree_panes['active'].connect('node-collapsed',
368
 
            self.on_task_collapsed)
 
371
                                           self.on_task_collapsed)
369
372
 
370
373
        b_signals = BackendSignals()
371
374
        b_signals.connect(b_signals.BACKEND_FAILED, self.on_backend_failed)
395
398
        self._add_accelerator_for_widget(agr, "edit_redo", "<Control>y")
396
399
        self._add_accelerator_for_widget(agr, "new_task_mi", "<Control>n")
397
400
        self._add_accelerator_for_widget(agr, "new_subtask_mi",
398
 
            "<Control><Shift>n")
 
401
                                         "<Control><Shift>n")
399
402
        self._add_accelerator_for_widget(agr, "edit_mi", "Return")
400
403
        self._add_accelerator_for_widget(agr, "done_mi", "<Control>d")
401
404
        self._add_accelerator_for_widget(agr, "dismiss_mi", "<Control>i")
406
409
        quickadd_field = self.builder.get_object("quickadd_field")
407
410
        key, mod = gtk.accelerator_parse("<Control>l")
408
411
        quickadd_field.add_accelerator("grab-focus", agr, key, mod,
409
 
            gtk.ACCEL_VISIBLE)
 
412
                                       gtk.ACCEL_VISIBLE)
410
413
 
411
414
### HELPER FUNCTIONS ########################################################
412
415
    def open_preferences(self, widget):
464
467
            self.builder.get_object("view_sidebar").set_active(True)
465
468
            if not self.tagtreeview:
466
469
                self.init_tags_sidebar()
467
 
 
468
 
            # for applying the last used tag                
469
 
            taglist = self.config.get("last_selected_tag")
470
 
            model = self.tagtreeview.get_model()
471
 
            for tag_name in taglist:
472
 
                path = self.tagtree.get_paths_for_node(tag_name)[0]
473
 
                tag_iter = model.my_get_iter(path)
474
 
 
475
 
                selection = self.tagtreeview.get_selection()
476
 
                selection.select_iter(tag_iter)
477
 
 
478
470
            self.sidebar.show()
479
 
            self.on_select_tag()
480
 
 
481
471
 
482
472
        sidebar_width = self.config.get("sidebar_width")
483
473
        self.builder.get_object("hpaned1").set_position(sidebar_width)
484
474
        self.builder.get_object("hpaned1").connect('notify::position',
485
 
            self.on_sidebar_width)
 
475
                                                   self.on_sidebar_width)
486
476
 
487
477
        closed_task_pane = self.config.get("closed_task_pane")
488
478
        if not closed_task_pane:
492
482
 
493
483
        botpos = self.config.get("bottom_pane_position")
494
484
        self.builder.get_object("vpaned1").set_position(botpos)
 
485
        on_bottom_pan_position = self.on_bottom_pane_position
495
486
        self.builder.get_object("vpaned1").connect('notify::position',
496
 
            self.on_bottom_pane_position)
 
487
                                                   on_bottom_pan_position)
497
488
 
498
489
        toolbar = self.config.get("toolbar")
499
490
        if toolbar:
520
511
            model.set_sort_column_id(sort_column, sort_order)
521
512
 
522
513
        for path_s in self.config.get("collapsed_tasks"):
523
 
            #the tuple was stored as a string. we have to reconstruct it
 
514
            # the tuple was stored as a string. we have to reconstruct it
524
515
            path = ()
525
516
            for p in path_s[1:-1].split(","):
526
517
                p = p.strip(" '")
580
571
            self.req.apply_global_filter(self.activetree, 'workview')
581
572
            workview = True
582
573
        else:
583
 
            raise Exception('Cannot set the view %s' %viewname)
 
574
            raise Exception('Cannot set the view %s' % viewname)
584
575
        self.menu_view_workview.set_active(workview)
585
576
        self.toggle_workview.set_active(workview)
586
 
        #The config_set has to be after the toggle, else you will have a loop
 
577
        # The config_set has to be after the toggle, else you will have a loop
587
578
        self.config.set('view', viewname)
588
579
        self.vtree_panes['active'].set_col_visible('startdate', not workview)
589
580
 
590
581
    def _update_window_title(self, nid=None, path=None, state_id=None):
591
582
        count = self.activetree.get_n_nodes()
592
 
        #Set the title of the window:
 
583
        # Set the title of the window:
593
584
        parenthesis = ""
594
585
        if count == 0:
595
586
            parenthesis = _("no active tasks")
597
588
            parenthesis = ngettext("%(tasks)d active task",
598
589
                                   "%(tasks)d active tasks",
599
590
                                   count) % {'tasks': count}
600
 
        self.window.set_title("%s - "%parenthesis + info.NAME)
 
591
        self.window.set_title("%s - " % parenthesis + info.NAME)
601
592
 
602
593
    def _add_page(self, notebook, label, page):
603
594
        notebook.append_page(page, label)
633
624
        self.config.set('tasklist_sort_column', sort_column)
634
625
        self.config.set('tasklist_sort_order', sort_order)
635
626
 
636
 
    def on_move(self, widget = None, data = None):
 
627
    def on_move(self, widget=None, data=None):
637
628
        xpos, ypos = self.window.get_position()
638
629
        self.config.set('x_pos', xpos)
639
630
        self.config.set('y_pos', ypos)
640
631
 
641
 
    def on_size_allocate(self, widget = None, data = None):
 
632
    def on_size_allocate(self, widget=None, data=None):
642
633
        width, height = self.window.get_size()
643
634
        self.config.set('width', width)
644
635
        self.config.set('height', height)
645
636
 
646
 
    def on_bottom_pane_position(self, widget, data = None):
 
637
    def on_bottom_pane_position(self, widget, data=None):
647
638
        self.config.set('bottom_pane_position', widget.get_position())
648
639
 
649
 
    def on_sidebar_width(self, widget, data = None):
 
640
    def on_sidebar_width(self, widget, data=None):
650
641
        self.config.set('sidebar_width', widget.get_position())
651
642
 
652
643
    def on_about_clicked(self, widget):
697
688
        if not 'closed' in self.vtree_panes:
698
689
            ctree = self.__create_closed_tree()
699
690
            self.vtree_panes['closed'] = \
700
 
                         self.tv_factory.closed_tasks_treeview(ctree)
 
691
                self.tv_factory.closed_tasks_treeview(ctree)
701
692
                    # Closed tasks TreeView
702
693
            self.vtree_panes['closed'].connect('row-activated',
703
 
                self.on_edit_done_task)
 
694
                                               self.on_edit_done_task)
 
695
            # I did not want to break the variable and there was no other
 
696
            # option except this name:(Nimit)
 
697
            clsd_tsk_btn_prs = self.on_closed_task_treeview_button_press_event
704
698
            self.vtree_panes['closed'].connect('button-press-event',
705
 
                self.on_closed_task_treeview_button_press_event)
 
699
                                               clsd_tsk_btn_prs)
 
700
            clsd_tsk_key_prs = self.on_closed_task_treeview_key_press_event
706
701
            self.vtree_panes['closed'].connect('key-press-event',
707
 
                self.on_closed_task_treeview_key_press_event)
 
702
                                               clsd_tsk_key_prs)
708
703
 
709
704
            self.closed_selection = self.vtree_panes['closed'].get_selection()
710
705
            self.closed_selection.connect("changed",
711
 
                self.on_taskdone_cursor_changed)
 
706
                                          self.on_taskdone_cursor_changed)
712
707
            ctree.apply_filter(self.get_selected_tags()[0], refresh=True)
713
708
        if not self.closed_pane:
714
709
            self.closed_pane = gtk.ScrolledWindow()
715
710
            self.closed_pane.set_size_request(-1, 100)
716
711
            self.closed_pane.set_policy(gtk.POLICY_AUTOMATIC,
717
 
                gtk.POLICY_AUTOMATIC)
 
712
                                        gtk.POLICY_AUTOMATIC)
718
713
            self.closed_pane.add(self.vtree_panes['closed'])
719
714
 
720
715
        elif self.accessory_notebook.page_num(self.closed_pane) != -1:
726
721
        self.config.set('closed_task_pane', True)
727
722
 
728
723
    def hide_closed_pane(self):
729
 
        #If we destroy completely the vtree, we cannot display it anymore
730
 
        #Check is to hide/show the closed task pane multiple times.
731
 
        #I let this code commented for now because it might be useful
732
 
        #for performance reason, to really destroy the view when we don't
733
 
        #display it. (Lionel, 17092010)
 
724
        # If we destroy completely the vtree, we cannot display it anymore
 
725
        # Check is to hide/show the closed task pane multiple times.
 
726
        # I let this code commented for now because it might be useful
 
727
        # for performance reason, to really destroy the view when we don't
 
728
        # display it. (Lionel, 17092010)
734
729
#        if self.vtree_panes.has_key('closed'):
735
730
#            self.vtree_panes['closed'].set_model(None)
736
731
#            del self.vtree_panes['closed']
762
757
        tid_build = []
763
758
        current_iter = iter
764
759
        while current_iter is not None:
765
 
            tid = str(model.get_value(current_iter,0))
 
760
            tid = str(model.get_value(current_iter, 0))
766
761
            tid_build.insert(0, tid)
767
762
            current_iter = model.iter_parent(current_iter)
768
763
        tid = str(tuple(tid_build))
810
805
            # select. So, we have to wait for the task to be created, and then
811
806
            # wait for its tid to show up (invernizzi)
812
807
            def select_next_added_task_in_browser(treemodelsort, path,
813
 
                iter, self):
 
808
                                                  iter, self):
814
809
 
815
810
                def selecter(treemodelsort, path, iter, self):
816
811
                    self.__last_quick_added_tid_event.wait()
817
812
                    treeview = self.vtree_panes['active']
818
813
                    tid = self.activetree.get_node_for_path(path)
819
814
                    if self.__last_quick_added_tid == tid:
820
 
                        #this is the correct task
 
815
                        # this is the correct task
821
816
                        treemodelsort.disconnect(
822
817
                            self.__quick_add_select_handle)
823
818
                        selection = treeview.get_selection()
824
819
                        selection.unselect_all()
825
820
                        selection.select_path(path)
826
821
 
827
 
                #It cannot be another thread than the main gtk thread !
 
822
                # It cannot be another thread than the main gtk thread !
828
823
                gobject.idle_add(selecter, treemodelsort, path, iter, self)
829
 
            #event that is set when the new task is created
 
824
            # event that is set when the new task is created
830
825
            self.__last_quick_added_tid_event = threading.Event()
831
826
            self.__quick_add_select_handle = \
832
 
                    self.vtree_panes['active'].get_model().connect(
833
 
                        "row-inserted", select_next_added_task_in_browser,
834
 
                        self)
 
827
                self.vtree_panes['active'].get_model().connect(
 
828
                    "row-inserted", select_next_added_task_in_browser,
 
829
                    self)
835
830
            task = self.req.new_task(newtask=True)
836
831
            self.__last_quick_added_tid = task.get_id()
837
832
            self.__last_quick_added_tid_event.set()
838
833
            task.set_complex_title(text, tags=tags)
839
834
            self.quickadd_entry.set_text('')
840
835
 
841
 
            #signal the event for the plugins to catch
 
836
            # signal the event for the plugins to catch
842
837
            gobject.idle_add(self.emit, "task-added-via-quick-add",
843
838
                             task.get_id())
844
839
        else:
845
 
            #if no text is selected, we open the currently selected task
 
840
            # if no text is selected, we open the currently selected task
846
841
            nids = self.vtree_panes['active'].get_selected_nodes()
847
842
            for nid in nids:
848
843
                self.vmanager.open_task(nid)
864
859
            time = event.time
865
860
            pthinfo = treeview.get_path_at_pos(x, y)
866
861
            if pthinfo is not None:
867
 
                path, col, cellx, celly = pthinfo #pylint: disable-msg=W0612
 
862
                path, col, cellx, celly = pthinfo  # pylint: disable-msg=W0612
868
863
                treeview.grab_focus()
869
864
                # The location we want the cursor to return to
870
865
                # after we're done.
878
873
                # later on.
879
874
                self.target_cursor = path, col
880
875
                treeview.set_cursor(path, col, 0)
881
 
                #the nospecial=True disable right clicking for special tags
 
876
                # the nospecial=True disable right clicking for special tags
882
877
                selected_tags = self.get_selected_tags(nospecial=True)
883
878
                selected_search = self.get_selected_search()
884
 
                #popup menu for searches
 
879
                # popup menu for searches
885
880
                if selected_search is not None:
886
881
                    my_tag = self.req.get_tag(selected_search)
887
882
                    self.tagpopup.set_tag(my_tag)
900
895
    def on_tag_treeview_key_press_event(self, treeview, event):
901
896
        keyname = gtk.gdk.keyval_name(event.keyval)
902
897
        is_shift_f10 = (keyname == "F10" and
903
 
            event.get_state() & gtk.gdk.SHIFT_MASK)
 
898
                        event.get_state() & gtk.gdk.SHIFT_MASK)
904
899
        if is_shift_f10 or keyname == "Menu":
905
900
            selected_tags = self.get_selected_tags(nospecial=True)
906
901
            selected_search = self.get_selected_search()
907
 
            #popup menu for searches
 
902
            # popup menu for searches
908
903
            if selected_search is not None:
909
904
                self.searchpopup.popup(None, None, None, 0, event.time)
910
905
            elif len(selected_tags) > 0:
943
938
    def on_task_treeview_key_press_event(self, treeview, event):
944
939
        keyname = gtk.gdk.keyval_name(event.keyval)
945
940
        is_shift_f10 = (keyname == "F10" and
946
 
            event.get_state() & gtk.gdk.SHIFT_MASK)
 
941
                        event.get_state() & gtk.gdk.SHIFT_MASK)
947
942
 
948
943
        if keyname == "Delete":
949
944
            self.on_delete_tasks()
968
963
    def on_closed_task_treeview_key_press_event(self, treeview, event):
969
964
        keyname = gtk.gdk.keyval_name(event.keyval)
970
965
        is_shift_f10 = (keyname == "F10" and
971
 
            event.get_state() & gtk.gdk.SHIFT_MASK)
 
966
                        event.get_state() & gtk.gdk.SHIFT_MASK)
972
967
 
973
968
        if keyname == "Delete":
974
969
            self.on_delete_tasks()
991
986
            zetask = self.req.get_task(uid)
992
987
            tags = [t.get_name() for t in zetask.get_tags()]
993
988
            task = self.req.new_task(tags=tags, newtask=True)
994
 
            #task.add_parent(uid)
 
989
            # task.add_parent(uid)
995
990
            zetask.add_child(task.get_id())
996
991
            self.vmanager.open_task(task.get_id(), thisisnew=True)
997
992
 
1006
1001
            self.vmanager.open_task(tid)
1007
1002
 
1008
1003
    def on_delete_tasks(self, widget=None, tid=None):
1009
 
        #If we don't have a parameter, then take the selection in the treeview
 
1004
        # If we don't have a parameter, then take the selection in the
 
1005
        # treeview
1010
1006
        if not tid:
1011
 
            #tid_to_delete is a [project, task] tuple
 
1007
            # tid_to_delete is a [project, task] tuple
1012
1008
            tids_todelete = self.get_selected_tasks()
1013
1009
            if not tids_todelete:
1014
1010
                return
1019
1015
 
1020
1016
    def update_start_date(self, widget, new_start_date):
1021
1017
        tasks = [self.req.get_task(uid)
1022
 
            for uid in self.get_selected_tasks()
1023
 
            if uid is not None]
 
1018
                 for uid in self.get_selected_tasks()
 
1019
                 if uid is not None]
1024
1020
 
1025
1021
        start_date = Date.parse(new_start_date)
1026
1022
 
1027
 
        #FIXME: If the task dialog is displayed, refresh its start_date widget
 
1023
        # FIXME:If the task dialog is displayed, refresh its start_date widget
1028
1024
        for task in tasks:
1029
1025
            task.set_start_date(start_date)
1030
1026
 
1048
1044
 
1049
1045
    def update_due_date(self, widget, new_due_date):
1050
1046
        tasks = [self.req.get_task(uid)
1051
 
            for uid in self.get_selected_tasks()
1052
 
            if uid is not None]
 
1047
                 for uid in self.get_selected_tasks()
 
1048
                 if uid is not None]
1053
1049
 
1054
1050
        due_date = Date.parse(new_due_date)
1055
1051
 
1056
 
        #FIXME: If the task dialog is displayed, refresh its due_date widget
 
1052
        # FIXME: If the task dialog is displayed, refresh its due_date widget
1057
1053
        for task in tasks:
1058
1054
            task.set_due_date(due_date)
1059
1055
 
1106
1102
 
1107
1103
    def on_mark_as_done(self, widget):
1108
1104
        tasks_uid = [uid for uid in self.get_selected_tasks()
1109
 
                        if uid is not None]
 
1105
                     if uid is not None]
1110
1106
        if len(tasks_uid) == 0:
1111
1107
            return
1112
1108
        tasks = [self.req.get_task(uid) for uid in tasks_uid]
1126
1122
 
1127
1123
    def on_dismiss_task(self, widget):
1128
1124
        tasks_uid = [uid for uid in self.get_selected_tasks()
1129
 
                        if uid is not None]
 
1125
                     if uid is not None]
1130
1126
        if len(tasks_uid) == 0:
1131
1127
            return
1132
1128
        tasks = [self.req.get_task(uid) for uid in tasks_uid]
1156
1152
        """
1157
1153
        # FIXME add support for multiple selection of tags in future
1158
1154
 
1159
 
        #When you click on a tag, you want to unselect the tasks
 
1155
        # When you click on a tag, you want to unselect the tasks
1160
1156
        new_taglist = self.get_selected_tags()
1161
1157
 
1162
 
        self.config.set_lst("last_selected_tag", new_taglist)
1163
 
 
1164
1158
        for tagname in self.applied_tags:
1165
1159
            if tagname not in new_taglist:
1166
1160
                self.unapply_filter_on_panes(tagname, refresh=False)
1188
1182
                           "tooltip": GnomeConfig.MARK_UNDONE_TOOLTIP,
1189
1183
                           "icon-name": "gtg-task-undone"}
1190
1184
        settings_dismiss = {"label": GnomeConfig.MARK_DISMISS,
1191
 
                           "tooltip": GnomeConfig.MARK_DISMISS_TOOLTIP,
1192
 
                           "icon-name": "gtg-task-dismiss"}
 
1185
                            "tooltip": GnomeConfig.MARK_DISMISS_TOOLTIP,
 
1186
                            "icon-name": "gtg-task-dismiss"}
1193
1187
        settings_undismiss = {"label": GnomeConfig.MARK_UNDISMISS,
1194
1188
                              "tooltip": GnomeConfig.MARK_UNDISMISS_TOOLTIP,
1195
1189
                              "icon-name": "gtg-task-undismiss"}
1205
1199
            menu_item.set_image(image)
1206
1200
            menu_item.set_label(settings["label"])
1207
1201
 
1208
 
        #We unselect all in the active task view
1209
 
        #Only if something is selected in the closed task list
1210
 
        #And we change the status of the Done/dismiss button
 
1202
        # We unselect all in the active task view
 
1203
        # Only if something is selected in the closed task list
 
1204
        # And we change the status of the Done/dismiss button
1211
1205
        update_button(self.donebutton, settings_done)
1212
1206
        update_menu_item(self.done_mi, settings_done)
1213
1207
        update_button(self.dismissbutton, settings_dismiss)
1236
1230
 
1237
1231
        Changes the way the selected task is displayed.
1238
1232
        """
1239
 
        #We unselect all in the closed task view
1240
 
        #Only if something is selected in the active task list
 
1233
        # We unselect all in the closed task view
 
1234
        # Only if something is selected in the active task list
1241
1235
        self.donebutton.set_icon_name("gtg-task-done")
1242
1236
        self.dismissbutton.set_icon_name("gtg-task-dismiss")
1243
1237
        if selection.count_selected_rows() > 0:
1250
1244
 
1251
1245
    def on_close(self, widget=None):
1252
1246
        """Closing the window."""
1253
 
        #Saving is now done in main.py
 
1247
        # Saving is now done in main.py
1254
1248
        self.quit()
1255
1249
 
1256
 
    #using dummy parameters that are given by the signal
 
1250
    # using dummy parameters that are given by the signal
1257
1251
    def update_buttons_sensitivity(self, a=None, b=None, c=None):
1258
1252
        enable = self.selection.count_selected_rows()
1259
1253
        if 'closed' in self.vtree_panes:
1279
1273
        """
1280
1274
        ids = self.get_selected_tasks(tv)
1281
1275
        if len(ids) > 0:
1282
 
            #FIXME: we should also unselect all the others
 
1276
            # FIXME: we should also unselect all the others
1283
1277
            return ids[0]
1284
1278
        else:
1285
1279
            return None
1292
1286
        @param tv: The tree view to find the selected task in. Defaults to
1293
1287
            the task_tview.
1294
1288
        """
1295
 
        #FIXME Why we have active as back case? is that so? Study this code
 
1289
        # FIXME Why we have active as back case? is that so? Study this code
1296
1290
        selected = []
1297
1291
        if tv:
1298
1292
            selected = self.vtree_panes[tv].get_selected_nodes()
1304
1298
                    selected = self.vtree_panes[i].get_selected_nodes()
1305
1299
        return selected
1306
1300
 
1307
 
    #If nospecial=True, only normal @tag are considered
 
1301
    # If nospecial=True, only normal @tag are considered
1308
1302
    def get_selected_tags(self, nospecial=False):
1309
1303
        """
1310
1304
        Returns the selected nodes from the tagtree
1314
1308
        taglist = []
1315
1309
        if self.tagtreeview:
1316
1310
            taglist = self.tagtreeview.get_selected_nodes()
1317
 
        #If no selection, we display all
 
1311
        # If no selection, we display all
1318
1312
        if not nospecial and (not taglist or len(taglist) < 0):
1319
1313
            taglist = ['gtg-tags-all']
1320
1314
        if nospecial:
1407
1401
    def show(self):
1408
1402
        """ Unhides the TaskBrowser """
1409
1403
        self.browser_shown = True
1410
 
        #redraws the GDK window, bringing it to front
 
1404
        # redraws the GDK window, bringing it to front
1411
1405
        self.window.show()
1412
1406
        self.window.present()
1413
1407
        self.window.grab_focus()
1483
1477
        '''
1484
1478
        infobar = self._new_infobar(backend_id)
1485
1479
        infobar.set_interaction_request(description, interaction_type,
1486
 
            callback)
 
1480
                                        callback)
1487
1481
 
1488
1482
    def __remove_backend_infobar(self, child, backend_id):
1489
1483
        '''
1494
1488
                            removed.
1495
1489
        '''
1496
1490
        if isinstance(child, CustomInfoBar) and\
1497
 
            child.get_backend_id() == backend_id:
 
1491
                child.get_backend_id() == backend_id:
1498
1492
            if self.vbox_toolbars:
1499
1493
                self.vbox_toolbars.remove(child)
1500
1494
 
1509
1503
        '''
1510
1504
        backend = self.req.get_backend(backend_id)
1511
1505
        if not backend or (backend and backend.is_enabled()):
1512
 
            #remove old infobar related to backend_id, if any
 
1506
            # remove old infobar related to backend_id, if any
1513
1507
            if self.vbox_toolbars:
1514
1508
                self.vbox_toolbars.foreach(self.__remove_backend_infobar,
1515
 
                                       backend_id)
 
1509
                                           backend_id)
1516
1510
 
1517
1511
    def _new_infobar(self, backend_id):
1518
1512
        '''
1521
1515
        @param backend_id: the backend for which we're creating the infobar
1522
1516
        @returns gtk.Infobar: the created infobar
1523
1517
        '''
1524
 
        #remove old infobar related to backend_id, if any
 
1518
        # remove old infobar related to backend_id, if any
1525
1519
        if not self.vbox_toolbars:
1526
1520
            return
1527
1521
        self.vbox_toolbars.foreach(self.__remove_backend_infobar, backend_id)
1528
 
        #add a new one
 
1522
        # add a new one
1529
1523
        infobar = CustomInfoBar(self.req, self, self.vmanager, backend_id)
1530
1524
        self.vbox_toolbars.pack_start(infobar, True)
1531
1525
        return infobar
1535
1529
        """ return just one selected view """
1536
1530
        if self.tagtreeview:
1537
1531
            tags = self.tagtreeview.get_selected_nodes()
1538
 
            if len(tags)>0:
 
1532
            if len(tags) > 0:
1539
1533
                tag = self.tagtree.get_node(tags[0])
1540
1534
                if tag.is_search_tag():
1541
1535
                    return tags[0]