Big update to 0.1.0. Improved error handling, syncing, the works...
[hermes] / package / src / gui.py
index e3366fc..c283ff1 100755 (executable)
@@ -7,6 +7,7 @@ import traceback
 import time
 import thread
 import contactview
+import urllib2 
 from hermes import Hermes
 
 gobject.threads_init()
@@ -39,10 +40,23 @@ class HermesGUI:
       try:
         fb2c = Hermes(self,
                       twitter = (self.get_use_twitter() and self.get_twitter_credentials()) or None,
-                      facebook = self.get_use_facebook())
+                      facebook = self.get_use_facebook(),
+                      empty = self.get_create_empty())
         fb2c.load_friends()
         fb2c.sync_contacts(resync = force)
         gobject.idle_add(self.open_summary, fb2c)
+
+      except urllib2.HTTPError, e:
+        traceback.print_exc()
+        if e.code == 401:
+          gobject.idle_add(self.report_error, 'Authentication problem. Check credentials.', True)
+        else:
+          gobject.idle_add(self.report_error, 'Network connection error. Check connectivity.')
+
+      except urllib2.URLError, e:
+        traceback.print_exc()
+        gobject.idle_add(self.report_error, 'Network connection error. Check connectivity.')
+      
       except Exception, e:
         traceback.print_exc()
         gobject.idle_add(self.report_error, 'Something went wrong: ' + e.message)
@@ -83,7 +97,6 @@ class HermesGUI:
     view = contactview.ContactView(contacts)
 
     dialog = gtk.Dialog('Contacts', self.window)
-    dialog.add_button('Back', gtk.RESPONSE_OK)
     #view.connect('contact-activated', self.map_contact)
     dialog.vbox.add(view)
     dialog.show_all()
@@ -102,47 +115,81 @@ class HermesGUI:
     dialog = gtk.Dialog('Accounts', self.window)
     dialog.add_button('Save', gtk.RESPONSE_OK)
 
-    use_facebook = hildon.CheckButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
-    use_facebook.set_label('Use Facebook')
+    #pa = hildon.PannableArea()
+    #dialog.vbox.add(pa)
+    content = dialog.vbox 
+    #content = gtk.VBox()
+    #pa.add(content)
+    #pa.set_size_request(600, 380)
+
+    use_facebook = self.new_checkbox('Use Facebook', content)
     use_facebook.set_active(self.get_use_facebook())
-    dialog.vbox.add(use_facebook)
 
-    use_twitter = hildon.CheckButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
-    use_twitter.set_label('Use Twitter')
+    indent = self.new_indent(content)
+    fb_msg = self.add_linked(indent, use_facebook, gtk.Label('Note: authentication via web page'))
+    fb_msg.set_property('justify', gtk.JUSTIFY_LEFT)
+    
+    fb_empty = self.add_linked(indent, use_facebook, self.new_checkbox('Create birthday-only contacts'))
+    fb_empty.set_active(self.get_create_empty())
+
+    use_twitter = self.new_checkbox('Use Twitter', content)
     use_twitter.set_active(self.get_use_twitter())
-    dialog.vbox.add(use_twitter)
 
-    tw_indent = gtk.HBox()
-    tw_user = hildon.Entry(gtk.HILDON_SIZE_FINGER_HEIGHT)
-    tw_user.set_property('hildon-input-mode', gtk.HILDON_GTK_INPUT_MODE_FULL)
-    tw_user.set_placeholder("Username")
-    tw_user.set_property('is-focus', False)
+    indent = self.new_indent(content)
+    tw_user = self.add_linked(indent, use_twitter, self.new_input('Twitter username'))
     tw_user.set_text(self.get_twitter_credentials()[0])
