From 37a2a2fbad0d2db0988cd4ca6f6f6fe676221806 Mon Sep 17 00:00:00 2001 From: lynxnb Date: Fri, 31 Mar 2023 01:45:48 +0200 Subject: [PATCH] Fix inconsistent OSC button movements when using the arrow buttons A combination of factors caused inconsistent button movements when using the arrow buttons to move it, namely floating point approximation and the round down performed when snapping a button to the grid. Sometimes the layman solution is the best one: adding/subtracting one to the move amount depending on the direction ensures that the button always ends up on a grid line. --- .../skyline/input/onscreen/OnScreenButton.kt | 19 +++++++++++++++---- .../input/onscreen/OnScreenControllerView.kt | 1 - .../input/onscreen/OnScreenEditInfo.kt | 2 -- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/emu/skyline/input/onscreen/OnScreenButton.kt b/app/src/main/java/emu/skyline/input/onscreen/OnScreenButton.kt index 14520af9..e8f01c49 100644 --- a/app/src/main/java/emu/skyline/input/onscreen/OnScreenButton.kt +++ b/app/src/main/java/emu/skyline/input/onscreen/OnScreenButton.kt @@ -209,23 +209,34 @@ abstract class OnScreenButton( saveConfigValues() } + /** + * Returns the amount to move the button when the user presses an arrow key + * @param gridOffset The offset to apply to the grid size so that the button always ends up on a grid line + */ + private fun getMoveAmount(gridOffset : Int) : Int { + return if (editInfo.snapToGrid) + editInfo.gridSize + gridOffset + else + OnScreenEditInfo.ArrowKeyMoveAmount + } + override fun moveUp() { - move(currentX, currentY - editInfo.arrowKeyMoveAmount) + move(currentX, currentY - getMoveAmount(-1)) saveConfigValues() } override fun moveDown() { - move(currentX, currentY + editInfo.arrowKeyMoveAmount) + move(currentX, currentY + getMoveAmount(+1)) saveConfigValues() } override fun moveLeft() { - move(currentX - editInfo.arrowKeyMoveAmount, currentY) + move(currentX - getMoveAmount(-1), currentY) saveConfigValues() } override fun moveRight() { - move(currentX + editInfo.arrowKeyMoveAmount, currentY) + move(currentX + getMoveAmount(+1), currentY) saveConfigValues() } diff --git a/app/src/main/java/emu/skyline/input/onscreen/OnScreenControllerView.kt b/app/src/main/java/emu/skyline/input/onscreen/OnScreenControllerView.kt index 3c8c55db..fcc0a0ac 100644 --- a/app/src/main/java/emu/skyline/input/onscreen/OnScreenControllerView.kt +++ b/app/src/main/java/emu/skyline/input/onscreen/OnScreenControllerView.kt @@ -373,7 +373,6 @@ class OnScreenControllerView @JvmOverloads constructor(context : Context, attrs fun setSnapToGrid(snap : Boolean) { editInfo.snapToGrid = snap - editInfo.arrowKeyMoveAmount = if (snap) editInfo.gridSize else OnScreenEditInfo.ArrowKeyMoveAmount } fun resetButton() { diff --git a/app/src/main/java/emu/skyline/input/onscreen/OnScreenEditInfo.kt b/app/src/main/java/emu/skyline/input/onscreen/OnScreenEditInfo.kt index d73b8e30..df91bbb7 100644 --- a/app/src/main/java/emu/skyline/input/onscreen/OnScreenEditInfo.kt +++ b/app/src/main/java/emu/skyline/input/onscreen/OnScreenEditInfo.kt @@ -40,8 +40,6 @@ class OnScreenEditInfo { var gridSize : Int = GridSize - var arrowKeyMoveAmount : Int = ArrowKeyMoveAmount - companion object { /** * The size of the grid, calculated from the value of 8dp