Provide search-as-you-type in the mapping dialogues.
[hermes] / package / src / org / maemo / hermes / gui / gtkui.py
index 54567ff..5008925 100644 (file)
@@ -5,13 +5,15 @@ import time
 import thread
 import urllib2
 import hildon
 import thread
 import urllib2
 import hildon
+import conic
+import webbrowser
 from org.bleb.wimpworks import WimpWorks
 from org.maemo.hermes.gui.contactview import ContactView
 from org.maemo.hermes.gui.mapcontact import MapContact
 from org.maemo.hermes.gui.accountsdialogue import AccountsDialogue
 from org.bleb.wimpworks import HildonMainScreenLayout
 from org.maemo.hermes.engine.syncjob import SyncJob
 from org.bleb.wimpworks import WimpWorks
 from org.maemo.hermes.gui.contactview import ContactView
 from org.maemo.hermes.gui.mapcontact import MapContact
 from org.maemo.hermes.gui.accountsdialogue import AccountsDialogue
 from org.bleb.wimpworks import HildonMainScreenLayout
 from org.maemo.hermes.engine.syncjob import SyncJob
-#from hermes import Hermes ### FIXME This needs to be new
+from org.maemo.hermes.engine.hermes import Hermes
 
 class HermesGUI(WimpWorks):
     """Provides the GUI for Hermes, allowing the syncing of Facebook and
 
 class HermesGUI(WimpWorks):
     """Provides the GUI for Hermes, allowing the syncing of Facebook and
@@ -24,7 +26,7 @@ class HermesGUI(WimpWorks):
     # -----------------------------------------------------------------------
     def __init__(self, providers = None):
         gettext.install('hermes','/opt/hermes/share/locale/')
     # -----------------------------------------------------------------------
     def __init__(self, providers = None):
         gettext.install('hermes','/opt/hermes/share/locale/')
-        WimpWorks.__init__(self, 'Hermes', version = '0.9.0', dbus_name = 'org.maemo.hermes')
+        WimpWorks.__init__(self, 'Hermes', version = '0.8.2', dbus_name = 'org.maemo.hermes')
         self.set_background('background.png')
         
         layout = HildonMainScreenLayout(offset = 0.8, container = self)
         self.set_background('background.png')
         
         layout = HildonMainScreenLayout(offset = 0.8, container = self)
@@ -32,10 +34,13 @@ class HermesGUI(WimpWorks):
         layout.add_button('Refresh', _("Update contacts' info"))
         
         self.add_menu_action("Accounts")
         layout.add_button('Refresh', _("Update contacts' info"))
         
         self.add_menu_action("Accounts")
+        self.add_menu_action("About")
         self.menu.show_all()
         
         self.providers = providers
         self.progressnote = None
         self.menu.show_all()
         
         self.providers = providers
         self.progressnote = None
+        connection = conic.Connection()
+        gobject.timeout_add(100, connection.request_connection, conic.CONNECT_FLAG_NONE)
 
   
     # -----------------------------------------------------------------------
 
   
     # -----------------------------------------------------------------------
@@ -52,6 +57,54 @@ class HermesGUI(WimpWorks):
     def do_accounts(self, widget = None):
         dialog = AccountsDialogue(self.main_window, self.providers)
         dialog.show()
     def do_accounts(self, widget = None):
         dialog = AccountsDialogue(self.main_window, self.providers)
         dialog.show()
