Adding a proper error box for the sms window
authorEd Page <eopage@byu.net>
Fri, 19 Feb 2010 01:41:13 +0000 (19:41 -0600)
committerEd Page <eopage@byu.net>
Fri, 19 Feb 2010 01:41:13 +0000 (19:41 -0600)
src/dc_glade.py
src/dialcentral.glade
src/gtk_toolbox.py
src/gv_views.py

index 63941bf..d18a6d4 100755 (executable)
@@ -111,7 +111,10 @@ class Dialcentral(object):
 
                self._window = self._widgetTree.get_widget("mainWindow")
                self._notebook = self._widgetTree.get_widget("notebook")
-               self._errorDisplay = gtk_toolbox.ErrorDisplay(self._widgetTree)
+               errorBox = self._widgetTree.get_widget("errorEventBox")
+               errorDescription = self._widgetTree.get_widget("errorDescription")
+               errorClose = self._widgetTree.get_widget("errorClose")
+               self._errorDisplay = gtk_toolbox.ErrorDisplay(errorBox, errorDescription, errorClose)
                self._credentialsDialog = gtk_toolbox.LoginWindow(self._widgetTree)
                self._smsEntryWindow = None
 
@@ -278,7 +281,8 @@ class Dialcentral(object):
                        import gv_views
                        from backends import merge_backend
 
-                       self._smsEntryWindow = gv_views.SmsEntryWindow(self._widgetTree, self._window)
+                       with gtk_toolbox.gtk_lock():
+                               self._smsEntryWindow = gv_views.SmsEntryWindow(self._widgetTree, self._window, self._app)
                        try:
                                os.makedirs(constants._data_path_)
                        except OSError, e:
index 116c7ad..4442e85 100644 (file)
                         <property name="receives_default">False</property>
                         <property name="focus_on_click">False</property>
                         <signal name="clicked" handler="on_digit_clicked"/>
-                        <accelerator key="2" signal="clicked"/>
-                        <accelerator key="a" signal="clicked"/>
-                        <accelerator key="b" signal="clicked"/>
                         <accelerator key="c" signal="clicked"/>
+                        <accelerator key="b" signal="clicked"/>
+                        <accelerator key="a" signal="clicked"/>
+                        <accelerator key="2" 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="3" signal="clicked"/>
-                        <accelerator key="d" signal="clicked"/>
-                        <accelerator key="e" signal="clicked"/>
                         <accelerator key="f" signal="clicked"/>
+                        <accelerator key="e" signal="clicked"/>
+                        <accelerator key="d" signal="clicked"/>
+                        <accelerator key="3" 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="4" signal="clicked"/>
-                        <accelerator key="g" signal="clicked"/>
-                        <accelerator key="h" signal="clicked"/>
                         <accelerator key="i" signal="clicked"/>
+                        <accelerator key="h" signal="clicked"/>
+                        <accelerator key="g" signal="clicked"/>
+                        <accelerator key="4" 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="5" signal="clicked"/>
-                        <accelerator key="j" signal="clicked"/>
-                        <accelerator key="k" signal="clicked"/>
                         <accelerator key="l" signal="clicked"/>
+                        <accelerator key="k" signal="clicked"/>
+                        <accelerator key="j" signal="clicked"/>
+                        <accelerator key="5" 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="6" signal="clicked"/>
-                        <accelerator key="m" signal="clicked"/>
-                        <accelerator key="n" signal="clicked"/>
                         <accelerator key="o" signal="clicked"/>
+                        <accelerator key="n" signal="clicked"/>
+                        <accelerator key="m" signal="clicked"/>
+                        <accelerator key="6" 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="7" signal="clicked"/>
-                        <accelerator key="p" signal="clicked"/>
-                        <accelerator key="q" signal="clicked"/>
-                        <accelerator key="r" signal="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"/>
                         <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="8" signal="clicked"/>
-                        <accelerator key="t" signal="clicked"/>
-                        <accelerator key="u" signal="clicked"/>
                         <accelerator key="v" signal="clicked"/>
