From b79e62c1ee2b9a3a3ad17fd008802d0a2a9ec4f9 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Wed, 15 Apr 2009 23:02:51 -0500 Subject: [PATCH] Broke the todo item list out into a seperate class in preparation for making it interchangable --- src/rtm_view.py | 239 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 139 insertions(+), 100 deletions(-) diff --git a/src/rtm_view.py b/src/rtm_view.py index 987f34a..061588b 100644 --- a/src/rtm_view.py +++ b/src/rtm_view.py @@ -66,7 +66,7 @@ def get_credentials(credentialsDialog): return username, password, token -class GtkRtMilk(object): +class ItemListView(object): ID_IDX = 0 COMPLETION_IDX = 1 @@ -78,20 +78,13 @@ class GtkRtMilk(object): NOTES_IDX = 7 def __init__(self, widgetTree): - """ - @note Thread agnostic - """ - self._clipboard = gtk.clipboard_get() - + self._manager = None + self._projId = None self._showCompleted = False self._showIncomplete = True self._editDialog = gtk_toolbox.EditTaskDialog(widgetTree) - self._projectsList = gtk.ListStore(gobject.TYPE_STRING) - self._projectsCombo = widgetTree.get_widget("projectsCombo") - self._onListActivateId = 0 - self._itemList = gtk.ListStore( gobject.TYPE_STRING, # id gobject.TYPE_BOOLEAN, # is complete @@ -136,6 +129,131 @@ class GtkRtMilk(object): self._todoItemScroll.add(self._todoItemTree) self._onItemSelectId = 0 + + def enable(self, manager, projId): + self._manager = manager + self._projId = projId + + self._todoBox.pack_start(self._todoItemScroll) + self._todoItemScroll.show_all() + + self._itemList.clear() + self._todoItemTree.append_column(self._completionColumn) + self._todoItemTree.append_column(self._priorityColumn) + self._todoItemTree.append_column(self._nameColumn) + self._todoItemTree.append_column(self._dueColumn) + self._todoItemTree.append_column(self._linkColumn) + self._todoItemTree.append_column(self._notesColumn) + self.reset_task_list(self._projId) + + self._todoItemTree.set_headers_visible(False) + self._nameColumn.set_expand(True) + + self._onItemSelectId = self._todoItemTree.connect("row-activated", self._on_item_select) + + def disable(self): + self._manager = None + self._projId = None + + self._todoBox.remove(self._todoItemScroll) + self._todoItemScroll.hide_all() + self._todoItemTree.disconnect(self._onItemSelectId) + + self._todoItemTree.remove_column(self._completionColumn) + self._todoItemTree.remove_column(self._priorityColumn) + self._todoItemTree.remove_column(self._nameColumn) + self._todoItemTree.remove_column(self._dueColumn) + self._todoItemTree.remove_column(self._linkColumn) + self._todoItemTree.remove_column(self._notesColumn) + self._itemList.clear() + self._itemList.set_model(None) + + def reset_task_list(self, projId): + self._projId = projId + self._itemList.clear() + self._populate_items() + + def _populate_items(self): + projId = self._projId + sortedTasks = list(self._manager.get_tasks_with_details(projId)) + sortedTasks.sort(key = lambda taskDetails: (taskDetails["priority"].get_nothrow(1000), taskDetails["dueDate"].get_nothrow(datetime.datetime.max))) + for taskDetails in sortedTasks: + show = self._showCompleted if taskDetails["isCompleted"] else self._showIncomplete + if not show: + continue + id = taskDetails["id"] + isCompleted = taskDetails["isCompleted"] + name = abbreviate(taskDetails["name"], 100) + priority = str(taskDetails["priority"].get_nothrow("")) + if taskDetails["dueDate"].is_good(): + dueDate = taskDetails["dueDate"].get() + dueDescription = dueDate.strftime("%Y-%m-%d %H:%M:%S") + fuzzyDue = toolbox.to_fuzzy_date(dueDate) + else: + dueDescription = "" + fuzzyDue = "" + + linkDisplay = taskDetails["url"] + linkDisplay = abbreviate_url(linkDisplay, 20, 10) + + notes = taskDetails["notes"] + notesDisplay = "%d Notes" % len(notes) if notes else "" + + row = (id, isCompleted, name, priority, dueDescription, fuzzyDue, linkDisplay, notesDisplay) + self._itemList.append(row) + self._todoItemTree.set_model(self._itemList) + + def _on_item_select(self, treeView, path, viewColumn): + # @todo See if there is a way to use the new gtk_toolbox.ContextHandler + taskId = self._itemList[path[0]][self.ID_IDX] + + if viewColumn is self._priorityColumn: + pass + elif viewColumn is self._nameColumn: + self._editDialog.enable(self._manager) + try: + self._editDialog.request_task(self._manager, taskId) + finally: + self._editDialog.disable() + self.reset_task_list(self._projId) + elif viewColumn is self._dueColumn: + self._editDialog.enable(self._manager) + try: + self._editDialog.request_task(self._manager, taskId) + finally: + self._editDialog.disable() + self.reset_task_list(self._projId) + elif viewColumn is self._linkColumn: + webbrowser.open(self._manager.get_task_details(taskId)["url"]) + elif viewColumn is self._notesColumn: + pass + + def _on_completion_change(self, cell, path): + taskId = self._itemList[path[0]][self.ID_IDX] + self._manager.complete_task(taskId) + self.reset_task_list(self._projId) + + +class ItemAgendaView(object): + pass + + +class GtkRtMilk(object): + + def __init__(self, widgetTree): + """ + @note Thread agnostic + """ + self._manager = None + self._credentials = "", "", "" + + 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") @@ -147,9 +265,8 @@ class GtkRtMilk(object): self._onClearId = None self._onPasteId = None + self._itemView = ItemListView(widgetTree) self._credentialsDialog = gtk_toolbox.LoginWindow(widgetTree) - self._credentials = "", "", "" - self._manager = None @staticmethod def name(): @@ -206,28 +323,14 @@ class GtkRtMilk(object): """ @note UI Thread """ - self._todoBox.pack_start(self._todoItemScroll) - self._todoItemScroll.show_all() - self._projectsList.clear() self._populate_projects() - self._itemList.clear() - self._todoItemTree.append_column(self._completionColumn) - self._todoItemTree.append_column(self._priorityColumn) - self._todoItemTree.append_column(self._nameColumn) - self._todoItemTree.append_column(self._dueColumn) - self._todoItemTree.append_column(self._linkColumn) - self._todoItemTree.append_column(self._notesColumn) - self._reset_task_list() - - self._todoItemTree.set_headers_visible(False) - self._nameColumn.set_expand(True) - - self._editDialog.enable(self._manager) + currentProject = self._get_project() + projId = self._manager.lookup_project(currentProject)["id"] + self._itemView.enable(self._manager, projId) self._onListActivateId = self._projectsCombo.connect("changed", self._on_list_activate) - self._onItemSelectId = self._todoItemTree.connect("row-activated", self._on_item_select) 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) @@ -238,32 +341,19 @@ class GtkRtMilk(object): """ @note UI Thread """ - self._todoBox.remove(self._todoItemScroll) - self._todoItemScroll.hide_all() - self._projectsCombo.disconnect(self._onListActivateId) - self._todoItemTree.disconnect(self._onItemSelectId) 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._editDialog.disable() + self._itemView.disable() self._projectsList.clear() self._projectsCombo.set_model(None) self._projectsCombo.disconnect("changed", self._on_list_activate) - self._todoItemTree.remove_column(self._completionColumn) - self._todoItemTree.remove_column(self._priorityColumn) - self._todoItemTree.remove_column(self._nameColumn) - self._todoItemTree.remove_column(self._dueColumn) - self._todoItemTree.remove_column(self._linkColumn) - self._todoItemTree.remove_column(self._notesColumn) - self._itemList.clear() - self._itemList.set_model(None) - self._manager = None def _populate_projects(self): @@ -286,65 +376,15 @@ class GtkRtMilk(object): # @todo RTM handles this by defaulting to a specific list self._addTaskButton.set_sensitive(not isMeta) - self._itemList.clear() - self._populate_items() + self._itemView.reset_task_list(projId) def _get_project(self): currentProjectName = self._projectsCombo.get_active_text() return currentProjectName - def _populate_items(self): - # @todo Look into using a button for notes and links, and labels for all else - currentProject = self._get_project() - projId = self._manager.lookup_project(currentProject)["id"] - sortedTasks = list(self._manager.get_tasks_with_details(projId)) - sortedTasks.sort(key = lambda taskDetails: (taskDetails["priority"].get_nothrow(1000), taskDetails["dueDate"].get_nothrow(datetime.datetime.max))) - for taskDetails in sortedTasks: - show = self._showCompleted if taskDetails["isCompleted"] else self._showIncomplete - if not show: - continue - id = taskDetails["id"] - isCompleted = taskDetails["isCompleted"] - name = abbreviate(taskDetails["name"], 100) - priority = str(taskDetails["priority"].get_nothrow("")) - if taskDetails["dueDate"].is_good(): - dueDate = taskDetails["dueDate"].get() - dueDescription = dueDate.strftime("%Y-%m-%d %H:%M:%S") - fuzzyDue = toolbox.to_fuzzy_date(dueDate) - else: - dueDescription = "" - fuzzyDue = "" - - linkDisplay = taskDetails["url"] - linkDisplay = abbreviate_url(linkDisplay, 20, 10) - - notes = taskDetails["notes"] - notesDisplay = "%d Notes" % len(notes) if notes else "" - - row = (id, isCompleted, name, priority, dueDescription, fuzzyDue, linkDisplay, notesDisplay) - self._itemList.append(row) - self._todoItemTree.set_model(self._itemList) - def _on_list_activate(self, *args): self._reset_task_list() - def _on_item_select(self, treeView, path, viewColumn): - # @todo See if there is a way to use the new gtk_toolbox.ContextHandler - taskId = self._itemList[path[0]][self.ID_IDX] - - if viewColumn is self._priorityColumn: - pass - elif viewColumn is self._nameColumn: - self._editDialog.request_task(self._manager, taskId) - self._reset_task_list() - elif viewColumn is self._dueColumn: - self._editDialog.request_task(self._manager, taskId) - self._reset_task_list() - elif viewColumn is self._linkColumn: - webbrowser.open(self._manager.get_task_details(taskId)["url"]) - elif viewColumn is self._notesColumn: - pass - def _on_add(self, *args): name = self._taskNameEntry.get_text() @@ -363,7 +403,11 @@ class GtkRtMilk(object): taskId = self._manager.add_task(projId, name) try: - self._editDialog.request_task(self._manager, taskId) + 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() @@ -383,8 +427,3 @@ class GtkRtMilk(object): def _on_clear(self, *args): self._taskNameEntry.set_text("") - - def _on_completion_change(self, cell, path): - taskId = self._itemList[path[0]][self.ID_IDX] - self._manager.complete_task(taskId) - self._reset_task_list() -- 1.7.9.5