-    self.sync_edit(use_twitter, tw_user)
-    use_twitter.connect('toggled', self.sync_edit, tw_user)
-    tw_indent.pack_start(tw_user, padding=48)
-    dialog.vbox.add(tw_indent)
-
-    tw_indent = gtk.HBox()
-    tw_pass = hildon.Entry(gtk.HILDON_SIZE_FINGER_HEIGHT)
-    tw_pass.set_placeholder("Password")
+
+    tw_pass = self.add_linked(indent, use_twitter, self.new_input('Twitter password'))
     tw_pass.set_property('hildon-input-mode', gtk.HILDON_GTK_INPUT_MODE_FULL |
                                               gtk.HILDON_GTK_INPUT_MODE_INVISIBLE)
     tw_pass.set_text(self.get_twitter_credentials()[1])
-    self.sync_edit(use_twitter, tw_pass)
-    use_twitter.connect('toggled', self.sync_edit, tw_pass)
-    tw_indent.pack_start(tw_pass, padding=48)
-    dialog.vbox.add(tw_indent)
 
     dialog.show_all()
     result = dialog.run()
     dialog.hide()
     if result == gtk.RESPONSE_OK:
       self.set_use_facebook(use_facebook.get_active())
+      self.set_create_empty(fb_empty.get_active())
       self.set_use_twitter(use_twitter.get_active(), tw_user.get_text(), tw_pass.get_text())
 
     return result
-    
+  # -----------------------------------------------------------------------
+  def new_checkbox(self, label, box = None):
+    checkbox = hildon.CheckButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
+    checkbox.set_label(label)
+    if box:
+      box.add(checkbox)
+    return checkbox
+
+
+  # -----------------------------------------------------------------------
+  def new_indent(self, box):
+    outer = gtk.HBox()
+    indent = gtk.VBox()
+    outer.pack_start(indent, padding=48)
+    box.add(outer)
+    return indent
+
+  # -----------------------------------------------------------------------
+  def new_input(self, text, box = None):
+    input = hildon.Entry(gtk.HILDON_SIZE_FINGER_HEIGHT)
+    input.set_property('hildon-input-mode', gtk.HILDON_GTK_INPUT_MODE_FULL)
+    input.set_placeholder(text)
+    input.set_property('is-focus', False)
+    if box:
+      box.add(input)
+    return input
+
+
+  # -----------------------------------------------------------------------
+  def add_linked(self, box, ctrl, to_add):
+    box.add(to_add)
+    self.sync_edit(ctrl, to_add)
+    ctrl.connect('toggled', self.sync_edit, to_add)
+    return to_add
+  
     
   # -----------------------------------------------------------------------
   def sync_edit(self, use_twitter, edit):
@@ -205,8 +252,14 @@ class HermesGUI:
 
 
   # -----------------------------------------------------------------------
-  def report_error(self, e):
+  def report_error(self, e, prefs = False):
+    if self.progressnote:
+      self.window.set_property('sensitive', True)
+      self.progressnote.destroy()
+
     hildon.hildon_banner_show_information(self.window, '', e)
+    if prefs:
+      self.open_prefs()
 
 
   # -----------------------------------------------------------------------
@@ -216,7 +269,7 @@ class HermesGUI:
     self.app = hildon.Program()
     self.window = hildon.Window()
     gtk.set_application_name('Hermes')
-    self.osso_context = osso.Context('org.maemo.hermes', '0.0.4', False)
+    self.osso_context = osso.Context('org.maemo.hermes', '0.0.5', False)
     self.app.add_window(self.window)
 
     self.window.connect("delete-event", gtk.main_quit)
@@ -260,6 +313,13 @@ class HermesGUI:
   def set_use_facebook(self, value):
     self.gc.set_bool("/apps/maemo/hermes/use_facebook", value)
 
+  def get_create_empty(self):
+    return self.gc.get_bool("/apps/maemo/hermes/create_empty")
+
+
+  def set_create_empty(self, value):
+    self.gc.set_bool("/apps/maemo/hermes/create_empty", value)
+
 
   def get_use_twitter(self):
     return self.gc.get_bool("/apps/maemo/hermes/use_twitter")