mirror of
https://github.com/amwatson/CitraVR.git
synced 2024-09-20 03:11:40 +02:00
remove prev/next UI buttons and make radio buttons functional
This commit is contained in:
parent
003590f5ff
commit
47746e74e7
5 changed files with 96 additions and 151 deletions
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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() {}
|
||||||
|
|
|
@ -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="<" />
|
|
||||||
|
|
||||||
<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=">" />
|
|
||||||
</LinearLayout>
|
|
||||||
</LinearLayout>
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
Loading…
Reference in a new issue