+
+
+    # -----------------------------------------------------------------------
+    def do_about(self, widget):
+        """Inspired by HeAboutDialog Python port:
+           http://wiki.maemo.org/Hildon-Extras#HeAboutDialog"""
+
+        dlg = gtk.Dialog(_("About"), self.main_window)
+
+        icon = gtk.Image()
+        icon.set_from_icon_name(self.name.lower(), gtk.ICON_SIZE_DIALOG)
+        icon.set_padding(5, 5)
+
+        name = gtk.Label(self.name)
+        name.set_alignment(0, 1)
+        hildon.hildon_helper_set_logical_font(name, 'X-LargeSystemFont')
+
+        version = gtk.Label('v%s' % (self.version))
+        version.set_alignment(0, 1)
+        version.set_padding(10, 0)
+        hildon.hildon_helper_set_logical_font(version, 'LargeSystemFont')
+        
+        desc = gtk.Label(_("Enrich contacts' from social networks."))
+        desc.set_alignment(0, 0)
+
+        copy = gtk.Label("Copyright (c) 2010 Andrew Flegg, Fredrik Wendt, Tim Samoff")
+        copy.set_alignment(0, 1)
+        copy.set_padding(0, 5)
+        hildon.hildon_helper_set_logical_font(copy, 'SmallSystemFont')
+        hildon.hildon_helper_set_logical_color(copy, gtk.RC_FG, gtk.STATE_NORMAL, "SecondaryTextColor")
+
+        layout = gtk.Table(3, 3, False)
+        layout.attach(icon, 0, 1, 0, 2, 0, gtk.EXPAND, 0, 0)
+        layout.attach(name, 1, 2, 0, 1, 0, gtk.EXPAND | gtk.FILL, 0, 0)
+        layout.attach(version, 2, 3, 0, 1, gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL, 0, 0)
+        layout.attach(desc, 1, 3, 1, 2, gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL, 0, 0)
+        layout.attach(copy, 0, 3, 2, 3, gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL, 0, 0)
+        dlg.vbox.add(layout)
+
+        dlg.add_button(_('Visit website'), gtk.RESPONSE_APPLY)
+        dlg.add_button(_('Report bug'), gtk.RESPONSE_NO)
+        dlg.show_all()
+        response = dlg.run()
+        if response == gtk.RESPONSE_APPLY:
+            webbrowser.open('http://hermes.garage.maemo.org/')
+        elif response == gtk.RESPONSE_NO:
+            webbrowser.open('https://bugs.maemo.org/enter_bug.cgi?product=Hermes')
+        dlg.hide()
    
 
     # -----------------------------------------------------------------------
    
 
     # -----------------------------------------------------------------------
@@ -65,28 +118,22 @@ class HermesGUI(WimpWorks):
             saved = self.do_accounts()
             if saved == gtk.RESPONSE_DELETE_EVENT:
                 return
             saved = self.do_accounts()
             if saved == gtk.RESPONSE_DELETE_EVENT:
                 return
+            
+        print "doing sync", main
         
         if main:
             self.main_window.set_property('sensitive', False)
             thread.start_new_thread(self.sync, (widget, force, False))
         else:
             try:
         
         if main:
             self.main_window.set_property('sensitive', False)
             thread.start_new_thread(self.sync, (widget, force, False))
         else:
             try:
+                self.progress('', 0, 0)
                 services = []
                 for provider in enabled:
                     services.append(provider.service(self))
                     
                 services = []
                 for provider in enabled:
                     services.append(provider.service(self))
                     
-                print services
-                class FakeContact():
-                    def get_name(self):
-                        return "Fredrik Wendt"
-                    def get_emails(self):
-                        return ["fredrik@wendt.se","maemohermes@wendt.se"]
-                self._sync_job = SyncJob(services, [FakeContact()], self.progress)
-                self._sync_job.run()
-                self._sync_job.get_unmatched_friends()
-                self._sync_job.get_updated_contacts()
-                self._sync_job.get_matched_contacts()
-                raise Exception("TODO - implement syncing")
+                hermes = Hermes(services, self.progress)
+                hermes.run(force)
+                gobject.idle_add(self.open_summary, hermes)
         
             except urllib2.HTTPError, e:
                 traceback.print_exc()
         
             except urllib2.HTTPError, e:
                 traceback.print_exc()
@@ -142,6 +189,7 @@ class HermesGUI(WimpWorks):
         view.connect('contact-activated', self.map_contact, fb2c)
         dialog.vbox.add(view)
         dialog.show_all()
         view.connect('contact-activated', self.map_contact, fb2c)
         dialog.vbox.add(view)
         dialog.show_all()
+        dialog.vbox.add(view.get_search())
       
         dialog.run()
         dialog.hide()
       
         dialog.run()
         dialog.hide()
@@ -150,25 +198,26 @@ class HermesGUI(WimpWorks):
     # -----------------------------------------------------------------------
     def map_contact(self, widget, contact, fb2c):
         view = MapContact(fb2c.friends, contact)
     # -----------------------------------------------------------------------
     def map_contact(self, widget, contact, fb2c):
         view = MapContact(fb2c.friends, contact)
-    
+
         dialog = gtk.Dialog(contact.get_name(), self.main_window)
         dialog.add_button(_('Update'), gtk.RESPONSE_OK)
         dialog.vbox.add(view)
         dialog.show_all()
         dialog = gtk.Dialog(contact.get_name(), self.main_window)
         dialog.add_button(_('Update'), gtk.RESPONSE_OK)
         dialog.vbox.add(view)
         dialog.show_all()
