Implement OSC per-button scale functionality

This commit is contained in:
lynxnb 2023-03-17 19:36:59 +01:00 committed by Niccolò Betto
parent 2794af6d06
commit 88084016a1
6 changed files with 67 additions and 4 deletions

View File

@ -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
}
}

View File

@ -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 <reified T> 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)
}

View File

@ -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() },

View File

@ -8,6 +8,7 @@ package emu.skyline.input.onscreen
enum class EditMode {
None,
Move,
Resize
}
/**

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#000000"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M10,9h4L14,6h3l-5,-5 -5,5h3v3zM9,10L6,10L6,7l-5,5 5,5v-3h3v-4zM23,12l-5,-5v3h-3v4h3v3l5,-5zM14,15h-4v3L7,18l5,5 5,-5h-3v-3z" />
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#000000"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M21,11l0,-8l-8,0l3.29,3.29l-10,10l-3.29,-3.29l0,8l8,0l-3.29,-3.29l10,-10z" />
</vector>