33
33
from GTG.core.plugins.engine import PluginEngine
34
34
from GTG.core.plugins.api import PluginAPI
35
35
from GTG.core.task import Task
36
from GTG.tools import dates
36
from GTG.tools.dates import Date
37
37
from GTG.gtk.editor.calendar import GTGCalendar
180
174
self.window.resize(eval(str(size[0])),eval(str(size[1])))
182
176
self.textview.set_editable(True)
183
#Connection for the update
184
self.req.connect('task-modified',self.task_modified)
185
177
self.window.show()
188
#FIXME: avoid to update to many time when we modify from the editor itself
189
def task_modified(self,sender,tid):
190
self.refresh_editor(refreshtext=True)
192
179
# Define accelerator-keys for this dialog
193
180
# TODO: undo/redo
194
181
def init_accelerators(self):
276
263
self.builder.get_object("label2").show()
277
264
self.builder.get_object("hbox1").show()
266
#refreshing the start date field
267
startdate = self.task.get_start_date()
268
prevdate = Date.parse(self.startdate_widget.get_text())
269
if startdate != prevdate:
270
self.startdate_widget.set_text(str(startdate))
279
272
#refreshing the due date field
280
273
duedate = self.task.get_due_date()
281
prevdate = dates.strtodate(self.duedate_widget.get_text())
282
if duedate != prevdate or type(duedate) is not type(prevdate):
283
zedate = str(duedate).replace("-", date_separator)
284
self.duedate_widget.set_text(zedate)
274
prevdate = Date.parse(self.duedate_widget.get_text())
275
if duedate != prevdate:
276
self.duedate_widget.set_text(str(duedate))
285
278
# refreshing the closed date field
286
279
closeddate = self.task.get_closed_date()
287
prevcldate = dates.strtodate(self.closeddate_widget.get_text())
288
if closeddate != prevcldate or type(closeddate) is not type(prevcldate):
289
zecldate = str(closeddate).replace("-", date_separator)
290
self.closeddate_widget.set_text(zecldate)
280
prevcldate = Date.parse(self.closeddate_widget.get_text())
281
if closeddate != prevcldate:
282
self.closeddate_widget.set_text(str(closeddate))
291
284
#refreshing the day left label
292
285
#If the task is marked as done, we display the delay between the
293
286
#due date and the actual closing date. If the task isn't marked
304
297
abs_delay = abs(delay)
305
298
txt = ngettext("Completed %(days)d day early", "Completed %(days)d days early", abs_delay) % {'days': abs_delay}
307
result = self.task.get_days_left()
300
due_date = self.task.get_due_date()
301
result = due_date.days_left()
302
if due_date.is_fuzzy():
311
305
txt = ngettext("Due tomorrow!", "%(days)d days left", result) % {'days': result}
318
312
color = str(window_style.text[gtk.STATE_INSENSITIVE])
319
313
self.dayleft_label.set_markup("<span color='"+color+"'>"+txt+"</span>")
321
startdate = self.task.get_start_date()
322
prevdate = dates.strtodate(self.startdate_widget.get_text())
323
if startdate != prevdate or type(startdate) is not type(prevdate):
324
zedate = str(startdate).replace("-",date_separator)
325
self.startdate_widget.set_text(zedate)
326
315
#Refreshing the tag list in the insert tag button
327
316
taglist = self.req.get_used_tags()
328
317
menu = gtk.Menu()
347
336
def date_changed(self,widget,data):
348
337
text = widget.get_text()
352
datetoset = dates.no_date
340
datetoset = Date.no_date()
354
datetoset = dates.strtodate(text)
343
datetoset = Date.parse(text)
359
348
#If the date is valid, we write with default color in the widget
360
349
# "none" will set the default color.
361
350
widget.modify_text(gtk.STATE_NORMAL, None)
362
351
widget.modify_base(gtk.STATE_NORMAL, None)
363
353
if data == "start" :
364
354
self.task.set_start_date(datetoset)
365
355
elif data == "due" :
366
356
self.task.set_due_date(datetoset)
367
357
elif data == "closed" :
368
358
self.task.set_closed_date(datetoset)
369
#Set the due date to be equal to the start date
360
# Set the due date to be equal to the start date
370
361
# when it happens that the start date is later than the due date
371
362
start_date = self.task.get_start_date()
372
363
due_date = self.task.get_due_date()
377
368
widget.modify_text(gtk.STATE_NORMAL, gtk.gdk.color_parse("#F00"))
378
369
widget.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#F88"))
382
371
def on_date_pressed(self, widget, date_kind):
383
372
"""Called when a date-changing button is clicked."""
384
373
if date_kind == GTGCalendar.DATE_KIND_DUE:
385
374
date = self.task.get_due_date()
387
# is due_date < start_date ?
388
# no_date need special care because we want to no_date < anything
389
375
start_date = self.task.get_start_date()
390
due_before_start = start_date != dates.no_date and start_date > date
376
due_before_start = start_date and start_date > date
392
378
if not date or due_before_start:
393
379
date = self.task.get_start_date()
402
388
self.calendar.show_at_position(x + rect.x + rect.width,
406
391
def on_date_changed(self, calendar):
407
392
date, date_kind = calendar.get_selected_date()
408
393
if date_kind == GTGCalendar.DATE_KIND_DUE:
413
398
self.task.set_closed_date(date)
414
399
self.refresh_editor()
401
def close_all_subtasks(self):
404
def trace_subtasks(root):
405
for i in root.get_subtasks():
406
if i not in all_subtasks:
407
all_subtasks.append(i)
410
trace_subtasks(self.task)
412
for task in all_subtasks:
413
self.vmanager.close_task(task.get_id())
416
415
def dismiss(self,widget) : #pylint: disable-msg=W0613
417
416
stat = self.task.get_status()
418
417
if stat == "Dismiss":