X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fgv_views.py;h=f03da7c526e944a5eb506e478ffbb71b93844e84;hb=4325208b27013d04c6e2dead4930a8d70b55abdc;hp=91f75d2a5088c3bc97c7f02941211a5a7f4aa05b;hpb=09ab0b4769d267e9ab8b98f549b6def319d68c96;p=gc-dialer diff --git a/src/gv_views.py b/src/gv_views.py index 91f75d2..f03da7c 100644 --- a/src/gv_views.py +++ b/src/gv_views.py @@ -17,12 +17,17 @@ 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 Add CTRL-V support to Dialpad +@todo Touch selector for notification time +@todo Test if hildonize should do stackables by default +@todo Alternate UI for dialogs """ from __future__ import with_statement import ConfigParser -import warnings +import logging import gobject import pango @@ -472,18 +477,18 @@ class Dialpad(object): 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) @@ -539,44 +544,62 @@ class Dialpad(object): pass def _on_sms_clicked(self, widget): - action = PhoneTypeSelector.ACTION_SEND_SMS - phoneNumber = self.get_number() + try: + action = PhoneTypeSelector.ACTION_SEND_SMS + phoneNumber = self.get_number() - message = self._smsDialog.run(phoneNumber, "", self._window) - if not message: - phoneNumber = "" - action = PhoneTypeSelector.ACTION_CANCEL + message = self._smsDialog.run(phoneNumber, "", self._window) + if not message: + phoneNumber = "" + action = PhoneTypeSelector.ACTION_CANCEL - if action == PhoneTypeSelector.ACTION_CANCEL: - return - self.number_selected(action, phoneNumber, message) + if action == PhoneTypeSelector.ACTION_CANCEL: + return + self.number_selected(action, phoneNumber, message) + except Exception, e: + self._errorDisplay.push_exception() def _on_dial_clicked(self, widget): - action = PhoneTypeSelector.ACTION_DIAL - phoneNumber = self.get_number() - message = "" - self.number_selected(action, phoneNumber, message) - - def _on_clear_number(self, *args): - self.clear() + try: + action = PhoneTypeSelector.ACTION_DIAL + phoneNumber = self.get_number() + message = "" + self.number_selected(action, phoneNumber, message) + except Exception, e: + self._errorDisplay.push_exception() def _on_digit_clicked(self, widget): - self.set_number(self._phonenumber + widget.get_name()[-1]) + try: + self.set_number(self._phonenumber + widget.get_name()[-1]) + except Exception, e: + self._errorDisplay.push_exception() def _on_backspace(self, taps): - self.set_number(self._phonenumber[:-taps]) - self._reset_back_button() + try: + self.set_number(self._phonenumber[:-taps]) + self._reset_back_button() + except Exception, e: + self._errorDisplay.push_exception() def _on_clearall(self, taps): - self.clear() - self._reset_back_button() + try: + self.clear() + self._reset_back_button() + except Exception, e: + self._errorDisplay.push_exception() return False def _set_clear_button(self): - self._backButton.set_label("gtk-clear") + try: + self._backButton.set_label("gtk-clear") + except Exception, e: + self._errorDisplay.push_exception() def _reset_back_button(self): - self._backButton.set_label(self._originalLabel) + try: + self._backButton.set_label(self._originalLabel) + except Exception, e: + self._errorDisplay.push_exception() class AccountInfo(object): @@ -627,7 +650,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) @@ -637,6 +660,8 @@ class AccountInfo(object): self._missedCheckbox.set_sensitive(False) self._voicemailCheckbox.set_sensitive(False) self._smsCheckbox.set_sensitive(False) + self._minutesEntryButton.set_sensitive(True) + self._onMinutesChanged = self._minutesEntryButton.connect("clicked", self._on_minutes_clicked) self.update(force=True) @@ -714,7 +739,7 @@ class AccountInfo(object): self._callbackList.clear() try: callbackNumbers = self._backend.get_callback_numbers() - except StandardError, e: + except Exception, e: self._errorDisplay.push_exception() self._isPopulated = False return @@ -730,28 +755,25 @@ class AccountInfo(object): 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(): - warnings.warn( + logging.warning( "Callback number already is %s" % ( self._backend.get_callback_number(), ), - UserWarning, - 2 ) 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()) ) - warnings.warn( + logging.info( "Callback number set to %s" % ( self._backend.get_callback_number(), ), - UserWarning, 2 ) - except StandardError, e: + except Exception, e: self._errorDisplay.push_exception() def _update_alarm_settings(self, recurrence): @@ -765,39 +787,82 @@ class AccountInfo(object): self._minutesEntryButton.set_label("%d Minutes" % self._alarmHandler.recurrence) def _on_callbackentry_changed(self, *args): - text = self.get_selected_callback_number() - number = make_ugly(text) - self._set_callback_number(number) + try: + text = self.get_selected_callback_number() + number = make_ugly(text) + self._set_callback_number(number) + except Exception, e: + self._errorDisplay.push_exception() def _on_notify_toggled(self, *args): - if self._applyAlarmTimeoutId is not None: - gobject.source_remove(self._applyAlarmTimeoutId) - self._applyAlarmTimeoutId = None - self._applyAlarmTimeoutId = gobject.timeout_add(500, self._on_apply_timeout) + try: + if self._applyAlarmTimeoutId is not None: + gobject.source_remove(self._applyAlarmTimeoutId) + self._applyAlarmTimeoutId = None + self._applyAlarmTimeoutId = gobject.timeout_add(500, self._on_apply_timeout) + except Exception, e: + self._errorDisplay.push_exception() - def _on_minutes_changed(self, *args): - recurrence = hildonize.request_number( - self._window, "Minutes", (1, 50), self._alarmHandler.recurrence - ) - self._update_alarm_settings(recurrence) + def _on_minutes_clicked(self, *args): + recurrenceChoices = [ + (1, "1 minute"), + (3, "3 minutes"), + (5, "5 minutes"), + (10, "10 minutes"), + (15, "15 minutes"), + (30, "30 minutes"), + (45, "45 minutes"), + (60, "1 hour"), + (12*60, "12 hours"), + ] + try: + 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 Exception, e: + self._errorDisplay.push_exception() def _on_apply_timeout(self, *args): - self._applyAlarmTimeoutId = None + try: + self._applyAlarmTimeoutId = None - self._update_alarm_settings(self._alarmHandler.recurrence) + self._update_alarm_settings(self._alarmHandler.recurrence) + except Exception, e: + self._errorDisplay.push_exception() return False def _on_missed_toggled(self, *args): - self._notifyOnMissed = self._missedCheckbox.get_active() - self.save_everything() + try: + self._notifyOnMissed = self._missedCheckbox.get_active() + self.save_everything() + except Exception, e: + self._errorDisplay.push_exception() def _on_voicemail_toggled(self, *args): - self._notifyOnVoicemail = self._voicemailCheckbox.get_active() - self.save_everything() + try: + self._notifyOnVoicemail = self._voicemailCheckbox.get_active() + self.save_everything() + except Exception, e: + self._errorDisplay.push_exception() def _on_sms_toggled(self, *args): - self._notifyOnSms = self._smsCheckbox.get_active() - self.save_everything() + try: + self._notifyOnSms = self._smsCheckbox.get_active() + self.save_everything() + except Exception, e: + self._errorDisplay.push_exception() class RecentCallsView(object): @@ -844,7 +909,6 @@ class RecentCallsView(object): 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) @@ -913,49 +977,55 @@ class RecentCallsView(object): pass def _idly_populate_recentview(self): - self._recentmodel.clear() - self._isPopulated = True - try: - recentItems = self._backend.get_recent() - except StandardError, e: + self._recentmodel.clear() + self._isPopulated = True + + try: + recentItems = self._backend.get_recent() + except Exception, e: + self._errorDisplay.push_exception_with_lock() + self._isPopulated = False + recentItems = [] + + for 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) + with gtk_toolbox.gtk_lock(): + self._recentmodel.append(item) + except Exception, e: self._errorDisplay.push_exception_with_lock() - self._isPopulated = False - recentItems = [] - - for 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) - with gtk_toolbox.gtk_lock(): - self._recentmodel.append(item) return False def _on_recentview_row_activated(self, treeview, path, view_column): - model, itr = self._recentviewselection.get_selected() - if not itr: - return + try: + model, itr = self._recentviewselection.get_selected() + 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) + 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) - action, phoneNumber, message = self._phoneTypeSelector.run( - contactPhoneNumbers, - message = description, - parent = self._window, - ) - if action == PhoneTypeSelector.ACTION_CANCEL: - return - assert phoneNumber, "A lack of phone number exists" + action, phoneNumber, message = self._phoneTypeSelector.run( + contactPhoneNumbers, + message = description, + parent = self._window, + ) + if action == PhoneTypeSelector.ACTION_CANCEL: + return + assert phoneNumber, "A lack of phone number exists" - self.number_selected(action, phoneNumber, message) - self._recentviewselection.unselect_all() + self.number_selected(action, phoneNumber, message) + self._recentviewselection.unselect_all() + except Exception, e: + self._errorDisplay.push_exception() class MessagesView(object): @@ -1046,46 +1116,52 @@ class MessagesView(object): pass def _idly_populate_messageview(self): - self._messagemodel.clear() - self._isPopulated = True - try: - messageItems = self._backend.get_messages() - except StandardError, e: - self._errorDisplay.push_exception_with_lock() - self._isPopulated = False - messageItems = [] + self._messagemodel.clear() + self._isPopulated = True - for header, number, relativeDate, message 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) - number = make_ugly(number) - row = (number, relativeDate, header, message) - with gtk_toolbox.gtk_lock(): - self._messagemodel.append(row) + try: + messageItems = self._backend.get_messages() + except Exception, e: + self._errorDisplay.push_exception_with_lock() + self._isPopulated = False + messageItems = [] + + for header, number, relativeDate, message 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) + number = make_ugly(number) + row = (number, relativeDate, header, message) + with gtk_toolbox.gtk_lock(): + self._messagemodel.append(row) + except Exception, e: + self._errorDisplay.push_exception_with_lock() return False def _on_messageview_row_activated(self, treeview, path, view_column): - model, itr = self._messageviewselection.get_selected() - if not itr: - return + try: + model, itr = self._messageviewselection.get_selected() + if not itr: + return - contactPhoneNumbers = [("Phone", self._messagemodel.get_value(itr, self.NUMBER_IDX))] - description = self._messagemodel.get_value(itr, self.MESSAGE_IDX) + contactPhoneNumbers = [("Phone", self._messagemodel.get_value(itr, self.NUMBER_IDX))] + description = self._messagemodel.get_value(itr, self.MESSAGE_IDX) - action, phoneNumber, message = self._phoneTypeSelector.run( - contactPhoneNumbers, - message = description, - parent = self._window, - ) - if action == PhoneTypeSelector.ACTION_CANCEL: - return - assert phoneNumber, "A lock of phone number exists" + action, phoneNumber, message = self._phoneTypeSelector.run( + contactPhoneNumbers, + message = description, + parent = self._window, + ) + if action == PhoneTypeSelector.ACTION_CANCEL: + return + assert phoneNumber, "A lock of phone number exists" - self.number_selected(action, phoneNumber, message) - self._messageviewselection.unselect_all() + self.number_selected(action, phoneNumber, message) + self._messageviewselection.unselect_all() + except Exception, e: + self._errorDisplay.push_exception() class ContactsView(object): @@ -1235,63 +1311,72 @@ class ContactsView(object): config.set(sectionName, "selectedAddressbook", str(self._selectedComboIndex)) def _idly_populate_contactsview(self): - addressBook = None - while addressBook is not self._addressBook: - addressBook = self._addressBook - with gtk_toolbox.gtk_lock(): - self._contactsview.set_model(None) - self.clear() - - try: - contacts = addressBook.get_contacts() - except StandardError, e: - contacts = [] - self._isPopulated = False - self._errorDisplay.push_exception_with_lock() - for contactId, contactName in contacts: - contactType = (addressBook.contact_source_short_name(contactId), ) - self._contactsmodel.append(contactType + (contactName, "", contactId) + ("", )) - - with gtk_toolbox.gtk_lock(): - self._contactsview.set_model(self._contactsmodel) - - self._isPopulated = True + try: + addressBook = None + while addressBook is not self._addressBook: + addressBook = self._addressBook + with gtk_toolbox.gtk_lock(): + self._contactsview.set_model(None) + self.clear() + + try: + contacts = addressBook.get_contacts() + except Exception, e: + contacts = [] + self._isPopulated = False + self._errorDisplay.push_exception_with_lock() + for contactId, contactName in contacts: + contactType = (addressBook.contact_source_short_name(contactId), ) + self._contactsmodel.append(contactType + (contactName, "", contactId) + ("", )) + + with gtk_toolbox.gtk_lock(): + self._contactsview.set_model(self._contactsmodel) + + self._isPopulated = True + except Exception, e: + self._errorDisplay.push_exception_with_lock() return False def _on_addressbook_combo_changed(self, *args, **kwds): - itr = self._booksSelectionBox.get_active_iter() - if itr is None: - return - self._selectedComboIndex = self._booksSelectionBox.get_active() - selectedFactoryId = self._booksList.get_value(itr, 0) - selectedBookId = self._booksList.get_value(itr, 1) - self.open_addressbook(selectedFactoryId, selectedBookId) - - def _on_contactsview_row_activated(self, treeview, path, view_column): - model, itr = self._contactsviewselection.get_selected() - if not itr: - return - - contactId = self._contactsmodel.get_value(itr, 3) - contactName = self._contactsmodel.get_value(itr, 1) try: - contactDetails = self._addressBook.get_contact_details(contactId) - except StandardError, e: - contactDetails = [] + itr = self._booksSelectionBox.get_active_iter() + if itr is None: + return + self._selectedComboIndex = self._booksSelectionBox.get_active() + selectedFactoryId = self._booksList.get_value(itr, 0) + selectedBookId = self._booksList.get_value(itr, 1) + self.open_addressbook(selectedFactoryId, selectedBookId) + except Exception, e: self._errorDisplay.push_exception() - contactPhoneNumbers = [phoneNumber for phoneNumber in contactDetails] - if len(contactPhoneNumbers) == 0: - return + def _on_contactsview_row_activated(self, treeview, path, view_column): + try: + model, itr = self._contactsviewselection.get_selected() + if not itr: + return - action, phoneNumber, message = self._phoneTypeSelector.run( - contactPhoneNumbers, - message = contactName, - parent = self._window, - ) - if action == PhoneTypeSelector.ACTION_CANCEL: - return - assert phoneNumber, "A lack of phone number exists" + contactId = self._contactsmodel.get_value(itr, 3) + contactName = self._contactsmodel.get_value(itr, 1) + try: + contactDetails = self._addressBook.get_contact_details(contactId) + except Exception, e: + contactDetails = [] + self._errorDisplay.push_exception() + contactPhoneNumbers = [phoneNumber for phoneNumber in contactDetails] + + if len(contactPhoneNumbers) == 0: + return + + action, phoneNumber, message = self._phoneTypeSelector.run( + contactPhoneNumbers, + message = contactName, + parent = self._window, + ) + if action == PhoneTypeSelector.ACTION_CANCEL: + return + assert phoneNumber, "A lack of phone number exists" - self.number_selected(action, phoneNumber, message) - self._contactsviewselection.unselect_all() + self.number_selected(action, phoneNumber, message) + self._contactsviewselection.unselect_all() + except Exception, e: + self._errorDisplay.push_exception()