X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fgc_dialer.py;h=348d3ebce6fd3c4daf0882eda51a6653c4b8ab15;hb=c32512b6d1d311fe9eac5812746513e9cf3df0fe;hp=69957a5b6a7c2849543ce8f64a728739b9262216;hpb=3a5a21952ea47c53016c649610de5965c76ca88e;p=gc-dialer diff --git a/src/gc_dialer.py b/src/gc_dialer.py index 69957a5..348d3eb 100755 --- a/src/gc_dialer.py +++ b/src/gc_dialer.py @@ -1,4 +1,4 @@ -#!/usr/bin/python2.5 +#!/usr/bin/python # GC Dialer - Front end for Google's Grand Central service. # Copyright (C) 2008 Mark Bergman bergman AT merctech DOT com @@ -42,12 +42,6 @@ except ImportError: try: import osso - try: - import abook - import evolution.ebook as evobook - except ImportError: - abook = None - evobook = None except ImportError: osso = None @@ -63,7 +57,8 @@ except ImportError: doctest = None optparse = None -from gcbackend import GCDialer +from gc_backend import GCDialer +from evo_backend import EvolutionAddressBook import socket @@ -137,20 +132,122 @@ def make_idler(func): """ a = [] - def callable(*args, **kwds): + def decorated_func(*args, **kwds): if not a: a.append(func(*args, **kwds)) try: a[0].next() return True except StopIteration: + del a[:] return False - callable.__name__ = func.__name__ - callable.__doc__ = func.__doc__ - callable.__dict__.update(func.__dict__) + decorated_func.__name__ = func.__name__ + decorated_func.__doc__ = func.__doc__ + decorated_func.__dict__.update(func.__dict__) - return callable + return decorated_func + + +class DummyAddressBook(object): + """ + Minimal example of both an addressbook factory and an addressbook + """ + + def get_addressbooks(self): + """ + @returns Iterable of (Address Book Factory, Book Id, Book Name) + """ + yield self, "", "None" + + def open_addressbook(self, bookId): + return self + + @staticmethod + def factory_name(): + return "" + + def get_contacts(self): + """ + @returns Iterable of (contact id, contact name) + """ + return [] + + def get_contact_details(self, contactId): + """ + @returns Iterable of (Phone Type, Phone Number) + """ + return [] + + +class SettingsDialog(object): + """ + @todo Remove this. Currently its only used for addressbooks and I want to make that a combo box on the contacts tab + """ + + def __init__(self, widgetTree, gcDialer): + self._gcDialer = gcDialer + self._widgetTree = widgetTree + self._dialog = self._widgetTree.get_widget("settings_dialog") + + self._applyButton = self._widgetTree.get_widget("apply_settings") + self._applyButton.connect("clicked", self.custom_button_response(gtk.RESPONSE_OK)) + + self._cancelButton = self._widgetTree.get_widget("cancel_settings") + self._cancelButton.connect("clicked", self.custom_button_response(gtk.RESPONSE_CANCEL)) + + self._booksList = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING) + for (factoryId, bookId), (factoryName, bookName) in self._gcDialer.get_addressbooks(): + row = (str(factoryId), bookId, factoryName, bookName) + self._booksList.append(row) + + self._booksView = self._widgetTree.get_widget("books_view") + self._booksView.set_model(self._booksList) + + # Add the column to the treeview + column = gtk.TreeViewColumn("Addressbook") + + textrenderer = gtk.CellRendererText() + column.pack_start(textrenderer, expand=False) + column.add_attribute(textrenderer, 'text', 2) + + textrenderer = gtk.CellRendererText() + column.pack_start(textrenderer, expand=True) + column.add_attribute(textrenderer, 'text', 3) + + column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) + column.set_sort_column_id(2) + column.set_visible(True) + self._booksView.append_column(column) + + self._booksViewSelection = self._booksView.get_selection() + self._booksViewSelection.set_mode(gtk.SELECTION_SINGLE) + self.reset() + + def reset(self): + pass + + def custom_button_response(self, response): + + def button_handler(*args, **kwds): + self._dialog.response(response) + + return button_handler + + def run(self): + userResponse = self._dialog.run() + + if userResponse == gtk.RESPONSE_OK: + model, itr = self._booksViewSelection.get_selected() + if itr: + factoryId = int(self._booksList.get_value(itr, 0)) + bookId = self._booksList.get_value(itr, 1) + self._gcDialer.open_addressbook(factoryId, bookId) + self._booksViewSelection.unselect_all() + else: + self.reset() + + self._dialog.hide() class PhoneTypeSelector(object): @@ -230,6 +327,7 @@ class Dialpad(object): self._clipboard = gtk.clipboard_get() self._deviceIsOnline = True + self.callbacklist = None self._callbackNeedsSetup = True self._recenttime = 0.0 @@ -287,13 +385,12 @@ class Dialpad(object): hildon = None elif hildon is not None: self._app = hildon.Program() - self._window.set_title("%s - Keypad" % self.__pretty_app_name__) self._app.add_window(self._window) self._widgetTree.get_widget("callbackcombo").get_child().set_property('hildon-input-mode', (1 << 4)) self._widgetTree.get_widget("usernameentry").set_property('hildon-input-mode', 7) self._widgetTree.get_widget("passwordentry").set_property('hildon-input-mode', 7|(1 << 29)) - gtkMenu = self._widgetTree.get_widget("menubar1") + gtkMenu = self._widgetTree.get_widget("dialpad_menubar") menu = gtk.Menu() for child in gtkMenu.get_children(): child.reparent(menu) @@ -305,17 +402,17 @@ class Dialpad(object): else: warnings.warn("No Hildon", UserWarning, 2) + if hildon is not None: + self._window.set_title("Keypad") + else: + self._window.set_title("%s - Keypad" % self.__pretty_app_name__) + self._osso = None self._ebook = None if osso is not None: self._osso = osso.Context(Dialpad.__app_name__, Dialpad.__version__, False) device = osso.DeviceState(self._osso) device.set_device_state_callback(self._on_device_state_change, 0) - if abook is not None and evobook is not None: - abook.init_with_name(Dialpad.__app_name__, self._osso) - self._ebook = evobook.open_addressbook("default") - else: - warnings.warn("No abook and No evolution address book support", UserWarning, 2) else: warnings.warn("No OSSO", UserWarning, 2) @@ -335,6 +432,7 @@ class Dialpad(object): "on_dialpad_quit": self._on_close, "on_paste": self._on_paste, "on_clear_number": self._on_clear_number, + "on_settings": self._on_settings, "on_clearcookies_clicked": self._on_clearcookies_clicked, "on_notebook_switch_page": self._on_notebook_switch_page, @@ -354,7 +452,16 @@ class Dialpad(object): self._gcBackend = GCDialer() + self._addressBookFactories = [ + DummyAddressBook(), + EvolutionAddressBook(), + self._gcBackend, + ] + self._addressBook = None + self.open_addressbook(*self.get_addressbooks().next()[0][0:2]) + self._phoneTypeSelector = PhoneTypeSelector(self._widgetTree, self._gcBackend) + self._settingsDialog = SettingsDialog(self._widgetTree, self) if not self._gcBackend.is_authed(): self.attempt_login(2) @@ -364,7 +471,9 @@ class Dialpad(object): gobject.idle_add(self._idly_init_contacts_view) def _idly_init_recent_view(self): - """ Deferred initalization of the recent view treeview """ + """ + Deferred initalization of the recent view treeview + """ recentview = self._widgetTree.get_widget("recentview") recentview.set_model(self._recentmodel) @@ -468,7 +577,7 @@ class Dialpad(object): contactType = (self._gcContactIcon,) else: contactType = (self._gcContactText,) - for contactId, contactName in self._gcBackend.get_contacts(): + for contactId, contactName in self._addressBook.get_contacts(): self._contactsmodel.append(contactType + (contactName, "", contactId) + ("",)) yield @@ -511,20 +620,33 @@ class Dialpad(object): error_dialog.connect("response", close, self) error_dialog.run() + def get_addressbooks(self): + """ + @returns Iterable of ((Factory Id, Book Id), (Factory Name, Book Name)) + """ + for i, factory in enumerate(self._addressBookFactories): + for bookFactory, bookId, bookName in factory.get_addressbooks(): + yield (i, bookId), (factory.factory_name(), bookName) + + def open_addressbook(self, bookFactoryId, bookId): + self._addressBook = self._addressBookFactories[bookFactoryId].open_addressbook(bookId) + self._contactstime = 0 + gobject.idle_add(self._idly_populate_contactsview) + def set_number(self, number): """ Set the callback phonenumber """ self._phonenumber = make_ugly(number) self._prettynumber = make_pretty(self._phonenumber) - self._numberdisplay.set_label("%s" % ( self._prettynumber ) ) + self._numberdisplay.set_label("%s" % (self._prettynumber)) def set_account_number(self): """ Displays current account number """ accountnumber = self._gcBackend.get_account_number() - self._widgetTree.get_widget("gcnumberlabel").set_label("%s" % (accountnumber)) + self._widgetTree.get_widget("gcnumber_display").set_label("%s" % (accountnumber)) def _on_close(self, *args): gtk.main_quit() @@ -565,6 +687,9 @@ class Dialpad(object): self._isFullScreen = True else: self._isFullScreen = False + + def _on_settings(self, *args, **kwds): + self._settingsDialog.run() def _on_key_press(self, widget, event, *args): """ @@ -622,7 +747,7 @@ class Dialpad(object): return contactId = self._contactsmodel.get_value(itr, 3) - contactDetails = self._gcBackend.get_contact_details(contactId) + contactDetails = self._addressBook.get_contact_details(contactId) contactDetails = [phoneNumber for phoneNumber in contactDetails] if len(contactDetails) == 0: @@ -646,9 +771,11 @@ class Dialpad(object): elif page_num == 3 and self._callbackNeedsSetup: gobject.idle_add(self._idly_setup_callback_combo) - if hildon: - hildonTitle = self._notebook.get_tab_label(self._notebook.get_nth_page(page_num)).get_text() - self._window.set_title("%s - %s" % (self.__pretty_app_name__, hildonTitle)) + tabTitle = self._notebook.get_tab_label(self._notebook.get_nth_page(page_num)).get_text() + if hildon is not None: + self._window.set_title(tabTitle) + else: + self._window.set_title("%s - %s" % (self.__pretty_app_name__, tabTitle)) def _on_dial_clicked(self, widget): """ @@ -716,7 +843,7 @@ class DummyOptions(object): if __name__ == "__main__": if hildon is not None: - gtk.set_application_name("Dialer") + gtk.set_application_name(Dialpad.__pretty_app_name__) if optparse is not None: parser = optparse.OptionParser()