Short/long version with long including tags colored specially
"""
-import warnings
-import contextlib
+import sys
+import traceback
import datetime
+import contextlib
+import warnings
import gobject
import gtk
else:
self.__show_message(message)
- def push_exception(self, exception):
- self.push_message(exception.message)
- warnings.warn(exception, stacklevel=3)
+ def push_exception(self, exception = None):
+ if exception is None:
+ userMessage = sys.exc_value.message
+ warningMessage = traceback.format_exc()
+ else:
+ userMessage = exception.message
+ warningMessage = exception
+ self.push_message(userMessage)
+ warnings.warn(warningMessage, stacklevel=3)
def pop_message(self):
if 0 < len(self.__messages):
class PopupCalendar(object):
- def __init__(self, parent, eventTarget = coroutines.null_sink()):
- self._eventTarget = eventTarget
-
- self.__calendar = gtk.Calendar()
- self.__calendar.connect("day-selected-double-click", self._on_date_select)
-
- self.__popupWindow = gtk.Window(type = gtk.WINDOW_POPUP)
- self.__popupWindow.set_title("")
- self.__popupWindow.add(self.__calendar)
- self.__popupWindow.set_transient_for(parent)
- self.__popupWindow.set_modal(True)
+ def __init__(self, parent, displayDate):
+ self._displayDate = displayDate
+
+ self._calendar = gtk.Calendar()
+ self._calendar.select_month(self._displayDate.month, self._displayDate.year)
+ self._calendar.select_day(self._displayDate.day)
+ self._calendar.set_display_options(
+ gtk.CALENDAR_SHOW_HEADING |
+ gtk.CALENDAR_SHOW_DAY_NAMES |
+ gtk.CALENDAR_NO_MONTH_CHANGE |
+ 0
+ )
+ self._calendar.connect("day-selected", self._on_day_selected)
- def get_date(self):
- year, month, day = self.__calendar.get_date()
- month += 1 # Seems to be 0 indexed
- return datetime.date(year, month, day)
+ self._popupWindow = gtk.Window()
+ self._popupWindow.set_title("")
+ self._popupWindow.add(self._calendar)
+ self._popupWindow.set_transient_for(parent)
+ self._popupWindow.set_modal(True)
def run(self):
- self.__popupWindow.show_all()
+ self._popupWindow.show_all()
- def _on_date_select(self, *args):
- self.__popupWindow.hide()
- self._eventTarget.send((self, self.get_date()))
+ def _on_day_selected(self, *args):
+ try:
+ self._calendar.select_month(self._displayDate.month, self._displayDate.year)
+ self._calendar.select_day(self._displayDate.day)
+ except StandardError, e:
+ warnings.warn(e.message)
class EditTaskDialog(object):
self._taskName = widgetTree.get_widget("edit-taskNameEntry")
self._pasteTaskNameButton = widgetTree.get_widget("edit-pasteTaskNameButton")
self._priorityChoiceCombo = widgetTree.get_widget("edit-priorityChoiceCombo")
- self._dueDateDisplay = widgetTree.get_widget("edit-dueDateDisplay")
- self._dueDateProperties = widgetTree.get_widget("edit-dueDateProperties")
+ self._dueDateDisplay = widgetTree.get_widget("edit-dueDateCalendar")
self._clearDueDate = widgetTree.get_widget("edit-clearDueDate")
self._addButton = widgetTree.get_widget("edit-commitEditTaskButton")
self._cancelButton = widgetTree.get_widget("edit-cancelEditTaskButton")
- self._popupCalendar = PopupCalendar(self._dialog, coroutines.func_sink(self._update_duedate))
+ self._onPasteTaskId = None
+ self._onClearDueDateId = None
+ self._onAddId = None
+ self._onCancelId = None
def enable(self, todoManager):
self._populate_projects(todoManager)
- self._pasteTaskNameButton.connect("clicked", self._on_name_paste)
- self._dueDateProperties.connect("clicked", self._on_choose_duedate)
- self._clearDueDate.connect("clicked", self._on_clear_duedate)
- self._addButton.connect("clicked", self._on_add_clicked)
- self._cancelButton.connect("clicked", self._on_cancel_clicked)
+ self._onPasteTaskId = self._pasteTaskNameButton.connect("clicked", self._on_name_paste)
+ self._onClearDueDateId = self._clearDueDate.connect("clicked", self._on_clear_duedate)
+ self._onAddId = self._addButton.connect("clicked", self._on_add_clicked)
+ self._onCancelId = self._cancelButton.connect("clicked", self._on_cancel_clicked)
def disable(self):
- self._pasteTaskNameButton.disconnect("clicked", self._on_name_paste)
- self._dueDateProperties.disconnect("clicked", self._on_choose_duedate)
- self._clearDueDate.disconnect("clicked", self._on_clear_duedate)
+ self._pasteTaskNameButton.disconnect(self._onPasteTaskId)
+ self._clearDueDate.disconnect(self._onClearDueDateId)
+ self._addButton.disconnect(self._onAddId)
+ self._cancelButton.disconnect(self._onAddId)
+
self._projectsList.clear()
self._projectCombo.set_model(None)
originalName = taskDetails["name"]
originalPriority = str(taskDetails["priority"].get_nothrow(0))
if taskDetails["dueDate"].is_good():
- originalDue = taskDetails["dueDate"].get().strftime("%Y-%m-%d %H:%M:%S")
+ originalDue = taskDetails["dueDate"].get()
else:
- originalDue = ""
+ originalDue = None
self._dialog.set_default_response(gtk.RESPONSE_OK)
self._taskName.set_text(originalName)
self._set_active_proj(originalProjectName)
self._priorityChoiceCombo.set_active(int(originalPriority))
- self._dueDateDisplay.set_text(originalDue)
+ if originalDue is not None:
+ # Months are 0 indexed
+ self._dueDateDisplay.select_month(originalDue.month - 1, originalDue.year)
+ self._dueDateDisplay.select_day(originalDue.day)
+ else:
+ now = datetime.datetime.now()
+ self._dueDateDisplay.select_month(now.month, now.year)
+ self._dueDateDisplay.select_day(0)
try:
response = self._dialog.run()
newProjectName = self._get_project(todoManager)
newName = self._taskName.get_text()
newPriority = self._get_priority()
- newDueDate = self._dueDateDisplay.get_text()
+ year, month, day = self._dueDateDisplay.get_date()
+ if day != 0:
+ # Months are 0 indexed
+ date = datetime.date(year, month + 1, day)
+ time = datetime.time()
+ newDueDate = datetime.datetime.combine(date, time)
+ else:
+ newDueDate = None
isProjDifferent = newProjectName != originalProjectName
isNameDifferent = newName != originalName
print "PRIO CHANGE"
if isDueDifferent:
if newDueDate:
- due = datetime.datetime.strptime(newDueDate, "%Y-%m-%d %H:%M:%S")
- due = toolbox.Optional(due)
+ due = toolbox.Optional(newDueDate)
else:
due = toolbox.Optional()
else:
return str(index)
- def _update_duedate(self, eventData):
- widget, date = eventData
- time = datetime.time()
- dueDate = datetime.datetime.combine(date, time)
-
- formttedDate = dueDate.strftime("%Y-%m-%d %H:%M:%S")
- self._dueDateDisplay.set_text(formttedDate)
-
def _on_name_paste(self, *args):
clipboard = gtk.clipboard_get()
contents = clipboard.wait_for_text()
if contents is not None:
self._taskName.set_text(contents)
- def _on_choose_duedate(self, *args):
- self._popupCalendar.run()
-
def _on_clear_duedate(self, *args):
- self._dueDateDisplay.set_text("")
+ self._dueDateDisplay.select_day(0)
def _on_add_clicked(self, *args):
self._dialog.response(gtk.RESPONSE_OK)
win.connect("destroy", lambda w: gtk.main_quit())
win.show_all()
- gtk.main()
+
+ if False:
+ cal = PopupCalendar(None, datetime.datetime.now())
+ cal._popupWindow.connect("destroy", lambda w: gtk.main_quit())
+ cal.run()
+
+ gtk.main()