Skip to content

Commit

Permalink
Improve long press behaviour
Browse files Browse the repository at this point in the history
To improve the feeling of long presses they're triggered after the time
is over, not waiting for the button to be released anymore.
  • Loading branch information
lnqs committed Feb 22, 2022
1 parent 453e2da commit a9182ae
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 14 deletions.
25 changes: 14 additions & 11 deletions deckconnect/widgets/base.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import time
from asyncio import Event, Task, get_event_loop, sleep
from typing import Any, Dict

Expand All @@ -19,8 +18,8 @@ def __init__(
self.wake_lock: WakeLock | None = None
self.holds_wait_lock = False
self.needs_update = False
self.press_time: float | None = None
self.periodic_update_task: Task[None] | None = None
self.long_press_task: Task[None] | None = None

async def activate(self) -> None: # pragma: no cover
pass
Expand All @@ -32,17 +31,21 @@ async def update(self, key: Key) -> None: # pragma: no cover
pass

async def pressed(self) -> None:
self.press_time = time.monotonic()
async def maybe_trigger_longpress() -> None:
await sleep(1.0)
self.long_press_task = None
await self.triggered(True)

self.long_press_task = get_event_loop().create_task(maybe_trigger_longpress())

async def released(self) -> None:
long_press = (
time.monotonic() - self.press_time >= 1.0 if self.press_time else False
)
self.press_time = None
await self.triggered(long_press)

if "switch_deck" in self.config:
raise SwitchDeckException(self.config["switch_deck"])
if self.long_press_task:
self.long_press_task.cancel()
self.long_press_task = None
await self.triggered(False)

if "switch_deck" in self.config:
raise SwitchDeckException(self.config["switch_deck"])

async def triggered(self, long_press: bool = False) -> None:
pass
Expand Down
11 changes: 8 additions & 3 deletions tests/widgets/test_base.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from unittest.mock import patch
from asyncio import sleep
from unittest.mock import AsyncMock, Mock, patch

from pytest import raises

Expand All @@ -13,16 +14,20 @@ async def test_presses() -> None:
await widget.released()
assert triggered.call_args[0][0] is False

with patch.object(widget, "triggered") as triggered:
with patch.object(widget, "triggered") as triggered, patch(
"deckconnect.widgets.base.sleep", AsyncMock()
):
await widget.pressed()
widget.press_time = -2.0
await sleep(0.1)
await widget.released()
assert triggered.call_count == 1
assert triggered.call_args[0][0] is True


async def test_switch_deck() -> None:
widget = Widget({"switch_deck": "new_deck"}, {})
with raises(SwitchDeckException) as e:
widget.long_press_task = Mock()
await widget.released()
assert e.value.new_deck == "new_deck"

Expand Down

0 comments on commit a9182ae

Please sign in to comment.