|
|
@@ -45,9 +45,15 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
|
|
|
private val overlayButtons: MutableSet<InputOverlayDrawableButton> = HashSet()
|
|
|
private val overlayDpads: MutableSet<InputOverlayDrawableDpad> = HashSet()
|
|
|
private val overlayJoysticks: MutableSet<InputOverlayDrawableJoystick> = HashSet()
|
|
|
+
|
|
|
private var inEditMode = false
|
|
|
+ private var buttonBeingConfigured: InputOverlayDrawableButton? = null
|
|
|
+ private var dpadBeingConfigured: InputOverlayDrawableDpad? = null
|
|
|
+ private var joystickBeingConfigured: InputOverlayDrawableJoystick? = null
|
|
|
+
|
|
|
private val preferences: SharedPreferences =
|
|
|
PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
|
|
|
+
|
|
|
private val gyro = FloatArray(3)
|
|
|
private val accel = FloatArray(3)
|
|
|
private var motionTimestamp: Long = 0
|
|
|
@@ -114,7 +120,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
|
|
|
}
|
|
|
NativeLibrary.onGamePadButtonEvent(
|
|
|
NativeLibrary.Player1Device,
|
|
|
- button.id,
|
|
|
+ button.buttonId,
|
|
|
button.status
|
|
|
)
|
|
|
shouldUpdateView = true
|
|
|
@@ -224,8 +230,109 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
|
|
|
return false
|
|
|
}
|
|
|
|
|
|
- private fun onTouchWhileEditing(event: MotionEvent?): Boolean {
|
|
|
- // TODO: Reimplement this
|
|
|
+ private fun onTouchWhileEditing(event: MotionEvent): Boolean {
|
|
|
+ val pointerIndex = event.actionIndex
|
|
|
+ val fingerPositionX = event.getX(pointerIndex).toInt()
|
|
|
+ val fingerPositionY = event.getY(pointerIndex).toInt()
|
|
|
+
|
|
|
+ // TODO: Provide support for portrait layout
|
|
|
+ //val orientation =
|
|
|
+ // if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) "-Portrait" else ""
|
|
|
+
|
|
|
+ for (button in overlayButtons) {
|
|
|
+ // Determine the button state to apply based on the MotionEvent action flag.
|
|
|
+ when (event.action and MotionEvent.ACTION_MASK) {
|
|
|
+ MotionEvent.ACTION_DOWN,
|
|
|
+ MotionEvent.ACTION_POINTER_DOWN ->
|
|
|
+ // If no button is being moved now, remember the currently touched button to move.
|
|
|
+ if (buttonBeingConfigured == null &&
|
|
|
+ button.bounds.contains(
|
|
|
+ fingerPositionX,
|
|
|
+ fingerPositionY
|
|
|
+ )
|
|
|
+ ) {
|
|
|
+ buttonBeingConfigured = button
|
|
|
+ buttonBeingConfigured!!.onConfigureTouch(event)
|
|
|
+ }
|
|
|
+ MotionEvent.ACTION_MOVE -> if (buttonBeingConfigured != null) {
|
|
|
+ buttonBeingConfigured!!.onConfigureTouch(event)
|
|
|
+ invalidate()
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ MotionEvent.ACTION_UP,
|
|
|
+ MotionEvent.ACTION_POINTER_UP -> if (buttonBeingConfigured === button) {
|
|
|
+ // Persist button position by saving new place.
|
|
|
+ saveControlPosition(
|
|
|
+ buttonBeingConfigured!!.buttonId,
|
|
|
+ buttonBeingConfigured!!.bounds.centerX(),
|
|
|
+ buttonBeingConfigured!!.bounds.centerY(),
|
|
|
+ ""
|
|
|
+ )
|
|
|
+ buttonBeingConfigured = null
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (dpad in overlayDpads) {
|
|
|
+ // Determine the button state to apply based on the MotionEvent action flag.
|
|
|
+ when (event.action and MotionEvent.ACTION_MASK) {
|
|
|
+ MotionEvent.ACTION_DOWN,
|
|
|
+ MotionEvent.ACTION_POINTER_DOWN ->
|
|
|
+ // If no button is being moved now, remember the currently touched button to move.
|
|
|
+ if (buttonBeingConfigured == null &&
|
|
|
+ dpad.bounds.contains(fingerPositionX, fingerPositionY)
|
|
|
+ ) {
|
|
|
+ dpadBeingConfigured = dpad
|
|
|
+ dpadBeingConfigured!!.onConfigureTouch(event)
|
|
|
+ }
|
|
|
+ MotionEvent.ACTION_MOVE -> if (dpadBeingConfigured != null) {
|
|
|
+ dpadBeingConfigured!!.onConfigureTouch(event)
|
|
|
+ invalidate()
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ MotionEvent.ACTION_UP,
|
|
|
+ MotionEvent.ACTION_POINTER_UP -> if (dpadBeingConfigured === dpad) {
|
|
|
+ // Persist button position by saving new place.
|
|
|
+ saveControlPosition(
|
|
|
+ dpadBeingConfigured!!.upId,
|
|
|
+ dpadBeingConfigured!!.bounds.centerX(),
|
|
|
+ dpadBeingConfigured!!.bounds.centerY(),
|
|
|
+ ""
|
|
|
+ )
|
|
|
+ dpadBeingConfigured = null
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (joystick in overlayJoysticks) {
|
|
|
+ when (event.action) {
|
|
|
+ MotionEvent.ACTION_DOWN,
|
|
|
+ MotionEvent.ACTION_POINTER_DOWN -> if (joystickBeingConfigured == null &&
|
|
|
+ joystick.bounds.contains(
|
|
|
+ fingerPositionX,
|
|
|
+ fingerPositionY
|
|
|
+ )
|
|
|
+ ) {
|
|
|
+ joystickBeingConfigured = joystick
|
|
|
+ joystickBeingConfigured!!.onConfigureTouch(event)
|
|
|
+ }
|
|
|
+ MotionEvent.ACTION_MOVE -> if (joystickBeingConfigured != null) {
|
|
|
+ joystickBeingConfigured!!.onConfigureTouch(event)
|
|
|
+ invalidate()
|
|
|
+ }
|
|
|
+ MotionEvent.ACTION_UP,
|
|
|
+ MotionEvent.ACTION_POINTER_UP -> if (joystickBeingConfigured != null) {
|
|
|
+ saveControlPosition(
|
|
|
+ joystickBeingConfigured!!.buttonId,
|
|
|
+ joystickBeingConfigured!!.bounds.centerX(),
|
|
|
+ joystickBeingConfigured!!.bounds.centerY(),
|
|
|
+ ""
|
|
|
+ )
|
|
|
+ joystickBeingConfigured = null
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return true
|
|
|
}
|
|
|
|