Hi,
Is there any recommendations on handling a long button hold? I am trying to implement a reset on a App, but only want to happen if the user holds a key for a few seconds.
Cheers
Chris
class MyInputDelegate extends Ui.InputDelegate
{
hidden var mKeys;
function initialize() {
InputDelegate.initialize();
mKeys = new [Ui has :EXTENDED_KEYS ? 23 : 16];
}
function onKeyPressed(evt) {
var key = evt.getKey();
//if (mKeys[key] == null) {
var now = Sys.getTimer();
mKeys[key] = now;
//}
return true;
}
function onKeyReleased(evt) {
var key = evt.getKey();
// this can happen if view/delegate is popped as the result of an onKey
// or onKeyPressed event.
if (mKeys[key] != null) {
var now = Sys.getTimer();
var delta = now - mKeys[key];
Sys.println(Lang.format("Key $1$ held for $2$ms", [ key, delta ]));
mKeys[key] = null;
}
return true;
}
}
using Toybox.Application as App;
using Toybox.Graphics as Gfx;
using Toybox.Lang as Lang;
using Toybox.System as Sys;
using Toybox.Timer as Timer;
using Toybox.WatchUi as Ui;
class MyInputDelegate extends Ui.InputDelegate
{
hidden var mKeys;
hidden var mTimer;
class KeyHeldDelegate
{
hidden var mParent;
hidden var mKey;
function initialize(parent, key) {
mParent = parent;
mKey = key;
}
function invoke() {
mParent.onKeyHeld(new Ui.KeyEvent(mKey, Ui.PRESS_TYPE_ACTION));
}
}
function initialize(view) {
InputDelegate.initialize();
mKeys = new [Ui has :EXTENDED_KEYS ? 23 : 16];
mTimer = new Timer.Timer();
}
function onKeyPressed(evt) {
var key = evt.getKey();
if (mKeys[key] == null) {
mKeys[key] = new KeyHeldDelegate(self, key);
}
Sys.println(Lang.format("onKeyPressed: $1$", [ key ]));
// invoke the key delegate in 1 second
mTimer.stop();
mTimer.start(mKeys[key].method(:invoke), 1000, false);
return true;
}
function onKeyHeld(evt) {
var key = evt.getKey();
mKeys[key] = null;
Sys.println(Lang.format("onKeyHeld: $1$", [ key ]));
}
function onKeyReleased(evt) {
var key = evt.getKey();
// if we have a null then the either the key press was handled
// by another view and we are getting the release event in our
// view, or the key was held and we've already handled it.
if (mKeys[key] == null) {
return true;
}
// at this point, we know the given key has been pressed and
// not held down for more than a second.
mKeys[key] = null;
Sys.println(Lang.format("onKeyReleased: $1$", [ key ]));
mTimer.stop();
return true;
}
}
class EnterKeyDelegate extends Toybox.Watchui.InputDelegate (or BehaviorDelegate) {
hidden var keyPressedTime = 0;
function onKeyPressed( evt ) {
if (evt.getKey() == Ui.KEY_ENTER) {
keyPressedTime = System.getTimer();
return true;
}
return false;
}
function onKeyReleased( evt ) {
if ((keyPressedTime > 0) && (evt.getKey() == Ui.KEY_ENTER)) {
var delta = System.getTimer() - keyPressedTime; // ms since last press
keyPressedTime = 0;
if (delta > 1000) {
// We have a hold
} else {
// We have a regular press
}
return true;
}
return false;
}
}
Can't the whole timer issue be avoided by just using System.getTimer()