Implementing various key combos in the new sms window
[gc-dialer] / src / gv_views.py
index 63abd7a..a34aaa7 100644 (file)
@@ -60,22 +60,11 @@ def normalize_number(prettynumber):
        >>> normalize_number("+012-(345)-678-90")
        '+01234567890'
        >>> normalize_number("1-(345)-678-9000")
-       '+13456789000'
+       '13456789000'
        >>> normalize_number("+1-(345)-678-9000")
        '+13456789000'
        """
        uglynumber = re.sub('[^0-9+]', '', prettynumber)
-       if uglynumber.startswith("+"):
-               pass
-       elif uglynumber.startswith("1") and len(uglynumber) == 11:
-               uglynumber = "+"+uglynumber
-       elif len(uglynumber) == 10:
-               uglynumber = "+1"+uglynumber
-       else:
-               pass
-
-       #validateRe = re.compile("^\+?[0-9]{10,}$")
-       #assert validateRe.match(uglynumber) is not None
 
        return uglynumber
 
@@ -224,12 +213,15 @@ class SmsEntryWindow(object):
 
        MAX_CHAR = 160
 
-       def __init__(self, widgetTree):
+       def __init__(self, widgetTree, parent):
                self._clipboard = gtk.clipboard_get()
                self._widgetTree = widgetTree
                self._window = self._widgetTree.get_widget("smsWindow")
                self._window.connect("delete-event", self._on_delete)
                self._window.connect("key-press-event", self._on_key_press)
+               self._window.connect("window-state-event", self._on_window_state_change)
+               self._isFullScreen = False
+               self._parent = parent
 
                self._smsButton = self._widgetTree.get_widget("sendSmsButton")
                self._smsButton.connect("clicked", self._on_send)
@@ -264,10 +256,9 @@ class SmsEntryWindow(object):
                self._smsEntry.get_buffer().connect("changed", self._on_entry_changed)
                self._smsEntrySize = None
 
-               self._numberIndex = -1
                self._contacts = []
 
-       def add_contact(self, contactDetails, messages = (), parent = None, defaultIndex = -1):
+       def add_contact(self, contactDetails, messages = (), defaultIndex = -1):
                contactNumbers = list(self._to_contact_numbers(contactDetails))
                assert contactNumbers
                contactIndex = defaultIndex if defaultIndex != -1 else 0
@@ -275,20 +266,19 @@ class SmsEntryWindow(object):
                self._contacts.append(contact)
 
                selector = gtk.Button(contactNumbers[0][1])
-               #selector.connect("clicked", , len(self._contacts)) TODO
                removeContact = gtk.Button(stock="gtk-delete")
-               #removeContact.connect("clicked", , len(self._contacts)) TODO
                row = gtk.HBox()
                row.pack_start(selector, True, True)
                row.pack_start(removeContact, False, False)
                row.show_all()
                self._targetList.pack_start(row)
+               selector.connect("clicked", self._on_choose_phone_n, row)
+               removeContact.connect("clicked", self._on_remove_phone_n, row)
                self._update_button_state()
                self._update_context()
 
-               if parent is not None:
-                       parentSize = parent.get_size()
-                       self._window.resize(parentSize[0], max(parentSize[1]-10, 100))
+               parentSize = self._parent.get_size()
+               self._window.resize(parentSize[0], max(parentSize[1]-10, 100))
                self._window.show()
                self._window.present()
 
@@ -307,6 +297,12 @@ class SmsEntryWindow(object):
                self._update_letter_count()
                self._update_context()
 
+       def fullscreen(self):
+               self._window.fullscreen()
+
+       def unfullscreen(self):
+               self._window.unfullscreen()
+
        def _remove_contact(self, contactIndex):
                del self._contacts[contactIndex]
 
@@ -382,26 +378,66 @@ class SmsEntryWindow(object):
                        display = " - ".join((make_pretty(phoneNumber), phoneType))
                        yield (phoneNumber, display)
 
-       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 _hide(self):
                self.clear()
                self._window.hide()
 
+       def _request_number(self, contactIndex):
+               contactNumbers, index, messages = self._contacts[contactIndex]
+               assert 0 <= index, "%r" % index
+
+               index = hildonize.touch_selector(
+                       self._window,
+                       "Phone Numbers",
+                       (description for (number, description) in contactNumbers),
+                       index,
+               )
+               self._contacts[contactIndex] = contactNumbers, index, messages
+
+       def send_sms(self, numbers, message):
+               raise NotImplementedError()
+
+       def dial(self, number):
+               raise NotImplementedError()
+
        def _on_phone(self, *args):
-               self._request_number()
+               try:
+                       assert len(self._contacts) == 1
+                       self._request_number(0)
+
+                       contactNumbers, numberIndex, messages = self._contacts[0]
+                       self._phoneButton.set_label(contactNumbers[numberIndex][1])
+                       row = list(self._targetList.get_children())[0]
+                       phoneButton = list(row.get_children())[0]
+                       phoneButton.set_label(contactNumbers[numberIndex][1])
+               except Exception, e:
+                       _moduleLogger.exception("%s" % str(e))
+
+       def _on_choose_phone_n(self, button, row):
+               try:
+                       assert 1 < len(self._contacts)
+                       targetList = list(self._targetList.get_children())
+                       index = targetList.index(row)
+                       self._request_number(index)
+
+                       contactNumbers, numberIndex, messages = self._contacts[0]
+                       phoneButton = list(row.get_children())[0]
+                       phoneButton.set_label(contactNumbers[numberIndex][1])
+               except Exception, e:
+                       _moduleLogger.exception("%s" % str(e))
+
+       def _on_remove_phone_n(self, button, row):
+               try:
+                       assert 1 < len(self._contacts)
+                       targetList = list(self._targetList.get_children())
+                       index = targetList.index(row)
+
+                       del self._contacts[index]
+                       self._targetList.remove(row)
+                       self._update_context()
+                       self._update_button_state()
+               except Exception, e:
+                       _moduleLogger.exception("%s" % str(e))
 
        def _on_entry_changed(self, *args):
                self._update_letter_count()
@@ -417,7 +453,7 @@ class SmsEntryWindow(object):
                enteredMessage = entryBuffer.get_text(entryBuffer.get_start_iter(), entryBuffer.get_end_iter())
                enteredMessage = enteredMessage.strip()
                assert enteredMessage
-               # @todo
+               self.send_sms(phoneNumbers, enteredMessage)
                self._hide()
 
        def _on_dial(self, *args):
@@ -425,7 +461,7 @@ class SmsEntryWindow(object):
                contact = self._contacts[0]
                contactNumber = contact[0][contact[1]][0]
                phoneNumber = make_ugly(contactNumber)
-               # @todo
+               self.dial(phoneNumber)
                self._hide()
 
        def _on_delete(self, *args):
@@ -433,14 +469,45 @@ class SmsEntryWindow(object):
                self._hide()
                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
+                       else:
+                               self._isFullScreen = False
+               except Exception, e:
+                       self._errorDisplay.push_exception()
+
        def _on_key_press(self, widget, event):
+               RETURN_TYPES = (gtk.keysyms.Return, gtk.keysyms.ISO_Enter, gtk.keysyms.KP_Enter)
                try:
-                       if event.keyval == ord("c") and event.get_state() & gtk.gdk.CONTROL_MASK:
+                       if (
+                               event.keyval == gtk.keysyms.F6 or
+                               event.keyval in RETURN_TYPES and event.get_state() & gtk.gdk.CONTROL_MASK
+                       ):
+                               if self._isFullScreen:
+                                       self._window.unfullscreen()
+                               else:
+                                       self._window.fullscreen()
+                       elif event.keyval == ord("c") and event.get_state() & gtk.gdk.CONTROL_MASK:
                                message = "\n".join(
                                        messagePart[0]
                                        for messagePart in self._messagemodel
                                )
                                self._clipboard.set_text(str(message))
+                       elif (
+                               event.keyval == gtk.keysyms.w and
+                               event.get_state() & gtk.gdk.CONTROL_MASK
+                       ):
+                               self._hide()
+                       elif (
+                               event.keyval == gtk.keysyms.q and
+                               event.get_state() & gtk.gdk.CONTROL_MASK
+                       ):
+                               self._parent.destroy()
                except Exception, e:
                        _moduleLogger.exception(str(e))
 
@@ -452,10 +519,9 @@ class Dialpad(object):
                self._errorDisplay = errorDisplay
 
                self._numberdisplay = widgetTree.get_widget("numberdisplay")
-               self._smsButton = widgetTree.get_widget("sms")
-               self._dialButton = widgetTree.get_widget("dial")
+               self._okButton = widgetTree.get_widget("dialpadOk")
                self._backButton = widgetTree.get_widget("back")
-               self._zeroOrPlusButton = widgetTree.get_widget("digit0")
+               self._plusButton = widgetTree.get_widget("plus")
                self._phonenumber = ""
                self._prettynumber = ""
 
@@ -463,8 +529,8 @@ class Dialpad(object):
                        "on_digit_clicked": self._on_digit_clicked,
                }
                widgetTree.signal_autoconnect(callbackMapping)
-               self._dialButton.connect("clicked", self._on_dial_clicked)
-               self._smsButton.connect("clicked", self._on_sms_clicked)
+               self._okButton.connect("clicked", self._on_ok_clicked)
+               self._plusButton.connect("clicked", self._on_plus)
 
                self._originalLabel = self._backButton.get_label()
                self._backTapHandler = gtk_toolbox.TapOrHold(self._backButton)
@@ -472,17 +538,13 @@ class Dialpad(object):
                self._backTapHandler.on_hold = self._on_clearall
                self._backTapHandler.on_holding = self._set_clear_button
                self._backTapHandler.on_cancel = self._reset_back_button
-               self._zeroOrPlusTapHandler = gtk_toolbox.TapOrHold(self._zeroOrPlusButton)
-               self._zeroOrPlusTapHandler.on_tap = self._on_zero
-               self._zeroOrPlusTapHandler.on_hold = self._on_plus
 
                self._window = gtk_toolbox.find_parent_window(self._numberdisplay)
                self._keyPressEventId = 0
 
        def enable(self):
-               self._dialButton.grab_focus()
+               self._okButton.grab_focus()
                self._backTapHandler.enable()
-               self._zeroOrPlusTapHandler.enable()
                self._keyPressEventId = self._window.connect("key-press-event", self._on_key_press)
 
        def disable(self):
@@ -490,7 +552,6 @@ class Dialpad(object):
                self._keyPressEventId = 0
                self._reset_back_button()
                self._backTapHandler.disable()
-               self._zeroOrPlusTapHandler.disable()
 
        def add_contact(self, *args, **kwds):
                """
