remove prev/next UI buttons and make radio buttons functional

This commit is contained in:
amwatson 2024-04-06 18:42:04 -05:00
parent 003590f5ff
commit 47746e74e7
5 changed files with 96 additions and 151 deletions

View file

@ -14,124 +14,110 @@ import org.citra.citra_emu.utils.Log
class VrRibbonLayer(activity: VrActivity) : VrUILayer(activity, R.layout.vr_ribbon) { class VrRibbonLayer(activity: VrActivity) : VrUILayer(activity, R.layout.vr_ribbon) {
enum class MenuType(val resId: Int) { enum class MenuType(val resId: Int, buttonId: Int) {
MAIN(R.id.main_panel), MAIN(R.id.main_panel, R.id.button_menu_main),
POSITION(R.id.position_panel) POSITION(R.id.position_panel, R.id.button_menu_positional)
} }
private var menuTypeCurrent: MenuType = MenuType.MAIN private var menuTypeCurrent: MenuType = MenuType.MAIN
override fun onSurfaceCreated() { override fun onSurfaceCreated() {
super.onSurfaceCreated() super.onSurfaceCreated()
initializeLeftMenu() initializeLeftMenu()
initializeMainPanel() initializeMainPanel()
initializePositionalPanel() initializePositionalPanel()
} }
fun switchMenus(menuTypeNew: MenuType) { fun switchMenus(menuTypeNew: MenuType) {
if (menuTypeNew == menuTypeCurrent) if (menuTypeNew == menuTypeCurrent)
return return
window?.findViewById<View>(menuTypeCurrent.resId)?.visibility = View.GONE window?.findViewById<View>(menuTypeCurrent.resId)?.visibility = View.GONE
menuTypeCurrent = menuTypeNew menuTypeCurrent = menuTypeNew
window?.findViewById<View>(menuTypeCurrent.resId)?.visibility = View.VISIBLE window?.findViewById<View>(menuTypeCurrent.resId)?.visibility = View.VISIBLE
if (menuTypeCurrent == MenuType.MAIN) if (menuTypeCurrent == MenuType.MAIN)
VrMessageQueue.post(VrMessageQueue.MessageType.CHANGE_LOWER_MENU, 0) VrMessageQueue.post(VrMessageQueue.MessageType.CHANGE_LOWER_MENU, 0)
else if (menuTypeCurrent == MenuType.POSITION) else if (menuTypeCurrent == MenuType.POSITION)
VrMessageQueue.post(VrMessageQueue.MessageType.CHANGE_LOWER_MENU, 1) VrMessageQueue.post(VrMessageQueue.MessageType.CHANGE_LOWER_MENU, 1)
} }
private fun initializeLeftMenu() { private fun initializeLeftMenu() {
val radioGroup = window?.findViewById<RadioGroup>(R.id.vertical_tab) val radioGroup = window?.findViewById<RadioGroup>(R.id.vertical_tab)
radioGroup?.setOnCheckedChangeListener { group, checkedId -> radioGroup?.setOnCheckedChangeListener { group, checkedId ->
// Loop through all radio buttons in the group // Loop through all radio buttons in the group
for (i in 0 until group.childCount) { for (i in 0 until group.childCount) {
val btn = group.getChildAt(i) as RadioButton val btn = group.getChildAt(i) as RadioButton
if (btn.id == checkedId) { if (btn.id == checkedId) {
// This button is checked, change the background accordingly // This button is checked, change the background accordingly
btn.background = activity?.getDrawable( btn.background = activity?.getDrawable(
R.drawable.vr_ribbon_button_pressed) R.drawable.vr_ribbon_button_pressed)
when (btn.id) {
R.id.button_menu_main -> switchMenus(MenuType.MAIN)
R.id.button_menu_positional -> switchMenus(MenuType.POSITION)
}
} else { } else {
// This button is not checked, revert to the default background // This button is not checked, revert to the default background
btn.background = activity?.getDrawable(R.drawable.vr_ribbon_button_default) btn.background = activity?.getDrawable(R.drawable.vr_ribbon_button_default)
} }
}
} }
}
// Set the first button as checked
radioGroup?.check(R.id.button_menu_main)
}
private fun initializePositionalPanel() {
val horizontalLockToggle = window?.findViewById<ToggleButton>(R.id.horizontalAxisToggle)
horizontalLockToggle?.setOnCheckedChangeListener { _, isChecked ->
VrMessageQueue.post(VrMessageQueue.MessageType.CHANGE_LOCK_HORIZONTAL_AXIS, if (isChecked) 1 else 0)
}
val btnReset = window?.findViewById<Button>(R.id.btnReset)
btnReset?.setOnClickListener { _ ->
VrMessageQueue.post(VrMessageQueue.MessageType.RESET_PANEL_POSITIONS, 0)
false
}
horizontalLockToggle?.isChecked = true;
VrMessageQueue.post(VrMessageQueue.MessageType.CHANGE_LOCK_HORIZONTAL_AXIS, if (horizontalLockToggle?.isChecked == true) 1 else 0)
}
private fun initializeMainPanel() {
window?.findViewById<Button>(R.id.buttonSelect)?.setOnTouchListener { _, motionEvent ->
val action: Int = when (motionEvent.action) {
KeyEvent.ACTION_DOWN -> {
// Normal key events.
NativeLibrary.ButtonState.PRESSED
}
KeyEvent.ACTION_UP -> NativeLibrary.ButtonState.RELEASED
else -> return@setOnTouchListener false
}
NativeLibrary.onGamePadEvent(
NativeLibrary.TouchScreenDevice,
NativeLibrary.ButtonType.BUTTON_SELECT,
action
)
false
}
window?.findViewById<Button>(R.id.buttonStart)?.setOnTouchListener { _, motionEvent ->
val action: Int = when (motionEvent.action) {
KeyEvent.ACTION_DOWN -> {
// Normal key events.
NativeLibrary.ButtonState.PRESSED
}
KeyEvent.ACTION_UP -> NativeLibrary.ButtonState.RELEASED
else -> return@setOnTouchListener false
}
NativeLibrary.onGamePadEvent(
NativeLibrary.TouchScreenDevice,
NativeLibrary.ButtonType.BUTTON_START,
action
)
false
}
window?.findViewById<Button>(R.id.buttonExit)?.setOnTouchListener { _, motionEvent ->
activity.quitToMenu()
false
} }
private fun initializePositionalPanel() { }
val horizontalLockToggle = window?.findViewById<ToggleButton>(R.id.horizontalAxisToggle)
horizontalLockToggle?.setOnCheckedChangeListener { _, isChecked ->
VrMessageQueue.post(VrMessageQueue.MessageType.CHANGE_LOCK_HORIZONTAL_AXIS, if (isChecked) 1 else 0)
}
val btnReset = window?.findViewById<Button>(R.id.btnReset)
btnReset?.setOnClickListener { _ ->
VrMessageQueue.post(VrMessageQueue.MessageType.RESET_PANEL_POSITIONS, 0)
false
}
horizontalLockToggle?.isChecked = true;
VrMessageQueue.post(VrMessageQueue.MessageType.CHANGE_LOCK_HORIZONTAL_AXIS, if (horizontalLockToggle?.isChecked == true) 1 else 0)
}
private fun initializeMainPanel() {
window?.findViewById<Button>(R.id.buttonSelect)?.setOnTouchListener { _, motionEvent ->
val action: Int = when (motionEvent.action) {
KeyEvent.ACTION_DOWN -> {
// Normal key events.
NativeLibrary.ButtonState.PRESSED
}
KeyEvent.ACTION_UP -> NativeLibrary.ButtonState.RELEASED
else -> return@setOnTouchListener false
}
NativeLibrary.onGamePadEvent(
NativeLibrary.TouchScreenDevice,
NativeLibrary.ButtonType.BUTTON_SELECT,
action
)
false
}
window?.findViewById<Button>(R.id.buttonStart)?.setOnTouchListener { _, motionEvent ->
val action: Int = when (motionEvent.action) {
KeyEvent.ACTION_DOWN -> {
// Normal key events.
NativeLibrary.ButtonState.PRESSED
}
KeyEvent.ACTION_UP -> NativeLibrary.ButtonState.RELEASED
else -> return@setOnTouchListener false
}
NativeLibrary.onGamePadEvent(
NativeLibrary.TouchScreenDevice,
NativeLibrary.ButtonType.BUTTON_START,
action
)
false
}
window?.findViewById<Button>(R.id.buttonExit)?.setOnTouchListener { _, motionEvent ->
activity.quitToMenu()
false
}
val btnNext = window?.findViewById<Button>(R.id.buttonNextMenu)
val btnPrev = window?.findViewById<Button>(R.id.buttonPrevMenu)
btnNext?.setOnClickListener { _ ->
val nextIdx = (menuTypeCurrent.ordinal + 1) % MenuType.values().size
switchMenus(MenuType.values()[nextIdx])
if ((nextIdx + 1) >= MenuType.values().size)
btnNext.visibility = View.INVISIBLE
btnPrev?.visibility = View.VISIBLE
false
}
btnPrev?.setOnClickListener { _ ->
val prevIdx =
(menuTypeCurrent.ordinal - 1 + MenuType.values().size) % MenuType.values().size
switchMenus(MenuType.values()[prevIdx])
if ((prevIdx - 1) <= 0)
btnPrev.visibility = View.INVISIBLE
btnNext?.visibility = View.VISIBLE
false
}
}
} }

View file

@ -429,8 +429,8 @@ void GameSurfaceLayer::SetTopPanelFromController(const XrVector3f& controllerPos
CalculatePanelPosition(viewerPosition, controllerPosition, sphereRadius); CalculatePanelPosition(viewerPosition, controllerPosition, sphereRadius);
if (windowPosition.z >= -0.5f) { return; } if (windowPosition.z >= -0.5f) { return; }
if (XrMath::Vector3f::LengthSq( if (XrMath::Vector3f::LengthSq(
XrVector3f {windowPosition.x, windowPosition.y, mTopPanel.mInitialPose.position.z} XrVector3f{windowPosition.x, windowPosition.y, mTopPanel.mInitialPose.position.z} -
- mLowerPanel.mPanelFromWorld.position) < mLowerPanel.mPanelFromWorld.position) <
XrMath::Vector3f::LengthSq(mTopPanel.mInitialPose.position - XrMath::Vector3f::LengthSq(mTopPanel.mInitialPose.position -
mLowerPanel.mInitialPose.position)) { mLowerPanel.mInitialPose.position)) {
return; return;
@ -527,8 +527,8 @@ XrPosef GameSurfaceLayer::GetTopPanelFromHeadPose(uint32_t eye, const XrPosef& h
void GameSurfaceLayer::ResetPanelPositions() { void GameSurfaceLayer::ResetPanelPositions() {
mTopPanel.mPanelFromWorld = mTopPanel.mInitialPose; mTopPanel.mPanelFromWorld = mTopPanel.mInitialPose;
mLowerPanel.mPanelFromWorld = mLowerPanel.mInitialPose; mLowerPanel.mPanelFromWorld = mLowerPanel.mInitialPose;
} }
// based on thumbstick, modify the depth of the top panel // based on thumbstick, modify the depth of the top panel

View file

@ -173,7 +173,7 @@ public:
void SetLowerPanelFromController(const XrVector3f& controllerPosition); void SetLowerPanelFromController(const XrVector3f& controllerPosition);
XrPosef GetTopPanelFromHeadPose(uint32_t eye, const XrPosef& headPose); XrPosef GetTopPanelFromHeadPose(uint32_t eye, const XrPosef& headPose);
const XrPosef& GetLowerPanelPose() const { return mLowerPanel.mPanelFromWorld; } const XrPosef& GetLowerPanelPose() const { return mLowerPanel.mPanelFromWorld; }
void ResetPanelPositions(); void ResetPanelPositions();
private: private:
int Init(const XrSession& session, const jobject activityObject); int Init(const XrSession& session, const jobject activityObject);

View file

@ -28,12 +28,12 @@ struct Message {
// Note: Keep this in-sync with VrMessageQueue.java. // Note: Keep this in-sync with VrMessageQueue.java.
enum Type { enum Type {
SHOW_KEYBOARD = 0, // payload 0 = hide keyboard, 1 = show keyboard SHOW_KEYBOARD = 0, // payload 0 = hide keyboard, 1 = show keyboard
SHOW_ERROR_MESSAGE = 1, // payload 0 = show error message, 1 = hide error message SHOW_ERROR_MESSAGE = 1, // payload 0 = show error message, 1 = hide error message
EXIT_NEEDED = 2, // payload ignored EXIT_NEEDED = 2, // payload ignored
CHANGE_LOWER_MENU = 3, // payload indicates menu ID CHANGE_LOWER_MENU = 3, // payload indicates menu ID
CHANGE_LOCK_HORIZONTAL_AXIS = 4, // payload 0 = unlock, 1 = lock CHANGE_LOCK_HORIZONTAL_AXIS = 4, // payload 0 = unlock, 1 = lock
RESET_PANEL_POSITIONS = 5, // payload ignored RESET_PANEL_POSITIONS = 5, // payload ignored
}; };
Message() {} Message() {}

View file

@ -47,7 +47,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<RadioButton <RadioButton
android:id="@+id/menu_main" android:id="@+id/button_menu_main"
style="@style/VrRibbonButtonStyle" style="@style/VrRibbonButtonStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -55,7 +55,7 @@
android:clipToOutline="true" android:clipToOutline="true"
android:text="Main" /> android:text="Main" />
<RadioButton <RadioButton
android:id="@+id/menu_positional" android:id="@+id/button_menu_positional"
style="@style/VrRibbonButtonStyle" style="@style/VrRibbonButtonStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -64,7 +64,7 @@
android:text="Position" /> android:text="Position" />
<RadioButton <RadioButton
android:id="@+id/menu_stats" android:id="@+id/button_menu_stats"
style="@style/VrRibbonButtonStyle" style="@style/VrRibbonButtonStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -91,47 +91,6 @@
android:visibility="gone" /> android:visibility="gone" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="18dp"
android:layout_marginEnd="150dp"
android:layout_marginBottom="18dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/panelHolder">
<LinearLayout
android:layout_width="500dp"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/buttonPrevMenu"
style="@style/VrRibbonButtonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:minHeight="0dp"
android:padding="0dp"
android:paddingVertical="20dp"
android:text="&lt;" />
<Button
android:id="@+id/buttonNextMenu"
style="@style/VrRibbonButtonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:minHeight="0dp"
android:padding="0dp"
android:paddingVertical="20dp"
android:text="&gt;" />
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>