Back/Clear button now provides visual indicators when the behavior is changed
authorepage <eopage@byu.net>
Wed, 12 Aug 2009 02:20:14 +0000 (02:20 +0000)
committerepage <eopage@byu.net>
Wed, 12 Aug 2009 02:20:14 +0000 (02:20 +0000)
git-svn-id: file:///svnroot/gc-dialer/trunk@383 c39d3808-3fe2-4d86-a59f-b7f623ee9f21

src/dialcentral.glade
src/gc_views.py
src/gtk_toolbox.py

index a7d91fb..136abe1 100644 (file)
                         <property name="receives_default">True</property>
                         <property name="use_stock">True</property>
                         <property name="focus_on_click">False</property>
-                        <signal name="pressed" handler="on_back_pressed"/>
-                        <signal name="clicked" handler="on_back_clicked"/>
-                        <signal name="released" handler="on_back_released"/>
                         <accelerator key="BackSpace" signal="clicked"/>
                       </widget>
                       <packing>
index 4d7c2e8..06a6681 100644 (file)
@@ -442,28 +442,34 @@ class Dialpad(object):
 
                self._numberdisplay = widgetTree.get_widget("numberdisplay")
                self._dialButton = widgetTree.get_widget("dial")
+               self._backButton = widgetTree.get_widget("back")
                self._phonenumber = ""
                self._prettynumber = ""
-               self._clearall_id = None
 
                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,
-                       "on_back_clicked": self._on_backspace,
-                       "on_back_pressed": self._on_back_pressed,
-                       "on_back_released": self._on_back_released,
                }
                widgetTree.signal_autoconnect(callbackMapping)
 
+               self._originalLabel = self._backButton.get_label()
+               self._backTapHandler = gtk_toolbox.TapOrHold(self._backButton)
+               self._backTapHandler.on_tap = self._on_backspace
+               self._backTapHandler.on_hold = self._on_clearall
+               self._backTapHandler.on_holding = self._set_clear_button
+               self._backTapHandler.on_cancel = self._reset_back_button
+
                self._window = gtk_toolbox.find_parent_window(self._numberdisplay)
 
        def enable(self):
                self._dialButton.grab_focus()
+               self._backTapHandler.enable()
 
        def disable(self):
-               pass
+               self._reset_back_button()
+               self._backTapHandler.disable()
 
        def number_selected(self, action, number, message):
                """
@@ -526,20 +532,20 @@ class Dialpad(object):
        def _on_digit_clicked(self, widget):
                self.set_number(self._phonenumber + widget.get_name()[-1])
 
-       def _on_backspace(self, widget):
-               self.set_number(self._phonenumber[:-1])
+       def _on_backspace(self, taps):
+               self.set_number(self._phonenumber[:-taps])
+               self._reset_back_button()
 
-       def _on_clearall(self):
+       def _on_clearall(self, *args):
                self.clear()
+               self._reset_back_button()
                return False
 
-       def _on_back_pressed(self, widget):
-               self._clearall_id = gobject.timeout_add(1000, self._on_clearall)
+       def _set_clear_button(self):
+               self._backButton.set_label("gtk-clear")
 
-       def _on_back_released(self, widget):
-               if self._clearall_id is not None:
-                       gobject.source_remove(self._clearall_id)
-               self._clearall_id = None
+       def _reset_back_button(self):
+               self._backButton.set_label(self._originalLabel)
 
 
 class AccountInfo(object):
index 88ceb1f..6ac61b5 100644 (file)
@@ -559,6 +559,93 @@ class QuickAddView(object):
                        self._errorDisplay.push_exception()
 
 
+class TapOrHold(object):
+
+       def __init__(self, widget):
+               self._widget = widget
+               self._isTap = True
+               self._isPointerInside = True
+               self._holdTimeoutId = None
+               self._tapTimeoutId = None
+               self._taps = 0
+
+               self._bpeId = None
+               self._breId = None
+               self._eneId = None
+               self._lneId = None
+
+       def enable(self):
+               self._bpeId = self._widget.connect("button-press-event", self._on_button_press)
+               self._breId = self._widget.connect("button-release-event", self._on_button_release)
+               self._eneId = self._widget.connect("enter-notify-event", self._on_enter)
+               self._lneId = self._widget.connect("leave-notify-event", self._on_leave)
+
+       def disable(self):
+               self._widget.disconnect(self._bpeId)
+               self._widget.disconnect(self._breId)
+               self._widget.disconnect(self._eneId)
+               self._widget.disconnect(self._lneId)
+
+       def on_tap(self, taps):
+               print "TAP", taps
+
+       def on_hold(self, taps):
+               print "HOLD", taps
+
+       def on_holding(self):
+               print "HOLDING"
+
+       def on_cancel(self):
+               print "CANCEL"
+
+       def _on_button_press(self, *args):
+               if self._tapTimeoutId is not None:
+                       gobject.source_remove(self._tapTimeoutId)
+                       self._tapTimeoutId = None
+
+               if self._holdTimeoutId is None:
+                       self._tapTimeoutId = None
+
+                       self._taps = 1
+                       self._holdTimeoutId = gobject.timeout_add(1000, self._on_hold_timeout)
+               else:
+                       self._taps = 2
+
+       def _on_button_release(self, *args):
+               assert self._tapTimeoutId is None
+               self._tapTimeoutId = gobject.timeout_add(100, self._on_tap_timeout)
+
+       def _on_actual_press(self, *args):
+               if self._holdTimeoutId is not None:
+                       gobject.source_remove(self._holdTimeoutId)
+               self._holdTimeoutId = None
+
+               if self._isPointerInside:
+                       if self._isTap:
+                               self.on_tap(self._taps)
+                       else:
+                               self.on_hold(self._taps)
+               else:
+                       self.on_cancel()
+
+       def _on_tap_timeout(self, *args):
+               self._tapTimeoutId = None
+               self._on_actual_press()
+               return False
+
+       def _on_hold_timeout(self, *args):
+               self._holdTimeoutId = None
+               self._isTap = False
+               self.on_holding()
+               return False
+
+       def _on_enter(self, *args):
+               self._isPointerInside = True
+
+       def _on_leave(self, *args):
+               self._isPointerInside = False
+
+
 if __name__ == "__main__":
        if False:
                import datetime