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 0f0eec33..eba454a1 100644 --- a/app/src/main/java/emu/skyline/input/onscreen/OnScreenButton.kt +++ b/app/src/main/java/emu/skyline/input/onscreen/OnScreenButton.kt @@ -7,6 +7,7 @@ package emu.skyline.input.onscreen import android.graphics.Canvas import android.graphics.Paint +import android.graphics.PointF import android.graphics.Rect import android.graphics.Typeface import android.graphics.drawable.Drawable @@ -48,8 +49,8 @@ abstract class OnScreenButton( var relativeX = config.relativeX var relativeY = config.relativeY - private val relativeWidth get() = defaultRelativeWidth * config.globalScale - private val relativeHeight get() = defaultRelativeHeight * config.globalScale + private val relativeWidth get() = defaultRelativeWidth * (config.globalScale + config.scale) + private val relativeHeight get() = defaultRelativeHeight * (config.globalScale + config.scale) /** * The width of the view this button is in, populated by the view during draw @@ -98,6 +99,16 @@ abstract class OnScreenButton( */ protected var editInfo = onScreenControllerView.editInfo + /** + * The touch point when the edit session started + */ + protected var editInitialTouchPoint = PointF() + + /** + * The scale of the button when the edit session started + */ + private var editInitialScale = 0f + protected open fun renderCenteredText(canvas : Canvas, text : String, size : Float, x : Float, y : Float, alpha : Int) { buttonSymbolPaint.apply { textSize = size @@ -152,11 +163,14 @@ abstract class OnScreenButton( * @param y The y coordinate of the initial touch */ open fun startEdit(x : Float, y : Float) { + editInitialTouchPoint.set(x, y) + editInitialScale = config.scale } open fun edit(x : Float, y : Float) { when (editInfo.editMode) { EditMode.Move -> move(x, y) + EditMode.Resize -> resize(x, y) else -> return } } @@ -169,6 +183,15 @@ abstract class OnScreenButton( relativeY = (y - heightDiff) / adjustedHeight } + /** + * Resizes this button based on the distance of the given Y coordinate from the initial Y coordinate + */ + open fun resize(x : Float, y : Float) { + // Invert the distance because the Y coordinate increases as you move down the screen + val verticalDistance = editInitialTouchPoint.y - y + config.scale = editInitialScale + verticalDistance / 200f + } + /** * Ends the current edit session */ @@ -188,5 +211,6 @@ abstract class OnScreenButton( open fun resetConfig() { resetRelativeValues() config.enabled = true + config.scale = 0f } } diff --git a/app/src/main/java/emu/skyline/input/onscreen/OnScreenConfiguration.kt b/app/src/main/java/emu/skyline/input/onscreen/OnScreenConfiguration.kt index d8919a72..5fe19ef8 100644 --- a/app/src/main/java/emu/skyline/input/onscreen/OnScreenConfiguration.kt +++ b/app/src/main/java/emu/skyline/input/onscreen/OnScreenConfiguration.kt @@ -13,11 +13,23 @@ import emu.skyline.utils.sharedPreferences class OnScreenConfiguration(private val context : Context, private val buttonId : ButtonId, defaultRelativeX : Float, defaultRelativeY : Float) { private inline fun config(default : T, prefix : String = "${buttonId.name}_") = sharedPreferences(context, default, prefix, "controller_config") + var enabled by config(true) + var alpha by config(155, "") var textColor by config(SwitchColors.BLACK.color) var backgroundColor by config(SwitchColors.WHITE.color) - var enabled by config(true) + + /** + * The global scale applied to all buttons + */ var globalScale by config(1.15f, "") + + /** + * The scale of each button, this is added to the global scale + * Allows buttons to have their own size, while still be controlled by the global scale + */ + var scale by config(0.0f) + var relativeX by config(defaultRelativeX) var relativeY by config(defaultRelativeY) } diff --git a/app/src/main/java/emu/skyline/input/onscreen/OnScreenEditActivity.kt b/app/src/main/java/emu/skyline/input/onscreen/OnScreenEditActivity.kt index 8c500504..4234eb90 100644 --- a/app/src/main/java/emu/skyline/input/onscreen/OnScreenEditActivity.kt +++ b/app/src/main/java/emu/skyline/input/onscreen/OnScreenEditActivity.kt @@ -58,6 +58,11 @@ class OnScreenEditActivity : AppCompatActivity() { toggleFabVisibility(false) } + private val resizeAction = { + binding.onScreenControllerView.setEditMode(EditMode.Resize) + toggleFabVisibility(false) + } + private val toggleAction : () -> Unit = { val buttonProps = binding.onScreenControllerView.getButtonProps() val checkedButtonsArray = buttonProps.map { it.enabled }.toBooleanArray() @@ -107,7 +112,8 @@ class OnScreenEditActivity : AppCompatActivity() { Pair(R.drawable.ic_palette, paletteAction), Pair(R.drawable.ic_restore) { binding.onScreenControllerView.resetControls() }, Pair(R.drawable.ic_toggle, toggleAction), - Pair(R.drawable.ic_edit, moveAction), + Pair(R.drawable.ic_move, moveAction), + Pair(R.drawable.ic_resize, resizeAction), Pair(R.drawable.ic_zoom_out) { binding.onScreenControllerView.decreaseScale() }, Pair(R.drawable.ic_zoom_in) { binding.onScreenControllerView.increaseScale() }, Pair(R.drawable.ic_opacity_minus) { binding.onScreenControllerView.decreaseOpacity() }, 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 27727427..09a5be2a 100644 --- a/app/src/main/java/emu/skyline/input/onscreen/OnScreenEditInfo.kt +++ b/app/src/main/java/emu/skyline/input/onscreen/OnScreenEditInfo.kt @@ -8,6 +8,7 @@ package emu.skyline.input.onscreen enum class EditMode { None, Move, + Resize } /** diff --git a/app/src/main/res/drawable/ic_move.xml b/app/src/main/res/drawable/ic_move.xml new file mode 100644 index 00000000..56d4cf42 --- /dev/null +++ b/app/src/main/res/drawable/ic_move.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_resize.xml b/app/src/main/res/drawable/ic_resize.xml new file mode 100644 index 00000000..c83c43d4 --- /dev/null +++ b/app/src/main/res/drawable/ic_resize.xml @@ -0,0 +1,10 @@ + + +