Merge lp:~jml/gtg/random-cleanups into lp:~gtg/gtg/old-trunk
- random-cleanups
- Merge into old-trunk
Proposed by
Jonathan Lange
Status: | Merged |
---|---|
Merged at revision: | not available |
Proposed branch: | lp:~jml/gtg/random-cleanups |
Merge into: | lp:~gtg/gtg/old-trunk |
Diff against target: | None lines |
To merge this branch: | bzr merge lp:~jml/gtg/random-cleanups |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Bertrand Rousseau (community) | Approve | ||
Review via email: mp+8980@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Revision history for this message
Jonathan Lange (jml) wrote : | # |
Revision history for this message
Bertrand Rousseau (bertrand-rousseau) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'GTG/taskbrowser/browser.py' |
2 | --- GTG/taskbrowser/browser.py 2009-07-16 16:17:56 +0000 |
3 | +++ GTG/taskbrowser/browser.py 2009-07-18 03:17:09 +0000 |
4 | @@ -58,16 +58,16 @@ |
5 | class TaskBrowser: |
6 | |
7 | def __init__(self, requester, config): |
8 | - |
9 | + |
10 | self.priv = {} |
11 | - |
12 | + |
13 | #The locks used to avoid unecessary refresh |
14 | self.refresh_lock = threading.Lock() |
15 | self.refresh_lock_lock = threading.Lock() |
16 | # Set the configuration dictionary |
17 | self.config = config |
18 | self.notes = EXPERIMENTAL_NOTES |
19 | - |
20 | + |
21 | # Setup default values for view |
22 | self.priv["collapsed_tid"] = [] |
23 | self.priv["tasklist"] = {} |
24 | @@ -76,11 +76,11 @@ |
25 | self.priv["ctasklist"] = {} |
26 | self.priv["ctasklist"]["sort_column"] = None |
27 | self.priv["ctasklist"]["sort_order"] = gtk.SORT_ASCENDING |
28 | - |
29 | + |
30 | #Set the Glade file |
31 | - self.gladefile = GnomeConfig.GLADE_FILE |
32 | - self.wTree = gtk.glade.XML(self.gladefile) |
33 | - |
34 | + self.gladefile = GnomeConfig.GLADE_FILE |
35 | + self.wTree = gtk.glade.XML(self.gladefile) |
36 | + |
37 | #Get the Main Window, and connect the "destroy" event |
38 | self.window = self.wTree.get_widget("MainWindow") |
39 | if (self.window): |
40 | @@ -102,14 +102,14 @@ |
41 | self.dismissbutton = self.wTree.get_widget("dismiss") |
42 | self.about = self.wTree.get_widget("aboutdialog1") |
43 | self.edit_mi = self.wTree.get_widget("edit_mi") |
44 | - |
45 | + |
46 | #Set the tooltip for the toolbar buttons |
47 | self.donebutton.set_tooltip_text(GnomeConfig.MARK_DONE_TOOLTIP) |
48 | self.editbutton.set_tooltip_text(_("Edit the selected task")) |
49 | self.dismissbutton.set_tooltip_text(GnomeConfig.MARK_DISMISS_TOOLTIP) |
50 | self.newtask.set_tooltip_text(_("Create a new task")) |
51 | self.newsubtask.set_tooltip_text(_("Create a new subtask")) |
52 | - |
53 | + |
54 | # Initialize "About" dialog |
55 | gtk.about_dialog_set_url_hook(lambda dialog, url: openurl.openurl(url)) |
56 | self.about.set_website(GTG.URL) |
57 | @@ -118,68 +118,73 @@ |
58 | self.about.set_authors(GTG.AUTHORS) |
59 | self.about.set_artists(GTG.ARTISTS) |
60 | self.about.set_translator_credits(GTG.TRANSLATORS) |
61 | - |
62 | + |
63 | # Initialize menu |
64 | |
65 | #Create our dictionay and connect it |
66 | dic = { |
67 | - "on_add_task": self.on_add_task, |
68 | - "on_add_note": (self.on_add_task, 'Note'), |
69 | - "on_edit_active_task": self.on_edit_active_task, |
70 | - "on_edit_done_task": self.on_edit_done_task, |
71 | - "on_edit_note": self.on_edit_note, |
72 | - "on_delete_task": self.on_delete_task, |
73 | - "on_mark_as_done": self.on_mark_as_done, |
74 | - "on_dismiss_task": self.on_dismiss_task, |
75 | - "on_delete": self.on_delete, |
76 | - "on_move": self.on_move, |
77 | - "on_size_allocate": self.on_size_allocate, |
78 | - "gtk_main_quit": self.close, |
79 | - "on_select_tag": self.on_select_tag, |
80 | - "on_delete_confirm": self.on_delete_confirm, |
81 | - "on_delete_cancel": lambda x : x.hide, |
82 | - "on_add_subtask": self.on_add_subtask, |
83 | - "on_closed_task_treeview_button_press_event": self.on_closed_task_treeview_button_press_event, |
84 | - "on_closed_task_treeview_key_press_event": self.on_closed_task_treeview_key_press_event, |
85 | - "on_task_treeview_button_press_event": self.on_task_treeview_button_press_event, |
86 | - "on_task_treeview_key_press_event": self.on_task_treeview_key_press_event, |
87 | - "on_tag_treeview_button_press_event": self.on_tag_treeview_button_press_event, |
88 | - "on_colorchooser_activate": self.on_colorchooser_activate, |
89 | - "on_workview_toggled": self.on_workview_toggled, |
90 | - "on_note_toggled": self.on_note_toggled, |
91 | - "on_view_workview_toggled": self.on_workview_toggled, |
92 | - "on_view_closed_toggled": self.on_closed_toggled, |
93 | - "on_view_sidebar_toggled": self.on_sidebar_toggled, |
94 | - "on_bg_color_toggled": self.on_bg_color_toggled, |
95 | - "on_quickadd_field_activate": self.quickadd, |
96 | - "on_quickadd_button_activate": self.quickadd, |
97 | - "on_view_toolbar_toggled": self.on_toolbar_toggled, |
98 | - "on_view_quickadd_toggled": self.toggle_quickadd, |
99 | - "on_about_clicked": self.on_about_clicked, |
100 | - "on_about_close": self.on_about_close, |
101 | - "on_nonworkviewtag_toggled": self.on_nonworkviewtag_toggled |
102 | - } |
103 | + "on_add_task": self.on_add_task, |
104 | + "on_add_note": (self.on_add_task, 'Note'), |
105 | + "on_edit_active_task": self.on_edit_active_task, |
106 | + "on_edit_done_task": self.on_edit_done_task, |
107 | + "on_edit_note": self.on_edit_note, |
108 | + "on_delete_task": self.on_delete_task, |
109 | + "on_mark_as_done": self.on_mark_as_done, |
110 | + "on_dismiss_task": self.on_dismiss_task, |
111 | + "on_delete": self.on_delete, |
112 | + "on_move": self.on_move, |
113 | + "on_size_allocate": self.on_size_allocate, |
114 | + "gtk_main_quit": self.close, |
115 | + "on_select_tag": self.on_select_tag, |
116 | + "on_delete_confirm": self.on_delete_confirm, |
117 | + "on_delete_cancel": lambda x: x.hide, |
118 | + "on_add_subtask": self.on_add_subtask, |
119 | + "on_closed_task_treeview_button_press_event": |
120 | + self.on_closed_task_treeview_button_press_event, |
121 | + "on_closed_task_treeview_key_press_event": |
122 | + self.on_closed_task_treeview_key_press_event, |
123 | + "on_task_treeview_button_press_event": |
124 | + self.on_task_treeview_button_press_event, |
125 | + "on_task_treeview_key_press_event": |
126 | + self.on_task_treeview_key_press_event, |
127 | + "on_tag_treeview_button_press_event": |
128 | + self.on_tag_treeview_button_press_event, |
129 | + "on_colorchooser_activate": self.on_colorchooser_activate, |
130 | + "on_workview_toggled": self.on_workview_toggled, |
131 | + "on_note_toggled": self.on_note_toggled, |
132 | + "on_view_workview_toggled": self.on_workview_toggled, |
133 | + "on_view_closed_toggled": self.on_closed_toggled, |
134 | + "on_view_sidebar_toggled": self.on_sidebar_toggled, |
135 | + "on_bg_color_toggled": self.on_bg_color_toggled, |
136 | + "on_quickadd_field_activate": self.quickadd, |
137 | + "on_quickadd_button_activate": self.quickadd, |
138 | + "on_view_toolbar_toggled": self.on_toolbar_toggled, |
139 | + "on_view_quickadd_toggled": self.toggle_quickadd, |
140 | + "on_about_clicked": self.on_about_clicked, |
141 | + "on_about_close": self.on_about_close, |
142 | + "on_nonworkviewtag_toggled": self.on_nonworkviewtag_toggled, |
143 | + } |
144 | self.wTree.signal_autoconnect(dic) |
145 | self.selected_rows = None |
146 | - |
147 | + |
148 | self.workview = False |
149 | self.req = requester |
150 | - |
151 | + |
152 | self.noteview = False |
153 | self.new_note_button = self.wTree.get_widget("new_note_button") |
154 | self.note_toggle = self.wTree.get_widget("note_toggle") |
155 | if not self.notes: |
156 | self.note_toggle.hide() |
157 | self.new_note_button.hide() |
158 | - |
159 | + |
160 | #Set the tooltip for the toolbar button |
161 | self.new_note_button.set_tooltip_text("Create a new note") |
162 | - |
163 | + |
164 | # Model constants |
165 | self.TASK_MODEL_OBJ = 0 |
166 | self.TASK_MODEL_TITLE = 1 |
167 | self.TASK_MODEL_TITLE_STR = 2 |
168 | - #Warning : this one is duplicated in treetools.py |
169 | + #Warning: this one is duplicated in treetools.py |
170 | #They all should go in treetools |
171 | self.TASK_MODEL_DDATE_STR = 3 |
172 | self.TASK_MODEL_DLEFT_STR = 4 |
173 | @@ -196,7 +201,7 @@ |
174 | self.CTASKS_MODEL_DDATE_STR = 4 |
175 | self.CTASKS_MODEL_BGCOL = 5 |
176 | self.CTASKS_MODEL_TAGS = 6 |
177 | - |
178 | + |
179 | #The tview and their model |
180 | self.taskdone_tview = self.wTree.get_widget("taskdone_tview") |
181 | self.taskdone_ts = gtk.TreeStore(gobject.TYPE_PYOBJECT, |
182 | @@ -217,30 +222,30 @@ |
183 | |
184 | #Be sure that we are reorderable (not needed normaly) |
185 | self.task_tview.set_reorderable(True) |
186 | - |
187 | + |
188 | #The menu items widget |
189 | self.menu_view_workview = self.wTree.get_widget("view_workview") |
190 | - |
191 | + |
192 | #The buttons |
193 | self.toggle_workview = self.wTree.get_widget("workview_toggle") |
194 | self.quickadd_entry = self.wTree.get_widget("quickadd_field") |
195 | - |
196 | + |
197 | #Set the tooltip for the toolbar button |
198 | self.toggle_workview.set_tooltip_text("Toggle the work view") |
199 | - |
200 | + |
201 | #The panes |
202 | self.sidebar = self.wTree.get_widget("sidebar") |
203 | self.closed_pane = self.wTree.get_widget("closed_pane") |
204 | self.toolbar = self.wTree.get_widget("task_tb") |
205 | self.quickadd_pane = self.wTree.get_widget("quickadd_pane") |
206 | - |
207 | + |
208 | #The tid that will be deleted |
209 | self.tid_todelete = None |
210 | - |
211 | + |
212 | #This is the list of tasks that are already opened in an editor |
213 | #of course it's empty right now |
214 | self.opened_task = {} |
215 | - |
216 | + |
217 | #Variables used during drag-n-drop |
218 | self.drag_sources = [] |
219 | self.path_source = None |
220 | @@ -248,7 +253,7 @@ |
221 | self.tid_tomove = None |
222 | self.tid_source_parent = None |
223 | self.tid_target_parent = None |
224 | - |
225 | + |
226 | #setting the default |
227 | self.menu_view_workview.set_active(WORKVIEW) |
228 | self.wTree.get_widget("view_sidebar").set_active(SIDEBAR) |
229 | @@ -256,11 +261,11 @@ |
230 | self.wTree.get_widget("view_toolbar").set_active(TOOLBAR) |
231 | self.wTree.get_widget("view_quickadd").set_active(QUICKADD_PANE) |
232 | self.priv["bg_color_enable"] = True |
233 | - |
234 | + |
235 | #connecting the refresh signal from the requester |
236 | self.lock = threading.Lock() |
237 | self.req.connect("refresh", self.do_refresh) |
238 | - |
239 | + |
240 | agr = gtk.AccelGroup() |
241 | self.wTree.get_widget("MainWindow").add_accel_group(agr) |
242 | |
243 | @@ -286,12 +291,12 @@ |
244 | key, mod = gtk.accelerator_parse("<Control>n") |
245 | new_task_mi.add_accelerator("activate", |
246 | agr, key, mod, gtk.ACCEL_VISIBLE) |
247 | - |
248 | + |
249 | new_subtask_mi = self.wTree.get_widget("new_subtask_mi") |
250 | key, mod = gtk.accelerator_parse("<Control><Shift>n") |
251 | new_subtask_mi.add_accelerator("activate", |
252 | agr, key, mod, gtk.ACCEL_VISIBLE) |
253 | - |
254 | + |
255 | edit_button = self.wTree.get_widget("edit_b") |
256 | key, mod = gtk.accelerator_parse("<Control>e") |
257 | edit_button.add_accelerator("clicked", |
258 | @@ -313,24 +318,24 @@ |
259 | 'activate', agr, key, mod, gtk.ACCEL_VISIBLE) |
260 | |
261 | def __restore_state_from_conf(self): |
262 | - |
263 | + |
264 | # Extract state from configuration dictionary |
265 | if not "browser" in self.config: |
266 | return |
267 | - |
268 | - if "width" in self.config["browser"] and \ |
269 | - "height" in self.config["browser"]: |
270 | + |
271 | + if ("width" in self.config["browser"] and |
272 | + "height" in self.config["browser"]): |
273 | width = int(self.config["browser"]["width"]) |
274 | height = int(self.config["browser"]["height"]) |
275 | self.window.resize(width, height) |
276 | - |
277 | - if "x_pos" in self.config["browser"] and \ |
278 | - "y_pos" in self.config["browser"]: |
279 | - |
280 | + |
281 | + if ("x_pos" in self.config["browser"] and |
282 | + "y_pos" in self.config["browser"]): |
283 | + |
284 | xpos = int(self.config["browser"]["x_pos"]) |
285 | ypos = int(self.config["browser"]["y_pos"]) |
286 | self.window.move(xpos, ypos) |
287 | - |
288 | + |
289 | if "tag_pane" in self.config["browser"]: |
290 | tag_pane = eval(self.config["browser"]["tag_pane"]) |
291 | if not tag_pane: |
292 | @@ -340,7 +345,7 @@ |
293 | self.wTree.get_widget("view_sidebar").set_active(True) |
294 | self.sidebar.show() |
295 | |
296 | - |
297 | + |
298 | if "closed_task_pane" in self.config["browser"]: |
299 | closed_task_pane = eval( |
300 | self.config["browser"]["closed_task_pane"]) |
301 | @@ -355,28 +360,28 @@ |
302 | ctask_pane_height = eval( |
303 | self.config["browser"]["ctask_pane_height"]) |
304 | self.wTree.get_widget("vpaned1").set_position(ctask_pane_height) |
305 | - |
306 | + |
307 | if "toolbar" in self.config["browser"]: |
308 | toolbar = eval(self.config["browser"]["toolbar"]) |
309 | if not toolbar: |
310 | self.toolbar.hide() |
311 | self.wTree.get_widget("view_toolbar").set_active(False) |
312 | - |
313 | + |
314 | if "quick_add" in self.config["browser"]: |
315 | quickadd_pane = eval(self.config["browser"]["quick_add"]) |
316 | if not quickadd_pane: |
317 | self.quickadd_pane.hide() |
318 | self.wTree.get_widget("view_quickadd").set_active(False) |
319 | - |
320 | + |
321 | if "bg_color_enable" in self.config["browser"]: |
322 | bgcol_enable = eval(self.config["browser"]["bg_color_enable"]) |
323 | self.priv["bg_color_enable"] = bgcol_enable |
324 | self.wTree.get_widget("bgcol_enable").set_active(bgcol_enable) |
325 | - |
326 | + |
327 | if "collapsed_tasks" in self.config["browser"]: |
328 | - self.priv["collapsed_tid"] = \ |
329 | - self.config["browser"]["collapsed_tasks"] |
330 | - |
331 | + self.priv["collapsed_tid"] = self.config[ |
332 | + "browser"]["collapsed_tasks"] |
333 | + |
334 | if "tasklist_sort" in self.config["browser"]: |
335 | col_id, order = self.config["browser"]["tasklist_sort"] |
336 | self.priv["sort_column"] = col_id |
337 | @@ -395,7 +400,7 @@ |
338 | view = self.config["browser"]["view"] |
339 | if view == "workview": |
340 | self.do_toggle_workview() |
341 | - |
342 | + |
343 | if "experimental_notes" in self.config["browser"]: |
344 | self.notes = eval(self.config["browser"]["experimental_notes"]) |
345 | if self.notes: |
346 | @@ -414,17 +419,17 @@ |
347 | width, height = self.window.get_size() |
348 | self.priv["window_width"] = width |
349 | self.priv["window_height"] = height |
350 | - |
351 | + |
352 | def on_delete(self, widget, user_data): #pylint: disable-msg=W0613 |
353 | - |
354 | + |
355 | # Save expanded rows |
356 | self.task_ts.foreach(self.update_collapsed_row, None) |
357 | - |
358 | + |
359 | # Cleanup collapsed row list |
360 | for tid in self.priv["collapsed_tid"]: |
361 | if not self.req.has_task(tid): |
362 | self.priv["collapsed_tid"].remove(tid) |
363 | - |
364 | + |
365 | # Get configuration values |
366 | tag_sidebar = self.sidebar.get_property("visible") |
367 | closed_pane = self.closed_pane.get_property("visible") |
368 | @@ -434,68 +439,72 @@ |
369 | sort_column = self.priv["tasklist"]["sort_column"] |
370 | sort_order = self.priv["tasklist"]["sort_order"] |
371 | closed_pane_height = self.wTree.get_widget("vpaned1").get_position() |
372 | - |
373 | - if self.workview : view = "workview" |
374 | - else : view = "default" |
375 | + |
376 | + if self.workview: |
377 | + view = "workview" |
378 | + else: |
379 | + view = "default" |
380 | |
381 | # Populate configuration dictionary |
382 | - self.config["browser"] = {} |
383 | - self.config["browser"]["width"] = self.priv["window_width"] |
384 | - self.config["browser"]["height"] = self.priv["window_height"] |
385 | - self.config["browser"]["x_pos"] = self.priv["window_xpos"] |
386 | - self.config["browser"]["y_pos"] = self.priv["window_ypos"] |
387 | - self.config["browser"]["tag_pane"] = tag_sidebar |
388 | - self.config["browser"]["closed_task_pane"] = closed_pane |
389 | - self.config["browser"]["ctask_pane_height"] = closed_pane_height |
390 | - self.config["browser"]["toolbar"] = toolbar |
391 | - self.config["browser"]["quick_add"] = quickadd_pane |
392 | - self.config["browser"]["bg_color_enable"] = self.priv["bg_color_enable"] |
393 | - self.config["browser"]["collapsed_tasks"] = self.priv["collapsed_tid"] |
394 | - if sort_column is not None and sort_order == gtk.SORT_ASCENDING: |
395 | + self.config["browser"] = { |
396 | + 'width': self.priv["window_width"], |
397 | + 'height': self.priv["window_height"], |
398 | + 'x_pos': self.priv["window_xpos"], |
399 | + 'y_pos': self.priv["window_ypos"], |
400 | + 'bg_color_enable': self.priv["bg_color_enable"], |
401 | + 'collapsed_tasks': self.priv["collapsed_tid"], |
402 | + 'tag_pane': tag_sidebar, |
403 | + 'closed_task_pane': closed_pane, |
404 | + 'ctask_pane_height': closed_pane_height, |
405 | + 'toolbar': toolbar, |
406 | + 'quick_add': quickadd_pane, |
407 | + 'view': view, |
408 | + } |
409 | + |
410 | + if sort_column is not None and sort_order == gtk.SORT_ASCENDING: |
411 | sort_col_id = self.priv["tasklist"]["columns"].index(sort_column) |
412 | - self.config["browser"]["tasklist_sort"] = [sort_col_id, 0] |
413 | + self.config["browser"]["tasklist_sort"] = [sort_col_id, 0] |
414 | elif sort_column is not None and sort_order == gtk.SORT_DESCENDING: |
415 | sort_col_id = self.priv["tasklist"]["columns"].index(sort_column) |
416 | - self.config["browser"]["tasklist_sort"] = [sort_col_id, 1] |
417 | - self.config["browser"]["view"] = view |
418 | - if self.notes : |
419 | + self.config["browser"]["tasklist_sort"] = [sort_col_id, 1] |
420 | + if self.notes: |
421 | self.config["browser"]["experimental_notes"] = True |
422 | - |
423 | + |
424 | def main(self): |
425 | #Here we will define the main TaskList interface |
426 | gobject.threads_init() |
427 | - |
428 | + |
429 | #The tags treeview |
430 | self.__create_tags_tview() |
431 | self.tag_tview.set_model(self.tag_ts) |
432 | - |
433 | + |
434 | #The Active tasks treeview |
435 | self.__create_task_tview() |
436 | self.task_tview.set_model(self.task_ts) |
437 | - |
438 | + |
439 | #The done/dismissed taks treeview |
440 | self.__create_closed_tasks_tview() |
441 | self.taskdone_tview.set_model(self.taskdone_ts) |
442 | - |
443 | + |
444 | #The treeview for notes |
445 | self.__create_note_tview() |
446 | self.note_tview.set_model(self.note_ts) |
447 | - |
448 | + |
449 | #put the content in those treeviews |
450 | self.do_refresh() |
451 | - |
452 | + |
453 | selection = self.task_tview.get_selection() |
454 | - selection.connect("changed",self.task_cursor_changed) |
455 | + selection.connect("changed", self.task_cursor_changed) |
456 | closed_selection = self.taskdone_tview.get_selection() |
457 | - closed_selection.connect("changed",self.taskdone_cursor_changed) |
458 | + closed_selection.connect("changed", self.taskdone_cursor_changed) |
459 | note_selection = self.note_tview.get_selection() |
460 | - note_selection.connect("changed",self.note_cursor_changed) |
461 | - |
462 | - |
463 | + note_selection.connect("changed", self.note_cursor_changed) |
464 | + |
465 | + |
466 | # Restore state from config |
467 | self.__restore_state_from_conf() |
468 | self.window.show() |
469 | - |
470 | + |
471 | gtk.main() |
472 | return 0 |
473 | |
474 | @@ -505,19 +514,17 @@ |
475 | def on_about_close(self, widget, response): #pylint: disable-msg=W0613 |
476 | self.about.hide() |
477 | |
478 | - def on_colorchooser_activate(self,widget) : #pylint: disable-msg=W0613 |
479 | - #TODO : Color chooser should be refactorized in its own class |
480 | - #Well, in fact we should have a TagPropertiesEditor (like for project) |
481 | - #Also, color change should be immediate. There's no reason for a Ok/Cancel |
482 | - wTree = gtk.glade.XML(self.gladefile, "ColorChooser") |
483 | + def on_colorchooser_activate(self, widget): #pylint: disable-msg=W0613 |
484 | + #TODO: Color chooser should be refactorized in its own class. Well, in |
485 | + #fact we should have a TagPropertiesEditor (like for project) Also, |
486 | + #color change should be immediate. There's no reason for a Ok/Cancel |
487 | + wTree = gtk.glade.XML(self.gladefile, "ColorChooser") |
488 | #Create our dictionay and connect it |
489 | - dic = { |
490 | - "on_color_response" : self.on_color_response |
491 | - } |
492 | + dic = {"on_color_response": self.on_color_response} |
493 | wTree.signal_autoconnect(dic) |
494 | window = wTree.get_widget("ColorChooser") |
495 | # Get previous color |
496 | - tags,notag_only = self.get_selected_tags() #pylint: disable-msg=W0612 |
497 | + tags, notag_only = self.get_selected_tags() #pylint: disable-msg=W0612 |
498 | if len(tags) == 1: |
499 | color = tags[0].get_attribute("color") |
500 | if color != None: |
501 | @@ -527,27 +534,27 @@ |
502 | colorsel.set_current_color(colorspec) |
503 | window.show() |
504 | |
505 | - def on_color_response(self,widget,response) : |
506 | + def on_color_response(self, widget, response): |
507 | #the OK button return -5. Don't ask me why. |
508 | - if response == -5 : |
509 | + if response == -5: |
510 | colorsel = widget.colorsel |
511 | gtkcolor = colorsel.get_current_color() |
512 | strcolor = gtk.color_selection_palette_to_string([gtkcolor]) |
513 | - tags,notag_only = self.get_selected_tags() #pylint: disable-msg=W0612 |
514 | - for t in tags : |
515 | - t.set_attribute("color",strcolor) |
516 | + tags, notag_only = self.get_selected_tags() |
517 | + for t in tags: |
518 | + t.set_attribute("color", strcolor) |
519 | self.do_refresh() |
520 | widget.destroy() |
521 | - |
522 | - def on_workview_toggled(self,widget) : #pylint: disable-msg=W0613 |
523 | + |
524 | + def on_workview_toggled(self, widget): #pylint: disable-msg=W0613 |
525 | self.do_toggle_workview() |
526 | - |
527 | + |
528 | def do_toggle_workview(self): |
529 | #We have to be careful here to avoid a loop of signals |
530 | - #menu_state = self.menu_view_workview.get_active() |
531 | + #menu_state = self.menu_view_workview.get_active() |
532 | #button_state = self.toggle_workview.get_active() |
533 | #We cannot have note and workview at the same time |
534 | - if not self.workview and self.note_toggle.get_active() : |
535 | + if not self.workview and self.note_toggle.get_active(): |
536 | self.note_toggle.set_active(False) |
537 | #We do something only if both widget are in different state |
538 | tobeset = not self.workview |
539 | @@ -556,48 +563,48 @@ |
540 | self.workview = tobeset |
541 | self.do_refresh() |
542 | |
543 | - def on_sidebar_toggled(self,widget) : |
544 | + def on_sidebar_toggled(self, widget): |
545 | view_sidebar = self.wTree.get_widget("view_sidebar") |
546 | if self.sidebar.get_property("visible"): |
547 | view_sidebar.set_active(False) |
548 | self.sidebar.hide() |
549 | - else : |
550 | + else: |
551 | view_sidebar.set_active(True) |
552 | self.sidebar.show() |
553 | - |
554 | - def on_note_toggled(self,widget) : |
555 | + |
556 | + def on_note_toggled(self, widget): |
557 | self.noteview = not self.noteview |
558 | workview_state = self.toggle_workview.get_active() |
559 | - if workview_state : |
560 | + if workview_state: |
561 | self.toggle_workview.set_active(False) |
562 | self.do_refresh() |
563 | - |
564 | - def on_closed_toggled(self,widget) : |
565 | - if widget.get_active() : |
566 | + |
567 | + def on_closed_toggled(self, widget): |
568 | + if widget.get_active(): |
569 | self.closed_pane.show() |
570 | - else : |
571 | + else: |
572 | self.closed_pane.hide() |
573 | |
574 | - def on_bg_color_toggled(self,widget) : |
575 | - if widget.get_active() : |
576 | + def on_bg_color_toggled(self, widget): |
577 | + if widget.get_active(): |
578 | self.priv["bg_color_enable"] = True |
579 | - else : |
580 | + else: |
581 | self.priv["bg_color_enable"] = False |
582 | self.do_refresh() |
583 | - |
584 | - def on_toolbar_toggled(self,widget) : |
585 | - if widget.get_active() : |
586 | + |
587 | + def on_toolbar_toggled(self, widget): |
588 | + if widget.get_active(): |
589 | self.toolbar.show() |
590 | - else : |
591 | + else: |
592 | self.toolbar.hide() |
593 | |
594 | - def toggle_quickadd(self,widget) : |
595 | - if widget.get_active() : |
596 | + def toggle_quickadd(self, widget): |
597 | + if widget.get_active(): |
598 | self.quickadd_pane.show() |
599 | - else : |
600 | + else: |
601 | self.quickadd_pane.hide() |
602 | - |
603 | - def canonical_date(self, arg) : |
604 | + |
605 | + def canonical_date(self, arg): |
606 | """ |
607 | Transform "arg" in a valid yyyy-mm-dd date or return None. |
608 | "arg" can be a yyyy-mm-dd, yyyymmdd, mmdd, today or a weekday name. |
609 | @@ -607,107 +614,110 @@ |
610 | day_names = [_("monday"), _("tuesday"), _("wednesday"), |
611 | _("thursday"), _("friday"), _("saturday"), |
612 | _("sunday")] |
613 | - if re.match(r'\d{4}-\d{2}-\d{2}', arg) : |
614 | + if re.match(r'\d{4}-\d{2}-\d{2}', arg): |
615 | date = arg |
616 | - elif arg.isdigit() : |
617 | - if len(arg) == 8 : |
618 | - date = "%s-%s-%s" % (arg[:4],arg[4:6],arg[6:]) |
619 | - elif len(arg) == 4 : |
620 | + elif arg.isdigit(): |
621 | + if len(arg) == 8: |
622 | + date = "%s-%s-%s" % (arg[:4], arg[4:6], arg[6:]) |
623 | + elif len(arg) == 4: |
624 | year = datetime.date.today().year |
625 | - date = "%i-%s-%s" % (year,arg[:2],arg[2:]) |
626 | + date = "%i-%s-%s" % (year, arg[:2], arg[2:]) |
627 | elif arg.lower() == "today" or arg.lower() == _("today"): |
628 | today = datetime.date.today() |
629 | year = today.year |
630 | month = today.month |
631 | day = today.day |
632 | - date = "%i-%i-%i" % (year,month,day) |
633 | - elif arg.lower() == "tomorrow" or\ |
634 | - arg.lower() == _("tomorrow") : |
635 | + date = "%i-%i-%i" % (year, month, day) |
636 | + elif arg.lower() == "tomorrow" or arg.lower() == _("tomorrow"): |
637 | today = datetime.date.today() |
638 | tomorrow = today + datetime.timedelta(days=1) |
639 | year = tomorrow.year |
640 | month = tomorrow.month |
641 | day = tomorrow.day |
642 | - date = "%i-%i-%i" % (year,month,day) |
643 | + date = "%i-%i-%i" % (year, month, day) |
644 | elif arg.lower() in day_names_en or arg.lower() in day_names: |
645 | today = datetime.date.today() |
646 | today_day = today.weekday() |
647 | - if arg.lower() in day_names_en : |
648 | + if arg.lower() in day_names_en: |
649 | arg_day = day_names_en.index(arg) |
650 | - else : |
651 | + else: |
652 | arg_day = day_names.index(arg) |
653 | - if arg_day > today_day : |
654 | + if arg_day > today_day: |
655 | delta = datetime.timedelta(days = arg_day-today_day) |
656 | - else : |
657 | + else: |
658 | delta = datetime.timedelta(days = arg_day-today_day+7) |
659 | next_date = today + delta |
660 | year = next_date.year |
661 | month = next_date.month |
662 | day = next_date.day |
663 | - date = "%i-%i-%i" % (year,month,day) |
664 | - else : |
665 | + date = "%i-%i-%i" % (year, month, day) |
666 | + else: |
667 | return None |
668 | - if self.is_date_valid(date) : |
669 | + if self.is_date_valid(date): |
670 | return date |
671 | - else : |
672 | + else: |
673 | return None |
674 | - |
675 | - def is_date_valid(self, fulldate) : |
676 | + |
677 | + def is_date_valid(self, fulldate): |
678 | """ |
679 | Return True if the date exists. False else. |
680 | "fulldate" is yyyy-mm-dd |
681 | """ |
682 | splited_date = fulldate.split("-") |
683 | - if len(splited_date) != 3 : |
684 | - return False |
685 | - year,month,day = splited_date |
686 | - try : |
687 | - datetime.date(int(year),int(month),int(day)) |
688 | - except ValueError : |
689 | - return False |
690 | - else : |
691 | + if len(splited_date) != 3: |
692 | + return False |
693 | + year, month, day = splited_date |
694 | + try: |
695 | + datetime.date(int(year), int(month), int(day)) |
696 | + except ValueError: |
697 | + return False |
698 | + else: |
699 | return True |
700 | - |
701 | - def quickadd(self,widget) : #pylint: disable-msg=W0613 |
702 | + |
703 | + def quickadd(self, widget): #pylint: disable-msg=W0613 |
704 | text = self.quickadd_entry.get_text() |
705 | due_date = None |
706 | defer_date = None |
707 | - if text : |
708 | - tags,notagonly = self.get_selected_tags() #pylint: disable-msg=W0612 |
709 | + if text: |
710 | + tags, notagonly = self.get_selected_tags() |
711 | # Get tags in the title |
712 | - for match in re.findall(r'[\s](@[^@,\s]+)',text) : |
713 | + for match in re.findall(r'[\s](@[^@,\s]+)', text): |
714 | tags.append(GTG.core.tagstore.Tag(match)) |
715 | # Remove the @ |
716 | - #text =text.replace(match,match[1:],1) |
717 | + #text =text.replace(match, match[1:], 1) |
718 | # Get attributes |
719 | regexp = r'([\s]*)([a-zA-Z0-9_-]+):([^\s]+)' |
720 | - for spaces,attribute, args in re.findall(regexp, text) : |
721 | + for spaces, attribute, args in re.findall(regexp, text): |
722 | valid_attribute = True |
723 | - if attribute.lower() == "tags" or attribute.lower() == _("tags"): |
724 | - for tag in args.split(",") : |
725 | + if (attribute.lower() == "tags" |
726 | + or attribute.lower() == _("tags")): |
727 | + for tag in args.split(","): |
728 | tags.append(GTG.core.tagstore.Tag("@"+tag)) |
729 | - elif attribute.lower() == "defer" or attribute.lower() == _("defer"): |
730 | + elif (attribute.lower() == "defer" |
731 | + or attribute.lower() == _("defer")): |
732 | defer_date = self.canonical_date(args) |
733 | - if defer_date is None : |
734 | + if defer_date is None: |
735 | valid_attribute = False |
736 | - elif attribute.lower() == "due" or attribute.lower() == _("due"): |
737 | + elif (attribute.lower() == "due" |
738 | + or attribute.lower() == _("due")): |
739 | due_date = self.canonical_date(args) |
740 | - if due_date is None : |
741 | + if due_date is None: |
742 | valid_attribute = False |
743 | - else : |
744 | + else: |
745 | # attribute is unknown |
746 | valid_attribute = False |
747 | - if valid_attribute : |
748 | + if valid_attribute: |
749 | # if the command is valid we have to remove it |
750 | # from the task title |
751 | - text = text.replace("%s%s:%s" % (spaces,attribute,args), "") |
752 | + text = text.replace( |
753 | + "%s%s:%s" % (spaces, attribute, args), "") |
754 | # Create the new task |
755 | - task = self.req.new_task(tags=tags,newtask=True) |
756 | - if text != "" : |
757 | + task = self.req.new_task(tags=tags, newtask=True) |
758 | + if text != "": |
759 | task.set_title(text) |
760 | - if not due_date is None : |
761 | + if not due_date is None: |
762 | task.set_due_date(due_date) |
763 | - if not defer_date is None : |
764 | + if not defer_date is None: |
765 | task.set_start_date(defer_date) |
766 | id_toselect = task.get_id() |
767 | ############# |
768 | @@ -715,393 +725,442 @@ |
769 | # Refresh the treeview |
770 | self.do_refresh(toselect=id_toselect) |
771 | #self.select_task(id_toselect) |
772 | - |
773 | - #This works only in the main task_tview |
774 | - #If it cannot find the requested task, nothing is selected |
775 | - def select_task(self,id_toselect) : |
776 | + |
777 | + def select_task(self, id_toselect): |
778 | + """Select a task with tid 'id_toselect'. |
779 | + |
780 | + This works only in the main task_tview. If it cannot find the |
781 | + requested task, nothing is selected. |
782 | + """ |
783 | #We will loop over all task_tview element to find the newly added one |
784 | model = self.task_tview.get_model() |
785 | tempit = model.get_iter_first() |
786 | it = None |
787 | - while (tempit and not it) : |
788 | - if tempit : |
789 | + while (tempit and not it): |
790 | + if tempit: |
791 | tid = model.get_value(tempit, 0) |
792 | - if tid == id_toselect : |
793 | + if tid == id_toselect: |
794 | it = tempit |
795 | #First we try to see if there is child task |
796 | tempit2 = model.iter_children(tempit) |
797 | #if no children, then take the tasks on the same level |
798 | - if not tempit2 : |
799 | + if not tempit2: |
800 | tempit2 = model.iter_next(tempit) |
801 | #if no task on the same level, go back to the parent |
802 | #and then to the next task on the parent level |
803 | - if not tempit2 : |
804 | + if not tempit2: |
805 | tempit2 = model.iter_parent(tempit) |
806 | - if tempit2 : |
807 | + if tempit2: |
808 | tempit2 = model.iter_next(tempit2) |
809 | tempit = tempit2 |
810 | - if it : |
811 | - selection = self.task_tview.get_selection() |
812 | + if it: |
813 | + selection = self.task_tview.get_selection() |
814 | selection.select_iter(it) |
815 | |
816 | - |
817 | - |
818 | - def do_refresh(self,sender=None,param=None,toselect=None) : #pylint: disable-msg=W0613 |
819 | + def do_refresh(self, sender=None, param=None, toselect=None): |
820 | #We ask to do the refresh in a gtk thread |
821 | - #We use a lock_lock like described in |
822 | + #We use a lock_lock like described in |
823 | #http://ploum.frimouvy.org/?202-the-signals-and-threads-flying-circus |
824 | - if self.refresh_lock_lock.acquire(False) : |
825 | - gobject.idle_add(self.refresh_tb,sender,toselect) |
826 | + if self.refresh_lock_lock.acquire(False): |
827 | + gobject.idle_add(self.refresh_tb, sender, toselect) |
828 | #If we have something toselect, we cannot skip the refresh |
829 | - elif toselect : |
830 | - gobject.idle_add(self.select_task,toselect) |
831 | - |
832 | - #If a task asked for the refresh, we don't refresh it to avoid a loop |
833 | - #New use refresh_tb directly, use "do_refresh" |
834 | - def refresh_tb(self,fromtask=None,toselect=None): |
835 | + elif toselect: |
836 | + gobject.idle_add(self.select_task, toselect) |
837 | + |
838 | + def refresh_tb(self, fromtask=None, toselect=None): |
839 | + """Refresh the task browser. |
840 | + |
841 | + If a task asked for the refresh, we don't refresh it to avoid a loop |
842 | + New use refresh_tb directly, use "do_refresh". |
843 | + """ |
844 | self.refresh_lock.acquire() |
845 | - try : |
846 | + try: |
847 | self.refresh_lock_lock.release() |
848 | current_pane = self.main_pane.get_child() |
849 | - if self.noteview : |
850 | - if current_pane == self.task_tview : |
851 | + if self.noteview: |
852 | + if current_pane == self.task_tview: |
853 | self.main_pane.remove(current_pane) |
854 | self.main_pane.add(self.note_tview) |
855 | self.refresh_note() |
856 | - else : |
857 | - if current_pane == self.note_tview : |
858 | + else: |
859 | + if current_pane == self.note_tview: |
860 | self.main_pane.remove(current_pane) |
861 | self.main_pane.add(self.task_tview) |
862 | self.refresh_list(toselect=toselect) |
863 | self.refresh_closed() |
864 | self.refresh_tags() |
865 | #Refreshing the opened editors |
866 | - for uid in self.opened_task : |
867 | - if uid != fromtask : |
868 | + for uid in self.opened_task: |
869 | + if uid != fromtask: |
870 | self.opened_task[uid].refresh_editor() |
871 | - finally : |
872 | + finally: |
873 | self.refresh_lock.release() |
874 | |
875 | + def refresh_tags(self): |
876 | + """Refresh the tag list. |
877 | |
878 | - #We refresh the tag list. Not needed very often |
879 | - def refresh_tags(self) : |
880 | + Not needed very often. |
881 | + """ |
882 | select = self.tag_tview.get_selection() |
883 | t_path = None |
884 | - if select : |
885 | - t_model,t_path = select.get_selected_rows() #pylint: disable-msg=W0612 |
886 | + if select: |
887 | + t_model, t_path = select.get_selected_rows() |
888 | self.tag_ts.clear() |
889 | - alltag = self.req.get_alltag_tag() |
890 | - notag = self.req.get_notag_tag() |
891 | - if self.workview : |
892 | + alltag = self.req.get_alltag_tag() |
893 | + notag = self.req.get_notag_tag() |
894 | + if self.workview: |
895 | count_all_task = len(self.req.get_active_tasks_list(workable=True)) |
896 | - count_no_tags = len(self.req.get_active_tasks_list(notag_only=True,\ |
897 | - workable=True)) |
898 | - else : |
899 | + count_no_tags = len( |
900 | + self.req.get_active_tasks_list(notag_only=True, workable=True)) |
901 | + else: |
902 | count_all_task = len(self.req.get_tasks_list(started_only=False)) |
903 | - count_no_tags = len(self.req.get_tasks_list(notag_only=True,\ |
904 | - started_only=False)) |
905 | - |
906 | - self.tag_ts.append([alltag,None,_("<span weight=\"bold\">All tags</span>"),str(count_all_task),False]) |
907 | - self.tag_ts.append([notag,None,_("<span weight=\"bold\">Tasks without tags</span>"),str(count_no_tags),False]) |
908 | - self.tag_ts.append([None,None,"","",True]) |
909 | + count_no_tags = len( |
910 | + self.req.get_tasks_list(notag_only=True, started_only=False)) |
911 | + |
912 | + self.tag_ts.append( |
913 | + [alltag, None, _("<span weight=\"bold\">All tags</span>"), |
914 | + str(count_all_task), False]) |
915 | + self.tag_ts.append( |
916 | + [notag, None, _("<span weight=\"bold\">Tasks without tags</span>"), |
917 | + str(count_no_tags), False]) |
918 | + self.tag_ts.append([None, None, "", "", True]) |
919 | |
920 | tags = self.req.get_used_tags() |
921 | - |
922 | - tags.sort(cmp=lambda x,y: cmp(x.get_name().lower(),y.get_name().lower())) |
923 | + |
924 | + tags.sort( |
925 | + cmp=lambda x, y: cmp(x.get_name().lower(), y.get_name().lower())) |
926 | |
927 | for tag in tags: |
928 | color = tag.get_attribute("color") |
929 | - if self.workview : |
930 | - count = len(self.req.get_active_tasks_list(tags=[tag],workable=True)) |
931 | - else : |
932 | - count = len(self.req.get_tasks_list(started_only=False,tags=[tag])) |
933 | + if self.workview: |
934 | + count = len( |
935 | + self.req.get_active_tasks_list(tags=[tag], workable=True)) |
936 | + else: |
937 | + count = len( |
938 | + self.req.get_tasks_list(started_only=False, tags=[tag])) |
939 | #We display the tags without the "@" (but we could) |
940 | if count != 0: |
941 | - self.tag_ts.append([tag,color,tag.get_name()[1:], str(count), False]) |
942 | - |
943 | + self.tag_ts.append( |
944 | + [tag, color, tag.get_name()[1:], str(count), False]) |
945 | + |
946 | #We reselect the selected tag |
947 | - if t_path : |
948 | - for i in t_path : |
949 | + if t_path: |
950 | + for i in t_path: |
951 | self.tag_tview.get_selection().select_path(i) |
952 | |
953 | - def tag_separator_filter(self, model, itera, user_data=None):#pylint: disable-msg=W0613 |
954 | + def tag_separator_filter(self, model, itera, user_data=None): |
955 | return model.get_value(itera, self.TAGS_MODEL_SEP) |
956 | - |
957 | - def update_collapsed_row(self, model, path, itera, user_data): #pylint: disable-msg=W0613 |
958 | + |
959 | + def update_collapsed_row(self, model, path, itera, user_data): |
960 | """Build a list of task that must showed as collapsed in Treeview""" |
961 | - tid = self.task_ts.get_value(itera,0) |
962 | + tid = self.task_ts.get_value(itera, 0) |
963 | # Remove expanded rows |
964 | - if self.task_ts.iter_has_child(itera) and \ |
965 | - self.task_tview.row_expanded(path) and \ |
966 | - tid in self.priv["collapsed_tid"]: |
967 | + if (self.task_ts.iter_has_child(itera) and |
968 | + self.task_tview.row_expanded(path) and |
969 | + tid in self.priv["collapsed_tid"]): |
970 | |
971 | self.priv["collapsed_tid"].remove(tid) |
972 | |
973 | # Append collapsed rows |
974 | - elif self.task_ts.iter_has_child(itera) and \ |
975 | - not self.task_tview.row_expanded(path) and \ |
976 | - tid not in self.priv["collapsed_tid"]: |
977 | + elif (self.task_ts.iter_has_child(itera) and |
978 | + not self.task_tview.row_expanded(path) and |
979 | + tid not in self.priv["collapsed_tid"]): |
980 | |
981 | self.priv["collapsed_tid"].append(tid) |
982 | |
983 | return False # Return False or the TreeModel.foreach() function ends |
984 | - |
985 | - def restore_collapsed(self,treeview,path,data) : |
986 | + |
987 | + def restore_collapsed(self, treeview, path, data): |
988 | itera = self.task_ts.get_iter(path) |
989 | - tid = self.task_ts.get_value(itera,0) |
990 | - if tid in self.priv["collapsed_tid"] : |
991 | + tid = self.task_ts.get_value(itera, 0) |
992 | + if tid in self.priv["collapsed_tid"]: |
993 | treeview.collapse_row(path) |
994 | - |
995 | - #refresh list build/refresh your TreeStore of task |
996 | - #to keep it in sync with your self.projects |
997 | - def refresh_list(self,a=None,toselect=None) : #pylint: disable-msg=W0613 |
998 | - |
999 | + |
1000 | + def refresh_list(self, a=None, toselect=None): |
1001 | + """Refresh or build the TreeStore of tasks.""" |
1002 | + |
1003 | # Save collapsed rows |
1004 | self.task_ts.foreach(self.update_collapsed_row, None) |
1005 | - |
1006 | - #selected tasks : |
1007 | + |
1008 | + #selected tasks: |
1009 | selected_uid = self.get_selected_task(self.task_tview) |
1010 | tselect = self.task_tview.get_selection() |
1011 | t_path = None |
1012 | - if tselect : |
1013 | - t_model,t_path = tselect.get_selected_rows() #pylint: disable-msg=W0612 |
1014 | - |
1015 | - #Scroll position : |
1016 | + if tselect: |
1017 | + t_model, t_path = tselect.get_selected_rows() |
1018 | + |
1019 | + #Scroll position: |
1020 | vscroll_value = self.task_tview.get_vadjustment().get_value() |
1021 | - hscroll_value = self.task_tview.get_hadjustment().get_value() |
1022 | - |
1023 | + hscroll_value = self.task_tview.get_hadjustment().get_value() |
1024 | + |
1025 | #to refresh the list we build a new treestore then replace the existing |
1026 | new_taskts = treetools.new_task_ts(dnd_func=self.row_dragndrop) |
1027 | - tag_list,notag_only = self.get_selected_tags() |
1028 | + tag_list, notag_only = self.get_selected_tags() |
1029 | nbr_of_tasks = 0 |
1030 | - |
1031 | + |
1032 | #We build the active tasks pane |
1033 | - if self.workview : |
1034 | - tasks = self.req.get_active_tasks_list(tags=tag_list,\ |
1035 | - notag_only=notag_only,workable=True, started_only=False) |
1036 | - for tid in tasks : |
1037 | - self.add_task_tree_to_list(new_taskts,tid,None,selected_uid,\ |
1038 | - treeview=False) |
1039 | + if self.workview: |
1040 | + tasks = self.req.get_active_tasks_list( |
1041 | + tags=tag_list, notag_only=notag_only, workable=True, |
1042 | + started_only=False) |
1043 | + for tid in tasks: |
1044 | + self.add_task_tree_to_list( |
1045 | + new_taskts, tid, None, selected_uid, treeview=False) |
1046 | nbr_of_tasks = len(tasks) |
1047 | - |
1048 | - else : |
1049 | + |
1050 | + else: |
1051 | #building the classical treeview |
1052 | - active_root_tasks = self.req.get_active_tasks_list(tags=tag_list,\ |
1053 | - notag_only=notag_only, is_root=True, started_only=False) |
1054 | - active_tasks = self.req.get_active_tasks_list(tags=tag_list,\ |
1055 | - notag_only=notag_only, is_root=False, started_only=False) |
1056 | - for tid in active_root_tasks : |
1057 | - self.add_task_tree_to_list(new_taskts, tid, None,\ |
1058 | - selected_uid,active_tasks=active_tasks) |
1059 | + active_root_tasks = self.req.get_active_tasks_list( |
1060 | + tags=tag_list, notag_only=notag_only, is_root=True, |
1061 | + started_only=False) |
1062 | + active_tasks = self.req.get_active_tasks_list( |
1063 | + tags=tag_list, notag_only=notag_only, is_root=False, |
1064 | + started_only=False) |
1065 | + for tid in active_root_tasks: |
1066 | + self.add_task_tree_to_list( |
1067 | + new_taskts, tid, None, selected_uid, |
1068 | + active_tasks=active_tasks) |
1069 | nbr_of_tasks = len(active_tasks) |
1070 | - |
1071 | - #Set the title of the window : |
1072 | - if nbr_of_tasks == 0 : |
1073 | + |
1074 | + #Set the title of the window: |
1075 | + if nbr_of_tasks == 0: |
1076 | parenthesis = _("(no active tasks)") |
1077 | - elif nbr_of_tasks == 1 : |
1078 | + elif nbr_of_tasks == 1: |
1079 | parenthesis = _("(1 active task)") |
1080 | - else : |
1081 | + else: |
1082 | parenthesis = "(%s active tasks)"%nbr_of_tasks |
1083 | self.window.set_title("Getting Things GNOME! %s"%parenthesis) |
1084 | self.task_tview.set_model(new_taskts) |
1085 | self.task_ts = new_taskts |
1086 | #We expand all the we close the tasks who were not saved as "expanded" |
1087 | self.task_tview.expand_all() |
1088 | - self.task_tview.map_expanded_rows(self.restore_collapsed,None) |
1089 | + self.task_tview.map_expanded_rows(self.restore_collapsed, None) |
1090 | # Restore sorting |
1091 | - if not self.noteview : |
1092 | - if self.priv["tasklist"].has_key("sort_column") and \ |
1093 | - self.priv["tasklist"].has_key("sort_order") : |
1094 | - if self.priv["tasklist"]["sort_column"] is not None and \ |
1095 | - self.priv["tasklist"]["sort_order"] is not None : |
1096 | - self.sort_tasklist_rows(self.priv["tasklist"]["sort_column"], \ |
1097 | - self.priv["tasklist"]["sort_order"]) |
1098 | + if not self.noteview: |
1099 | + # XXX: This can be done much more simply using {}.get(). -- jml, |
1100 | + # 2009-07-18. |
1101 | + if ('sort_column' in self.priv["tasklist"] and |
1102 | + 'sort_order' in self.priv["tasklist"]): |
1103 | + if (self.priv["tasklist"]["sort_column"] is not None and |
1104 | + self.priv["tasklist"]["sort_order"] is not None): |
1105 | + self.sort_tasklist_rows( |
1106 | + self.priv["tasklist"]["sort_column"], |
1107 | + self.priv["tasklist"]["sort_order"]) |
1108 | #We reselect the selected tasks |
1109 | - if toselect : |
1110 | + if toselect: |
1111 | self.select_task(toselect) |
1112 | - elif t_path : |
1113 | + elif t_path: |
1114 | selection = self.task_tview.get_selection() |
1115 | - for i in t_path : |
1116 | + for i in t_path: |
1117 | selection.select_path(i) |
1118 | - |
1119 | - #scroll position |
1120 | - #We have to call that in another thread, else it will not work |
1121 | - def restore_vscroll(old_position) : |
1122 | + |
1123 | + def restore_vscroll(old_position): |
1124 | vadjust = self.task_tview.get_vadjustment() |
1125 | #We ensure that we will not scroll out of the window |
1126 | #It was bug #331285 |
1127 | - vscroll = min(old_position,(vadjust.upper - vadjust.page_size)) |
1128 | + vscroll = min(old_position, (vadjust.upper - vadjust.page_size)) |
1129 | vadjust.set_value(vscroll) |
1130 | - def restore_hscroll(old_position) : |
1131 | + |
1132 | + def restore_hscroll(old_position): |
1133 | hadjust = self.task_tview.get_hadjustment() |
1134 | - hscroll = min(old_position,(hadjust.upper - hadjust.page_size)) |
1135 | + hscroll = min(old_position, (hadjust.upper - hadjust.page_size)) |
1136 | hadjust.set_value(hscroll) |
1137 | - gobject.idle_add(restore_vscroll,vscroll_value) |
1138 | - gobject.idle_add(restore_hscroll,hscroll_value) |
1139 | - |
1140 | - #Refresh the closed tasks pane |
1141 | - def refresh_closed(self) : |
1142 | + |
1143 | + #scroll position |
1144 | + #We have to call that in another thread, else it will not work |
1145 | + gobject.idle_add(restore_vscroll, vscroll_value) |
1146 | + gobject.idle_add(restore_hscroll, hscroll_value) |
1147 | + |
1148 | + def refresh_closed(self): |
1149 | + """Refresh the closed tasks pane.""" |
1150 | #We build the closed tasks pane |
1151 | dselect = self.taskdone_tview.get_selection() |
1152 | d_path = None |
1153 | - if dselect : |
1154 | - d_model,d_path = dselect.get_selected_rows() #pylint: disable-msg=W0612 |
1155 | + if dselect: |
1156 | + d_model, d_path = dselect.get_selected_rows() |
1157 | #We empty the pane |
1158 | self.taskdone_ts.clear() |
1159 | #We rebuild it |
1160 | - tag_list,notag_only = self.get_selected_tags() |
1161 | - closed_tasks = self.req.get_closed_tasks_list(tags=tag_list,\ |
1162 | - notag_only=notag_only) |
1163 | - for tid in closed_tasks : |
1164 | - t = self.req.get_task(tid) |
1165 | - title_str = saxutils.escape(t.get_title()) |
1166 | - closeddate = t.get_closed_date() |
1167 | + tag_list, notag_only = self.get_selected_tags() |
1168 | + closed_tasks = self.req.get_closed_tasks_list( |
1169 | + tags=tag_list, notag_only=notag_only) |
1170 | + for tid in closed_tasks: |
1171 | + t = self.req.get_task(tid) |
1172 | + title_str = saxutils.escape(t.get_title()) |
1173 | + closeddate = t.get_closed_date() |
1174 | closeddate_str = closeddate |
1175 | - tags = t.get_tags() |
1176 | - if self.priv["bg_color_enable"] and t.has_tags() : |
1177 | + tags = t.get_tags() |
1178 | + if self.priv["bg_color_enable"] and t.has_tags(): |
1179 | my_color = colors.background_color(t.get_tags()) |
1180 | else: |
1181 | my_color = None |
1182 | if t.get_status() == "Dismiss": |
1183 | - title_str = "<span color=\"#AAAAAA\">%s</span>" % title_str |
1184 | - closeddate_str = "<span color=\"#AAAAAA\">%s</span>" % closeddate |
1185 | - self.taskdone_ts.append(None,[tid,t.get_color(),title_str,closeddate,closeddate_str,my_color,tags]) |
1186 | + title_str = "<span color=\"#AAAAAA\">%s</span>" % title_str |
1187 | + closeddate_str = ( |
1188 | + "<span color=\"#AAAAAA\">%s</span>" % closeddate) |
1189 | + self.taskdone_ts.append( |
1190 | + None, |
1191 | + [tid, t.get_color(), title_str, closeddate, closeddate_str, |
1192 | + my_color, tags]) |
1193 | closed_selection = self.taskdone_tview.get_selection() |
1194 | - if d_path : |
1195 | - for i in d_path : |
1196 | + if d_path: |
1197 | + for i in d_path: |
1198 | closed_selection.select_path(i) |
1199 | - self.taskdone_ts.set_sort_column_id(self.CTASKS_MODEL_DDATE, gtk.SORT_DESCENDING) |
1200 | - |
1201 | - #Refresh the notes pane |
1202 | - def refresh_note(self) : |
1203 | + self.taskdone_ts.set_sort_column_id( |
1204 | + self.CTASKS_MODEL_DDATE, gtk.SORT_DESCENDING) |
1205 | + |
1206 | + def refresh_note(self): |
1207 | + """Refresh the notes pane.""" |
1208 | #We build the notes pane |
1209 | dselect = self.note_tview.get_selection() |
1210 | d_path = None |
1211 | - if dselect : |
1212 | - d_model,d_path = dselect.get_selected_rows() #pylint: disable-msg=W0612 |
1213 | + if dselect: |
1214 | + d_model, d_path = dselect.get_selected_rows() |
1215 | #We empty the pane |
1216 | self.note_ts.clear() |
1217 | #We rebuild it |
1218 | - tag_list,notag_only = self.get_selected_tags() |
1219 | + tag_list, notag_only = self.get_selected_tags() |
1220 | notes = self.req.get_notes_list(tags=tag_list, notag_only=notag_only) |
1221 | - for tid in notes : |
1222 | - t = self.req.get_task(tid) |
1223 | - title_str = saxutils.escape(t.get_title()) |
1224 | - self.note_ts.append(None,[tid,t.get_color(),title_str]) |
1225 | + for tid in notes: |
1226 | + t = self.req.get_task(tid) |
1227 | + title_str = saxutils.escape(t.get_title()) |
1228 | + self.note_ts.append(None, [tid, t.get_color(), title_str]) |
1229 | note_selection = self.note_tview.get_selection() |
1230 | - if d_path : |
1231 | - for i in d_path : |
1232 | + if d_path: |
1233 | + for i in d_path: |
1234 | note_selection.select_path(i) |
1235 | - #self.note_ts.set_sort_column_id(self.CTASKS_MODEL_DDATE, gtk.SORT_DESCENDING) |
1236 | - |
1237 | - #Add tasks to a treeview. If treeview is False, it becomes a flat list |
1238 | - def add_task_tree_to_list(self, tree_store, tid, parent, selected_uid=None,\ |
1239 | - active_tasks=[], treeview=True): |
1240 | - task = self.req.get_task(tid) |
1241 | + #self.note_ts.set_sort_column_id(self.CTASKS_MODEL_DDATE, |
1242 | + #gtk.SORT_DESCENDING) |
1243 | + |
1244 | + def add_task_tree_to_list(self, tree_store, tid, parent, selected_uid=None, |
1245 | + active_tasks=[], treeview=True): |
1246 | + """Add tasks to a treeview. |
1247 | + |
1248 | + If 'treeview' is False, it becomes a flat list. |
1249 | + """ |
1250 | + task = self.req.get_task(tid) |
1251 | st_count = self.__count_tasks_rec(task, active_tasks) |
1252 | - if selected_uid and selected_uid == tid : |
1253 | + if selected_uid and selected_uid == tid: |
1254 | # Temporarily disabled |
1255 | - #title = self.__build_task_title(task,extended=True) |
1256 | - title_str = self.__build_task_title(task, st_count, extended=False) |
1257 | - else : |
1258 | - title_str = self.__build_task_title(task, st_count, extended=False) |
1259 | - |
1260 | + #title = self.__build_task_title(task, extended=True) |
1261 | + title_str = self.__build_task_title(task, st_count, extended=False) |
1262 | + else: |
1263 | + title_str = self.__build_task_title(task, st_count, extended=False) |
1264 | + |
1265 | |
1266 | # Extract data |
1267 | - title = saxutils.escape(task.get_title()) |
1268 | + title = saxutils.escape(task.get_title()) |
1269 | duedate_str = task.get_due_date() |
1270 | - left_str = task.get_days_left() |
1271 | - tags = task.get_tags() |
1272 | - if self.priv["bg_color_enable"] : |
1273 | + left_str = task.get_days_left() |
1274 | + tags = task.get_tags() |
1275 | + if self.priv["bg_color_enable"]: |
1276 | my_color = colors.background_color(tags) |
1277 | else: |
1278 | my_color = None |
1279 | - |
1280 | + |
1281 | if not parent and len(task.get_subtasks()) == 0: |
1282 | itera = tree_store.get_iter_first() |
1283 | - my_row = tree_store.insert_before(None, itera, row=[tid,title,title_str,duedate_str,left_str,tags,my_color]) |
1284 | + my_row = tree_store.insert_before( |
1285 | + None, itera, |
1286 | + row=[tid, title, title_str, duedate_str, left_str, tags, |
1287 | + my_color]) |
1288 | else: |
1289 | #None should be "parent" but crashing with thread |
1290 | - my_row = tree_store.append(parent,\ |
1291 | - [tid,title,title_str,duedate_str,left_str,tags,my_color]) |
1292 | + my_row = tree_store.append( |
1293 | + parent, |
1294 | + [tid, title, title_str, duedate_str, left_str, tags, my_color]) |
1295 | #If treeview, we add add the active childs |
1296 | - if treeview : |
1297 | + if treeview: |
1298 | for c in task.get_subtasks(): |
1299 | cid = c.get_id() |
1300 | if cid in active_tasks: |
1301 | #None should be cid |
1302 | - self.add_task_tree_to_list(tree_store, cid, my_row,selected_uid,\ |
1303 | - active_tasks=active_tasks) |
1304 | - |
1305 | - #This function is called when the selection change in the closed task view |
1306 | - #It will displays the selected task differently |
1307 | - def taskdone_cursor_changed(self,selection=None) : |
1308 | + self.add_task_tree_to_list( |
1309 | + tree_store, cid, my_row, selected_uid, |
1310 | + active_tasks=active_tasks) |
1311 | + |
1312 | + def taskdone_cursor_changed(self, selection=None): |
1313 | + """Called when selection changes in closed task view. |
1314 | + |
1315 | + Changes the way the selected task is displayed. |
1316 | + """ |
1317 | #We unselect all in the active task view |
1318 | #Only if something is selected in the closed task list |
1319 | #And we change the status of the Done/dismiss button |
1320 | self.donebutton.set_icon_name("gtg-task-done") |
1321 | self.dismissbutton.set_icon_name("gtg-task-dismiss") |
1322 | - if selection.count_selected_rows() > 0 : |
1323 | + if selection.count_selected_rows() > 0: |
1324 | tid = self.get_selected_task(self.taskdone_tview) |
1325 | task = self.req.get_task(tid) |
1326 | self.task_tview.get_selection().unselect_all() |
1327 | self.note_tview.get_selection().unselect_all() |
1328 | - if task.get_status() == "Dismiss" : |
1329 | - self.wTree.get_widget("ctcm_mark_as_not_done").set_sensitive(False) |
1330 | + if task.get_status() == "Dismiss": |
1331 | + self.wTree.get_widget( |
1332 | + "ctcm_mark_as_not_done").set_sensitive(False) |
1333 | self.wTree.get_widget("ctcm_undismiss").set_sensitive(True) |
1334 | self.dismissbutton.set_label(GnomeConfig.MARK_UNDISMISS) |
1335 | self.donebutton.set_label(GnomeConfig.MARK_DONE) |
1336 | self.donebutton.set_tooltip_text(GnomeConfig.MARK_DONE_TOOLTIP) |
1337 | self.dismissbutton.set_icon_name("gtg-task-undismiss") |
1338 | - self.dismissbutton.set_tooltip_text(GnomeConfig.MARK_UNDISMISS_TOOLTIP) |
1339 | + self.dismissbutton.set_tooltip_text( |
1340 | + GnomeConfig.MARK_UNDISMISS_TOOLTIP) |
1341 | # self.editbutton.connect('clicked', self.on_edit_done_task) |
1342 | # self.edit_mi.connect('activate', self.on_edit_done_task) |
1343 | - else : |
1344 | - self.wTree.get_widget("ctcm_mark_as_not_done").set_sensitive(True) |
1345 | + else: |
1346 | + self.wTree.get_widget( |
1347 | + "ctcm_mark_as_not_done").set_sensitive(True) |
1348 | self.wTree.get_widget("ctcm_undismiss").set_sensitive(False) |
1349 | self.donebutton.set_label(GnomeConfig.MARK_UNDONE) |
1350 | - self.donebutton.set_tooltip_text(GnomeConfig.MARK_UNDONE_TOOLTIP) |
1351 | + self.donebutton.set_tooltip_text( |
1352 | + GnomeConfig.MARK_UNDONE_TOOLTIP) |
1353 | self.dismissbutton.set_label(GnomeConfig.MARK_DISMISS) |
1354 | - self.dismissbutton.set_tooltip_text(GnomeConfig.MARK_DISMISS_TOOLTIP) |
1355 | + self.dismissbutton.set_tooltip_text( |
1356 | + GnomeConfig.MARK_DISMISS_TOOLTIP) |
1357 | self.donebutton.set_icon_name("gtg-task-undone") |
1358 | # self.editbutton.connect('clicked', self.on_edit_active_task) |
1359 | # self.edit_mi.connect('activate', self.on_edit_active_task) |
1360 | - |
1361 | - #This function is called when the selection change in the active task view |
1362 | - #It will displays the selected task differently |
1363 | - def task_cursor_changed(self,selection=None) : |
1364 | + |
1365 | + def task_cursor_changed(self, selection=None): |
1366 | + """Called when selection changes in the active task view. |
1367 | + |
1368 | + Changes the way the selected task is displayed. |
1369 | + """ |
1370 | #We unselect all in the closed task view |
1371 | #Only if something is selected in the active task list |
1372 | self.donebutton.set_icon_name("gtg-task-done") |
1373 | self.dismissbutton.set_icon_name("gtg-task-dismiss") |
1374 | - if selection.count_selected_rows() > 0 : |
1375 | + if selection.count_selected_rows() > 0: |
1376 | self.taskdone_tview.get_selection().unselect_all() |
1377 | self.note_tview.get_selection().unselect_all() |
1378 | self.donebutton.set_label(GnomeConfig.MARK_DONE) |
1379 | self.donebutton.set_tooltip_text(GnomeConfig.MARK_DONE_TOOLTIP) |
1380 | self.dismissbutton.set_label(GnomeConfig.MARK_DISMISS) |
1381 | #We reset the previously selected task |
1382 | - if self.selected_rows and self.task_ts.iter_is_valid(self.selected_rows): |
1383 | - tid = self.task_ts.get_value(self.selected_rows, self.TASK_MODEL_OBJ) |
1384 | + if (self.selected_rows |
1385 | + and self.task_ts.iter_is_valid(self.selected_rows)): |
1386 | + tid = self.task_ts.get_value( |
1387 | + self.selected_rows, self.TASK_MODEL_OBJ) |
1388 | task = self.req.get_task(tid) |
1389 | - title = self.__build_task_title(task,extended=False) |
1390 | - self.task_ts.set_value(self.selected_rows,self.TASK_MODEL_TITLE,title) |
1391 | + title = self.__build_task_title(task, extended=False) |
1392 | + self.task_ts.set_value( |
1393 | + self.selected_rows, self.TASK_MODEL_TITLE, title) |
1394 | #We change the selection title |
1395 | - #if selection : |
1396 | - #ts,itera = selection.get_selected() #pylint: disable-msg=W0612 |
1397 | - #if itera and self.task_ts.iter_is_valid(itera) : |
1398 | + #if selection: |
1399 | + #ts, itera = selection.get_selected() #pylint: disable-msg=W0612 |
1400 | + #if itera and self.task_ts.iter_is_valid(itera): |
1401 | #tid = self.task_ts.get_value(itera, self.TASK_MODEL_OBJ) |
1402 | #task = self.req.get_task(tid) |
1403 | #self.selected_rows = itera |
1404 | # Extended title is temporarily disabled |
1405 | - #title = self.__build_task_title(task,extended=True) |
1406 | - #title = self.__build_task_title(task,extended=False) |
1407 | - #self.task_ts.set_value(self.selected_rows,self.TASK_MODEL_TITLE,title) |
1408 | - |
1409 | - def note_cursor_changed(self,selection=None) : |
1410 | + #title = self.__build_task_title(task, extended=True) |
1411 | + #title = self.__build_task_title(task, extended=False) |
1412 | + #self.task_ts.set_value( |
1413 | + # self.selected_rows, self.TASK_MODEL_TITLE, title) |
1414 | + |
1415 | + def note_cursor_changed(self, selection=None): |
1416 | #We unselect all in the closed task view |
1417 | #Only if something is selected in the active task list |
1418 | - if selection.count_selected_rows() > 0 : |
1419 | + if selection.count_selected_rows() > 0: |
1420 | self.taskdone_tview.get_selection().unselect_all() |
1421 | self.task_tview.get_selection().unselect_all() |
1422 | |
1423 | @@ -1114,48 +1173,53 @@ |
1424 | else: |
1425 | count = count + 1 |
1426 | return count |
1427 | - |
1428 | - def __build_task_title(self,task,count,extended=False): |
1429 | + |
1430 | + def __build_task_title(self, task, count, extended=False): |
1431 | simple_title = saxutils.escape(task.get_title()) |
1432 | - if extended : |
1433 | + if extended: |
1434 | excerpt = task.get_excerpt(lines=2) |
1435 | - if excerpt.strip() != "" : |
1436 | - title = "<b><big>%s</big></b>\n<small>%s</small>" %(simple_title,excerpt) |
1437 | - else : |
1438 | - title = "<b><big>%s</big></b>" %simple_title |
1439 | - else : |
1440 | + if excerpt.strip() != "": |
1441 | + title = "<b><big>%s</big></b>\n<small>%s</small>" % ( |
1442 | + simple_title, excerpt) |
1443 | + else: |
1444 | + title = "<b><big>%s</big></b>" %simple_title |
1445 | + else: |
1446 | if (not self.workview): |
1447 | if count == 0: |
1448 | - title = "<span>%s</span>" % (simple_title ) |
1449 | + title = "<span>%s</span>" % simple_title |
1450 | else: |
1451 | - title = "<span>%s (%s)</span>" % (simple_title , count ) |
1452 | + title = "<span>%s (%s)</span>" % (simple_title, count) |
1453 | else: |
1454 | - title = simple_title |
1455 | + title = simple_title |
1456 | return title |
1457 | |
1458 | - #If a Task editor is already opened for a given task, we present it |
1459 | - #Else, we create a new one. |
1460 | - def open_task(self,uid) : |
1461 | + def open_task(self, uid): |
1462 | + """Open the task identified by 'uid'. |
1463 | + |
1464 | + If a Task editor is already opened for a given task, we present it. |
1465 | + Else, we create a new one. |
1466 | + """ |
1467 | t = self.req.get_task(uid) |
1468 | - if self.opened_task.has_key(uid) : |
1469 | + if uid in self.opened_task: |
1470 | self.opened_task[uid].present() |
1471 | - else : |
1472 | - tv = TaskEditor(self.req,t,self.do_refresh,self.on_delete_task, |
1473 | - self.close_task,self.open_task,self.get_tasktitle, |
1474 | - notes=self.notes) |
1475 | + else: |
1476 | + tv = TaskEditor( |
1477 | + self.req, t, self.do_refresh, self.on_delete_task, |
1478 | + self.close_task, self.open_task, self.get_tasktitle, |
1479 | + notes=self.notes) |
1480 | #registering as opened |
1481 | self.opened_task[uid] = tv |
1482 | - |
1483 | - def get_tasktitle(self,tid) : |
1484 | + |
1485 | + def get_tasktitle(self, tid): |
1486 | task = self.req.get_task(tid) |
1487 | return task.get_title() |
1488 | - |
1489 | - #When an editor is closed, it should deregister itself |
1490 | - def close_task(self,tid) : |
1491 | - if self.opened_task.has_key(tid) : |
1492 | + |
1493 | + def close_task(self, tid): |
1494 | + # When an editor is closed, it should deregister itself. |
1495 | + if tid in self.opened_task: |
1496 | del self.opened_task[tid] |
1497 | |
1498 | - def on_tag_treeview_button_press_event(self,treeview,event) : |
1499 | + def on_tag_treeview_button_press_event(self, treeview, event): |
1500 | if event.button == 3: |
1501 | x = int(event.x) |
1502 | y = int(event.y) |
1503 | @@ -1174,8 +1238,8 @@ |
1504 | selected_tag = selected_tags[0] |
1505 | nonworkview = selected_tag.get_attribute("nonworkview") |
1506 | # We must invert because the tagstore has "True" for tasks |
1507 | - # that are *not* in workview, and the checkbox is set if the |
1508 | - # tag *is* shown in the workview. |
1509 | + # that are *not* in workview, and the checkbox is set if |
1510 | + # the tag *is* shown in the workview. |
1511 | if nonworkview == "True": |
1512 | shown = False |
1513 | else: |
1514 | @@ -1184,178 +1248,180 @@ |
1515 | self.tagpopup.popup(None, None, None, event.button, time) |
1516 | return 1 |
1517 | |
1518 | - def on_nonworkviewtag_toggled(self,widget) : #pylint: disable-msg=W0613 |
1519 | + def on_nonworkviewtag_toggled(self, widget): #pylint: disable-msg=W0613 |
1520 | tags = self.get_selected_tags()[0] |
1521 | nonworkview_item = self.tagpopup.get_children()[1] |
1522 | #We must inverse because the tagstore has True |
1523 | #for tasks that are not in workview (and also convert to string) |
1524 | toset = str(not nonworkview_item.get_active()) |
1525 | - if len(tags) > 0 : |
1526 | - tags[0].set_attribute("nonworkview",toset) |
1527 | + if len(tags) > 0: |
1528 | + tags[0].set_attribute("nonworkview", toset) |
1529 | self.do_refresh() |
1530 | |
1531 | - def on_task_treeview_button_press_event(self,treeview,event) : |
1532 | - if event.button == 3: |
1533 | - x = int(event.x) |
1534 | - y = int(event.y) |
1535 | - time = event.time |
1536 | - pthinfo = treeview.get_path_at_pos(x, y) |
1537 | - if pthinfo is not None: |
1538 | - path, col, cellx, celly = pthinfo #pylint: disable-msg=W0612 |
1539 | - treeview.grab_focus() |
1540 | - treeview.set_cursor( path, col, 0) |
1541 | - self.taskpopup.popup( None, None, None, event.button, time) |
1542 | - return 1 |
1543 | - |
1544 | - def on_task_treeview_key_press_event(self,treeview,event) : |
1545 | - if gtk.gdk.keyval_name(event.keyval) == "Delete": |
1546 | - self.on_delete_task() |
1547 | - |
1548 | - def on_closed_task_treeview_button_press_event(self,treeview,event) : |
1549 | - if event.button == 3: |
1550 | - x = int(event.x) |
1551 | - y = int(event.y) |
1552 | - time = event.time |
1553 | - pthinfo = treeview.get_path_at_pos(x, y) |
1554 | - if pthinfo is not None: |
1555 | - path, col, cellx, celly = pthinfo #pylint: disable-msg=W0612 |
1556 | - treeview.grab_focus() |
1557 | - treeview.set_cursor( path, col, 0) |
1558 | - self.closedtaskpopup.popup( None, None, None, event.button, time) |
1559 | - return 1 |
1560 | - |
1561 | - def on_closed_task_treeview_key_press_event(self,treeview,event) : |
1562 | - if gtk.gdk.keyval_name(event.keyval) == "Delete": |
1563 | - self.on_delete_task() |
1564 | - |
1565 | - def on_add_task(self,widget,status=None) : #pylint: disable-msg=W0613 |
1566 | - tags,notagonly = self.get_selected_tags() #pylint: disable-msg=W0612 |
1567 | - task = self.req.new_task(tags=tags,newtask=True) |
1568 | + def on_task_treeview_button_press_event(self, treeview, event): |
1569 | + if event.button == 3: |
1570 | + x = int(event.x) |
1571 | + y = int(event.y) |
1572 | + time = event.time |
1573 | + pthinfo = treeview.get_path_at_pos(x, y) |
1574 | + if pthinfo is not None: |
1575 | + path, col, cellx, celly = pthinfo #pylint: disable-msg=W0612 |
1576 | + treeview.grab_focus() |
1577 | + treeview.set_cursor(path, col, 0) |
1578 | + self.taskpopup.popup(None, None, None, event.button, time) |
1579 | + return 1 |
1580 | + |
1581 | + def on_task_treeview_key_press_event(self, treeview, event): |
1582 | + if gtk.gdk.keyval_name(event.keyval) == "Delete": |
1583 | + self.on_delete_task() |
1584 | + |
1585 | + def on_closed_task_treeview_button_press_event(self, treeview, event): |
1586 | + if event.button == 3: |
1587 | + x = int(event.x) |
1588 | + y = int(event.y) |
1589 | + time = event.time |
1590 | + pthinfo = treeview.get_path_at_pos(x, y) |
1591 | + if pthinfo is not None: |
1592 | + path, col, cellx, celly = pthinfo #pylint: disable-msg=W0612 |
1593 | + treeview.grab_focus() |
1594 | + treeview.set_cursor(path, col, 0) |
1595 | + self.closedtaskpopup.popup( |
1596 | + None, None, None, event.button, time) |
1597 | + return 1 |
1598 | + |
1599 | + def on_closed_task_treeview_key_press_event(self, treeview, event): |
1600 | + if gtk.gdk.keyval_name(event.keyval) == "Delete": |
1601 | + self.on_delete_task() |
1602 | + |
1603 | + def on_add_task(self, widget, status=None): #pylint: disable-msg=W0613 |
1604 | + tags, notagonly = self.get_selected_tags() #pylint: disable-msg=W0612 |
1605 | + task = self.req.new_task(tags=tags, newtask=True) |
1606 | uid = task.get_id() |
1607 | - if status : |
1608 | + if status: |
1609 | task.set_status(status) |
1610 | self.open_task(uid) |
1611 | |
1612 | - def on_add_subtask(self,widget) : #pylint: disable-msg=W0613 |
1613 | + def on_add_subtask(self, widget): #pylint: disable-msg=W0613 |
1614 | uid = self.get_selected_task() |
1615 | - if uid : |
1616 | - zetask = self.req.get_task(uid) |
1617 | - tags = zetask.get_tags() |
1618 | - task = self.req.new_task(tags=tags,newtask=True) |
1619 | + if uid: |
1620 | + zetask = self.req.get_task(uid) |
1621 | + tags = zetask.get_tags() |
1622 | + task = self.req.new_task(tags=tags, newtask=True) |
1623 | task.add_parent(uid) |
1624 | zetask.add_subtask(task.get_id()) |
1625 | self.open_task(task.get_id()) |
1626 | self.do_refresh() |
1627 | - |
1628 | - #Get_selected_task returns the uid : |
1629 | - # uid (example : '21@1') |
1630 | - #By default, we select in the task_tview |
1631 | - def get_selected_task(self,tv=None) : |
1632 | + |
1633 | + def get_selected_task(self, tv=None): |
1634 | + """Return the 'uid' of the selected task |
1635 | + |
1636 | + :param tv: The tree view to find the selected task in. Defaults to |
1637 | + the task_tview. |
1638 | + """ |
1639 | uid = None |
1640 | - if not tv : |
1641 | + if not tv: |
1642 | tview = self.task_tview |
1643 | - else : |
1644 | + else: |
1645 | tview = tv |
1646 | # Get the selection in the gtk.TreeView |
1647 | selection = tview.get_selection() |
1648 | #If we don't have anything and no tview specified |
1649 | #Let's have a look in the closed task view |
1650 | - if selection and selection.count_selected_rows() <= 0 and not tv : |
1651 | + if selection and selection.count_selected_rows() <= 0 and not tv: |
1652 | tview = self.taskdone_tview |
1653 | selection = tview.get_selection() |
1654 | #Then in the notes pane |
1655 | - if selection and selection.count_selected_rows() <= 0 and not tv : |
1656 | + if selection and selection.count_selected_rows() <= 0 and not tv: |
1657 | tview = self.note_tview |
1658 | selection = tview.get_selection() |
1659 | # Get the selection iter |
1660 | - if selection : |
1661 | - model, selection_iter = selection.get_selected() #pylint: disable-msg=W0612 |
1662 | - if selection_iter : |
1663 | + if selection: |
1664 | + model, selection_iter = selection.get_selected() |
1665 | + if selection_iter: |
1666 | ts = tview.get_model() |
1667 | uid = ts.get_value(selection_iter, 0) |
1668 | return uid |
1669 | |
1670 | - def get_selected_tags(self) : |
1671 | + def get_selected_tags(self): |
1672 | t_selected = self.tag_tview.get_selection() |
1673 | t_iter = None |
1674 | - if t_selected : |
1675 | - tmodel, t_iter = t_selected.get_selected() #pylint: disable-msg=W0612 |
1676 | + if t_selected: |
1677 | + tmodel, t_iter = t_selected.get_selected() |
1678 | notag_only = False |
1679 | tag = [] |
1680 | - if t_iter : |
1681 | + if t_iter: |
1682 | selected = self.tag_ts.get_value(t_iter, 0) |
1683 | special = selected.get_attribute("special") |
1684 | - if special == "all" : |
1685 | + if special == "all": |
1686 | tag = [] |
1687 | selected = None |
1688 | #notag means we want to display only tasks without any tag |
1689 | - if special == "notag" : |
1690 | + if special == "notag": |
1691 | notag_only = True |
1692 | - if not notag_only and selected : |
1693 | + if not notag_only and selected: |
1694 | tag.append(selected) |
1695 | #If no selection, we display all |
1696 | - return tag,notag_only |
1697 | - |
1698 | - ################### |
1699 | - #Drag-drop support# |
1700 | - ################### |
1701 | - #Because of bug in pygtk, the rows-reordered signal is never emitted |
1702 | - #We workaoround this bug by connecting to row_insert and row_deleted |
1703 | - #Basically, we do the following : |
1704 | - # 1. If a row is inserted for a task X, look if the task already |
1705 | - # exist elsewhere. |
1706 | - # 2. If yes, it's probably a drag-n-drop so we save those information |
1707 | - # 3. If the "elsewhere" from point 1 is deleted, we are sure it's a |
1708 | - # drag-n-drop so we change the parent of the moved task |
1709 | - def row_dragndrop(self,tree, path, it,data=None) : #pylint: disable-msg=W0613 |
1710 | - if data == "insert" : |
1711 | + return tag, notag_only |
1712 | + |
1713 | + def row_dragndrop(self, tree, path, it, data=None): |
1714 | + """Drag and drop support.""" |
1715 | + #Because of bug in pygtk, the rows-reordered signal is never emitted |
1716 | + #We workaoround this bug by connecting to row_insert and row_deleted |
1717 | + #Basically, we do the following: |
1718 | + # 1. If a row is inserted for a task X, look if the task already |
1719 | + # exist elsewhere. |
1720 | + # 2. If yes, it's probably a drag-n-drop so we save those information |
1721 | + # 3. If the "elsewhere" from point 1 is deleted, we are sure it's a |
1722 | + # drag-n-drop so we change the parent of the moved task |
1723 | + if data == "insert": |
1724 | #If the row inserted already exists in another position |
1725 | #We are in a drag n drop case |
1726 | - def findsource(model, path, it,data): |
1727 | + |
1728 | + def findsource(model, path, it, data): |
1729 | path_move = tree.get_path(data[1]) |
1730 | path_actual = tree.get_path(it) |
1731 | - if model.get(it,0) == data[0] and path_move != path_actual: |
1732 | + if model.get(it, 0) == data[0] and path_move != path_actual: |
1733 | self.drag_sources.append(path) |
1734 | self.path_source = path |
1735 | return True |
1736 | - else : |
1737 | + else: |
1738 | self.path_source = None |
1739 | |
1740 | self.path_target = path |
1741 | - tid = tree.get(it,0) |
1742 | - tree.foreach(findsource,[tid,it]) |
1743 | - if self.path_source : |
1744 | + tid = tree.get(it, 0) |
1745 | + tree.foreach(findsource, [tid, it]) |
1746 | + if self.path_source: |
1747 | #We will prepare the drag-n-drop |
1748 | iter_source = tree.get_iter(self.path_source) |
1749 | iter_target = tree.get_iter(self.path_target) |
1750 | iter_source_parent = tree.iter_parent(iter_source) |
1751 | iter_target_parent = tree.iter_parent(iter_target) |
1752 | #the tid_parent will be None for root tasks |
1753 | - if iter_source_parent : |
1754 | - sparent = tree.get(iter_source_parent,0)[0] |
1755 | - else : |
1756 | + if iter_source_parent: |
1757 | + sparent = tree.get(iter_source_parent, 0)[0] |
1758 | + else: |
1759 | sparent = None |
1760 | - if iter_target_parent : |
1761 | - tparent = tree.get(iter_target_parent,0)[0] |
1762 | - else : |
1763 | + if iter_target_parent: |
1764 | + tparent = tree.get(iter_target_parent, 0)[0] |
1765 | + else: |
1766 | tparent = None |
1767 | #If target and source are the same, we are moving |
1768 | - #a child of the deplaced task. Indeed, children are |
1769 | + #a child of the deplaced task. Indeed, children are |
1770 | #also moved in the tree but their parents remain ! |
1771 | - if sparent != tparent : |
1772 | + if sparent != tparent: |
1773 | self.tid_source_parent = sparent |
1774 | self.tid_target_parent = tparent |
1775 | self.tid_tomove = tid[0] |
1776 | # "row %s will move from %s to %s"%(self.tid_tomove,\ |
1777 | - # self.tid_source_parent,self.tid_target_parent) |
1778 | -# def row_deleted(self,tree,path,data=None) : #pylint: disable-msg=W0613 |
1779 | - elif data == "delete" : |
1780 | + # self.tid_source_parent, self.tid_target_parent) |
1781 | +# def row_deleted(self, tree, path, data=None): #pylint: disable-msg=W0613 |
1782 | + elif data == "delete": |
1783 | #If we are removing the path source guessed during the insertion |
1784 | #It confirms that we are in a drag-n-drop |
1785 | - if path in self.drag_sources and self.tid_tomove : |
1786 | + if path in self.drag_sources and self.tid_tomove: |
1787 | self.drag_sources.remove(path) |
1788 | # "row %s moved from %s to %s"%(self.tid_tomove,\ |
1789 | - # self.tid_source_parent,self.tid_target_parent) |
1790 | + # self.tid_source_parent, self.tid_target_parent) |
1791 | tomove = self.req.get_task(self.tid_tomove) |
1792 | tomove.set_to_keep() |
1793 | tomove.remove_parent(self.tid_source_parent) |
1794 | @@ -1368,70 +1434,67 @@ |
1795 | self.tid_tomove = None |
1796 | self.tid_source_parent = None |
1797 | self.tid_target_parent = None |
1798 | - |
1799 | - ############################### |
1800 | - ##### End of the drag-n-drop part |
1801 | - ############################### |
1802 | - |
1803 | - |
1804 | - def on_edit_active_task(self,widget,row=None ,col=None) : #pylint: disable-msg=W0613 |
1805 | + |
1806 | + def on_edit_active_task(self, widget, row=None, col=None): |
1807 | tid = self.get_selected_task() |
1808 | - if tid : |
1809 | + if tid: |
1810 | self.open_task(tid) |
1811 | - def on_edit_done_task(self,widget,row=None ,col=None) : #pylint: disable-msg=W0613 |
1812 | + |
1813 | + def on_edit_done_task(self, widget, row=None, col=None): |
1814 | tid = self.get_selected_task(self.taskdone_tview) |
1815 | - if tid : |
1816 | + if tid: |
1817 | self.open_task(tid) |
1818 | - def on_edit_note(self,widget,row=None,col=None) : #pylint: disable-msg=W0613 |
1819 | + |
1820 | + def on_edit_note(self, widget, row=None, col=None): |
1821 | tid = self.get_selected_task(self.note_tview) |
1822 | - if tid : |
1823 | + if tid: |
1824 | self.open_task(tid) |
1825 | - |
1826 | - #if we pass a tid as a parameter, we delete directly |
1827 | - #otherwise, we will look which tid is selected |
1828 | - def on_delete_confirm(self,widget) : #pylint: disable-msg=W0613 |
1829 | + |
1830 | + def on_delete_confirm(self, widget): |
1831 | self.req.delete_task(self.tid_todelete) |
1832 | self.tid_todelete = None |
1833 | self.do_refresh() |
1834 | - |
1835 | - def on_delete_task(self,widget=None,tid=None) : #pylint: disable-msg=W0613 |
1836 | + |
1837 | + def on_delete_task(self, widget=None, tid=None): #pylint: disable-msg=W0613 |
1838 | #If we don't have a parameter, then take the selection in the treeview |
1839 | - if not tid : |
1840 | - #tid_to_delete is a [project,task] tuple |
1841 | + if not tid: |
1842 | + #tid_to_delete is a [project, task] tuple |
1843 | self.tid_todelete = self.get_selected_task() |
1844 | - else : |
1845 | + else: |
1846 | self.tid_todelete = tid |
1847 | #We must at least have something to delete ! |
1848 | - if self.tid_todelete : |
1849 | + if self.tid_todelete: |
1850 | delete_dialog = self.wTree.get_widget("confirm_delete") |
1851 | delete_dialog.run() |
1852 | delete_dialog.hide() |
1853 | #has the task been deleted ? |
1854 | return not self.tid_todelete |
1855 | - else : |
1856 | + else: |
1857 | return False |
1858 | - |
1859 | - def on_mark_as_done(self,widget) : #pylint: disable-msg=W0613 |
1860 | - uid = self.get_selected_task() |
1861 | - if uid : |
1862 | - zetask = self.req.get_task(uid) |
1863 | - status = zetask.get_status() |
1864 | - if status == "Done" : |
1865 | - zetask.set_status("Active") |
1866 | - else : zetask.set_status("Done") |
1867 | - self.do_refresh() |
1868 | - |
1869 | - def on_dismiss_task(self,widget) : #pylint: disable-msg=W0613 |
1870 | - uid = self.get_selected_task() |
1871 | - if uid : |
1872 | - zetask = self.req.get_task(uid) |
1873 | - status = zetask.get_status() |
1874 | - if status == "Dismiss" : |
1875 | - zetask.set_status("Active") |
1876 | - else : zetask.set_status("Dismiss") |
1877 | - self.do_refresh() |
1878 | - |
1879 | - def on_select_tag(self, widget, row=None ,col=None) : #pylint: disable-msg=W0613 |
1880 | + |
1881 | + def on_mark_as_done(self, widget): #pylint: disable-msg=W0613 |
1882 | + uid = self.get_selected_task() |
1883 | + if uid: |
1884 | + zetask = self.req.get_task(uid) |
1885 | + status = zetask.get_status() |
1886 | + if status == "Done": |
1887 | + zetask.set_status("Active") |
1888 | + else: |
1889 | + zetask.set_status("Done") |
1890 | + self.do_refresh() |
1891 | + |
1892 | + def on_dismiss_task(self, widget): #pylint: disable-msg=W0613 |
1893 | + uid = self.get_selected_task() |
1894 | + if uid: |
1895 | + zetask = self.req.get_task(uid) |
1896 | + status = zetask.get_status() |
1897 | + if status == "Dismiss": |
1898 | + zetask.set_status("Active") |
1899 | + else: |
1900 | + zetask.set_status("Dismiss") |
1901 | + self.do_refresh() |
1902 | + |
1903 | + def on_select_tag(self, widget, row=None, col=None): |
1904 | #When you clic on a tag, you want to unselect the tasks |
1905 | self.task_tview.get_selection().unselect_all() |
1906 | self.taskdone_tview.get_selection().unselect_all() |
1907 | @@ -1441,56 +1504,64 @@ |
1908 | ##### Useful tools################## |
1909 | |
1910 | def __create_tags_tview(self): |
1911 | - |
1912 | + |
1913 | # Tag column |
1914 | - tag_col = gtk.TreeViewColumn() |
1915 | - render_text = gtk.CellRendererText() |
1916 | + tag_col = gtk.TreeViewColumn() |
1917 | + render_text = gtk.CellRendererText() |
1918 | render_count = gtk.CellRendererText() |
1919 | - render_tags = CellRendererTags() |
1920 | - tag_col.set_title ("Tags") |
1921 | - tag_col.set_clickable (False) |
1922 | - tag_col.pack_start (render_tags , expand=False) |
1923 | - tag_col.set_attributes (render_tags , tag=self.TAGS_MODEL_OBJ) |
1924 | - tag_col.pack_start (render_text , expand=True) |
1925 | - tag_col.set_attributes (render_text , markup=self.TAGS_MODEL_NAME) |
1926 | - tag_col.pack_end (render_count , expand=False) |
1927 | - tag_col.set_attributes (render_count , markup=self.TAGS_MODEL_COUNT) |
1928 | - render_count.set_property ("foreground","#888a85") |
1929 | - render_count.set_property ('xalign', 1.0) |
1930 | - render_tags.set_property ('ypad' , 3) |
1931 | - render_text.set_property ('ypad' , 3) |
1932 | - render_count.set_property ('xpad' , 3) |
1933 | - render_count.set_property ('ypad' , 3) |
1934 | - tag_col.set_sort_column_id (-1) |
1935 | - tag_col.set_expand (True) |
1936 | - self.tag_tview.append_column (tag_col) |
1937 | + render_tags = CellRendererTags() |
1938 | + tag_col.set_title("Tags") |
1939 | + tag_col.set_clickable(False) |
1940 | + tag_col.pack_start(render_tags, expand=False) |
1941 | + tag_col.set_attributes(render_tags, tag=self.TAGS_MODEL_OBJ) |
1942 | + tag_col.pack_start(render_text, expand=True) |
1943 | + tag_col.set_attributes(render_text, markup=self.TAGS_MODEL_NAME) |
1944 | + tag_col.pack_end(render_count, expand=False) |
1945 | + tag_col.set_attributes(render_count, markup=self.TAGS_MODEL_COUNT) |
1946 | + render_count.set_property("foreground", "#888a85") |
1947 | + render_count.set_property('xalign', 1.0) |
1948 | + render_tags.set_property('ypad', 3) |
1949 | + render_text.set_property('ypad', 3) |
1950 | + render_count.set_property('xpad', 3) |
1951 | + render_count.set_property('ypad', 3) |
1952 | + tag_col.set_sort_column_id(-1) |
1953 | + tag_col.set_expand(True) |
1954 | + self.tag_tview.append_column(tag_col) |
1955 | # Global treeview properties |
1956 | - self.tag_tview.set_row_separator_func (self.tag_separator_filter) |
1957 | - self.tag_tview.set_headers_visible (False) |
1958 | + self.tag_tview.set_row_separator_func(self.tag_separator_filter) |
1959 | + self.tag_tview.set_headers_visible(False) |
1960 | |
1961 | def cmp_duedate_str(self, key1, key2): |
1962 | if self.priv["tasklist"]["sort_order"] == gtk.SORT_ASCENDING: |
1963 | - if key1 == "" and key2 == "" : return 0 |
1964 | - elif key1 == "" and key2 != "" : return -1 |
1965 | - elif key1 != "" and key2 == "" : return 1 |
1966 | - else : return cmp(key1,key2) |
1967 | + if key1 == "" and key2 == "": |
1968 | + return 0 |
1969 | + elif key1 == "" and key2 != "": |
1970 | + return -1 |
1971 | + elif key1 != "" and key2 == "": |
1972 | + return 1 |
1973 | + else: |
1974 | + return cmp(key1, key2) |
1975 | else: |
1976 | - if key1 == "" and key2 == "" : return 0 |
1977 | - elif key1 == "" and key2 != "" : return 1 |
1978 | - elif key1 != "" and key2 == "" : return -1 |
1979 | - else : return cmp(key1,key2) |
1980 | - |
1981 | - def sort_tasklist_rows(self, column, sort_order=None): |
1982 | + if key1 == "" and key2 == "": |
1983 | + return 0 |
1984 | + elif key1 == "" and key2 != "": |
1985 | + return 1 |
1986 | + elif key1 != "" and key2 == "": |
1987 | + return -1 |
1988 | + else: |
1989 | + return cmp(key1, key2) |
1990 | + |
1991 | + def sort_tasklist_rows(self, column, sort_order=None): |
1992 | """ Sort the rows based on the given column """ |
1993 | - |
1994 | + |
1995 | # Extract sorting state |
1996 | - last_sort_col = self.priv["tasklist"]["sort_column"] |
1997 | + last_sort_col = self.priv["tasklist"]["sort_column"] |
1998 | last_sort_order = self.priv["tasklist"]["sort_order"] |
1999 | - |
2000 | + |
2001 | # Cleanup |
2002 | if last_sort_col is not None: |
2003 | last_sort_col.set_sort_indicator(False) |
2004 | - |
2005 | + |
2006 | # Ascending or descending? |
2007 | if sort_order is None: |
2008 | if last_sort_col == column: |
2009 | @@ -1503,101 +1574,112 @@ |
2010 | |
2011 | # Store sorting state |
2012 | self.priv["tasklist"]["sort_column"] = column |
2013 | - self.priv["tasklist"]["sort_order"] = sort_order |
2014 | + self.priv["tasklist"]["sort_order"] = sort_order |
2015 | |
2016 | # Determine row sorting depending on column |
2017 | if column == self.priv["tasklist"]["columns"][self.TASKLIST_COL_TITLE]: |
2018 | - cmp_func = lambda x,y: locale.strcoll(x.lower(),y.lower()) |
2019 | - sort_key = lambda x:x[self.TASK_MODEL_TITLE] |
2020 | + cmp_func = lambda x, y: locale.strcoll(x.lower(), y.lower()) |
2021 | + sort_key = lambda x: x[self.TASK_MODEL_TITLE] |
2022 | else: |
2023 | cmp_func = self.cmp_duedate_str |
2024 | - sort_key = lambda x:x[self.TASK_MODEL_DDATE_STR] |
2025 | - |
2026 | + sort_key = lambda x: x[self.TASK_MODEL_DDATE_STR] |
2027 | + |
2028 | # Determine sorting direction |
2029 | - if sort_order == gtk.SORT_ASCENDING: sort_reverse = True |
2030 | - else : sort_reverse = False |
2031 | + if sort_order == gtk.SORT_ASCENDING: |
2032 | + sort_reverse = True |
2033 | + else: |
2034 | + sort_reverse = False |
2035 | |
2036 | # Sort rows |
2037 | rows = [tuple(r) + (i,) for i, r in enumerate(self.task_ts)] |
2038 | if len(rows) != 0: |
2039 | - rows.sort(key=lambda x:x[self.TASK_MODEL_TITLE].lower()) |
2040 | - rows.sort(cmp=cmp_func,key=sort_key,reverse=sort_reverse) |
2041 | + rows.sort(key=lambda x: x[self.TASK_MODEL_TITLE].lower()) |
2042 | + rows.sort(cmp=cmp_func, key=sort_key, reverse=sort_reverse) |
2043 | self.task_ts.reorder(None, [r[-1] for r in rows]) |
2044 | - |
2045 | + |
2046 | # Display the sort indicator |
2047 | column.set_sort_indicator(True) |
2048 | column.set_sort_order(sort_order) |
2049 | |
2050 | def __create_task_tview(self): |
2051 | - |
2052 | + |
2053 | self.priv["tasklist"]["columns"] = [] |
2054 | - |
2055 | + |
2056 | # Tag column |
2057 | self.TASKLIST_COL_TAGS = 0 |
2058 | - tag_col = gtk.TreeViewColumn() |
2059 | + tag_col = gtk.TreeViewColumn() |
2060 | render_tags = CellRendererTags() |
2061 | - tag_col.set_title (_("Tags")) |
2062 | - tag_col.pack_start (render_tags, expand=False) |
2063 | - tag_col.add_attribute (render_tags, "tag_list", self.TASK_MODEL_TAGS) |
2064 | - render_tags.set_property ('xalign', 0.0) |
2065 | - tag_col.set_resizable (False) |
2066 | - tag_col.add_attribute (render_tags, "cell-background", self.TASK_MODEL_BGCOL) |
2067 | - #tag_col.set_clickable (True) |
2068 | - #tag_col.connect ('clicked', self.sort_tasklist_rows) |
2069 | - self.task_tview.append_column (tag_col) |
2070 | - self.priv["tasklist"]["columns"].insert(self.TASKLIST_COL_TAGS, tag_col) |
2071 | - |
2072 | + tag_col.set_title(_("Tags")) |
2073 | + tag_col.pack_start(render_tags, expand=False) |
2074 | + tag_col.add_attribute(render_tags, "tag_list", self.TASK_MODEL_TAGS) |
2075 | + render_tags.set_property('xalign', 0.0) |
2076 | + tag_col.set_resizable(False) |
2077 | + tag_col.add_attribute( |
2078 | + render_tags, "cell-background", self.TASK_MODEL_BGCOL) |
2079 | + self.task_tview.append_column(tag_col) |
2080 | + self.priv["tasklist"]["columns"].insert( |
2081 | + self.TASKLIST_COL_TAGS, tag_col) |
2082 | + |
2083 | # Title column |
2084 | self.TASKLIST_COL_TITLE = 1 |
2085 | - title_col = gtk.TreeViewColumn() |
2086 | + title_col = gtk.TreeViewColumn() |
2087 | render_text = gtk.CellRendererText() |
2088 | - title_col.set_title (_("Title")) |
2089 | - title_col.pack_start (render_text, expand=False) |
2090 | - title_col.add_attribute (render_text, "markup", self.TASK_MODEL_TITLE_STR) |
2091 | - title_col.set_resizable (True) |
2092 | - title_col.set_expand (True) |
2093 | + title_col.set_title(_("Title")) |
2094 | + title_col.pack_start(render_text, expand=False) |
2095 | + title_col.add_attribute( |
2096 | + render_text, "markup", self.TASK_MODEL_TITLE_STR) |
2097 | + title_col.set_resizable(True) |
2098 | + title_col.set_expand(True) |
2099 | #The following line seems to fix bug #317469 |
2100 | #I don't understand why !!! It's voodoo ! |
2101 | #Is there a Rubber Chicken With a Pulley in the Middle ? |
2102 | - title_col.set_max_width (100) |
2103 | - title_col.add_attribute (render_text, "cell_background", self.TASK_MODEL_BGCOL) |
2104 | - title_col.set_clickable (True) |
2105 | - title_col.connect ('clicked', self.sort_tasklist_rows) |
2106 | - self.task_tview.append_column (title_col) |
2107 | - self.priv["tasklist"]["columns"].insert(self.TASKLIST_COL_TITLE, title_col) |
2108 | - |
2109 | + title_col.set_max_width(100) |
2110 | + title_col.add_attribute( |
2111 | + render_text, "cell_background", self.TASK_MODEL_BGCOL) |
2112 | + title_col.set_clickable(True) |
2113 | + title_col.connect('clicked', self.sort_tasklist_rows) |
2114 | + self.task_tview.append_column(title_col) |
2115 | + self.priv["tasklist"]["columns"].insert( |
2116 | + self.TASKLIST_COL_TITLE, title_col) |
2117 | + |
2118 | # Due date column |
2119 | self.TASKLIST_COL_DDATE = 2 |
2120 | - ddate_col = gtk.TreeViewColumn() |
2121 | + ddate_col = gtk.TreeViewColumn() |
2122 | render_text = gtk.CellRendererText() |
2123 | - ddate_col.set_title (_("Due date")) |
2124 | - ddate_col.pack_start (render_text, expand=False) |
2125 | - ddate_col.add_attribute (render_text, "markup", self.TASK_MODEL_DDATE_STR) |
2126 | - ddate_col.set_resizable (False) |
2127 | - ddate_col.add_attribute (render_text, "cell_background", self.TASK_MODEL_BGCOL) |
2128 | - ddate_col.set_clickable (True) |
2129 | - ddate_col.connect ('clicked', self.sort_tasklist_rows) |
2130 | - self.task_tview.append_column (ddate_col) |
2131 | - self.priv["tasklist"]["columns"].insert(self.TASKLIST_COL_DDATE, ddate_col) |
2132 | - |
2133 | + ddate_col.set_title(_("Due date")) |
2134 | + ddate_col.pack_start(render_text, expand=False) |
2135 | + ddate_col.add_attribute( |
2136 | + render_text, "markup", self.TASK_MODEL_DDATE_STR) |
2137 | + ddate_col.set_resizable(False) |
2138 | + ddate_col.add_attribute( |
2139 | + render_text, "cell_background", self.TASK_MODEL_BGCOL) |
2140 | + ddate_col.set_clickable(True) |
2141 | + ddate_col.connect('clicked', self.sort_tasklist_rows) |
2142 | + self.task_tview.append_column(ddate_col) |
2143 | + self.priv["tasklist"]["columns"].insert( |
2144 | + self.TASKLIST_COL_DDATE, ddate_col) |
2145 | + |
2146 | # days left |
2147 | self.TASKLIST_COL_DLEFT = 3 |
2148 | - dleft_col = gtk.TreeViewColumn() |
2149 | + dleft_col = gtk.TreeViewColumn() |
2150 | render_text = gtk.CellRendererText() |
2151 | - dleft_col.set_title (_("Days left")) |
2152 | - dleft_col.pack_start (render_text, expand=False) |
2153 | - dleft_col.add_attribute (render_text, "markup", self.TASK_MODEL_DLEFT_STR) |
2154 | - dleft_col.set_resizable (False) |
2155 | - dleft_col.add_attribute (render_text, "cell_background", self.TASK_MODEL_BGCOL) |
2156 | - dleft_col.set_clickable (True) |
2157 | - dleft_col.connect ('clicked', self.sort_tasklist_rows) |
2158 | - self.task_tview.append_column (dleft_col) |
2159 | - self.priv["tasklist"]["columns"].insert(self.TASKLIST_COL_DLEFT, dleft_col) |
2160 | + dleft_col.set_title(_("Days left")) |
2161 | + dleft_col.pack_start(render_text, expand=False) |
2162 | + dleft_col.add_attribute( |
2163 | + render_text, "markup", self.TASK_MODEL_DLEFT_STR) |
2164 | + dleft_col.set_resizable(False) |
2165 | + dleft_col.add_attribute( |
2166 | + render_text, "cell_background", self.TASK_MODEL_BGCOL) |
2167 | + dleft_col.set_clickable(True) |
2168 | + dleft_col.connect('clicked', self.sort_tasklist_rows) |
2169 | + self.task_tview.append_column(dleft_col) |
2170 | + self.priv["tasklist"]["columns"].insert( |
2171 | + self.TASKLIST_COL_DLEFT, dleft_col) |
2172 | |
2173 | # Global treeview properties |
2174 | - self.task_tview.set_property ("expander-column", title_col) |
2175 | - self.task_tview.set_property ("enable-tree-lines", False) |
2176 | - self.task_tview.set_rules_hint (False) |
2177 | + self.task_tview.set_property("expander-column", title_col) |
2178 | + self.task_tview.set_property("enable-tree-lines", False) |
2179 | + self.task_tview.set_rules_hint(False) |
2180 | |
2181 | def __create_closed_tasks_tview(self): |
2182 | |
2183 | @@ -1605,64 +1687,66 @@ |
2184 | |
2185 | # Tag column |
2186 | self.CTASKLIST_COL_TAGS = 0 |
2187 | - tag_col = gtk.TreeViewColumn() |
2188 | + tag_col = gtk.TreeViewColumn() |
2189 | render_tags = CellRendererTags() |
2190 | - tag_col.set_title (_("Tags")) |
2191 | - tag_col.pack_start (render_tags, expand=False) |
2192 | - tag_col.add_attribute (render_tags, "tag_list", self.CTASKS_MODEL_TAGS) |
2193 | - render_tags.set_property ('xalign', 0.0) |
2194 | - tag_col.set_resizable (False) |
2195 | - tag_col.add_attribute (render_tags, "cell-background", self.CTASKS_MODEL_BGCOL) |
2196 | - #tag_col.set_clickable (True) |
2197 | - #tag_col.connect ('clicked', self.sort_tasklist_rows) |
2198 | - self.taskdone_tview.append_column (tag_col) |
2199 | - self.priv["ctasklist"]["columns"].insert(self.CTASKLIST_COL_TAGS, tag_col) |
2200 | - |
2201 | + tag_col.set_title(_("Tags")) |
2202 | + tag_col.pack_start(render_tags, expand=False) |
2203 | + tag_col.add_attribute(render_tags, "tag_list", self.CTASKS_MODEL_TAGS) |
2204 | + render_tags.set_property('xalign', 0.0) |
2205 | + tag_col.set_resizable(False) |
2206 | + tag_col.add_attribute( |
2207 | + render_tags, "cell-background", self.CTASKS_MODEL_BGCOL) |
2208 | + self.taskdone_tview.append_column(tag_col) |
2209 | + self.priv["ctasklist"]["columns"].insert( |
2210 | + self.CTASKLIST_COL_TAGS, tag_col) |
2211 | + |
2212 | # Done date column |
2213 | self.CTASKLIST_COL_DDATE = 1 |
2214 | - ddate_col = gtk.TreeViewColumn() |
2215 | - render_text = gtk.CellRendererText() |
2216 | - ddate_col.set_title (_("Closing date")) |
2217 | - ddate_col.pack_start (render_text , expand=True) |
2218 | - ddate_col.set_attributes (render_text , markup=self.CTASKS_MODEL_DDATE_STR) |
2219 | - ddate_col.set_sort_column_id (self.CTASKS_MODEL_DDATE) |
2220 | - ddate_col.add_attribute (render_text, "cell_background", self.CTASKS_MODEL_BGCOL) |
2221 | - self.taskdone_tview.append_column (ddate_col) |
2222 | - self.priv["ctasklist"]["columns"].insert(self.CTASKLIST_COL_DDATE, ddate_col) |
2223 | - |
2224 | + ddate_col = gtk.TreeViewColumn() |
2225 | + render_text = gtk.CellRendererText() |
2226 | + ddate_col.set_title(_("Closing date")) |
2227 | + ddate_col.pack_start(render_text, expand=True) |
2228 | + ddate_col.set_attributes( |
2229 | + render_text, markup=self.CTASKS_MODEL_DDATE_STR) |
2230 | + ddate_col.set_sort_column_id(self.CTASKS_MODEL_DDATE) |
2231 | + ddate_col.add_attribute( |
2232 | + render_text, "cell_background", self.CTASKS_MODEL_BGCOL) |
2233 | + self.taskdone_tview.append_column(ddate_col) |
2234 | + self.priv["ctasklist"]["columns"].insert( |
2235 | + self.CTASKLIST_COL_DDATE, ddate_col) |
2236 | + |
2237 | # Title column |
2238 | self.CTASKLIST_COL_TITLE = 2 |
2239 | - title_col = gtk.TreeViewColumn() |
2240 | - render_text = gtk.CellRendererText() |
2241 | - title_col.set_title (_("Title")) |
2242 | - title_col.pack_start (render_text , expand=True) |
2243 | - title_col.set_attributes (render_text , markup=self.CTASKS_MODEL_TITLE) |
2244 | - title_col.set_sort_column_id (self.CTASKS_MODEL_TITLE) |
2245 | - title_col.set_expand (True) |
2246 | - title_col.add_attribute (render_text, "cell_background", self.CTASKS_MODEL_BGCOL) |
2247 | - self.taskdone_tview.append_column (title_col) |
2248 | - self.priv["ctasklist"]["columns"].insert(self.CTASKLIST_COL_TITLE, title_col) |
2249 | - |
2250 | + title_col = gtk.TreeViewColumn() |
2251 | + render_text = gtk.CellRendererText() |
2252 | + title_col.set_title(_("Title")) |
2253 | + title_col.pack_start(render_text, expand=True) |
2254 | + title_col.set_attributes(render_text, markup=self.CTASKS_MODEL_TITLE) |
2255 | + title_col.set_sort_column_id(self.CTASKS_MODEL_TITLE) |
2256 | + title_col.set_expand(True) |
2257 | + title_col.add_attribute( |
2258 | + render_text, "cell_background", self.CTASKS_MODEL_BGCOL) |
2259 | + self.taskdone_tview.append_column(title_col) |
2260 | + self.priv["ctasklist"]["columns"].insert( |
2261 | + self.CTASKLIST_COL_TITLE, title_col) |
2262 | + |
2263 | # Global treeview properties |
2264 | - self.taskdone_ts.set_sort_column_id(self.CTASKS_MODEL_DDATE, gtk.SORT_DESCENDING) |
2265 | - |
2266 | + self.taskdone_ts.set_sort_column_id( |
2267 | + self.CTASKS_MODEL_DDATE, gtk.SORT_DESCENDING) |
2268 | + |
2269 | def __create_note_tview(self): |
2270 | # Title column |
2271 | - title_col = gtk.TreeViewColumn() |
2272 | - render_text = gtk.CellRendererText() |
2273 | - title_col.set_title (_("Notes")) |
2274 | - title_col.pack_start (render_text , expand=True) |
2275 | - title_col.set_attributes (render_text , markup=self.CTASKS_MODEL_TITLE) |
2276 | - title_col.set_sort_column_id (self.CTASKS_MODEL_TITLE) |
2277 | - title_col.set_expand (True) |
2278 | - self.note_tview.append_column (title_col) |
2279 | - |
2280 | - # Global treeview properties |
2281 | - #self.taskdone_ts.set_sort_column_id(self.CTASKS_MODEL_DDATE, gtk.SORT_DESCENDING) |
2282 | - |
2283 | - |
2284 | - ######Closing the window |
2285 | - def close(self,widget=None) : #pylint: disable-msg=W0613 |
2286 | + title_col = gtk.TreeViewColumn() |
2287 | + render_text = gtk.CellRendererText() |
2288 | + title_col.set_title(_("Notes")) |
2289 | + title_col.pack_start(render_text, expand=True) |
2290 | + title_col.set_attributes(render_text, markup=self.CTASKS_MODEL_TITLE) |
2291 | + title_col.set_sort_column_id(self.CTASKS_MODEL_TITLE) |
2292 | + title_col.set_expand(True) |
2293 | + self.note_tview.append_column(title_col) |
2294 | + |
2295 | + def close(self, widget=None): |
2296 | + """Closing the window.""" |
2297 | #Saving is now done in main.py |
2298 | self.on_delete(None, None) |
2299 | gtk.main_quit() |
Absolutely no behavioural changes here, just getting rid of all of the valid PEP 8 warnings in browser.py.