More todo work
[doneit] / src / gtk_rtmilk.py
index e92c0fb..693cc62 100644 (file)
@@ -1,6 +1,7 @@
 import webbrowser
 import datetime
 import urlparse
+import base64
 
 import gobject
 import gtk
@@ -54,6 +55,12 @@ def get_token(username, apiKey, secret):
        return token
 
 
+def get_credentials(credentialsDialog):
+       username, password = credentialsDialog.request_credentials()
+       token = get_token(username, rtmilk.RtMilkManager.API_KEY, rtmilk.RtMilkManager.SECRET)
+       return username, password, token
+
+
 class GtkRtMilk(object):
 
        ID_IDX = 0
@@ -80,9 +87,10 @@ class GtkRtMilk(object):
                self._projectsCombo = widgetTree.get_widget("projectsCombo")
                self._onListActivateId = 0
 
+               # @todo Need to figure out how to make the list sortable, especially with weird priority sorting
                self._itemList = gtk.ListStore(
                        gobject.TYPE_STRING, # id
-                       gobject.TYPE_BOOLEAN,   # is complete
+                       gobject.TYPE_BOOLEAN, # is complete
                        gobject.TYPE_STRING, # name
                        gobject.TYPE_STRING, # priority
                        gobject.TYPE_STRING, # due
@@ -107,7 +115,7 @@ class GtkRtMilk(object):
                self._dueColumn = gtk.TreeViewColumn('Due')
                self._dueCell = gtk.CellRendererText()
                self._dueColumn.pack_start(self._nameCell, False)
-               self._dueColumn.set_attributes(self._nameCell, text=self.DUE_IDX)
+               self._dueColumn.set_attributes(self._nameCell, text=self.FUZZY_IDX)
                self._linkColumn = gtk.TreeViewColumn('') # Link
                self._linkCell = gtk.CellRendererText()
                self._linkColumn.pack_start(self._nameCell, False)
@@ -131,24 +139,65 @@ class GtkRtMilk(object):
                self._onClearId = None
                self._onPasteId = None
 
-               self._credentials = gtk_toolbox.LoginWindow(widgetTree)
+               self._credentialsDialog = gtk_toolbox.LoginWindow(widgetTree)
+               self._credentials = "", "", ""
                self._manager = None
 
        @staticmethod
        def name():
                return "Remember The Milk"
 
-       def start_session(self):
-               username, password = self._credentials.request_credentials()
-               token = get_token(username, rtmilk.RtMilkManager.API_KEY, rtmilk.RtMilkManager.SECRET)
-               return rtmilk.RtMilkManager(username, password, token)
+       def load_settings(self, config):
+               """
+               @note Thread Agnostic
+               """
+               blobs = (
+                       config.get(self.name(), "bin_blob_%i" % i)
+                       for i in xrange(len(self._credentials))
+               )
+               creds = (
+                       base64.b64decode(blob)
+                       for blob in blobs
+               )
+               self._credentials = tuple(creds)
 
-       def enable(self):
+       def save_settings(self, config):
+               """
+               @note Thread Agnostic
+               """
+               config.add_section(self.name())
+               for i, value in enumerate(self._credentials):
+                       blob = base64.b64encode(value)
+                       config.set(self.name(), "bin_blob_%i" % i, blob)
+
+       def login(self):
                """
                @note UI Thread
                """
-               self._manager = self.start_session()
+               if self._manager is not None:
+                       return
+
+               credentials = self._credentials
+               while True:
+                       try:
+                               self._manager = rtmilk.RtMilkManager(*credentials)
+                               self._credentials = credentials
+                               return # Login succeeded
+                       except rtmapi.AuthStateMachine.NoData:
+                               # Login failed, grab new credentials
+                               credentials = get_credentials(self._credentialsDialog)
+
+       def logout(self):
+               """
+               @note Thread Agnostic
+               """
+               self._credentials = "", "", ""
+               self._manager = None
 
+       def enable(self):
+               """
+               @note UI Thread
+               """
                self._projectsList.clear()
                self._populate_projects()
 
@@ -231,6 +280,7 @@ class GtkRtMilk(object):
                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"]
                for taskDetails in self._manager.get_tasks_with_details(projId):
@@ -262,6 +312,8 @@ class GtkRtMilk(object):
                self._reset_task_list()
 
        def _on_item_select(self, treeView, path, viewColumn):
+               # @todo See if there is a way to get a right click / tap'n'hold for more task goodness
+               #       https://garage.maemo.org/plugins/wiki/index.php?TapAndHold&id=40&type=g
                taskId = self._itemList[path[0]][self.ID_IDX]
 
                if viewColumn is self._priorityColumn: