From 03234795fa91b6617152adab9ccc7afcdd3a8dd6 Mon Sep 17 00:00:00 2001 From: ArthurKun <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 29 Oct 2024 04:06:07 +0800 Subject: [PATCH 1/6] increase rate as hold longer --- .../ui/HoldRepeatClickable.kt | 32 +++++++++++++++++-- .../github/fate_grand_automata/ui/Stepper.kt | 5 +-- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt b/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt index 7916ad2e0..bb7bd34aa 100644 --- a/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt +++ b/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt @@ -16,10 +16,12 @@ import androidx.compose.ui.input.pointer.pointerInput import kotlinx.coroutines.cancelAndJoin import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import kotlin.math.pow import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.Duration.Companion.seconds fun Modifier.holdRepeatClickable( - onRepeat: () -> Unit, + onRepeat: (Int) -> Unit = { 0 }, onEnd: () -> Unit, enabled: Boolean = true ) = composed { @@ -45,22 +47,46 @@ fun Modifier.holdRepeatClickable( val currentJob = scope.launch { var first = false + var increment = 0 + var totalRepeatInterval = 0.milliseconds + var lastIncrementTime = 0.milliseconds + try { delay(longPressTimeout) var repeatInterval = 100.milliseconds while (rememberedIsEnabled) { - rememberedOnRepeat() + rememberedOnRepeat(increment) first = true delay(repeatInterval) + totalRepeatInterval += repeatInterval + + if (totalRepeatInterval in 1.seconds..3.seconds) { + if (totalRepeatInterval - lastIncrementTime >= 1.seconds) { + increment = + (totalRepeatInterval.inWholeSeconds + .toFloat() + .pow(2) * 1.1).toInt() + lastIncrementTime = totalRepeatInterval + } + } else if (totalRepeatInterval > 3.seconds) { + if (totalRepeatInterval - lastIncrementTime >= 1.seconds) { + increment = + (totalRepeatInterval.inWholeSeconds + .toFloat() + .pow(2) * 1.5).toInt() + lastIncrementTime = totalRepeatInterval + } + } + repeatInterval = (repeatInterval - repeatIntervalDelta) .coerceAtLeast(minRepeatInterval) } } finally { if (!first) { - rememberedOnRepeat() + rememberedOnRepeat(0) } } } diff --git a/app/src/main/java/io/github/fate_grand_automata/ui/Stepper.kt b/app/src/main/java/io/github/fate_grand_automata/ui/Stepper.kt index 7ace9071a..d0fab6788 100644 --- a/app/src/main/java/io/github/fate_grand_automata/ui/Stepper.kt +++ b/app/src/main/java/io/github/fate_grand_automata/ui/Stepper.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import io.github.fate_grand_automata.ui.prefs.StatusWrapper +import kotlin.math.sign @Composable private fun DeltaButton( @@ -41,8 +42,8 @@ private fun DeltaButton( text, modifier = Modifier .holdRepeatClickable( - onRepeat = { - onCurrentValueChange((currentValue + delta).coerceIn(valueRange)) + onRepeat = { increment -> + onCurrentValueChange((currentValue + delta + delta.sign * increment).coerceIn(valueRange)) }, onEnd = onCommit, enabled = isEnabled From 86faac3aa471869947054ff9ff7b3b61dfcafe14 Mon Sep 17 00:00:00 2001 From: ArthurKun <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 29 Oct 2024 16:33:07 +0800 Subject: [PATCH 2/6] Fix update rate --- .../io/github/fate_grand_automata/ui/HoldRepeatClickable.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt b/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt index bb7bd34aa..aa0f60d4e 100644 --- a/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt +++ b/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt @@ -70,6 +70,8 @@ fun Modifier.holdRepeatClickable( .toFloat() .pow(2) * 1.1).toInt() lastIncrementTime = totalRepeatInterval + } else { + increment = 0 } } else if (totalRepeatInterval > 3.seconds) { if (totalRepeatInterval - lastIncrementTime >= 1.seconds) { @@ -78,6 +80,8 @@ fun Modifier.holdRepeatClickable( .toFloat() .pow(2) * 1.5).toInt() lastIncrementTime = totalRepeatInterval + } else { + increment = 0 } } @@ -116,4 +120,4 @@ fun Modifier.holdRepeatClickable( interactionSource = interactionSource, indication = ripple() ) -} \ No newline at end of file +} From 05d18c2732124a3f3ebda43d5fade7d035e90603 Mon Sep 17 00:00:00 2001 From: ArthurKun <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 29 Oct 2024 16:39:30 +0800 Subject: [PATCH 3/6] updated the adjustment rate --- .../io/github/fate_grand_automata/ui/HoldRepeatClickable.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt b/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt index aa0f60d4e..2d9f82dc5 100644 --- a/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt +++ b/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt @@ -50,6 +50,7 @@ fun Modifier.holdRepeatClickable( var increment = 0 var totalRepeatInterval = 0.milliseconds var lastIncrementTime = 0.milliseconds + val adjustmentFactor = 1.5 try { delay(longPressTimeout) @@ -68,7 +69,7 @@ fun Modifier.holdRepeatClickable( increment = (totalRepeatInterval.inWholeSeconds .toFloat() - .pow(2) * 1.1).toInt() + .pow(2) * adjustmentFactor).toInt() lastIncrementTime = totalRepeatInterval } else { increment = 0 @@ -78,7 +79,7 @@ fun Modifier.holdRepeatClickable( increment = (totalRepeatInterval.inWholeSeconds .toFloat() - .pow(2) * 1.5).toInt() + .pow(2) * 3 * adjustmentFactor).toInt() lastIncrementTime = totalRepeatInterval } else { increment = 0 From 74c36e3855f53eb5c51bf8e3231344f50a90e483 Mon Sep 17 00:00:00 2001 From: ArthurKun <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 29 Oct 2024 16:42:21 +0800 Subject: [PATCH 4/6] simplify code --- .../fate_grand_automata/ui/HoldRepeatClickable.kt | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt b/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt index 2d9f82dc5..2a7381efa 100644 --- a/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt +++ b/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt @@ -64,22 +64,13 @@ fun Modifier.holdRepeatClickable( totalRepeatInterval += repeatInterval - if (totalRepeatInterval in 1.seconds..3.seconds) { + if (totalRepeatInterval in 1.seconds..3.seconds || totalRepeatInterval > 3.seconds) { if (totalRepeatInterval - lastIncrementTime >= 1.seconds) { + val factor = if (totalRepeatInterval > 3.seconds) 3 else 1 increment = (totalRepeatInterval.inWholeSeconds .toFloat() - .pow(2) * adjustmentFactor).toInt() - lastIncrementTime = totalRepeatInterval - } else { - increment = 0 - } - } else if (totalRepeatInterval > 3.seconds) { - if (totalRepeatInterval - lastIncrementTime >= 1.seconds) { - increment = - (totalRepeatInterval.inWholeSeconds - .toFloat() - .pow(2) * 3 * adjustmentFactor).toInt() + .pow(2) * factor * adjustmentFactor).toInt() lastIncrementTime = totalRepeatInterval } else { increment = 0 From 7aba576a4855b41633adfb0c838b5817f12e0ba7 Mon Sep 17 00:00:00 2001 From: ArthurKun <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 29 Oct 2024 16:47:47 +0800 Subject: [PATCH 5/6] simplify code --- .../ui/HoldRepeatClickable.kt | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt b/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt index 2a7381efa..c0e11846a 100644 --- a/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt +++ b/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt @@ -64,17 +64,14 @@ fun Modifier.holdRepeatClickable( totalRepeatInterval += repeatInterval - if (totalRepeatInterval in 1.seconds..3.seconds || totalRepeatInterval > 3.seconds) { - if (totalRepeatInterval - lastIncrementTime >= 1.seconds) { - val factor = if (totalRepeatInterval > 3.seconds) 3 else 1 - increment = - (totalRepeatInterval.inWholeSeconds - .toFloat() - .pow(2) * factor * adjustmentFactor).toInt() - lastIncrementTime = totalRepeatInterval - } else { - increment = 0 - } + if (totalRepeatInterval >= 1.seconds && totalRepeatInterval - lastIncrementTime >= 1.seconds) { + val factor = if (totalRepeatInterval > 3.seconds) 3 else 1 + increment = (totalRepeatInterval.inWholeSeconds + .toFloat() + .pow(2) * factor * adjustmentFactor).toInt() + lastIncrementTime = totalRepeatInterval + } else { + increment = 0 } repeatInterval = (repeatInterval - repeatIntervalDelta) From 35e683b08fdbe4c648ef2a173c2a06e5b4255adf Mon Sep 17 00:00:00 2001 From: ArthurKun <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 29 Oct 2024 16:52:39 +0800 Subject: [PATCH 6/6] remove unused --- .../io/github/fate_grand_automata/ui/HoldRepeatClickable.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt b/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt index c0e11846a..566a9de08 100644 --- a/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt +++ b/app/src/main/java/io/github/fate_grand_automata/ui/HoldRepeatClickable.kt @@ -21,7 +21,7 @@ import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.seconds fun Modifier.holdRepeatClickable( - onRepeat: (Int) -> Unit = { 0 }, + onRepeat: (Int) -> Unit, onEnd: () -> Unit, enabled: Boolean = true ) = composed {