Start of preferences dialog
authorEd Page <eopage@byu.net>
Tue, 21 Apr 2009 00:13:58 +0000 (19:13 -0500)
committerEd Page <eopage@byu.net>
Tue, 21 Apr 2009 00:13:58 +0000 (19:13 -0500)
Also got some minor bug fixes in to some of the gtk_toolbox code

src/doneit.glade
src/doneit_glade.py
src/gtk_toolbox.py
src/rtm_view.py

index 61dbdc9..5aa296d 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
-<!--Generated with glade3 3.4.5 on Fri Apr 17 17:00:44 2009 -->
+<!--Generated with glade3 3.4.5 on Mon Apr 20 18:51:41 2009 -->
 <glade-interface>
   <widget class="GtkWindow" id="mainWindow">
     <property name="default_width">800</property>
                         <property name="use_stock">True</property>
                       </widget>
                     </child>
+                    <child>
+                      <widget class="GtkSeparatorMenuItem" id="separatormenuitem1">
+                        <property name="visible">True</property>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="preferencesMenuItem">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">gtk-preferences</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </widget>
+                    </child>
                   </widget>
                 </child>
               </widget>
       </widget>
     </child>
   </widget>
+  <widget class="GtkDialog" id="preferencesDialog">
+    <property name="border_width">5</property>
+    <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
+    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+    <property name="has_separator">False</property>
+    <child internal-child="vbox">
+      <widget class="GtkVBox" id="dialog-vbox4">
+        <property name="visible">True</property>
+        <property name="spacing">2</property>
+        <child>
+          <widget class="GtkNotebook" id="notebook1">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <child>
+              <widget class="GtkVBox" id="prefsBackendLayout">
+                <property name="visible">True</property>
+                <child>
+                  <widget class="GtkComboBox" id="prefsBackendSelector">
+                    <property name="visible">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                  </packing>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkLabel" id="prefsBackendTabLabel">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Backend</property>
+              </widget>
+              <packing>
+                <property name="type">tab</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <widget class="GtkHButtonBox" id="dialog-action_area4">
+            <property name="visible">True</property>
+            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <child>
+              <widget class="GtkButton" id="cancelPrefsButton">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="label" translatable="yes">gtk-cancel</property>
+                <property name="use_stock">True</property>
+                <property name="response_id">0</property>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkButton" id="applyPrefsButton">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="label" translatable="yes">gtk-apply</property>
+                <property name="use_stock">True</property>
+                <property name="response_id">0</property>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">GTK_PACK_END</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
 </glade-interface>
index 69bc6e0..86019f8 100755 (executable)
@@ -70,6 +70,7 @@ class DoneIt(object):
                self._clipboard = gtk.clipboard_get()
                self.__window = self._widgetTree.get_widget("mainWindow")
                self.__errorDisplay = gtk_toolbox.ErrorDisplay(self._widgetTree)
+               self._prefsDialog = gtk_toolbox.PreferencesDialog(self._widgetTree)
 
                self._app = None
                self._isFullScreen = False
@@ -99,7 +100,8 @@ class DoneIt(object):
                        "on_about": self._on_about_activate,
                }
                self._widgetTree.signal_autoconnect(callbackMapping)
-               self._widgetTree.get_widget("connectMenuItem").connect("activate", lambda *args: self._switch_ui(self._defaultUIName))
+               self._widgetTree.get_widget("connectMenuItem").connect("activate", lambda *args: self.switch_ui(self._defaultUIName))
+               self._widgetTree.get_widget("preferencesMenuItem").connect("activate", self._on_prefs)
 
                if self.__window:
                        if hildon is None:
@@ -199,9 +201,9 @@ class DoneIt(object):
                        )
 
                try:
-                       self._switch_ui(activeUIName)
+                       self.switch_ui(activeUIName)
                except KeyError, e:
-                       self._switch_ui(self._defaultUIName)
+                       self.switch_ui(self._defaultUIName)
 
        def save_settings(self, config):
                """
@@ -213,7 +215,13 @@ class DoneIt(object):
                for todoUI in self._todoUIs.itervalues():
                        todoUI.save_settings(config)
 
-       def _switch_ui(self, uiName):
+       def get_uis(self):
+               return (ui for ui in self._todoUIs.iteritems())
+
+       def get_default_ui(self):
+               return self._defaultUIName
+
+       def switch_ui(self, uiName):
                """
                @note UI Thread
                """
@@ -264,10 +272,10 @@ class DoneIt(object):
 
                if status == conic.STATUS_CONNECTED:
                        self._deviceIsOnline = True
-                       self._switch_ui(self._defaultUIName)
+                       self.switch_ui(self._defaultUIName)
                elif status == conic.STATUS_DISCONNECTED:
                        self._deviceIsOnline = False
-                       self._switch_ui(self._fallbackUIName)
+                       self.switch_ui(self._fallbackUIName)
 
        def _on_window_state_change(self, widget, event, *args):
                """
@@ -302,7 +310,14 @@ class DoneIt(object):
 
        def _on_logout(self, *args):
                self._todoUI.logout()
-               self._switch_ui(self._fallbackUIName)
+               self.switch_ui(self._fallbackUIName)
+
+       def _on_prefs(self, *args):
+               self._prefsDialog.enable()
+               try:
+                       self._prefsDialog.run(self)
+               finally:
+                       self._prefsDialog.disable()
 
        def _on_about_activate(self, *args):
                dlg = gtk.AboutDialog()