+                        <accelerator key="u" signal="clicked"/>
+                        <accelerator key="t" signal="clicked"/>
+                        <accelerator key="8" 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="9" signal="clicked"/>
-                        <accelerator key="w" signal="clicked"/>
-                        <accelerator key="x" signal="clicked"/>
-                        <accelerator key="y" signal="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"/>
                         <child>
                           <widget class="GtkLabel" id="label18">
                             <property name="visible">True</property>
         <property name="visible">True</property>
         <property name="orientation">vertical</property>
         <child>
+          <widget class="GtkEventBox" id="smsErrorEventBox">
+            <property name="visible">True</property>
+            <child>
+              <widget class="GtkHBox" id="smsErrorBox">
+                <property name="visible">True</property>
+                <child>
+                  <widget class="GtkImage" id="smsErrorImage">
+                    <property name="visible">True</property>
+                    <property name="stock">gtk-dialog-error</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="smsErrorDescription">
+                    <property name="visible">True</property>
+                    <property name="use_markup">True</property>
+                    <property name="ellipsize">end</property>
+                    <property name="single_line_mode">True</property>
+                  </widget>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkImage" id="smsErrorClose">
+                    <property name="visible">True</property>
+                    <property name="stock">gtk-close</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+              </widget>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
           <widget class="GtkScrolledWindow" id="smsMessages_scrolledwindow">
             <property name="visible">True</property>
             <property name="can_focus">True</property>
             </child>
           </widget>
           <packing>
-            <property name="position">0</property>
+            <property name="position">1</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
-            <property name="position">1</property>
+            <property name="position">2</property>
           </packing>
         </child>
       </widget>
index 7112030..17dc166 100644 (file)
@@ -414,11 +414,11 @@ def safecall(f, errorDisplay=None, default=None, exception=Exception):
 
 class ErrorDisplay(object):
 
-       def __init__(self, widgetTree):
+       def __init__(self, errorBox, errorDescription, errorClose):
                super(ErrorDisplay, self).__init__()
-               self.__errorBox = widgetTree.get_widget("errorEventBox")
-               self.__errorDescription = widgetTree.get_widget("errorDescription")
-               self.__errorClose = widgetTree.get_widget("errorClose")
+               self.__errorBox = errorBox
+               self.__errorDescription = errorDescription
+               self.__errorClose = errorClose
                self.__parentBox = self.__errorBox.get_parent()
 
                self.__errorBox.connect("button_release_event", self._on_close)
index d5aed57..e1514b6 100644 (file)
@@ -247,7 +247,7 @@ class SmsEntryWindow(object):
 
        MAX_CHAR = 160
 
-       def __init__(self, widgetTree, parent):
+       def __init__(self, widgetTree, parent, app):
                self._clipboard = gtk.clipboard_get()
                self._widgetTree = widgetTree
                self._window = self._widgetTree.get_widget("smsWindow")
@@ -257,6 +257,11 @@ class SmsEntryWindow(object):
                self._isFullScreen = False
                self._parent = parent
 
+               errorBox = self._widgetTree.get_widget("smsErrorEventBox")
+               errorDescription = self._widgetTree.get_widget("smsErrorDescription")
+               errorClose = self._widgetTree.get_widget("smsErrorClose")
+               self._errorDisplay = gtk_toolbox.ErrorDisplay(errorBox, errorDescription, errorClose)
+
                self._smsButton = self._widgetTree.get_widget("sendSmsButton")
                self._smsButton.connect("clicked", self._on_send)
                self._dialButton = self._widgetTree.get_widget("dialButton")
@@ -290,6 +295,9 @@ class SmsEntryWindow(object):
                self._smsEntry.get_buffer().connect("changed", self._on_entry_changed)
                self._smsEntrySize = None
 
+               self._app = app
+               self._window = hildonize.hildonize_window(self._app, self._window)
+
                self._contacts = []
 
        def add_contact(self, name, contactDetails, messages = (), defaultIndex = -1):
@@ -448,8 +456,8 @@ class SmsEntryWindow(object):
                        row = list(self._targetList.get_children())[0]
                        phoneButton = list(row.get_children())[1]
                        phoneButton.set_label(contactNumbers[numberIndex][1])
