From 1d6b075d5ce36db4e4f0d48282444046af9d7160 Mon Sep 17 00:00:00 2001 From: lynxnb Date: Fri, 31 Mar 2023 00:47:56 +0200 Subject: [PATCH] Draw a selection rectangle around the active button while editing --- .../emu/skyline/input/onscreen/OnScreenButton.kt | 2 +- .../input/onscreen/OnScreenControllerView.kt | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) 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 10986a62..14520af9 100644 --- a/app/src/main/java/emu/skyline/input/onscreen/OnScreenButton.kt +++ b/app/src/main/java/emu/skyline/input/onscreen/OnScreenButton.kt @@ -83,7 +83,7 @@ abstract class OnScreenButton( private val left get() = currentX - itemWidth / 2f private val top get() = currentY - itemHeight / 2f - protected val currentBounds get() = Rect(left.roundToInt(), top.roundToInt(), (left + itemWidth).roundToInt(), (top + itemHeight).roundToInt()) + val currentBounds get() = Rect(left.roundToInt(), top.roundToInt(), (left + itemWidth).roundToInt(), (top + itemHeight).roundToInt()) /** * Keeps track of finger when there are multiple touches 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 9d7901a9..3c8c55db 100644 --- a/app/src/main/java/emu/skyline/input/onscreen/OnScreenControllerView.kt +++ b/app/src/main/java/emu/skyline/input/onscreen/OnScreenControllerView.kt @@ -10,14 +10,18 @@ import android.animation.AnimatorListenerAdapter import android.animation.ValueAnimator import android.content.Context import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint import android.graphics.PointF import android.os.VibrationEffect import android.os.Vibrator import android.util.AttributeSet +import android.util.TypedValue import android.view.MotionEvent import android.view.View import android.view.View.OnTouchListener import androidx.annotation.IntRange +import emu.skyline.R import emu.skyline.input.ButtonId import emu.skyline.input.ButtonState import emu.skyline.input.ControllerType @@ -73,6 +77,12 @@ class OnScreenControllerView @JvmOverloads constructor(context : Context, attrs editInfo.onEditButtonChangedListener = listener } + private val selectionPaint = Paint().apply { + color = context.obtainStyledAttributes(intArrayOf(R.attr.colorPrimary)).getColor(0, Color.RED) + style = Paint.Style.STROKE + strokeWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2f, context.resources.displayMetrics) + } + // Populated externally by the activity, as retrieving the vibrator service inside the view crashes the layout editor lateinit var vibrator : Vibrator private val effectClick = VibrationEffect.createPredefined(VibrationEffect.EFFECT_TICK) @@ -95,6 +105,10 @@ class OnScreenControllerView @JvmOverloads constructor(context : Context, attrs button.render(canvas) } } + + // Draw the selection box around the edit button + if (editInfo.isEditing && editInfo.editButton is OnScreenButton) + canvas.drawRect((editInfo.editButton as OnScreenButton).currentBounds, selectionPaint) } private val playingTouchHandler = OnTouchListener { _, event -> @@ -248,6 +262,7 @@ class OnScreenControllerView @JvmOverloads constructor(context : Context, attrs activeEditButtonChanged = true editInfo.editButton = touchedButton performClick() + invalidate() return@run } @@ -292,6 +307,7 @@ class OnScreenControllerView @JvmOverloads constructor(context : Context, attrs fun selectAllButtons() { editInfo.editButton = allButtonsProxy + invalidate() } fun setButtonEnabled(enabled : Boolean) {