@@ -537,19 +598,13 @@ class Dialpad(object):
                except Exception, e:
                        self._errorDisplay.push_exception()
 
-       def _on_sms_clicked(self, widget):
+       def _on_ok_clicked(self, widget):
                try:
                        phoneNumber = self.get_number()
                        self.add_contact(
-                               [("Dialer", phoneNumber)], (), self._window
+                               [("Dialer", phoneNumber)], ()
                        )
-               except Exception, e:
-                       self._errorDisplay.push_exception()
-
-       def _on_dial_clicked(self, widget):
-               try:
-                       #self.number_selected(action, phoneNumbers, message) TODO
-                       pass
+                       self.set_number("")
                except Exception, e:
                        self._errorDisplay.push_exception()
 
@@ -559,12 +614,6 @@ class Dialpad(object):
                except Exception, e:
                        self._errorDisplay.push_exception()
 
-       def _on_zero(self, *args):
-               try:
-                       self.set_number(self._phonenumber + "0")
-               except Exception, e:
-                       self._errorDisplay.push_exception()
-
        def _on_plus(self, *args):
                try:
                        self.set_number(self._phonenumber + "+")
@@ -1127,7 +1176,6 @@ class CallHistoryView(object):
                        self.add_contact(
                                contactPhoneNumbers,
                                messages = (description, ),
-                               parent = self._window,
                                defaultIndex = defaultIndex,
                        )
                        self._historyviewselection.unselect_all()
@@ -1390,7 +1438,6 @@ class MessagesView(object):
                        self.add_contact(
                                contactPhoneNumbers,
                                messages = description,
-                               parent = self._window,
                                defaultIndex = defaultIndex,
                        )
                        self._messageviewselection.unselect_all()
@@ -1664,7 +1711,6 @@ class ContactsView(object):
                        self.add_contact(
                                contactPhoneNumbers,
                                messages = (contactName, ),
-                               parent = self._window,
                        )
                        self._contactsviewselection.unselect_all()
                except Exception, e: