add button handling for UI Ribbon

This commit is contained in:
amwatson 2024-02-22 17:13:45 -06:00
parent 686550c6c4
commit 09cdf9cfdb
2 changed files with 44 additions and 4 deletions

View file

@ -1,13 +1,43 @@
package org.citra.citra_emu.vr.ui
import android.view.MotionEvent
import android.widget.Button
import android.widget.ImageButton
import org.citra.citra_emu.NativeLibrary
import org.citra.citra_emu.R
import org.citra.citra_emu.vr.VrActivity
class VrRibbonLayer(activity: VrActivity) : VrUILayer(activity, R.layout.vr_ribbon) {
override fun onSurfaceCreated() {
super.onSurfaceCreated()
window?.findViewById<Button>(R.id.buttonSelect)?.setOnTouchListener { _, motionEvent ->
NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice,
NativeLibrary.ButtonType.BUTTON_SELECT,
if (motionEvent.action == MotionEvent.ACTION_DOWN)
NativeLibrary.ButtonState.PRESSED
else NativeLibrary.ButtonState.RELEASED)
false
}
window?.findViewById<ImageButton>(R.id.buttonHome)?.setOnTouchListener { view, motionEvent ->
if (motionEvent.action == MotionEvent.ACTION_DOWN) {
(view as ImageButton).setImageResource(R.drawable.button_home_pressed)
} else {
(view as ImageButton).setImageResource(R.drawable.button_home)
}
NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice,
NativeLibrary.ButtonType.BUTTON_HOME,
if (motionEvent.action == MotionEvent.ACTION_DOWN)
NativeLibrary.ButtonState.PRESSED
else NativeLibrary.ButtonState.RELEASED)
false
}
window?.findViewById<Button>(R.id.buttonStart)?.setOnTouchListener { _, motionEvent ->
NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice,
NativeLibrary.ButtonType.BUTTON_START,
if (motionEvent.action == MotionEvent.ACTION_DOWN)
NativeLibrary.ButtonState.PRESSED
else NativeLibrary.ButtonState.RELEASED)
false
}
}
}

View file

@ -697,9 +697,10 @@ private:
mKeyboardLayer->SendClickToUI(cursorPos2d, triggerState.currentState);
}
} else {
// No dialogs/popups that should impede normal cursor interaction with
// applicable panels
shouldRenderCursor = mGameSurfaceLayer->GetRayIntersectionWithPanel(
start, end, cursorPos2d, cursorPose3d);
ALOG_INPUT_VERBOSE("Cursor 2D coords: {} {}", cursorPos2d.x, cursorPos2d.y);
if (triggerState.currentState == 0 && triggerState.changedSinceLastSync) {
jni->CallVoidMethod(mActivityObject, mSendClickToWindowMethodID,
cursorPos2d.x, cursorPos2d.y, 0);
@ -713,6 +714,14 @@ private:
jni->CallVoidMethod(mActivityObject, mSendClickToWindowMethodID,
cursorPos2d.x, cursorPos2d.y, 2);
}
if (!shouldRenderCursor) {
shouldRenderCursor = mRibbonLayer->GetRayIntersectionWithPanel(
start, end, cursorPos2d, cursorPose3d);
if (triggerState.changedSinceLastSync) {
mRibbonLayer->SendClickToUI(cursorPos2d, triggerState.currentState);
}
}
if (!shouldRenderCursor) {
// Handling this here means L2/R2 are liable to
// be slightly out of sync with the other
@ -774,6 +783,7 @@ private:
}
if (shouldRenderCursor) {
ALOG_INPUT_VERBOSE("Cursor 2D coords: {} {}", cursorPos2d.x, cursorPos2d.y);
XrCompositionLayerQuad quadLayer = {};
mCursorLayer->Frame(gOpenXr->mLocalSpace, quadLayer, cursorPose3d, scaleFactor,
cursorType);