index 4828d5e..e6f6fc0 100644 (file)
@@ -370,7 +370,7 @@ class NotesDialog(object):
        def disable(self):
                self._addButton.disconnect(self._onAddId)
                self._saveButton.disconnect(self._onSaveId)
-               self._cancelButton.disconnect(self._onAddId)
+               self._cancelButton.disconnect(self._onCancelId)
 
        def run(self, todoManager, taskId, parentWindow = None):
                if parentWindow is not None:
@@ -490,7 +490,7 @@ class EditTaskDialog(object):
                self._pasteTaskNameButton.disconnect(self._onPasteTaskId)
                self._clearDueDate.disconnect(self._onClearDueDateId)
                self._addButton.disconnect(self._onAddId)
-               self._cancelButton.disconnect(self._onAddId)
+               self._cancelButton.disconnect(self._onCancelId)
 
                self._projectsList.clear()
                self._projectCombo.set_model(None)
@@ -622,6 +622,66 @@ class EditTaskDialog(object):
                self._dialog.response(gtk.RESPONSE_CANCEL)
 
 
+class PreferencesDialog(object):
+
+       def __init__(self, widgetTree):
+               self._backendList = gtk.ListStore(gobject.TYPE_STRING)
+               self._backendCell = gtk.CellRendererText()
+
+               self._dialog = widgetTree.get_widget("preferencesDialog")
+               self._backendSelector = widgetTree.get_widget("prefsBackendSelector")
+               self._applyButton = widgetTree.get_widget("applyPrefsButton")
+               self._cancelButton = widgetTree.get_widget("cancelPrefsButton")
+
+               self._onApplyId = None
+               self._onCancelId = None
+
+       def enable(self):
+               self._dialog.set_default_size(800, 300)
+               self._onApplyId = self._applyButton.connect("clicked", self._on_apply_clicked)
+               self._onCancelId = self._cancelButton.connect("clicked", self._on_cancel_clicked)
+
+               cell = self._backendCell
+               self._backendSelector.pack_start(cell, True)
+               self._backendSelector.add_attribute(cell, 'text', 0)
+               self._backendSelector.set_model(self._backendList)
+
+       def disable(self):
+               self._applyButton.disconnect(self._onApplyId)
+               self._cancelButton.disconnect(self._onCancelId)
+
+               self._backendList.clear()
+               self._backendSelector.set_model(None)
+
+       def run(self, app, parentWindow = None):
+               if parentWindow is not None:
+                       self._dialog.set_transient_for(parentWindow)
+
+               self._backendList.clear()
+               activeIndex = 0
+               for i, (uiName, ui) in enumerate(app.get_uis()):
+                       self._backendList.append((uiName, ))
+                       if uiName == app.get_default_ui():
+                               activeIndex = i
+               self._backendSelector.set_active(activeIndex)
+
+               try:
+                       response = self._dialog.run()
+                       if response != gtk.RESPONSE_OK:
+                               raise RuntimeError("Edit Cancelled")
+               finally:
+                       self._dialog.hide()
+
+               backendName = self._backendSelector.get_active_text()
+               app.switch_ui(backendName)
+
+       def _on_apply_clicked(self, *args):
+               self._dialog.response(gtk.RESPONSE_OK)
+
+       def _on_cancel_clicked(self, *args):
+               self._dialog.response(gtk.RESPONSE_CANCEL)
+
+
 if __name__ == "__main__":
        if True:
                win = gtk.Window()
index 158e569..a2593bf 100644 (file)
@@ -241,7 +241,7 @@ class ItemListView(object):
                self._todoItemScroll.hide_all()
 
                self._itemList.clear()
-               self._itemList.set_model(None)
+               self._todoItemTree.set_model(None)
 
        def reset_task_list(self, projId):
                self._projId = projId
@@ -442,6 +442,7 @@ class GtkRtMilk(object):
 
                self._projectsList = gtk.ListStore(gobject.TYPE_STRING)
                self._projectsCombo = widgetTree.get_widget("projectsCombo")
+               self._projectCell = gtk.CellRendererText()
                self._onListActivateId = 0
 
                self._itemView = ItemListView(widgetTree, self._errorDisplay)
@@ -507,6 +508,9 @@ class GtkRtMilk(object):
                """
                self._projectsList.clear()
                self._populate_projects()
+               cell = self._projectCell
+               self._projectsCombo.pack_start(cell, True)
+               self._projectsCombo.add_attribute(cell, 'text', 0)
 
                currentProject = self._get_project()
                projId = self._manager.lookup_project(currentProject)["id"]
@@ -520,15 +524,13 @@ class GtkRtMilk(object):
                @note UI Thread
                """
                self._projectsCombo.disconnect(self._onListActivateId)
+               self._onListActivateId = 0
 
                self._addView.disable()
                self._itemView.disable()
 
                self._projectsList.clear()
                self._projectsCombo.set_model(None)
-               self._projectsCombo.disconnect("changed", self._on_list_activate)
-
-               self._manager = None
 
        def _populate_projects(self):
                projects = self._manager.get_projects()
@@ -540,9 +542,6 @@ class GtkRtMilk(object):
                        if isVisible:
                                self._projectsList.append(row)
                self._projectsCombo.set_model(self._projectsList)
-               cell = gtk.CellRendererText()
-               self._projectsCombo.pack_start(cell, True)
-               self._projectsCombo.add_attribute(cell, 'text', 0)
                self._projectsCombo.set_active(0)
 
        def _reset_task_list(self):