From: Ed Page Date: Fri, 24 Apr 2009 04:00:07 +0000 (-0500) Subject: Moving QuickView and commiting start of work on project editor X-Git-Url: https://vcs.maemo.org/git/?p=doneit;a=commitdiff_plain;h=09b3d4e2698191c622809a880c3f112feb7d30ba Moving QuickView and commiting start of work on project editor Minor cleanups Bug Fixes --- diff --git a/src/doneit.glade b/src/doneit.glade index d1039fc..9973d36 100644 --- a/src/doneit.glade +++ b/src/doneit.glade @@ -1,6 +1,6 @@ - + 800 @@ -95,6 +95,18 @@ True _View True + + + True + + + True + Projects + True + + + + @@ -289,19 +301,32 @@ True 2 + + True + + + False + False + 1 + + + True 2 2 - + True - True - False + Username + + + + + True + Password - 1 - 2 1 2 @@ -317,36 +342,23 @@ - + True - Password + True + False + 1 + 2 1 2 - - - True - Username - - 1 - - - True - - - False - False - 1 - - True @@ -423,28 +435,27 @@ 2 2 - + True - + True True - True - True - True - True - True + 2009 + 3 + 16 + False - + True - + True True True - gtk-paste + gtk-clear True 0 @@ -452,7 +463,6 @@ False - False 1 @@ -460,6 +470,17 @@ 1 2 + 1 + 2 + + + + + True + + + 1 + 2 @@ -476,36 +497,28 @@ - - True - - - 1 - 2 - - - - + True - + True True - 2009 - 3 - 16 - False + True + True + True + True + True - + True - + True True True - gtk-clear + gtk-paste True 0 @@ -513,6 +526,7 @@ False + False 1 @@ -520,8 +534,6 @@ 1 2 - 1 - 2 @@ -761,7 +773,7 @@ GTK_POLICY_NEVER GTK_POLICY_AUTOMATIC - + True True diff --git a/src/gtk_toolbox.py b/src/gtk_toolbox.py index e6f6fc0..6e5bbf7 100644 --- a/src/gtk_toolbox.py +++ b/src/gtk_toolbox.py @@ -272,6 +272,38 @@ class ErrorDisplay(object): self.__parentBox.remove(self.__errorBox) +class DummyErrorDisplay(object): + + def __init__(self): + super(DummyErrorDisplay, self).__init__() + + self.__messages = [] + + def push_message_with_lock(self, message): + self.push_message(message) + + def push_message(self, message): + if 0 < len(self.__messages): + self.__messages.append(message) + else: + self.__show_message(message) + + def push_exception(self, exception = None): + if exception is None: + warningMessage = traceback.format_exc() + else: + warningMessage = exception + warnings.warn(warningMessage, stacklevel=3) + + def pop_message(self): + if 0 < len(self.__messages): + self.__show_message(self.__messages[0]) + del self.__messages[0] + + def __show_message(self, message): + warnings.warn(message, stacklevel=2) + + class MessageBox(gtk.MessageDialog): def __init__(self, message): @@ -346,6 +378,96 @@ class PopupCalendar(object): warnings.warn(e.message) +class QuickAddView(object): + + def __init__(self, widgetTree, errorDisplay, signalSink, prefix): + self._errorDisplay = errorDisplay + self._manager = None + self._signalSink = signalSink + + self._clipboard = gtk.clipboard_get() + + self._taskNameEntry = widgetTree.get_widget(prefix+"-nameEntry") + self._addTaskButton = widgetTree.get_widget(prefix+"-addButton") + self._pasteTaskNameButton = widgetTree.get_widget(prefix+"-pasteNameButton") + self._clearTaskNameButton = widgetTree.get_widget(prefix+"-clearNameButton") + self._onAddId = None + self._onAddClickedId = None + self._onAddReleasedId = None + self._addToEditTimerId = None + self._onClearId = None + self._onPasteId = None + + def enable(self, manager): + self._manager = manager + + 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._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 set_addability(self, addability): + self._addTaskButton.set_sensitive(addability) + + def _on_add(self, *args): + try: + name = self._taskNameEntry.get_text() + self._taskNameEntry.set_text("") + + self._signalSink.stage.send(("add", name)) + except StandardError, e: + self._errorDisplay.push_exception() + + def _on_add_edit(self, *args): + try: + name = self._taskNameEntry.get_text() + self._taskNameEntry.set_text("") + + self._signalSink.stage.send(("add-edit", name)) + except StandardError, e: + self._errorDisplay.push_exception() + + def _on_add_pressed(self, widget): + try: + self._addToEditTimerId = gobject.timeout_add(1000, self._on_add_edit) + except StandardError, e: + self._errorDisplay.push_exception() + + def _on_add_released(self, widget): + try: + if self._addToEditTimerId is not None: + gobject.source_remove(self._addToEditTimerId) + self._addToEditTimerId = None + except StandardError, e: + self._errorDisplay.push_exception() + + def _on_paste(self, *args): + try: + entry = self._taskNameEntry.get_text() + addedText = self._clipboard.wait_for_text() + if addedText: + entry += addedText + self._taskNameEntry.set_text(entry) + except StandardError, e: + self._errorDisplay.push_exception() + + def _on_clear(self, *args): + try: + self._taskNameEntry.set_text("") + except StandardError, e: + self._errorDisplay.push_exception() + + class NotesDialog(object): def __init__(self, widgetTree): @@ -682,6 +804,86 @@ class PreferencesDialog(object): self._dialog.response(gtk.RESPONSE_CANCEL) +class ProjectsDialog(object): + + ID_IDX = 0 + NAME_IDX = 1 + VISIBILITY_IDX = 2 + + def __init__(self, widgetTree): + self._manager = None + + self._dialog = widgetTree.get_widget("projectsDialog") + self._projView = widgetTree.get_widget("proj-projectView") + + addSink = coroutines.CoSwitch(["add", "add-edit"]) + addSink.register_sink("add", coroutines.func_sink(self._on_add)) + addSink.register_sink("add-edit", coroutines.func_sink(self._on_add_edit)) + self._addView = QuickAddView(widgetTree, DummyErrorDisplay(), addSink, "proj") + + self._projList = gtk.ListStore( + gobject.TYPE_STRING, # id + gobject.TYPE_STRING, # name + gobject.TYPE_BOOLEAN, # is visible + ) + self._visibilityColumn = gtk.TreeViewColumn('') # Complete? + self._visibilityCell = gtk.CellRendererToggle() + self._visibilityCell.set_property("activatable", True) + self._visibilityCell.connect("toggled", self._on_toggle_visibility) + self._visibilityColumn.pack_start(self._visibilityCell, False) + self._visibilityColumn.set_attributes(self._visibilityCell, active=self.VISIBILITY_IDX) + self._nameColumn = gtk.TreeViewColumn('Name') + self._nameCell = gtk.CellRendererText() + self._nameColumn.pack_start(self._nameCell, True) + self._nameColumn.set_attributes(self._nameCell, text=self.NAME_IDX) + self._nameColumn.set_expand(True) + + self._projView.append_column(self._visibilityColumn) + self._projView.append_column(self._nameColumn) + self._projView.connect("row-activated", self._on_proj_select) + + def enable(self, manager): + self._manager = manager + + self._populate_projects() + self._dialog.show_all() + + def disable(self): + self._dialog.hide_all() + self._manager = None + + self._projList.clear() + self._projView.set_model(None) + + def _populate_projects(self): + self._projList.clear() + + projects = self._manager.get_projects() + for project in projects: + projectId = project["id"] + projectName = project["name"] + isVisible = project["isVisible"] + row = (projectId, projectName, isVisible) + self._projList.append(row) + self._projView.set_model(self._projList) + + def _on_add(self, eventData): + eventName, taskName, = eventData + # @todo + self._populate_projects() + + def _on_add_edit(self, eventData): + self._on_add(eventData) + + def _on_toggle_visibility(self, *args): + # @todo + pass + + def _on_proj_select(self, *args): + # @todo + pass + + if __name__ == "__main__": if True: win = gtk.Window() diff --git a/src/rtm_view.py b/src/rtm_view.py index fa67a2c..4c704c0 100644 --- a/src/rtm_view.py +++ b/src/rtm_view.py @@ -322,96 +322,6 @@ class ItemListView(object): self._errorDisplay.push_exception() -class QuickAddView(object): - - def __init__(self, widgetTree, errorDisplay, signalSink, prefix): - self._errorDisplay = errorDisplay - self._manager = None - self._signalSink = signalSink - - self._clipboard = gtk.clipboard_get() - - self._taskNameEntry = widgetTree.get_widget(prefix+"-nameEntry") - self._addTaskButton = widgetTree.get_widget(prefix+"-addButton") - self._pasteTaskNameButton = widgetTree.get_widget(prefix+"-pasteNameButton") - self._clearTaskNameButton = widgetTree.get_widget(prefix+"-clearNameButton") - self._onAddId = None - self._onAddClickedId = None - self._onAddReleasedId = None - self._addToEditTimerId = None - self._onClearId = None - self._onPasteId = None - - def enable(self, manager): - self._manager = manager - - 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._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 set_addability(self, addability): - self._addTaskButton.set_sensitive(addability) - - def _on_add(self, *args): - try: - name = self._taskNameEntry.get_text() - self._taskNameEntry.set_text("") - - self._signalSink.stage.send(("add", name)) - except StandardError, e: - self._errorDisplay.push_exception() - - def _on_add_edit(self, *args): - try: - name = self._taskNameEntry.get_text() - self._taskNameEntry.set_text("") - - self._signalSink.stage.send(("add-edit", name)) - except StandardError, e: - self._errorDisplay.push_exception() - - def _on_add_pressed(self, widget): - try: - self._addToEditTimerId = gobject.timeout_add(1000, self._on_add_edit) - except StandardError, e: - self._errorDisplay.push_exception() - - def _on_add_released(self, widget): - try: - if self._addToEditTimerId is not None: - gobject.source_remove(self._addToEditTimerId) - self._addToEditTimerId = None - except StandardError, e: - self._errorDisplay.push_exception() - - def _on_paste(self, *args): - try: - entry = self._taskNameEntry.get_text() - addedText = self._clipboard.wait_for_text() - if addedText: - entry += addedText - self._taskNameEntry.set_text(entry) - except StandardError, e: - self._errorDisplay.push_exception() - - def _on_clear(self, *args): - try: - self._taskNameEntry.set_text("") - except StandardError, e: - self._errorDisplay.push_exception() - - class GtkRtMilk(object): def __init__(self, widgetTree, errorDisplay): @@ -423,16 +333,20 @@ class GtkRtMilk(object): self._credentials = "", "", "" self._editDialog = gtk_toolbox.EditTaskDialog(widgetTree) + self._projDialog = gtk_toolbox.ProjectsDialog(widgetTree) self._projectsList = gtk.ListStore(gobject.TYPE_STRING) self._projectsCombo = widgetTree.get_widget("projectsCombo") self._projectCell = gtk.CellRendererText() self._onListActivateId = 0 + self._projectMenuItem = widgetTree.get_widget("projectMenuItem") + self._onProjectMenuItemActivated = 0 + self._itemView = ItemListView(widgetTree, self._errorDisplay) addSink = coroutines.CoSwitch(["add", "add-edit"]) addSink.register_sink("add", coroutines.func_sink(self._on_add)) addSink.register_sink("add-edit", coroutines.func_sink(self._on_add_edit)) - self._addView = QuickAddView(widgetTree, self._errorDisplay, addSink, "add") + self._addView = gtk_toolbox.QuickAddView(widgetTree, self._errorDisplay, addSink, "add") self._credentialsDialog = gtk_toolbox.LoginWindow(widgetTree) @staticmethod @@ -503,12 +417,14 @@ class GtkRtMilk(object): self._itemView.enable(self._manager, projId) self._onListActivateId = self._projectsCombo.connect("changed", self._on_list_activate) + self._onProjectMenuItemActivated = self._projectMenuItem.connect("activate", self._on_proj_activate) def disable(self): """ @note UI Thread """ self._projectsCombo.disconnect(self._onListActivateId) + self._projectMenuItem.disconnect(self._onProjectMenuItemActivated) self._onListActivateId = 0 self._addView.disable() @@ -550,29 +466,26 @@ class GtkRtMilk(object): def _on_add(self, eventData): eventName, taskName, = eventData - try: - projectName = self._get_project() - projId = self._manager.lookup_project(projectName)["id"] + projectName = self._get_project() + projId = self._manager.lookup_project(projectName)["id"] - taskId = self._manager.add_task(projId, taskName) + taskId = self._manager.add_task(projId, taskName) - self._itemView.reset_task_list(projId) - except StandardError, e: - self._errorDisplay.push_exception() + self._itemView.reset_task_list(projId) def _on_add_edit(self, eventData): eventName, taskName, = eventData - try: - projectName = self._get_project() - projId = self._manager.lookup_project(projectName)["id"] + projectName = self._get_project() + projId = self._manager.lookup_project(projectName)["id"] - taskId = self._manager.add_task(projId, taskName) + taskId = self._manager.add_task(projId, taskName) - self._editDialog.enable(self._manager) - try: - self._editDialog.request_task(self._manager, taskId) - finally: - self._editDialog.disable() - self._itemView.reset_task_list(projId) - except StandardError, e: - self._errorDisplay.push_exception() + self._editDialog.enable(self._manager) + try: + self._editDialog.request_task(self._manager, taskId) + finally: + self._editDialog.disable() + self._itemView.reset_task_list(projId) + + def _on_proj_activate(self, *args): + self._projDialog.enable(self._manager)