From a580b9d20d53e9f23bf8eca6ebd0fbd1a58fafab Mon Sep 17 00:00:00 2001 From: Matthias Metelka <62722460+kleinerpirat@users.noreply.github.com> Date: Wed, 2 Nov 2022 11:41:15 +0100 Subject: [PATCH] Increasingly increment/decrement SpinBox value on long press (#2163) * Increasingly increment/decrement SpinBox value on long press * Make increment/decrement speedup a bit more programmatic --- ts/components/SpinBox.svelte | 57 +++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/ts/components/SpinBox.svelte b/ts/components/SpinBox.svelte index 9c04fad96..d0adf2f29 100644 --- a/ts/components/SpinBox.svelte +++ b/ts/components/SpinBox.svelte @@ -39,6 +39,31 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html event.preventDefault(); } } + + function change(step: number): void { + value += step; + if (pressed) { + setTimeout(() => change(step), timeout); + } + } + + const progression = [1500, 1250, 1000, 750, 500, 250]; + + async function longPress(func: Function): Promise { + pressed = true; + timeout = 128; + pressTimer = setTimeout(func, 250); + + for (const delay of progression) { + timeout = await new Promise((resolve) => + setTimeout(() => resolve(pressed ? timeout / 2 : 128), delay), + ); + } + } + + let pressed = false; + let timeout: number; + let pressTimer: any;
@@ -48,11 +73,23 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html on:click={() => { input.focus(); if (rtl && value < max) { - value += step; + change(step); } else if (value > min) { - value -= step; + change(-step); } }} + on:mousedown={() => + longPress(() => { + if (rtl && value < max) { + change(step); + } else if (value > min) { + change(-step); + } + })} + on:mouseup={() => { + clearTimeout(pressTimer); + pressed = false; + }} > {@html chevronLeft} @@ -77,11 +114,23 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html on:click={() => { input.focus(); if (rtl && value > min) { - value -= step; + change(-step); } else if (value < max) { - value += step; + change(step); } }} + on:mousedown={() => + longPress(() => { + if (rtl && value > min) { + change(-step); + } else if (value < max) { + change(step); + } + })} + on:mouseup={() => { + clearTimeout(pressTimer); + pressed = false; + }} > {@html chevronRight}