From: epage Date: Wed, 12 Aug 2009 02:20:14 +0000 (+0000) Subject: Back/Clear button now provides visual indicators when the behavior is changed X-Git-Url: http://git.maemo.org/git/?a=commitdiff_plain;h=9d8383db9955ebdf5f2a6f8272b9959fba582e4f;p=gc-dialer Back/Clear button now provides visual indicators when the behavior is changed git-svn-id: file:///svnroot/gc-dialer/trunk@383 c39d3808-3fe2-4d86-a59f-b7f623ee9f21 --- diff --git a/src/dialcentral.glade b/src/dialcentral.glade index a7d91fb..136abe1 100644 --- a/src/dialcentral.glade +++ b/src/dialcentral.glade @@ -204,9 +204,6 @@ True True False - - - diff --git a/src/gc_views.py b/src/gc_views.py index 4d7c2e8..06a6681 100644 --- a/src/gc_views.py +++ b/src/gc_views.py @@ -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): diff --git a/src/gtk_toolbox.py b/src/gtk_toolbox.py index 88ceb1f..6ac61b5 100644 --- a/src/gtk_toolbox.py +++ b/src/gtk_toolbox.py @@ -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