~saurabhanandiit/gtg/exportFixed

« back to all changes in this revision

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

  • Committer: Izidor Matušov
  • Date: 2012-02-29 10:06:41 UTC
  • mfrom: (1098 gtg)
  • mto: This revision was merged to the branch mainline in revision 1103.
  • Revision ID: izidor.matusov@gmail.com-20120229100641-q1uns4yqz1fem2z4
Merged with the current trunk & solved problems with offset

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
38
38
 
39
 
 
40
 
date_separator = "-"
41
 
 
42
 
 
43
 
 
44
39
class TaskEditor:
45
40
 
46
 
 
47
41
    def __init__(self, 
48
42
                 requester, 
49
43
                 vmanager, 
180
174
                    self.window.resize(eval(str(size[0])),eval(str(size[1])))
181
175
 
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()
186
178
 
187
 
 
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)
191
 
 
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()
278
265
 
 
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)) 
 
271
 
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))
 
277
 
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))
 
283
 
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}
306
299
        else:
307
 
            result = self.task.get_days_left()
308
 
            if result is None:
 
300
            due_date = self.task.get_due_date()
 
301
            result = due_date.days_left()
 
302
            if due_date.is_fuzzy():
309
303
                txt = ""
310
304
            elif result > 0:
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>")
320
314
 
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()
346
335
 
347
336
    def date_changed(self,widget,data):
348
337
        text = widget.get_text()
349
 
        validdate = False
350
 
        if not text :
351
 
            validdate = True
352
 
            datetoset = dates.no_date
 
338
        valid = True
 
339
        if not text:
 
340
            datetoset = Date.no_date()
353
341
        else :
354
 
            datetoset = dates.strtodate(text)
355
 
            if datetoset :
356
 
                validdate = True
 
342
            try:
 
343
                datetoset = Date.parse(text)
 
344
            except ValueError:
 
345
                valid = False
357
346
 
358
 
        if validdate :
 
347
        if valid:
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)
 
352
 
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
 
359
 
 
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"))
379
370
 
380
 
 
381
 
 
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()
386
 
 
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
391
377
 
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,
403
389
                                       y + rect.y)
404
390
 
405
 
 
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()
415
400
 
 
401
    def close_all_subtasks(self):
 
402
        all_subtasks = []
 
403
 
 
404
        def trace_subtasks(root):
 
405
            for i in root.get_subtasks():
 
406
                if i not in all_subtasks:
 
407
                    all_subtasks.append(i)
 
408
                    trace_subtasks(i)
 
409
 
 
410
        trace_subtasks(self.task)
 
411
 
 
412
        for task in all_subtasks:
 
413
            self.vmanager.close_task(task.get_id())
 
414
 
416
415
    def dismiss(self,widget) : #pylint: disable-msg=W0613
417
416
        stat = self.task.get_status()
418
417
        if stat == "Dismiss":
420
419
            self.refresh_editor()
421
420
        else:
422
421
            self.task.set_status("Dismiss")
 
422
            self.close_all_subtasks()
423
423
            self.close(None)
424
424
 
425
425
    def change_status(self,widget) : #pylint: disable-msg=W0613
429
429
            self.refresh_editor()
430
430
        else:
431
431
            self.task.set_status("Done")
 
432
            self.close_all_subtasks()
432
433
            self.close(None)
433
434
 
434
435
    def delete_task(self, widget) :