<property name="receives_default">False</property>
<property name="focus_on_click">False</property>
<signal name="clicked" handler="on_digit_clicked"/>
- <accelerator key="c" signal="clicked"/>
- <accelerator key="b" signal="clicked"/>
- <accelerator key="a" signal="clicked"/>
<accelerator key="2" signal="clicked"/>
+ <accelerator key="a" signal="clicked"/>
+ <accelerator key="b" signal="clicked"/>
+ <accelerator key="c" signal="clicked"/>
<child>
<widget class="GtkLabel" id="label10">
<property name="visible">True</property>
<property name="receives_default">False</property>
<property name="focus_on_click">False</property>
<signal name="clicked" handler="on_digit_clicked"/>
- <accelerator key="f" signal="clicked"/>
- <accelerator key="e" signal="clicked"/>
- <accelerator key="d" signal="clicked"/>
<accelerator key="3" signal="clicked"/>
+ <accelerator key="d" signal="clicked"/>
+ <accelerator key="e" signal="clicked"/>
+ <accelerator key="f" signal="clicked"/>
<child>
<widget class="GtkLabel" id="label11">
<property name="visible">True</property>
<property name="receives_default">False</property>
<property name="focus_on_click">False</property>
<signal name="clicked" handler="on_digit_clicked"/>
- <accelerator key="i" signal="clicked"/>
- <accelerator key="h" signal="clicked"/>
- <accelerator key="g" signal="clicked"/>
<accelerator key="4" signal="clicked"/>
+ <accelerator key="g" signal="clicked"/>
+ <accelerator key="h" signal="clicked"/>
+ <accelerator key="i" signal="clicked"/>
<child>
<widget class="GtkLabel" id="label13">
<property name="visible">True</property>
<property name="receives_default">False</property>
<property name="focus_on_click">False</property>
<signal name="clicked" handler="on_digit_clicked"/>
- <accelerator key="l" signal="clicked"/>
- <accelerator key="k" signal="clicked"/>
- <accelerator key="j" signal="clicked"/>
<accelerator key="5" signal="clicked"/>
+ <accelerator key="j" signal="clicked"/>
+ <accelerator key="k" signal="clicked"/>
+ <accelerator key="l" signal="clicked"/>
<child>
<widget class="GtkLabel" id="label14">
<property name="visible">True</property>
<property name="receives_default">False</property>
<property name="focus_on_click">False</property>
<signal name="clicked" handler="on_digit_clicked"/>
- <accelerator key="o" signal="clicked"/>
- <accelerator key="n" signal="clicked"/>
- <accelerator key="m" signal="clicked"/>
<accelerator key="6" signal="clicked"/>
+ <accelerator key="m" signal="clicked"/>
+ <accelerator key="n" signal="clicked"/>
+ <accelerator key="o" signal="clicked"/>
<child>
<widget class="GtkLabel" id="label15">
<property name="visible">True</property>
<property name="receives_default">False</property>
<property name="focus_on_click">False</property>
<signal name="clicked" handler="on_digit_clicked"/>
- <accelerator key="s" signal="clicked"/>
- <accelerator key="r" signal="clicked"/>
- <accelerator key="q" signal="clicked"/>
- <accelerator key="p" signal="clicked"/>
<accelerator key="7" signal="clicked"/>
+ <accelerator key="p" signal="clicked"/>
+ <accelerator key="q" signal="clicked"/>
+ <accelerator key="r" signal="clicked"/>
+ <accelerator key="s" signal="clicked"/>
<child>
<widget class="GtkLabel" id="label16">
<property name="visible">True</property>
<property name="receives_default">False</property>
<property name="focus_on_click">False</property>
<signal name="clicked" handler="on_digit_clicked"/>
- <accelerator key="v" signal="clicked"/>
- <accelerator key="u" signal="clicked"/>
- <accelerator key="t" signal="clicked"/>
<accelerator key="8" signal="clicked"/>
+ <accelerator key="t" signal="clicked"/>
+ <accelerator key="u" signal="clicked"/>
+ <accelerator key="v" signal="clicked"/>
<child>
<widget class="GtkLabel" id="label17">
<property name="visible">True</property>
<property name="receives_default">False</property>
<property name="focus_on_click">False</property>
<signal name="clicked" handler="on_digit_clicked"/>
- <accelerator key="z" signal="clicked"/>
- <accelerator key="y" signal="clicked"/>
- <accelerator key="x" signal="clicked"/>
- <accelerator key="w" signal="clicked"/>
<accelerator key="9" signal="clicked"/>
+ <accelerator key="w" signal="clicked"/>
+ <accelerator key="x" signal="clicked"/>
+ <accelerator key="y" signal="clicked"/>
+ <accelerator key="z" signal="clicked"/>
<child>
<widget class="GtkLabel" id="label18">
<property name="visible">True</property>
</child>
</widget>
<packing>
+ <property name="expand">False</property>
<property name="position">3</property>
</packing>
</child>
"""
@returns (personsName, phoneNumber, date, action)
"""
+ contactId = recentCallData["contactId"]
if recentCallData["name"]:
header = recentCallData["name"]
elif recentCallData["prettyNumber"]:
number = recentCallData["number"]
relTime = recentCallData["relTime"]
action = recentCallData["action"]
- return header, number, relTime, action
+ return contactId, header, number, relTime, action
def decorate_message(messageData):
+ contactId = messageData["contactId"]
exactTime = messageData["time"]
if messageData["name"]:
header = messageData["name"]
for messagePart in messageParts
]
- decoratedResults = header, number, relativeTime, messages
+ decoratedResults = contactId, header, number, relativeTime, messages
return decoratedResults
self._numberIndex = -1
self._contactDetails = []
- def run(self, contactDetails, messages = (), parent = None):
+ 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)
row = (phoneNumber, display)
self._contactDetails.append(row)
if 0 < len(self._contactDetails):
- self._numberIndex = 0
- self._phoneButton.set_label(self._contactDetails[0][1])
+ 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)
+ parentSize = parent.get_size()
+ self._dialog.resize(parentSize[0], max(parentSize[1]-50, 100))
# Run
try:
self._smsEntry.grab_focus()
if 1 < len(self._contactDetails):
- self._request_number()
+ if defaultIndex == -1:
+ self._request_number()
self._phoneButton.set_sensitive(True)
else:
self._phoneButton.set_sensitive(False)
DATE_IDX = 1
ACTION_IDX = 2
FROM_IDX = 3
+ FROM_ID_IDX = 4
def __init__(self, widgetTree, backend, errorDisplay):
self._errorDisplay = errorDisplay
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
self._recentview.append_column(self._numberColumn)
self._recentview.append_column(self._nameColumn)
self._recentviewselection = self._recentview.get_selection()
- self._recentviewselection.set_mode(gtk.SELECTION_NONE)
+ self._recentviewselection.set_mode(gtk.SELECTION_SINGLE)
self._onRecentviewRowActivatedId = self._recentview.connect("row-activated", self._on_recentview_row_activated)
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:
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 == SmsEntryDialog.ACTION_CANCEL:
return
HEADER_IDX = 2
MESSAGE_IDX = 3
MESSAGES_IDX = 4
+ FROM_ID_IDX = 5
def __init__(self, widgetTree, backend, errorDisplay):
self._errorDisplay = errorDisplay
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
self._messageview.append_column(self._messageColumn)
self._messageviewselection = self._messageview.get_selection()
- self._messageviewselection.set_mode(gtk.SELECTION_NONE)
+ self._messageviewselection.set_mode(gtk.SELECTION_SINGLE)
self._onMessageviewRowActivatedId = self._messageview.connect("row-activated", self._on_messageview_row_activated)
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)
number = make_ugly(number)
- row = (number, relativeDate, header, "\n".join(collapsedMessages), expandedMessages)
+ row = number, relativeDate, header, "\n".join(collapsedMessages), expandedMessages, contactId
with gtk_toolbox.gtk_lock():
self._messagemodel.append(row)
except Exception, e:
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 == SmsEntryDialog.ACTION_CANCEL:
return
self._contactsview.set_fixed_height_mode(True)
self._contactsview.append_column(self._contactColumn)
self._contactsviewselection = self._contactsview.get_selection()
- self._contactsviewselection.set_mode(gtk.SELECTION_NONE)
+ self._contactsviewselection.set_mode(gtk.SELECTION_SINGLE)
del self._booksList[:]
for (factoryId, bookId), (factoryName, bookName) in self.get_addressbooks():
treeView.set_model(model)
treeView.append_column(column)
selection = treeView.get_selection()
- selection.set_mode(gtk.SELECTION_NONE)
+ selection.set_mode(gtk.SELECTION_SINGLE)
if 0 < defaultIndex:
selection.select_path((defaultIndex, ))
treeView.set_model(model)
treeView.append_column(column)
selection = treeView.get_selection()
- selection.set_mode(gtk.SELECTION_NONE)
+ selection.set_mode(gtk.SELECTION_SINGLE)
scrolledWin = gtk.ScrolledWindow()
scrolledWin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
* Sped up various login cases
* Added descriptions to the callback numbers
* Collapsed conversations in the messages tab
+* Give access to all of a contacts numbers when launching dialog from Recent or Messages tabs
* UI Tweak: Added more login status notifications
* UI Tweak: When no characters are entered, you can't send a text
-* UI Tweak: Switched to TreeView's using no selection to match Fremantle
* UI Tweak: Trying to consolidate dialogs by combining phone selection and SMS entry
* UI Tweak: Removed "Select" button from SMS Dialog
+* UI Tweak: Increased the size of the SMS dialog
* Bug Fix: Expanded the types of the Enter key that are supported for going to full screen
* Bug Fix: Random people were reporting login issues
* Bug Fix: Hardened against issues with grabbing possible callback numbers