+        dialog.vbox.add(view.get_search())
       
         result = dialog.run()
         dialog.hide()
         if result == gtk.RESPONSE_OK:
             friend = view.get_selected_friend()
             if friend:
       
         result = dialog.run()
         dialog.hide()
         if result == gtk.RESPONSE_OK:
             friend = view.get_selected_friend()
             if friend:
-                if 'contact' in friend and friend['contact'] == contact:
+                if friend.get_contact() == contact:
                     hildon.hildon_banner_show_information(self.main_window, '', _("Removing existing mappings is not yet supported"))
                 elif view.contact_mapped:
                     hildon.hildon_banner_show_information(self.main_window, '', _("Removing existing mappings is not yet supported"))
                 elif view.contact_mapped:
-                    if fb2c.update_contact(contact, friend, True):
-                        fb2c.addresses.commit_contact(contact)
+                    fb2c.update_contact(contact, friend, True, True)
+                    widget.add_mapping(friend.get_source())
                 else:
                 else:
-                    if fb2c.update_contact(contact, friend, False):
-                        fb2c.addresses.commit_contact(contact)
+                    fb2c.update_contact(contact, friend, False, True)
+                    widget.add_mapping(friend.get_source())
     
                         
     # -----------------------------------------------------------------------
     
                         
     # -----------------------------------------------------------------------
@@ -190,8 +239,8 @@ class HermesGUI(WimpWorks):
             note.add_button(_("Validate"), gtk.RESPONSE_OK)
             if prompt:
                 input = hildon.Entry(gtk.HILDON_SIZE_FINGER_HEIGHT)
             note.add_button(_("Validate"), gtk.RESPONSE_OK)
             if prompt:
                 input = hildon.Entry(gtk.HILDON_SIZE_FINGER_HEIGHT)
-                input.set_placeholder(_("Verification code from web browser"))
                 input.set_property('is-focus', False)
                 input.set_property('is-focus', False)
+                note.set_title(_("Verification code from web browser"))
                 note.vbox.add(input)
             else:
                 note.vbox.add(gtk.Label(_("\nPress 'Validate' once account has\nbeen authorised in web browser.\n")))
                 note.vbox.add(input)
             else:
                 note.vbox.add(gtk.Label(_("\nPress 'Validate' once account has\nbeen authorised in web browser.\n")))
@@ -201,6 +250,7 @@ class HermesGUI(WimpWorks):
             note.hide()
             lock.release()
             if prompt and result == gtk.RESPONSE_OK:
             note.hide()
             lock.release()
             if prompt and result == gtk.RESPONSE_OK:
+                print input.get_text()
                 return input.get_text()
             else:
                 return None
                 return input.get_text()
             else:
                 return None
@@ -215,31 +265,30 @@ class HermesGUI(WimpWorks):
                       
                         
     # -----------------------------------------------------------------------
                       
                         
     # -----------------------------------------------------------------------
-    def progress(self, i, j, main = False):
+    def progress(self, msg, i, j, main = False):
         """Part of the GUI callback API."""
 
         if main:
             if i == 0:
                 self.progressbar = gtk.ProgressBar()
         """Part of the GUI callback API."""
 
         if main:
             if i == 0:
                 self.progressbar = gtk.ProgressBar()
-                self.progressnote = gtk.Dialog(_("Fetching friends' info"), self.main_window)
+                self.progressnote = gtk.Dialog(_("Initialising connections"), self.main_window)
                 self.progressnote.vbox.add(self.progressbar)
                 hildon.hildon_gtk_window_set_progress_indicator(self.progressnote, 1)
                
                 self.progressnote.show_all()
               
             elif i < j:
                 self.progressnote.vbox.add(self.progressbar)
                 hildon.hildon_gtk_window_set_progress_indicator(self.progressnote, 1)
                
                 self.progressnote.show_all()
               
             elif i < j:
-                if i == 1:
-                    self.progressnote.set_title(_("Updating contacts"))
-                    hildon.hildon_gtk_window_set_progress_indicator(self.progressnote, 0)
+                self.progressnote.set_title(_(msg))
+                hildon.hildon_gtk_window_set_progress_indicator(self.progressnote, 0)
                 
                 self.progressbar.set_fraction(float(i) / float(j))
               
             else:
                 self.progressnote.destroy()
               
                 
                 self.progressbar.set_fraction(float(i) / float(j))
               
             else:
                 self.progressnote.destroy()
               
-            print i,j
+            print msg, i,j
         else:
         else:
-            gobject.idle_add(self.progress, i, j, True)
+            gobject.idle_add(self.progress, msg, i, j, True)
 
        
     # -----------------------------------------------------------------------
 
        
     # -----------------------------------------------------------------------