-               except Exception, e:
-                       _moduleLogger.exception("%s" % str(e))
+               except TypeError, e:
+                       self._errorDisplay.push_exception()
 
        def _on_choose_phone_n(self, button, row):
                try:
@@ -461,8 +469,8 @@ class SmsEntryWindow(object):
                        contactNumbers, numberIndex, messages = self._contacts[0]
                        phoneButton = list(row.get_children())[1]
                        phoneButton.set_label(contactNumbers[numberIndex][1])
-               except Exception, e:
-                       _moduleLogger.exception("%s" % str(e))
+               except TypeError, e:
+                       self._errorDisplay.push_exception()
 
        def _on_remove_phone_n(self, button, row):
                try:
@@ -474,43 +482,52 @@ class SmsEntryWindow(object):
                        self._targetList.remove(row)
                        self._update_context()
                        self._update_button_state()
-               except Exception, e:
-                       _moduleLogger.exception("%s" % str(e))
+               except TypeError, e:
+                       self._errorDisplay.push_exception()
 
        def _on_entry_changed(self, *args):
-               self._update_letter_count()
+               try:
+                       self._update_letter_count()
+               except TypeError, e:
+                       self._errorDisplay.push_exception()
 
        def _on_send(self, *args):
-               assert 0 < len(self._contacts), "%r" % self._contacts
-               phoneNumbers = [
-                       make_ugly(contact[0][contact[1]][0])
-                       for contact in self._contacts
-               ]
-
-               entryBuffer = self._smsEntry.get_buffer()
-               enteredMessage = entryBuffer.get_text(entryBuffer.get_start_iter(), entryBuffer.get_end_iter())
-               enteredMessage = enteredMessage.strip()
-               assert enteredMessage
-               self.send_sms(phoneNumbers, enteredMessage)
-               self._hide()
+               try:
+                       assert 0 < len(self._contacts), "%r" % self._contacts
+                       phoneNumbers = [
+                               make_ugly(contact[0][contact[1]][0])
+                               for contact in self._contacts
+                       ]
+
+                       entryBuffer = self._smsEntry.get_buffer()
+                       enteredMessage = entryBuffer.get_text(entryBuffer.get_start_iter(), entryBuffer.get_end_iter())
+                       enteredMessage = enteredMessage.strip()
+                       assert enteredMessage
+                       self.send_sms(phoneNumbers, enteredMessage)
+                       self._hide()
+               except TypeError, e:
+                       self._errorDisplay.push_exception()
 
        def _on_dial(self, *args):
-               assert len(self._contacts) == 1, "%r" % self._contacts
-               contact = self._contacts[0]
-               contactNumber = contact[0][contact[1]][0]
-               phoneNumber = make_ugly(contactNumber)
-               self.dial(phoneNumber)
-               self._hide()
+               try:
+                       assert len(self._contacts) == 1, "%r" % self._contacts
+                       contact = self._contacts[0]
+                       contactNumber = contact[0][contact[1]][0]
+                       phoneNumber = make_ugly(contactNumber)
+                       self.dial(phoneNumber)
+                       self._hide()
+               except TypeError, e:
+                       self._errorDisplay.push_exception()
 
        def _on_delete(self, *args):
-               self._window.emit_stop_by_name("delete-event")
-               self._hide()
+               try:
+                       self._window.emit_stop_by_name("delete-event")
+                       self._hide()
+               except TypeError, e:
+                       self._errorDisplay.push_exception()
                return True
 
        def _on_window_state_change(self, widget, event, *args):
-               """
-               @note Hildon specific
-               """
                try:
                        if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN:
                                self._isFullScreen = True
@@ -546,8 +563,8 @@ class SmsEntryWindow(object):
                                event.get_state() & gtk.gdk.CONTROL_MASK
                        ):
                                self._parent.destroy()
-               except Exception, e:
-                       _moduleLogger.exception(str(e))
+               except TypeError, e:
+                       self._errorDisplay.push_exception()
 
 
 class Dialpad(object):