import gobject
import gtk
-try:
- import hildon
-except ImportError:
- hildon = None
-
def make_ugly(prettynumber):
"""
class Dialpad(object):
- def __init__(self, widgetTree):
+ def __init__(self, widgetTree, errorDisplay):
+ self._errorDisplay = errorDisplay
self._numberdisplay = widgetTree.get_widget("numberdisplay")
+ self._dialButton = widgetTree.get_widget("dial")
self._phonenumber = ""
self._prettynumber = ""
self._clearall_id = None
"on_back_released": self._on_back_released,
}
widgetTree.signal_autoconnect(callbackMapping)
- widgetTree.get_widget("dial").grab_default()
- widgetTree.get_widget("dial").grab_focus()
def enable(self):
- pass
+ self._dialButton.grab_focus()
def disable(self):
pass
def dial(self, number):
+ """
+ @note Actual dial function is patched in later
+ """
raise NotImplementedError
def get_number(self):
"""
Set the callback phonenumber
"""
- self._phonenumber = make_ugly(number)
- self._prettynumber = make_pretty(self._phonenumber)
- self._numberdisplay.set_label("<span size='30000' weight='bold'>%s</span>" % (self._prettynumber))
+ try:
+ self._phonenumber = make_ugly(number)
+ self._prettynumber = make_pretty(self._phonenumber)
+ self._numberdisplay.set_label("<span size='30000' weight='bold'>%s</span>" % (self._prettynumber))
+ except TypeError, e:
+ self._errorDisplay.push_message(e.message)
def clear(self):
self.set_number("")
class AccountInfo(object):
- def __init__(self, widgetTree, backend = None):
+ def __init__(self, widgetTree, backend, errorDisplay):
+ self._errorDisplay = errorDisplay
self._backend = backend
self._callbackList = gtk.ListStore(gobject.TYPE_STRING)
self._accountViewNumberDisplay = widgetTree.get_widget("gcnumber_display")
self._callbackCombo = widgetTree.get_widget("callbackcombo")
- if hildon is not None:
- self._callbackCombo.get_child().set_property('hildon-input-mode', (1 << 4))
-
- callbackMapping = {
- }
- widgetTree.signal_autoconnect(callbackMapping)
- self._callbackCombo.get_child().connect("changed", self._on_callbackentry_changed)
-
- self.set_account_number("")
def enable(self):
- pass
+ assert self._backend.is_authed()
+ self._accountViewNumberDisplay.set_use_markup(True)
+ self.set_account_number("")
+ self._callbackList.clear()
+ self.update()
+ self._callbackCombo.get_child().connect("changed", self._on_callbackentry_changed)
def disable(self):
- pass
+ self._callbackCombo.get_child().disconnect("changed", self._on_callbackentry_changed)
+ self.clear()
+ self._callbackList.clear()
def get_selected_callback_number(self):
return make_ugly(self._callbackCombo.get_child().get_text())
def populate_callback_combo(self):
self._callbackList.clear()
- for number, description in self._backend.get_callback_numbers().iteritems():
+ try:
+ callbackNumbers = self._backend.get_callback_numbers()
+ except RuntimeError, e:
+ self._errorDisplay.push_message(e.message)
+ return
+
+ for number, description in callbackNumbers.iteritems():
self._callbackList.append((make_pretty(number),))
self._callbackCombo.set_model(self._callbackList)
self._callbackCombo.set_text_column(0)
- self._callbackCombo.get_child().set_text(make_pretty(self._backend.get_callback_number()))
+ try:
+ callbackNumber = self._backend.get_callback_number()
+ except RuntimeError, e:
+ self._errorDisplay.push_message(e.message)
+ return
+ self._callbackCombo.get_child().set_text(make_pretty(callbackNumber))
def _on_callbackentry_changed(self, *args):
"""
@todo Potential blocking on web access, maybe we should defer this or put up a dialog?
"""
- text = self.get_selected_callback_number()
- if not self._backend.is_valid_syntax(text):
- warnings.warn("%s is not a valid callback number" % text, UserWarning, 2)
- elif text == self._backend.get_callback_number():
- warnings.warn("Callback number already is %s" % self._backend.get_callback_number(), UserWarning, 2)
- else:
- self._backend.set_callback_number(text)
+ try:
+ text = self.get_selected_callback_number()
+ if not self._backend.is_valid_syntax(text):
+ self._errorDisplay.push_message("%s is not a valid callback number" % text)
+ elif text == self._backend.get_callback_number():
+ warnings.warn("Callback number already is %s" % self._backend.get_callback_number(), UserWarning, 2)
+ else:
+ self._backend.set_callback_number(text)
+ except RuntimeError, e:
+ self._errorDisplay.push_message(e.message)
class RecentCallsView(object):
- def __init__(self, widgetTree, backend = None):
+ def __init__(self, widgetTree, backend, errorDisplay):
+ self._errorDisplay = errorDisplay
self._backend = backend
+
self._recenttime = 0.0
self._recentmodel = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
self._recentview = widgetTree.get_widget("recentview")
self._recentviewselection = None
- callbackMapping = {
- "on_recentview_row_activated": self._on_recentview_row_activated,
- }
- widgetTree.signal_autoconnect(callbackMapping)
-
- self._init_recent_view()
- if hildon is not None:
- hildon.hildon_helper_set_thumb_scrollbar(widgetTree.get_widget('recent_scrolledwindow'), True)
+ textrenderer = gtk.CellRendererText()
+ self._recentviewColumn = gtk.TreeViewColumn("Calls", textrenderer, text=1)
+ self._recentviewColumn.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
def enable(self):
- pass
+ assert self._backend.is_authed()
+ self._recentview.set_model(self._recentmodel)
+
+ self._recentview.append_column(self._recentviewColumn)
+ self._recentviewselection = self._recentview.get_selection()
+ self._recentviewselection.set_mode(gtk.SELECTION_SINGLE)
+
+ self._recentview.connect("row-activated", self._on_recentview_row_activated)
def disable(self):
- pass
+ self._recentview.disconnect("row-activated", self._on_recentview_row_activated)
+ self._recentview.remove_column(self._recentviewColumn)
+ self._recentview.set_model(None)
def number_selected(self, number):
+ """
+ @note Actual dial function is patched in later
+ """
raise NotImplementedError
def update(self):
self._recenttime = 0.0
self._recentmodel.clear()
- def _init_recent_view(self):
- self._recentview.set_model(self._recentmodel)
- textrenderer = gtk.CellRendererText()
-
- # Add the column to the treeview
- column = gtk.TreeViewColumn("Calls", textrenderer, text=1)
- column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
-
- self._recentview.append_column(column)
-
- self._recentviewselection = self._recentview.get_selection()
- self._recentviewselection.set_mode(gtk.SELECTION_SINGLE)
-
def _idly_populate_recentview(self):
self._recenttime = time.time()
self._recentmodel.clear()
- for personsName, phoneNumber, date, action in self._backend.get_recent():
+ try:
+ recentItems = self._backend.get_recent()
+ except RuntimeError, e:
+ gtk.gdk.threads_enter()
+ try:
+ self._errorDisplay.push_message(e.message)
+ finally:
+ gtk.gdk.threads_leave()
+ self._recenttime = 0.0
+ recentItems = []
+ for personsName, phoneNumber, date, action in recentItems:
description = "%s on %s from/to %s - %s" % (action.capitalize(), date, personsName, phoneNumber)
item = (phoneNumber, description)
gtk.gdk.threads_enter()
class ContactsView(object):
- def __init__(self, widgetTree, backend = None):
+ def __init__(self, widgetTree, backend, errorDisplay):
+ self._errorDisplay = errorDisplay
self._backend = backend
self._addressBook = None
self._contactsviewselection = None
self._contactsview = widgetTree.get_widget("contactsview")
+ self._contactColumn = gtk.TreeViewColumn("Contact")
+ displayContactSource = True
+ if displayContactSource:
+ textrenderer = gtk.CellRendererText()
+ self._contactColumn.pack_start(textrenderer, expand=False)
+ self._contactColumn.add_attribute(textrenderer, 'text', 0)
+ textrenderer = gtk.CellRendererText()
+ self._contactColumn.pack_start(textrenderer, expand=True)
+ self._contactColumn.add_attribute(textrenderer, 'text', 1)
+ textrenderer = gtk.CellRendererText()
+ self._contactColumn.pack_start(textrenderer, expand=True)
+ self._contactColumn.add_attribute(textrenderer, 'text', 4)
+ self._contactColumn.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
+ self._contactColumn.set_sort_column_id(1)
+ self._contactColumn.set_visible(True)
+
self._phoneTypeSelector = PhoneTypeSelector(widgetTree, self._backend)
- callbackMapping = {
- "on_contactsview_row_activated" : self._on_contactsview_row_activated,
- "on_addressbook_combo_changed": self._on_addressbook_combo_changed,
- }
- widgetTree.signal_autoconnect(callbackMapping)
- if hildon is not None:
- hildon.hildon_helper_set_thumb_scrollbar(widgetTree.get_widget('contacts_scrolledwindow'), True)
+ def enable(self):
+ assert self._backend.is_authed()
- self._init_contacts_view()
+ self._contactsview.set_model(self._contactsmodel)
+ self._contactsview.append_column(self._contactColumn)
+ self._contactsviewselection = self._contactsview.get_selection()
+ self._contactsviewselection.set_mode(gtk.SELECTION_SINGLE)
- def enable(self):
- pass
+ self._booksList.clear()
+ for (factoryId, bookId), (factoryName, bookName) in self.get_addressbooks():
+ if factoryName and bookName:
+ entryName = "%s: %s" % (factoryName, bookName)
+ elif factoryName:
+ entryName = factoryName
+ elif bookName:
+ entryName = bookName
+ else:
+ entryName = "Bad name (%d)" % factoryId
+ row = (str(factoryId), bookId, entryName)
+ self._booksList.append(row)
+
+ self._booksSelectionBox.set_model(self._booksList)
+ cell = gtk.CellRendererText()
+ self._booksSelectionBox.pack_start(cell, True)
+ self._booksSelectionBox.add_attribute(cell, 'text', 2)
+ self._booksSelectionBox.set_active(0)
+
+ self._contactsview.connect("row-activated", self._on_contactsview_row_activated)
+ self._booksSelectionBox.connect("changed", self._on_addressbook_combo_changed)
def disable(self):
- pass
+ self._booksSelectionBox.set_model(None)
+ self._contactsview.set_model(None)
+ self._contactsview.remove_column(self._contactColumn)
+ self._contactsview.disconnect("row-activated", self._on_contactsview_row_activated)
+ self._booksSelectionBox.disconnect("changed", self._on_addressbook_combo_changed)
def number_selected(self, number):
+ """
+ @note Actual dial function is patched in later
+ """
raise NotImplementedError
def get_addressbooks(self):
def extend(self, books):
self._addressBookFactories.extend(books)
- def _init_contacts_view(self):
- self._contactsview.set_model(self._contactsmodel)
-
- # Add the column to the treeview
- column = gtk.TreeViewColumn("Contact")
-
- #displayContactSource = False
- displayContactSource = True
- if displayContactSource:
- textrenderer = gtk.CellRendererText()
- column.pack_start(textrenderer, expand=False)
- column.add_attribute(textrenderer, 'text', 0)
-
- textrenderer = gtk.CellRendererText()
- column.pack_start(textrenderer, expand=True)
- column.add_attribute(textrenderer, 'text', 1)
-
- textrenderer = gtk.CellRendererText()
- column.pack_start(textrenderer, expand=True)
- column.add_attribute(textrenderer, 'text', 4)
-
- column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
- column.set_sort_column_id(1)
- column.set_visible(True)
- self._contactsview.append_column(column)
-
- self._contactsviewselection = self._contactsview.get_selection()
- self._contactsviewselection.set_mode(gtk.SELECTION_SINGLE)
-
- def _init_books_combo(self):
- self._booksList.clear()
- for (factoryId, bookId), (factoryName, bookName) in self.get_addressbooks():
- if factoryName and bookName:
- entryName = "%s: %s" % (factoryName, bookName)
- elif factoryName:
- entryName = factoryName
- elif bookName:
- entryName = bookName
- else:
- entryName = "Bad name (%d)" % factoryId
- row = (str(factoryId), bookId, entryName)
- self._booksList.append(row)
-
- self._booksSelectionBox.set_model(self._booksList)
- cell = gtk.CellRendererText()
- self._booksSelectionBox.pack_start(cell, True)
- self._booksSelectionBox.add_attribute(cell, 'text', 2)
- self._booksSelectionBox.set_active(0)
-
def _idly_populate_contactsview(self):
#@todo Add a lock so only one code path can be in here at a time
self.clear()
self._contactsview.set_model(None)
addressBook = self._addressBook
- for contactId, contactName in addressBook.get_contacts():
+ try:
+ contacts = addressBook.get_contacts()
+ except RuntimeError, e:
+ contacts = []
+ self._contactstime = 0.0
+ gtk.gdk.threads_enter()
+ try:
+ self._errorDisplay.push_message(e.message)
+ finally:
+ gtk.gdk.threads_leave()
+ for contactId, contactName in contacts:
contactType = (addressBook.contact_source_short_name(contactId),)
self._contactsmodel.append(contactType + (contactName, "", contactId) + ("",))
return
contactId = self._contactsmodel.get_value(itr, 3)
- contactDetails = self._addressBook.get_contact_details(contactId)
+ try:
+ contactDetails = self._addressBook.get_contact_details(contactId)
+ except RuntimeError, e:
+ contactDetails = []
+ self._contactstime = 0.0
+ self._errorDisplay.push_message(e.message)
contactDetails = [phoneNumber for phoneNumber in contactDetails]
if len(contactDetails) == 0: