comboctl-main: Fix computeShortRTButtonPress() cyclic quantity bug
Signed-off-by: Carlos Rafael Giani <crg7475@mailbox.org>
This commit is contained in:
parent
3f265c855c
commit
20d4a0c692
2 changed files with 23 additions and 3 deletions
|
@ -1045,10 +1045,17 @@ internal fun computeShortRTButtonPress(
|
||||||
require(stepSize > 0)
|
require(stepSize > 0)
|
||||||
val distance = (targetQuantity - currentQuantity).absoluteValue
|
val distance = (targetQuantity - currentQuantity).absoluteValue
|
||||||
if (cyclicQuantityRange != null) {
|
if (cyclicQuantityRange != null) {
|
||||||
|
// With a cyclic quantity, if the absolute distance between
|
||||||
|
// quantities exceeds half of that range, we have the option
|
||||||
|
// to change the quantity in the opposite direction which
|
||||||
|
// requires fewer button presses. For example, if the range
|
||||||
|
// is 60, and the absolute distance is 40, we'd normally have
|
||||||
|
// to press a button 40 times to get to the target quantity.
|
||||||
|
// But since cyclic quantities wrap around, we can instead
|
||||||
|
// press the opposite button 60-40 = 20 times to also get
|
||||||
|
// to the target quantity.
|
||||||
if (distance > (cyclicQuantityRange / 2)) {
|
if (distance > (cyclicQuantityRange / 2)) {
|
||||||
val firstPart = (cyclicQuantityRange - targetQuantity)
|
numNeededShortRTButtonPresses = computeNumSteps(stepSize, cyclicQuantityRange - distance)
|
||||||
val secondPart = currentQuantity - 0
|
|
||||||
numNeededShortRTButtonPresses = computeNumSteps(stepSize, firstPart + secondPart)
|
|
||||||
shortRTButtonToPress = if (targetQuantity < currentQuantity) incrementButton else decrementButton
|
shortRTButtonToPress = if (targetQuantity < currentQuantity) incrementButton else decrementButton
|
||||||
} else {
|
} else {
|
||||||
numNeededShortRTButtonPresses = computeNumSteps(stepSize, distance)
|
numNeededShortRTButtonPresses = computeNumSteps(stepSize, distance)
|
||||||
|
|
|
@ -274,6 +274,19 @@ class RTNavigationTest {
|
||||||
)
|
)
|
||||||
assertEquals(Pair(((60 - 50) + (10 - 0)) / 1, RTNavigationButton.DOWN), result)
|
assertEquals(Pair(((60 - 50) + (10 - 0)) / 1, RTNavigationButton.DOWN), result)
|
||||||
|
|
||||||
|
// Another cyclic quantity range test with a wrap around,
|
||||||
|
// this time from the other direction (wrapping around
|
||||||
|
// from quantity 58 to target quantity 1).
|
||||||
|
result = computeShortRTButtonPress(
|
||||||
|
currentQuantity = 58,
|
||||||
|
targetQuantity = 1,
|
||||||
|
cyclicQuantityRange = 60,
|
||||||
|
incrementSteps = arrayOf(Pair(0, 1)),
|
||||||
|
incrementButton = RTNavigationButton.UP,
|
||||||
|
decrementButton = RTNavigationButton.DOWN
|
||||||
|
)
|
||||||
|
assertEquals(Pair(3, RTNavigationButton.UP), result)
|
||||||
|
|
||||||
// Additional test to check that cyclic ranges are handled correctly
|
// Additional test to check that cyclic ranges are handled correctly
|
||||||
// even if currentQuantity is slightly higher than targetQuantity. This
|
// even if currentQuantity is slightly higher than targetQuantity. This
|
||||||
// verifies that the computation does not produce negative distances.
|
// verifies that the computation does not produce negative distances.
|
||||||
|
|
Loading…
Reference in a new issue