From de16bbe25ee0885da4d0a290a619036bc53a82bd Mon Sep 17 00:00:00 2001 From: Ed Page Date: Wed, 15 Apr 2009 23:52:04 -0500 Subject: [PATCH] Cleanup and moving the add view to a seperate class --- src/rtm_view.py | 168 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 94 insertions(+), 74 deletions(-) diff --git a/src/rtm_view.py b/src/rtm_view.py index d6a563d..22364f1 100644 --- a/src/rtm_view.py +++ b/src/rtm_view.py @@ -1,6 +1,7 @@ """ @todo Add an agenda view to the task list Tree of days, with each successive 7 days dropping the visibility of further lower priority items +@todo Remove blocking operations from UI thread """ import webbrowser @@ -11,6 +12,7 @@ import base64 import gobject import gtk +import coroutines import toolbox import gtk_toolbox import rtm_backend @@ -179,7 +181,6 @@ class ItemListView(object): self._todoItemScroll.add(self._todoItemTree) self._onItemSelectId = 0 - def enable(self, manager, projId): self._manager = manager self._projId = projId @@ -289,26 +290,16 @@ class ItemListView(object): self.reset_task_list(self._projId) -class ItemAgendaView(object): - pass - +class QuickAddView(object): -class GtkRtMilk(object): - - def __init__(self, widgetTree): - """ - @note Thread agnostic - """ + def __init__(self, widgetTree, addSink): self._manager = None - self._credentials = "", "", "" + self._projId = None + self._addSink = addSink self._clipboard = gtk.clipboard_get() self._editDialog = gtk_toolbox.EditTaskDialog(widgetTree) - self._projectsList = gtk.ListStore(gobject.TYPE_STRING) - self._projectsCombo = widgetTree.get_widget("projectsCombo") - self._onListActivateId = 0 - self._taskNameEntry = widgetTree.get_widget("add-taskNameEntry") self._addTaskButton = widgetTree.get_widget("add-addTaskButton") self._pasteTaskNameButton = widgetTree.get_widget("add-pasteTaskNameButton") @@ -320,7 +311,90 @@ class GtkRtMilk(object): self._onClearId = None self._onPasteId = None + def enable(self, manager, projId): + self._manager = manager + self._projId = projId + + self._onAddId = self._addTaskButton.connect("clicked", self._on_add) + self._onAddClickedId = self._addTaskButton.connect("pressed", self._on_add_pressed) + self._onAddReleasedId = self._addTaskButton.connect("released", self._on_add_released) + self._onPasteId = self._pasteTaskNameButton.connect("clicked", self._on_paste) + self._onClearId = self._clearTaskNameButton.connect("clicked", self._on_clear) + + def disable(self): + self._manager = None + self._projId = None + + self._addTaskButton.disconnect(self._onAddId) + self._addTaskButton.disconnect(self._onAddClickedId) + self._addTaskButton.disconnect(self._onAddReleasedId) + self._pasteTaskNameButton.disconnect(self._onPasteId) + self._clearTaskNameButton.disconnect(self._onClearId) + + def reset_task_list(self, projId): + self._projId = projId + isMeta = self._manager.get_project(self._projId)["isMeta"] + # @todo RTM handles this by defaulting to a specific list + self._addTaskButton.set_sensitive(not isMeta) + + def _on_add(self, *args): + name = self._taskNameEntry.get_text() + + projId = self._projId + taskId = self._manager.add_task(projId, name) + + self._taskNameEntry.set_text("") + self._addSink.send((projId, taskId)) + + def _on_add_edit(self, *args): + name = self._taskNameEntry.get_text() + + projId = self._projId + taskId = self._manager.add_task(projId, name) + + try: + self._editDialog.enable(self._manager) + try: + self._editDialog.request_task(self._manager, taskId) + finally: + self._editDialog.disable() + finally: + self._taskNameEntry.set_text("") + self._addSink.send((projId, taskId)) + + def _on_add_pressed(self, widget): + self._addToEditTimerId = gobject.timeout_add(1000, self._on_add_edit) + + def _on_add_released(self, widget): + if self._addToEditTimerId is not None: + gobject.source_remove(self._addToEditTimerId) + self._addToEditTimerId = None + + def _on_paste(self, *args): + entry = self._taskNameEntry.get_text() + entry += self._clipboard.wait_for_text() + self._taskNameEntry.set_text(entry) + + def _on_clear(self, *args): + self._taskNameEntry.set_text("") + + +class GtkRtMilk(object): + + def __init__(self, widgetTree): + """ + @note Thread agnostic + """ + self._manager = None + self._credentials = "", "", "" + + self._projectsList = gtk.ListStore(gobject.TYPE_STRING) + self._projectsCombo = widgetTree.get_widget("projectsCombo") + self._onListActivateId = 0 + self._itemView = ItemListView(widgetTree) + addSink = coroutines.func_sink(lambda eventData: self._itemView.reset_task_list(eventData[0])) + self._addView = QuickAddView(widgetTree, addSink) self._credentialsDialog = gtk_toolbox.LoginWindow(widgetTree) @staticmethod @@ -383,26 +457,18 @@ class GtkRtMilk(object): currentProject = self._get_project() projId = self._manager.lookup_project(currentProject)["id"] + self._addView.enable(self._manager, projId) self._itemView.enable(self._manager, projId) self._onListActivateId = self._projectsCombo.connect("changed", self._on_list_activate) - self._onAddId = self._addTaskButton.connect("clicked", self._on_add) - self._onAddClickedId = self._addTaskButton.connect("pressed", self._on_add_pressed) - self._onAddReleasedId = self._addTaskButton.connect("released", self._on_add_released) - self._onPasteId = self._pasteTaskNameButton.connect("clicked", self._on_paste) - self._onClearId = self._clearTaskNameButton.connect("clicked", self._on_clear) def disable(self): """ @note UI Thread """ self._projectsCombo.disconnect(self._onListActivateId) - self._addTaskButton.disconnect(self._onAddId) - self._addTaskButton.disconnect(self._onAddClickedId) - self._addTaskButton.disconnect(self._onAddReleasedId) - self._pasteTaskNameButton.disconnect(self._onPasteId) - self._clearTaskNameButton.disconnect(self._onClearId) + self._addView.disable() self._itemView.disable() self._projectsList.clear() @@ -425,12 +491,9 @@ class GtkRtMilk(object): self._projectsCombo.set_active(0) def _reset_task_list(self): - currentProject = self._get_project() - projId = self._manager.lookup_project(currentProject)["id"] - isMeta = self._manager.get_project(projId)["isMeta"] - # @todo RTM handles this by defaulting to a specific list - self._addTaskButton.set_sensitive(not isMeta) - + projectName = self._get_project() + projId = self._manager.lookup_project(projectName) + self._addView.reset_task_list(projId) self._itemView.reset_task_list(projId) def _get_project(self): @@ -439,46 +502,3 @@ class GtkRtMilk(object): def _on_list_activate(self, *args): self._reset_task_list() - - def _on_add(self, *args): - name = self._taskNameEntry.get_text() - - currentProject = self._get_project() - projId = self._manager.lookup_project(currentProject)["id"] - taskId = self._manager.add_task(projId, name) - - self._taskNameEntry.set_text("") - self._reset_task_list() - - def _on_add_edit(self, *args): - name = self._taskNameEntry.get_text() - - currentProject = self._get_project() - projId = self._manager.lookup_project(currentProject)["id"] - taskId = self._manager.add_task(projId, name) - - try: - self._editDialog.enable(self._manager) - try: - self._editDialog.request_task(self._manager, taskId) - finally: - self._editDialog.disable() - finally: - self._taskNameEntry.set_text("") - self._reset_task_list() - - def _on_add_pressed(self, widget): - self._addToEditTimerId = gobject.timeout_add(1000, self._on_add_edit) - - def _on_add_released(self, widget): - if self._addToEditTimerId is not None: - gobject.source_remove(self._addToEditTimerId) - self._addToEditTimerId = None - - def _on_paste(self, *args): - entry = self._taskNameEntry.get_text() - entry += self._clipboard.wait_for_text() - self._taskNameEntry.set_text(entry) - - def _on_clear(self, *args): - self._taskNameEntry.set_text("") -- 1.7.9.5