<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>
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):
"""
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):
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