X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fgv_views.py;h=c5635fd2206a1fc89479845c7a979217796fa246;hb=f5a869b6083b410b67b117d9be62b35bca190d37;hp=dabc7d2c42effc5cd79541a66b1f67b326e04023;hpb=70a1b8f172bd4a3adf1277a5c94396d36511ecfa;p=gc-dialer diff --git a/src/gv_views.py b/src/gv_views.py index dabc7d2..c5635fd 100644 --- a/src/gv_views.py +++ b/src/gv_views.py @@ -19,7 +19,6 @@ 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) -@todo Get descriptions with the callback number """ from __future__ import with_statement @@ -266,171 +265,26 @@ class MergedAddressBook(object): return (contactData for (lastName, contactData) in contactsWithKey) -class PhoneTypeSelector(object): - - ACTION_CANCEL = "cancel" - ACTION_SELECT = "select" - ACTION_DIAL = "dial" - ACTION_SEND_SMS = "sms" - - def __init__(self, widgetTree, gcBackend): - self._gcBackend = gcBackend - self._widgetTree = widgetTree - - self._dialog = self._widgetTree.get_widget("phonetype_dialog") - self._smsDialog = SmsEntryDialog(self._widgetTree) - - self._smsButton = self._widgetTree.get_widget("sms_button") - self._smsButton.connect("clicked", self._on_phonetype_send_sms) - - self._dialButton = self._widgetTree.get_widget("dial_button") - self._dialButton.connect("clicked", self._on_phonetype_dial) - - self._selectButton = self._widgetTree.get_widget("select_button") - self._selectButton.connect("clicked", self._on_phonetype_select) - - 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._typeview = self._widgetTree.get_widget("phonetypes") - self._typeview.connect("row-activated", self._on_phonetype_select) - - self._action = self.ACTION_CANCEL - - 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) - - textrenderer = gtk.CellRendererText() - numberColumn = gtk.TreeViewColumn("Phone Numbers", textrenderer, text=0) - self._typeview.append_column(numberColumn) - - textrenderer = gtk.CellRendererText() - typeColumn = gtk.TreeViewColumn("Phone Type", textrenderer, text=1) - self._typeview.append_column(typeColumn) - - 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()) - - # 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._messagesView.hide() - self._scrollWindow.hide() - - if parent is not None: - self._dialog.set_transient_for(parent) - - try: - self._dialog.show() - if messages: - self._messagesView.scroll_to_cell((len(messages)-1, )) - - userResponse = self._dialog.run() - finally: - self._dialog.hide() - - if userResponse == gtk.RESPONSE_OK: - phoneNumber = self._get_number() - phoneNumber = make_ugly(phoneNumber) - else: - phoneNumber = "" - if not phoneNumber: - self._action = self.ACTION_CANCEL - - if self._action == self.ACTION_SEND_SMS: - 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) - self._typeview.set_model(None) - - return self._action, phoneNumber, smsMessage - - def _get_number(self): - model, itr = self._typeviewselection.get_selected() - if not itr: - return "" - - phoneNumber = self._typemodel.get_value(itr, 0) - return phoneNumber - - def _on_phonetype_dial(self, *args): - self._dialog.response(gtk.RESPONSE_OK) - self._action = self.ACTION_DIAL - - def _on_phonetype_send_sms(self, *args): - self._dialog.response(gtk.RESPONSE_OK) - self._action = self.ACTION_SEND_SMS - - def _on_phonetype_select(self, *args): - self._dialog.response(gtk.RESPONSE_OK) - self._action = self.ACTION_SELECT - - def _on_phonetype_cancel(self, *args): - self._dialog.response(gtk.RESPONSE_CANCEL) - self._action = self.ACTION_CANCEL - - class SmsEntryDialog(object): """ @todo Add multi-SMS messages like GoogleVoice """ + ACTION_CANCEL = "cancel" + ACTION_DIAL = "dial" + ACTION_SEND_SMS = "sms" + MAX_CHAR = 160 def __init__(self, widgetTree): + self._clipboard = gtk.clipboard_get() self._widgetTree = widgetTree self._dialog = self._widgetTree.get_widget("smsDialog") self._smsButton = self._widgetTree.get_widget("sendSmsButton") self._smsButton.connect("clicked", self._on_send) - + self._dialButton = self._widgetTree.get_widget("dialButton") + self._dialButton.connect("clicked", self._on_dial) self._cancelButton = self._widgetTree.get_widget("cancelSmsButton") self._cancelButton.connect("clicked", self._on_cancel) @@ -438,83 +292,177 @@ class SmsEntryDialog(object): self._messagemodel = gtk.ListStore(gobject.TYPE_STRING) self._messagesView = self._widgetTree.get_widget("smsMessages") - self._scrollWindow = self._messagesView.get_parent() + self._conversationView = self._messagesView.get_parent() + self._conversationViewPort = self._conversationView.get_parent() + self._scrollWindow = self._conversationViewPort.get_parent() + + self._phoneButton = self._widgetTree.get_widget("phoneTypeSelection") self._smsEntry = self._widgetTree.get_widget("smsEntry") - self._smsEntry.get_buffer().connect("changed", self._on_entry_changed) - def run(self, number, messages = (), parent = None): - # Add the column to the messages tree view - self._messagemodel.clear() - self._messagesView.set_model(self._messagemodel) + self._action = self.ACTION_CANCEL - 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._messagesView.hide() - self._scrollWindow.hide() + self._numberIndex = -1 + self._contactDetails = [] - self._smsEntry.get_buffer().set_text("") - self._update_letter_count() + def run(self, contactDetails, messages = (), parent = None, defaultIndex = -1): + entryConnectId = self._smsEntry.get_buffer().connect("changed", self._on_entry_changed) + phoneConnectId = self._phoneButton.connect("clicked", self._on_phone) + keyConnectId = self._keyPressEventId = self._dialog.connect("key-press-event", self._on_key_press) + try: + # Setup the phone selection button + del self._contactDetails[:] + for phoneType, phoneNumber in contactDetails: + display = " - ".join((make_pretty(phoneNumber), phoneType)) + row = (phoneNumber, display) + self._contactDetails.append(row) + if 0 < len(self._contactDetails): + self._numberIndex = defaultIndex if defaultIndex != -1 else 0 + self._phoneButton.set_label(self._contactDetails[self._numberIndex][1]) + else: + self._numberIndex = -1 + self._phoneButton.set_label("Error: No Number Available") - if parent is not None: - self._dialog.set_transient_for(parent) + # Add the column to the messages tree view + self._messagemodel.clear() + self._messagesView.set_model(self._messagemodel) + self._messagesView.set_fixed_height_mode(False) + + 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) - try: - self._dialog.show() if messages: - self._messagesView.scroll_to_cell((len(messages)-1, )) - self._smsEntry.grab_focus() + 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._messagesView.hide() + self._scrollWindow.hide() - userResponse = self._dialog.run() - finally: - self._dialog.hide() + self._smsEntry.get_buffer().set_text("") + self._update_letter_count() - if userResponse == gtk.RESPONSE_OK: - entryBuffer = self._smsEntry.get_buffer() - enteredMessage = entryBuffer.get_text(entryBuffer.get_start_iter(), entryBuffer.get_end_iter()) - enteredMessage = enteredMessage[0:self.MAX_CHAR] - else: - enteredMessage = "" + if parent is not None: + self._dialog.set_transient_for(parent) + parentSize = parent.get_size() + self._dialog.resize(parentSize[0], max(parentSize[1]-10, 100)) - self._messagesView.remove_column(messageColumn) - self._messagesView.set_model(None) + # Run + try: + self._dialog.show_all() + self._smsEntry.grab_focus() + adjustment = self._scrollWindow.get_vadjustment() + dx = self._conversationView.get_allocation().height - self._conversationViewPort.get_allocation().height + dx = max(dx, 0) + adjustment.value = dx + + if 1 < len(self._contactDetails): + if defaultIndex == -1: + self._request_number() + self._phoneButton.set_sensitive(True) + else: + self._phoneButton.set_sensitive(False) + + userResponse = self._dialog.run() + finally: + self._dialog.hide_all() + + # Process the users response + if userResponse == gtk.RESPONSE_OK and 0 <= self._numberIndex: + phoneNumber = self._contactDetails[self._numberIndex][0] + phoneNumber = make_ugly(phoneNumber) + else: + phoneNumber = "" + if not phoneNumber: + self._action = self.ACTION_CANCEL + if self._action == self.ACTION_SEND_SMS: + entryBuffer = self._smsEntry.get_buffer() + enteredMessage = entryBuffer.get_text(entryBuffer.get_start_iter(), entryBuffer.get_end_iter()) + enteredMessage = enteredMessage[0:self.MAX_CHAR].strip() + if not enteredMessage: + phoneNumber = "" + self._action = self.ACTION_CANCEL + else: + enteredMessage = "" + + self._messagesView.remove_column(messageColumn) + self._messagesView.set_model(None) - return enteredMessage.strip() + return self._action, phoneNumber, enteredMessage + finally: + self._smsEntry.get_buffer().disconnect(entryConnectId) + self._phoneButton.disconnect(phoneConnectId) + self._keyPressEventId = self._dialog.disconnect(keyConnectId) def _update_letter_count(self, *args): entryLength = self._smsEntry.get_buffer().get_char_count() + charsLeft = self.MAX_CHAR - entryLength self._letterCountLabel.set_text(str(charsLeft)) - if charsLeft < 0: + if charsLeft < 0 or charsLeft == self.MAX_CHAR: self._smsButton.set_sensitive(False) else: self._smsButton.set_sensitive(True) + if entryLength == 0: + self._dialButton.set_sensitive(True) + else: + self._dialButton.set_sensitive(False) + + def _request_number(self): + try: + assert 0 <= self._numberIndex, "%r" % self._numberIndex + + self._numberIndex = hildonize.touch_selector( + self._dialog, + "Phone Numbers", + (description for (number, description) in self._contactDetails), + self._numberIndex, + ) + self._phoneButton.set_label(self._contactDetails[self._numberIndex][1]) + except Exception, e: + _moduleLogger.exception("%s" % str(e)) + + def _on_phone(self, *args): + self._request_number() + def _on_entry_changed(self, *args): self._update_letter_count() def _on_send(self, *args): self._dialog.response(gtk.RESPONSE_OK) + self._action = self.ACTION_SEND_SMS + + def _on_dial(self, *args): + self._dialog.response(gtk.RESPONSE_OK) + self._action = self.ACTION_DIAL def _on_cancel(self, *args): self._dialog.response(gtk.RESPONSE_CANCEL) + self._action = self.ACTION_CANCEL + + def _on_key_press(self, widget, event): + try: + if event.keyval == ord("c") and event.get_state() & gtk.gdk.CONTROL_MASK: + message = "\n".join( + messagePart[0] + for messagePart in self._messagemodel + ) + # For some reason this kills clipboard stuff + #self._clipboard.set_text(message) + except Exception, e: + _moduleLogger.exception(str(e)) class Dialpad(object): @@ -606,15 +554,10 @@ class Dialpad(object): def _on_sms_clicked(self, widget): try: - action = PhoneTypeSelector.ACTION_SEND_SMS phoneNumber = self.get_number() + action, phoneNumber, message = self._smsDialog.run([("Dialer", phoneNumber)], (), self._window) - message = self._smsDialog.run(phoneNumber, (), self._window) - if not message: - phoneNumber = "" - action = PhoneTypeSelector.ACTION_CANCEL - - if action == PhoneTypeSelector.ACTION_CANCEL: + if action == SmsEntryDialog.ACTION_CANCEL: return self.number_selected(action, phoneNumber, message) except Exception, e: @@ -622,7 +565,7 @@ class Dialpad(object): def _on_dial_clicked(self, widget): try: - action = PhoneTypeSelector.ACTION_DIAL + action = SmsEntryDialog.ACTION_DIAL phoneNumber = self.get_number() message = "" self.number_selected(action, phoneNumber, message) @@ -770,7 +713,7 @@ class AccountInfo(object): return True def clear(self): - self._callbackSelectButton.set_label("") + self._set_callback_label("") self.set_account_number("") self._isPopulated = False @@ -807,28 +750,31 @@ class AccountInfo(object): self._isPopulated = False return + if len(callbackNumbers) == 0: + callbackNumbers = {"": "No callback numbers available"} + for number, description in callbackNumbers.iteritems(): self._callbackList.append((make_pretty(number), description)) - if not self.get_selected_callback_number(): - self._set_callback_number(self._defaultCallback) + self._set_callback_number(self._defaultCallback) def _set_callback_number(self, number): try: 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(): + elif number == self._backend.get_callback_number() and 0 < len(number): _moduleLogger.warning( "Callback number already is %s" % ( self._backend.get_callback_number(), ), ) + self._set_callback_label(number) else: self._backend.set_callback_number(number) 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()) ) - self._callbackSelectButton.set_label(make_pretty(number)) + self._set_callback_label(number) _moduleLogger.info( "Callback number set to %s" % ( self._backend.get_callback_number(), @@ -837,6 +783,12 @@ class AccountInfo(object): except Exception, e: self._errorDisplay.push_exception() + def _set_callback_label(self, uglyNumber): + prettyNumber = make_pretty(uglyNumber) + if len(prettyNumber) == 0: + prettyNumber = "No Callback Number" + self._callbackSelectButton.set_label(prettyNumber) + def _update_alarm_settings(self, recurrence): try: isEnabled = self._notifyCheckbox.get_active() @@ -958,6 +910,7 @@ class RecentCallsView(object): DATE_IDX = 1 ACTION_IDX = 2 FROM_IDX = 3 + FROM_ID_IDX = 4 def __init__(self, widgetTree, backend, errorDisplay): self._errorDisplay = errorDisplay @@ -969,6 +922,7 @@ class RecentCallsView(object): gobject.TYPE_STRING, # date gobject.TYPE_STRING, # action gobject.TYPE_STRING, # from + gobject.TYPE_STRING, # from id ) self._recentview = widgetTree.get_widget("recentview") self._recentviewselection = None @@ -1003,7 +957,7 @@ class RecentCallsView(object): self._nameColumn.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) self._window = gtk_toolbox.find_parent_window(self._recentview) - self._phoneTypeSelector = PhoneTypeSelector(widgetTree, self._backend) + self._phoneTypeSelector = SmsEntryDialog(widgetTree) self._updateSink = gtk_toolbox.threaded_stage( gtk_toolbox.comap( @@ -1015,6 +969,7 @@ class RecentCallsView(object): def enable(self): assert self._backend.is_authed(), "Attempting to enable backend while not logged in" self._recentview.set_model(self._recentmodel) + self._recentview.set_fixed_height_mode(False) self._recentview.append_column(self._dateColumn) self._recentview.append_column(self._actionColumn) @@ -1084,13 +1039,13 @@ class RecentCallsView(object): for data in gv_backend.sort_messages(recentItems) ) - for personName, phoneNumber, date, action in recentItems: + for contactId, personName, phoneNumber, date, action in recentItems: if not personName: personName = "Unknown" date = abbrev_relative_date(date) prettyNumber = phoneNumber[2:] if phoneNumber.startswith("+1") else phoneNumber prettyNumber = make_pretty(prettyNumber) - item = (prettyNumber, date, action.capitalize(), personName) + item = (prettyNumber, date, action.capitalize(), personName, contactId) with gtk_toolbox.gtk_lock(): self._recentmodel.append(item) except Exception, e: @@ -1103,21 +1058,41 @@ class RecentCallsView(object): def _on_recentview_row_activated(self, treeview, path, view_column): try: - model, itr = self._recentviewselection.get_selected() + itr = self._recentmodel.get_iter(path) if not itr: return number = self._recentmodel.get_value(itr, self.NUMBER_IDX) number = make_ugly(number) - contactPhoneNumbers = [("Phone", number)] description = self._recentmodel.get_value(itr, self.FROM_IDX) + contactId = self._recentmodel.get_value(itr, self.FROM_ID_IDX) + if contactId: + contactPhoneNumbers = list(self._backend.get_contact_details(contactId)) + defaultMatches = [ + (number == make_ugly(contactNumber) or number[1:] == make_ugly(contactNumber)) + for (numberDescription, contactNumber) in contactPhoneNumbers + ] + try: + defaultIndex = defaultMatches.index(True) + except ValueError: + contactPhoneNumbers.append(("Other", number)) + defaultIndex = len(contactPhoneNumbers)-1 + _moduleLogger.warn( + "Could not find contact %r's number %s among %r" % ( + contactId, number, contactPhoneNumbers + ) + ) + else: + contactPhoneNumbers = [("Phone", number)] + defaultIndex = -1 action, phoneNumber, message = self._phoneTypeSelector.run( contactPhoneNumbers, messages = (description, ), parent = self._window, + defaultIndex = defaultIndex, ) - if action == PhoneTypeSelector.ACTION_CANCEL: + if action == SmsEntryDialog.ACTION_CANCEL: return assert phoneNumber, "A lack of phone number exists" @@ -1134,6 +1109,7 @@ class MessagesView(object): HEADER_IDX = 2 MESSAGE_IDX = 3 MESSAGES_IDX = 4 + FROM_ID_IDX = 5 def __init__(self, widgetTree, backend, errorDisplay): self._errorDisplay = errorDisplay @@ -1146,6 +1122,7 @@ class MessagesView(object): gobject.TYPE_STRING, # header gobject.TYPE_STRING, # message object, # messages + gobject.TYPE_STRING, # from id ) self._messageview = widgetTree.get_widget("messages_view") self._messageviewselection = None @@ -1160,7 +1137,7 @@ class MessagesView(object): self._messageColumn.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) self._window = gtk_toolbox.find_parent_window(self._messageview) - self._phoneTypeSelector = PhoneTypeSelector(widgetTree, self._backend) + self._phoneTypeSelector = SmsEntryDialog(widgetTree) self._updateSink = gtk_toolbox.threaded_stage( gtk_toolbox.comap( @@ -1173,6 +1150,7 @@ class MessagesView(object): 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.set_fixed_height_mode(False) self._messageview.append_column(self._messageColumn) self._messageviewselection = self._messageview.get_selection() @@ -1217,6 +1195,8 @@ class MessagesView(object): """ pass + _MIN_MESSAGES_SHOWN = 4 + def _idly_populate_messageview(self): with gtk_toolbox.gtk_lock(): banner = hildonize.show_busy_banner_start(self._window, "Loading Messages") @@ -1236,17 +1216,24 @@ class MessagesView(object): for message in gv_backend.sort_messages(messageItems) ) - for header, number, relativeDate, messages in messageItems: + for contactId, header, number, relativeDate, messages in messageItems: prettyNumber = number[2:] if number.startswith("+1") else number prettyNumber = make_pretty(prettyNumber) firstMessage = "%s - %s (%s)" % (header, prettyNumber, relativeDate) - newMessages = [firstMessage] - newMessages.extend(messages) + expandedMessages = [firstMessage] + expandedMessages.extend(messages) + if (self._MIN_MESSAGES_SHOWN + 1) < len(messages): + firstMessage = "%s - %s (%s)" % (header, prettyNumber, relativeDate) + secondMessage = "%d Messages Hidden..." % (len(messages) - self._MIN_MESSAGES_SHOWN, ) + collapsedMessages = [firstMessage, secondMessage] + collapsedMessages.extend(messages[-(self._MIN_MESSAGES_SHOWN+0):]) + else: + collapsedMessages = expandedMessages number = make_ugly(number) - row = (number, relativeDate, header, "\n".join(newMessages), newMessages) + row = number, relativeDate, header, "\n".join(collapsedMessages), expandedMessages, contactId with gtk_toolbox.gtk_lock(): self._messagemodel.append(row) except Exception, e: @@ -1259,19 +1246,41 @@ class MessagesView(object): def _on_messageview_row_activated(self, treeview, path, view_column): try: - model, itr = self._messageviewselection.get_selected() + itr = self._messagemodel.get_iter(path) if not itr: return - contactPhoneNumbers = [("Phone", self._messagemodel.get_value(itr, self.NUMBER_IDX))] + number = make_ugly(self._messagemodel.get_value(itr, self.NUMBER_IDX)) description = self._messagemodel.get_value(itr, self.MESSAGES_IDX) + contactId = self._messagemodel.get_value(itr, self.FROM_ID_IDX) + if contactId: + contactPhoneNumbers = list(self._backend.get_contact_details(contactId)) + defaultMatches = [ + (number == make_ugly(contactNumber) or number[1:] == make_ugly(contactNumber)) + for (numberDescription, contactNumber) in contactPhoneNumbers + ] + try: + defaultIndex = defaultMatches.index(True) + except ValueError: + contactPhoneNumbers.append(("Other", number)) + defaultIndex = len(contactPhoneNumbers)-1 + _moduleLogger.warn( + "Could not find contact %r's number %s among %r" % ( + contactId, number, contactPhoneNumbers + ) + ) + else: + contactPhoneNumbers = [("Phone", number)] + defaultIndex = -1 + action, phoneNumber, message = self._phoneTypeSelector.run( contactPhoneNumbers, messages = description, parent = self._window, + defaultIndex = defaultIndex, ) - if action == PhoneTypeSelector.ACTION_CANCEL: + if action == SmsEntryDialog.ACTION_CANCEL: return assert phoneNumber, "A lock of phone number exists" @@ -1319,7 +1328,7 @@ class ContactsView(object): self._onContactsviewRowActivatedId = 0 self._onAddressbookButtonChangedId = 0 self._window = gtk_toolbox.find_parent_window(self._contactsview) - self._phoneTypeSelector = PhoneTypeSelector(widgetTree, self._backend) + self._phoneTypeSelector = SmsEntryDialog(widgetTree) self._updateSink = gtk_toolbox.threaded_stage( gtk_toolbox.comap( @@ -1332,6 +1341,7 @@ class ContactsView(object): assert self._backend.is_authed(), "Attempting to enable backend while not logged in" self._contactsview.set_model(self._contactsmodel) + self._contactsview.set_fixed_height_mode(False) self._contactsview.append_column(self._contactColumn) self._contactsviewselection = self._contactsview.get_selection() self._contactsviewselection.set_mode(gtk.SELECTION_SINGLE) @@ -1479,7 +1489,7 @@ class ContactsView(object): def _on_contactsview_row_activated(self, treeview, path, view_column): try: - model, itr = self._contactsviewselection.get_selected() + itr = self._contactsmodel.get_iter(path) if not itr: return @@ -1500,7 +1510,7 @@ class ContactsView(object): messages = (contactName, ), parent = self._window, ) - if action == PhoneTypeSelector.ACTION_CANCEL: + if action == SmsEntryDialog.ACTION_CANCEL: return assert phoneNumber, "A lack of phone number exists"