X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgv_views.py;h=21e126c51f57b2735b6c9450580d109bc5ce0b33;hb=f40854ec9cdac528f81ca2414d202d980cd486df;hp=0ec77c529d115bf0ebe33da6522e8a8b79c8efa8;hpb=1a0a1d09e2259498973a59a5165e23ce85f6f489;p=gc-dialer diff --git a/src/gv_views.py b/src/gv_views.py index 0ec77c5..21e126c 100644 --- a/src/gv_views.py +++ b/src/gv_views.py @@ -1,7 +1,7 @@ #!/usr/bin/python2.5 """ -DialCentral - Front end for Google's Grand Central service. +DialCentral - Front end for Google's GoogleVoice service. Copyright (C) 2008 Mark Bergman bergman AT merctech DOT com This library is free software; you can redistribute it and/or @@ -17,6 +17,8 @@ Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +@todo Alternate UI for dialogs (stackables) """ from __future__ import with_statement @@ -33,6 +35,9 @@ import hildonize import null_backend +_moduleLogger = logging.getLogger("gv_views") + + def make_ugly(prettynumber): """ function to take a phone number and strip out all non-numeric @@ -284,23 +289,24 @@ class PhoneTypeSelector(object): self._cancelButton = self._widgetTree.get_widget("cancel_button") self._cancelButton.connect("clicked", self._on_phonetype_cancel) + self._messagemodel = gtk.ListStore(gobject.TYPE_STRING) + self._messagesView = self._widgetTree.get_widget("phoneSelectionMessages") + self._scrollWindow = self._messagesView.get_parent() + self._typemodel = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING) self._typeviewselection = None - - self._message = self._widgetTree.get_widget("phoneSelectionMessage") - self._messageViewport = self._widgetTree.get_widget("phoneSelectionMessage_viewport") - self._scrollWindow = self._widgetTree.get_widget("phoneSelectionMessage_scrolledwindow") self._typeview = self._widgetTree.get_widget("phonetypes") self._typeview.connect("row-activated", self._on_phonetype_select) self._action = self.ACTION_CANCEL - def run(self, contactDetails, message = "", parent = None): + def run(self, contactDetails, messages = (), parent = None): self._action = self.ACTION_CANCEL + + # Add the column to the phone selection tree view self._typemodel.clear() self._typeview.set_model(self._typemodel) - # Add the column to the treeview textrenderer = gtk.CellRendererText() numberColumn = gtk.TreeViewColumn("Phone Numbers", textrenderer, text=0) self._typeview.append_column(numberColumn) @@ -309,32 +315,49 @@ class PhoneTypeSelector(object): typeColumn = gtk.TreeViewColumn("Phone Type", textrenderer, text=1) self._typeview.append_column(typeColumn) - self._typeviewselection = self._typeview.get_selection() - self._typeviewselection.set_mode(gtk.SELECTION_SINGLE) - for phoneType, phoneNumber in contactDetails: display = " - ".join((phoneNumber, phoneType)) display = phoneType row = (phoneNumber, display) self._typemodel.append(row) + self._typeviewselection = self._typeview.get_selection() + self._typeviewselection.set_mode(gtk.SELECTION_SINGLE) self._typeviewselection.select_iter(self._typemodel.get_iter_first()) - if message: - self._message.set_markup(message) - self._message.show() + + # Add the column to the messages tree view + self._messagemodel.clear() + self._messagesView.set_model(self._messagemodel) + + textrenderer = gtk.CellRendererText() + textrenderer.set_property("wrap-mode", pango.WRAP_WORD) + textrenderer.set_property("wrap-width", 450) + messageColumn = gtk.TreeViewColumn("") + messageColumn.pack_start(textrenderer, expand=True) + messageColumn.add_attribute(textrenderer, "markup", 0) + messageColumn.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) + self._messagesView.append_column(messageColumn) + self._messagesView.set_headers_visible(False) + + if messages: + for message in messages: + row = (message, ) + self._messagemodel.append(row) + self._messagesView.show() + self._scrollWindow.show() + messagesSelection = self._messagesView.get_selection() + messagesSelection.select_path((len(messages)-1, )) else: - self._message.set_markup("") - self._message.hide() + self._messagesView.hide() + self._scrollWindow.hide() if parent is not None: self._dialog.set_transient_for(parent) try: self._dialog.show() - adjustment = self._scrollWindow.get_vadjustment() - dx = self._message.get_allocation().height - self._messageViewport.get_allocation().height - dx = max(dx, 0) - adjustment.value = dx + if messages: + self._messagesView.scroll_to_cell((len(messages)-1, )) userResponse = self._dialog.run() finally: @@ -349,13 +372,16 @@ class PhoneTypeSelector(object): self._action = self.ACTION_CANCEL if self._action == self.ACTION_SEND_SMS: - smsMessage = self._smsDialog.run(phoneNumber, message, parent) + smsMessage = self._smsDialog.run(phoneNumber, messages, parent) if not smsMessage: phoneNumber = "" self._action = self.ACTION_CANCEL else: smsMessage = "" + self._messagesView.remove_column(messageColumn) + self._messagesView.set_model(None) + self._typeviewselection.unselect_all() self._typeview.remove_column(numberColumn) self._typeview.remove_column(typeColumn) @@ -389,7 +415,6 @@ class PhoneTypeSelector(object): class SmsEntryDialog(object): - """ @todo Add multi-SMS messages like GoogleVoice """ @@ -407,19 +432,41 @@ class SmsEntryDialog(object): self._cancelButton.connect("clicked", self._on_cancel) self._letterCountLabel = self._widgetTree.get_widget("smsLetterCount") - self._message = self._widgetTree.get_widget("smsMessage") - self._messageViewport = self._widgetTree.get_widget("smsMessage_viewport") - self._scrollWindow = self._widgetTree.get_widget("smsMessage_scrolledwindow") + + self._messagemodel = gtk.ListStore(gobject.TYPE_STRING) + self._messagesView = self._widgetTree.get_widget("smsMessages") + self._scrollWindow = self._messagesView.get_parent() + self._smsEntry = self._widgetTree.get_widget("smsEntry") self._smsEntry.get_buffer().connect("changed", self._on_entry_changed) - def run(self, number, message = "", parent = None): - if message: - self._message.set_markup(message) - self._message.show() + def run(self, number, messages = (), parent = None): + # Add the column to the messages tree view + self._messagemodel.clear() + self._messagesView.set_model(self._messagemodel) + + textrenderer = gtk.CellRendererText() + textrenderer.set_property("wrap-mode", pango.WRAP_WORD) + textrenderer.set_property("wrap-width", 450) + messageColumn = gtk.TreeViewColumn("") + messageColumn.pack_start(textrenderer, expand=True) + messageColumn.add_attribute(textrenderer, "markup", 0) + messageColumn.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) + self._messagesView.append_column(messageColumn) + self._messagesView.set_headers_visible(False) + + if messages: + for message in messages: + row = (message, ) + self._messagemodel.append(row) + self._messagesView.show() + self._scrollWindow.show() + messagesSelection = self._messagesView.get_selection() + messagesSelection.select_path((len(messages)-1, )) else: - self._message.set_markup("") - self._message.hide() + self._messagesView.hide() + self._scrollWindow.hide() + self._smsEntry.get_buffer().set_text("") self._update_letter_count() @@ -428,10 +475,9 @@ class SmsEntryDialog(object): try: self._dialog.show() - adjustment = self._scrollWindow.get_vadjustment() - dx = self._message.get_allocation().height - self._messageViewport.get_allocation().height - dx = max(dx, 0) - adjustment.value = dx + if messages: + self._messagesView.scroll_to_cell((len(messages)-1, )) + self._smsEntry.grab_focus() userResponse = self._dialog.run() finally: @@ -444,6 +490,9 @@ class SmsEntryDialog(object): else: enteredMessage = "" + self._messagesView.remove_column(messageColumn) + self._messagesView.set_model(None) + return enteredMessage.strip() def _update_letter_count(self, *args): @@ -468,22 +517,23 @@ class SmsEntryDialog(object): class Dialpad(object): def __init__(self, widgetTree, errorDisplay): + self._clipboard = gtk.clipboard_get() self._errorDisplay = errorDisplay self._smsDialog = SmsEntryDialog(widgetTree) self._numberdisplay = widgetTree.get_widget("numberdisplay") + self._smsButton = widgetTree.get_widget("sms") self._dialButton = widgetTree.get_widget("dial") self._backButton = widgetTree.get_widget("back") self._phonenumber = "" self._prettynumber = "" callbackMapping = { - "on_dial_clicked": self._on_dial_clicked, - "on_sms_clicked": self._on_sms_clicked, "on_digit_clicked": self._on_digit_clicked, - "on_clear_number": self._on_clear_number, } widgetTree.signal_autoconnect(callbackMapping) + self._dialButton.connect("clicked", self._on_dial_clicked) + self._smsButton.connect("clicked", self._on_sms_clicked) self._originalLabel = self._backButton.get_label() self._backTapHandler = gtk_toolbox.TapOrHold(self._backButton) @@ -493,12 +543,16 @@ class Dialpad(object): self._backTapHandler.on_cancel = self._reset_back_button self._window = gtk_toolbox.find_parent_window(self._numberdisplay) + self._keyPressEventId = 0 def enable(self): self._dialButton.grab_focus() self._backTapHandler.enable() + self._keyPressEventId = self._window.connect("key-press-event", self._on_key_press) def disable(self): + self._window.disconnect(self._keyPressEventId) + self._keyPressEventId = 0 self._reset_back_button() self._backTapHandler.disable() @@ -538,12 +592,21 @@ class Dialpad(object): """ pass + def _on_key_press(self, widget, event): + try: + if event.keyval == ord("v") and event.get_state() & gtk.gdk.CONTROL_MASK: + contents = self._clipboard.wait_for_text() + if contents is not None: + self.set_number(contents) + except Exception, e: + self._errorDisplay.push_exception() + def _on_sms_clicked(self, widget): try: action = PhoneTypeSelector.ACTION_SEND_SMS phoneNumber = self.get_number() - message = self._smsDialog.run(phoneNumber, "", self._window) + message = self._smsDialog.run(phoneNumber, (), self._window) if not message: phoneNumber = "" action = PhoneTypeSelector.ACTION_CANCEL @@ -563,12 +626,6 @@ class Dialpad(object): except Exception, e: self._errorDisplay.push_exception() - def _on_clear_number(self, *args): - try: - self.clear() - except Exception, e: - self._errorDisplay.push_exception() - def _on_digit_clicked(self, widget): try: self.set_number(self._phonenumber + widget.get_name()[-1]) @@ -614,10 +671,10 @@ class AccountInfo(object): self._notifyOnVoicemail = False self._notifyOnSms = False - self._callbackList = gtk.ListStore(gobject.TYPE_STRING) + self._callbackList = [] self._accountViewNumberDisplay = widgetTree.get_widget("gcnumber_display") - self._callbackCombo = widgetTree.get_widget("callbackcombo") - self._onCallbackentryChangedId = 0 + self._callbackSelectButton = widgetTree.get_widget("callbackSelectButton") + self._onCallbackSelectChangedId = 0 self._notifyCheckbox = widgetTree.get_widget("notifyCheckbox") self._minutesEntryButton = widgetTree.get_widget("minutesEntryButton") @@ -640,8 +697,8 @@ class AccountInfo(object): self._accountViewNumberDisplay.set_use_markup(True) self.set_account_number("") - self._callbackList.clear() - self._onCallbackentryChangedId = self._callbackCombo.get_child().connect("changed", self._on_callbackentry_changed) + del self._callbackList[:] + self._onCallbackSelectChangedId = self._callbackSelectButton.connect("clicked", self._on_callbackentry_clicked) if self._alarmHandler is not None: self._notifyCheckbox.set_active(self._alarmHandler.isEnabled) @@ -651,7 +708,7 @@ class AccountInfo(object): self._smsCheckbox.set_active(self._notifyOnSms) self._onNotifyToggled = self._notifyCheckbox.connect("toggled", self._on_notify_toggled) - self._onMinutesChanged = self._minutesEntryButton.connect("clicked", self._on_minutes_changed) + self._onMinutesChanged = self._minutesEntryButton.connect("clicked", self._on_minutes_clicked) self._onMissedToggled = self._missedCheckbox.connect("toggled", self._on_missed_toggled) self._onVoicemailToggled = self._voicemailCheckbox.connect("toggled", self._on_voicemail_toggled) self._onSmsToggled = self._smsCheckbox.connect("toggled", self._on_sms_toggled) @@ -665,8 +722,8 @@ class AccountInfo(object): self.update(force=True) def disable(self): - self._callbackCombo.get_child().disconnect(self._onCallbackentryChangedId) - self._onCallbackentryChangedId = 0 + self._callbackSelectButton.disconnect(self._onCallbackSelectChangedId) + self._onCallbackSelectChangedId = 0 if self._alarmHandler is not None: self._notifyCheckbox.disconnect(self._onNotifyToggled) @@ -687,10 +744,14 @@ class AccountInfo(object): self._smsCheckbox.set_sensitive(True) self.clear() - self._callbackList.clear() + del self._callbackList[:] def get_selected_callback_number(self): - return make_ugly(self._callbackCombo.get_child().get_text()) + currentLabel = self._callbackSelectButton.get_label() + if currentLabel is not None: + return make_ugly(currentLabel) + else: + return "" def set_account_number(self, number): """ @@ -706,7 +767,7 @@ class AccountInfo(object): return True def clear(self): - self._callbackCombo.get_child().set_text("") + self._callbackSelectButton.set_label("") self.set_account_number("") self._isPopulated = False @@ -735,7 +796,7 @@ class AccountInfo(object): def _populate_callback_combo(self): self._isPopulated = True - self._callbackList.clear() + del self._callbackList[:] try: callbackNumbers = self._backend.get_callback_numbers() except Exception, e: @@ -744,20 +805,17 @@ class AccountInfo(object): return for number, description in callbackNumbers.iteritems(): - self._callbackList.append((make_pretty(number),)) + self._callbackList.append(make_pretty(number)) - self._callbackCombo.set_model(self._callbackList) - self._callbackCombo.set_text_column(0) - #callbackNumber = self._backend.get_callback_number() - callbackNumber = self._defaultCallback - self._callbackCombo.get_child().set_text(make_pretty(callbackNumber)) + if not self.get_selected_callback_number(): + self._set_callback_number(self._defaultCallback) def _set_callback_number(self, number): try: - if not self._backend.is_valid_syntax(number): + if not self._backend.is_valid_syntax(number) and 0 < len(number): self._errorDisplay.push_message("%s is not a valid callback number" % number) elif number == self._backend.get_callback_number(): - logging.warning( + _moduleLogger.warning( "Callback number already is %s" % ( self._backend.get_callback_number(), ), @@ -767,7 +825,8 @@ class AccountInfo(object): assert make_ugly(number) == make_ugly(self._backend.get_callback_number()), "Callback number should be %s but instead is %s" % ( make_pretty(number), make_pretty(self._backend.get_callback_number()) ) - logging.info( + self._callbackSelectButton.set_label(make_pretty(number)) + _moduleLogger.info( "Callback number set to %s" % ( self._backend.get_callback_number(), ), @@ -785,11 +844,20 @@ class AccountInfo(object): self._notifyCheckbox.set_active(self._alarmHandler.isEnabled) self._minutesEntryButton.set_label("%d Minutes" % self._alarmHandler.recurrence) - def _on_callbackentry_changed(self, *args): + def _on_callbackentry_clicked(self, *args): try: - text = self.get_selected_callback_number() - number = make_ugly(text) + actualSelection = make_pretty(self.get_selected_callback_number()) + + userSelection = hildonize.touch_selector_entry( + self._window, + "Callback Number", + self._callbackList, + actualSelection, + ) + number = make_ugly(userSelection) self._set_callback_number(number) + except RuntimeError, e: + _moduleLogger.exception("%s" % str(e)) except Exception, e: self._errorDisplay.push_exception() @@ -802,12 +870,40 @@ class AccountInfo(object): except Exception, e: self._errorDisplay.push_exception() - def _on_minutes_changed(self, *args): + def _on_minutes_clicked(self, *args): + recurrenceChoices = [ + (1, "1 minute"), + (2, "2 minutes"), + (3, "3 minutes"), + (5, "5 minutes"), + (8, "8 minutes"), + (10, "10 minutes"), + (15, "15 minutes"), + (30, "30 minutes"), + (45, "45 minutes"), + (60, "1 hour"), + (3*60, "3 hours"), + (6*60, "6 hours"), + (12*60, "12 hours"), + ] try: - recurrence = hildonize.request_number( - self._window, "Minutes", (1, 50), self._alarmHandler.recurrence + actualSelection = self._alarmHandler.recurrence + + closestSelectionIndex = 0 + for i, possible in enumerate(recurrenceChoices): + if possible[0] <= actualSelection: + closestSelectionIndex = i + recurrenceIndex = hildonize.touch_selector( + self._window, + "Minutes", + (("%s" % m[1]) for m in recurrenceChoices), + closestSelectionIndex, ) + recurrence = recurrenceChoices[recurrenceIndex][0] + self._update_alarm_settings(recurrence) + except RuntimeError, e: + _moduleLogger.exception("%s" % str(e)) except Exception, e: self._errorDisplay.push_exception() @@ -878,19 +974,20 @@ class RecentCallsView(object): textrenderer = gtk.CellRendererText() textrenderer.set_property("yalign", 0) + textrenderer.set_property("ellipsize", pango.ELLIPSIZE_END) + textrenderer.set_property("width-chars", len("1 (555) 555-1234")) + self._numberColumn = gtk.TreeViewColumn("Number") + self._numberColumn.pack_start(textrenderer, expand=True) + self._numberColumn.add_attribute(textrenderer, "text", self.NUMBER_IDX) + + textrenderer = gtk.CellRendererText() + textrenderer.set_property("yalign", 0) hildonize.set_cell_thumb_selectable(textrenderer) self._nameColumn = gtk.TreeViewColumn("From") self._nameColumn.pack_start(textrenderer, expand=True) self._nameColumn.add_attribute(textrenderer, "text", self.FROM_IDX) self._nameColumn.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) - textrenderer = gtk.CellRendererText() - textrenderer.set_property("yalign", 0) - hildonize.set_cell_thumb_selectable(textrenderer) - self._numberColumn = gtk.TreeViewColumn("Number") - self._numberColumn.pack_start(textrenderer, expand=True) - self._numberColumn.add_attribute(textrenderer, "text", self.NUMBER_IDX) - self._window = gtk_toolbox.find_parent_window(self._recentview) self._phoneTypeSelector = PhoneTypeSelector(widgetTree, self._backend) @@ -955,6 +1052,8 @@ class RecentCallsView(object): pass def _idly_populate_recentview(self): + with gtk_toolbox.gtk_lock(): + banner = hildonize.show_busy_banner_start(self._window, "Loading Recent History") try: self._recentmodel.clear() self._isPopulated = True @@ -977,6 +1076,9 @@ class RecentCallsView(object): self._recentmodel.append(item) except Exception, e: self._errorDisplay.push_exception_with_lock() + finally: + with gtk_toolbox.gtk_lock(): + hildonize.show_busy_banner_end(banner) return False @@ -993,7 +1095,7 @@ class RecentCallsView(object): action, phoneNumber, message = self._phoneTypeSelector.run( contactPhoneNumbers, - message = description, + messages = (description, ), parent = self._window, ) if action == PhoneTypeSelector.ACTION_CANCEL: @@ -1012,6 +1114,7 @@ class MessagesView(object): DATE_IDX = 1 HEADER_IDX = 2 MESSAGE_IDX = 3 + MESSAGES_IDX = 4 def __init__(self, widgetTree, backend, errorDisplay): self._errorDisplay = errorDisplay @@ -1023,6 +1126,7 @@ class MessagesView(object): gobject.TYPE_STRING, # date gobject.TYPE_STRING, # header gobject.TYPE_STRING, # message + object, # messages ) self._messageview = widgetTree.get_widget("messages_view") self._messageviewselection = None @@ -1049,6 +1153,7 @@ class MessagesView(object): def enable(self): assert self._backend.is_authed(), "Attempting to enable backend while not logged in" self._messageview.set_model(self._messagemodel) + self._messageview.set_headers_visible(False) self._messageview.append_column(self._messageColumn) self._messageviewselection = self._messageview.get_selection() @@ -1094,6 +1199,8 @@ class MessagesView(object): pass def _idly_populate_messageview(self): + with gtk_toolbox.gtk_lock(): + banner = hildonize.show_busy_banner_start(self._window, "Loading Messages") try: self._messagemodel.clear() self._isPopulated = True @@ -1105,16 +1212,24 @@ class MessagesView(object): self._isPopulated = False messageItems = [] - for header, number, relativeDate, message in messageItems: + for header, number, relativeDate, messages in messageItems: prettyNumber = number[2:] if number.startswith("+1") else number prettyNumber = make_pretty(prettyNumber) - message = "%s - %s (%s)\n\n%s" % (header, prettyNumber, relativeDate, message) + + firstMessage = "%s - %s (%s)" % (header, prettyNumber, relativeDate) + newMessages = [firstMessage] + newMessages.extend(messages) + number = make_ugly(number) - row = (number, relativeDate, header, message) + + row = (number, relativeDate, header, "\n".join(newMessages), newMessages) with gtk_toolbox.gtk_lock(): self._messagemodel.append(row) except Exception, e: self._errorDisplay.push_exception_with_lock() + finally: + with gtk_toolbox.gtk_lock(): + hildonize.show_busy_banner_end(banner) return False @@ -1125,11 +1240,11 @@ class MessagesView(object): return contactPhoneNumbers = [("Phone", self._messagemodel.get_value(itr, self.NUMBER_IDX))] - description = self._messagemodel.get_value(itr, self.MESSAGE_IDX) + description = self._messagemodel.get_value(itr, self.MESSAGES_IDX) action, phoneNumber, message = self._phoneTypeSelector.run( contactPhoneNumbers, - message = description, + messages = description, parent = self._window, ) if action == PhoneTypeSelector.ACTION_CANCEL: @@ -1152,8 +1267,8 @@ class ContactsView(object): self._selectedComboIndex = 0 self._addressBookFactories = [null_backend.NullAddressBook()] - self._booksList = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING) - self._booksSelectionBox = widgetTree.get_widget("addressbook_combo") + self._booksList = [] + self._bookSelectionButton = widgetTree.get_widget("addressbookSelectButton") self._isPopulated = False self._contactsmodel = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING) @@ -1178,7 +1293,7 @@ class ContactsView(object): self._contactColumn.set_visible(True) self._onContactsviewRowActivatedId = 0 - self._onAddressbookComboChangedId = 0 + self._onAddressbookButtonChangedId = 0 self._window = gtk_toolbox.find_parent_window(self._contactsview) self._phoneTypeSelector = PhoneTypeSelector(widgetTree, self._backend) @@ -1197,7 +1312,7 @@ class ContactsView(object): self._contactsviewselection = self._contactsview.get_selection() self._contactsviewselection.set_mode(gtk.SELECTION_SINGLE) - self._booksList.clear() + del self._booksList[:] for (factoryId, bookId), (factoryName, bookName) in self.get_addressbooks(): if factoryName and bookName: entryName = "%s: %s" % (factoryName, bookName) @@ -1210,26 +1325,24 @@ class ContactsView(object): 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._onContactsviewRowActivatedId = self._contactsview.connect("row-activated", self._on_contactsview_row_activated) - self._onAddressbookComboChangedId = self._booksSelectionBox.connect("changed", self._on_addressbook_combo_changed) + self._onAddressbookButtonChangedId = self._bookSelectionButton.connect("clicked", self._on_addressbook_button_changed) if len(self._booksList) <= self._selectedComboIndex: self._selectedComboIndex = 0 - self._booksSelectionBox.set_active(self._selectedComboIndex) + self._bookSelectionButton.set_label(self._booksList[self._selectedComboIndex][2]) + + selectedFactoryId = self._booksList[self._selectedComboIndex][0] + selectedBookId = self._booksList[self._selectedComboIndex][1] + self.open_addressbook(selectedFactoryId, selectedBookId) def disable(self): self._contactsview.disconnect(self._onContactsviewRowActivatedId) - self._booksSelectionBox.disconnect(self._onAddressbookComboChangedId) + self._bookSelectionButton.disconnect(self._onAddressbookButtonChangedId) self.clear() - self._booksSelectionBox.clear() - self._booksSelectionBox.set_model(None) + self._bookSelectionButton.set_label("") self._contactsview.set_model(None) self._contactsview.remove_column(self._contactColumn) @@ -1289,6 +1402,8 @@ class ContactsView(object): config.set(sectionName, "selectedAddressbook", str(self._selectedComboIndex)) def _idly_populate_contactsview(self): + with gtk_toolbox.gtk_lock(): + banner = hildonize.show_busy_banner_start(self._window, "Loading Contacts") try: addressBook = None while addressBook is not self._addressBook: @@ -1313,17 +1428,28 @@ class ContactsView(object): self._isPopulated = True except Exception, e: self._errorDisplay.push_exception_with_lock() + finally: + with gtk_toolbox.gtk_lock(): + hildonize.show_busy_banner_end(banner) return False - def _on_addressbook_combo_changed(self, *args, **kwds): + def _on_addressbook_button_changed(self, *args, **kwds): try: - itr = self._booksSelectionBox.get_active_iter() - if itr is None: + try: + newSelectedComboIndex = hildonize.touch_selector( + self._window, + "Addressbook", + (("%s" % m[2]) for m in self._booksList), + self._selectedComboIndex, + ) + except RuntimeError: return - self._selectedComboIndex = self._booksSelectionBox.get_active() - selectedFactoryId = self._booksList.get_value(itr, 0) - selectedBookId = self._booksList.get_value(itr, 1) + + selectedFactoryId = self._booksList[newSelectedComboIndex][0] + selectedBookId = self._booksList[newSelectedComboIndex][1] self.open_addressbook(selectedFactoryId, selectedBookId) + self._selectedComboIndex = newSelectedComboIndex + self._bookSelectionButton.set_label(self._booksList[self._selectedComboIndex][2]) except Exception, e: self._errorDisplay.push_exception() @@ -1347,7 +1473,7 @@ class ContactsView(object): action, phoneNumber, message = self._phoneTypeSelector.run( contactPhoneNumbers, - message = contactName, + messages = (contactName, ), parent = self._window, ) if action == PhoneTypeSelector.ACTION_CANCEL: