From db04f2c29d4eb0e8d4ef85f2a78b59e23764a4bf Mon Sep 17 00:00:00 2001 From: adas20 Date: Thu, 24 Jul 2025 14:07:08 -0400 Subject: [PATCH] Added code in arrays.xml to display the buttons. This code has the buttons display but clicking on them crashes the app. Will debug further. Also replaced setSelectedValues with add and remove SelectedValue for clarity purposes. --- .../features/settings/model/Settings.kt | 2 ++ .../settings/model/view/MultiChoiceSetting.kt | 21 ++++++++--- .../model/view/StringMultiChoiceSetting.kt | 21 ++++++++--- .../features/settings/ui/SettingsAdapter.kt | 28 ++++++++++----- .../settings/ui/SettingsFragmentPresenter.kt | 35 ++++++++++++++----- .../app/src/main/res/values/arrays.xml | 14 ++++++++ 6 files changed, 94 insertions(+), 27 deletions(-) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.kt index 6476644bf..3928675ea 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.kt @@ -220,6 +220,8 @@ class Settings { R.string.turbo_limit_hotkey ) + val comboSelection = mutableSetOf() + const val PREF_FIRST_APP_LAUNCH = "FirstApplicationLaunch" const val PREF_MATERIAL_YOU = "MaterialYouTheme" const val PREF_THEME_MODE = "ThemeMode" diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/MultiChoiceSetting.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/MultiChoiceSetting.kt index d09146c4c..b8cfe41f6 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/MultiChoiceSetting.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/MultiChoiceSetting.kt @@ -44,21 +44,32 @@ class MultiChoiceSetting( } /** - * Write a value to the backing int. If that int was previously null, - * initializes a new one and returns it, so it can be added to the Hashmap. + * Add values to multi choice backing mutable sets. * * @param selection New value of the int. - * @return the existing setting with the new value applied. + * @return the existing setting with the new value added. */ - fun setSelectedValues(selection: Int): AbstractMultiIntSetting { + fun addSelectedValue(selection: Int): AbstractMultiIntSetting { val intSetting = setting as AbstractMultiIntSetting intSetting.ints.add(selection) return intSetting } - fun setSelectedValues(selection: Short): AbstractMultiShortSetting { + fun addSelectedValue(selection: Short): AbstractMultiShortSetting { val shortSetting = setting as AbstractMultiShortSetting shortSetting.shorts.add(selection) return shortSetting } + + fun removeSelectedValue(selection: Int): AbstractMultiIntSetting { + val intSetting = setting as AbstractMultiIntSetting + intSetting.ints.remove(selection) + return intSetting + } + + fun removeSelectedValue(selection: Short): AbstractMultiShortSetting { + val shortSetting = setting as AbstractMultiShortSetting + shortSetting.shorts.remove(selection) + return shortSetting + } } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/StringMultiChoiceSetting.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/StringMultiChoiceSetting.kt index 8977c7880..ced239289 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/StringMultiChoiceSetting.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/StringMultiChoiceSetting.kt @@ -72,21 +72,32 @@ class StringMultiChoiceSetting( } /** - * Write a value to the backing int. If that int was previously null, - * initializes a new one and returns it, so it can be added to the Hashmap. + * Add values to multi choice through the backing mutable sets. * * @param selection New value of the int. - * @return the existing setting with the new value applied. + * @return the existing setting with the new value added. */ - fun setSelectedValues(selection: String): AbstractMultiStringSetting { + fun addSelectedValue(selection: String): AbstractMultiStringSetting { val stringSetting = setting as AbstractMultiStringSetting stringSetting.strings.add(selection) return stringSetting } - fun setSelectedValues(selection: Short): AbstractMultiShortSetting { + fun addSelectedValue(selection: Short): AbstractMultiShortSetting { val shortSetting = setting as AbstractMultiShortSetting shortSetting.shorts.add(selection) return shortSetting } + + fun removeSelectedValue(selection: String): AbstractMultiStringSetting { + val stringSetting = setting as AbstractMultiStringSetting + stringSetting.strings.remove(selection) + return stringSetting + } + + fun removeSelectedValue(selection: Short): AbstractMultiShortSetting { + val shortSetting = setting as AbstractMultiShortSetting + shortSetting.shorts.remove(selection) + return shortSetting + } } \ No newline at end of file diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.kt index 92befc80e..c3620d1ff 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.kt @@ -716,22 +716,26 @@ class SettingsAdapter( is AbstractMultiIntSetting -> { val value = getValueForMultiChoiceSelection(it, which, is_checked) if (value !in it.selectedValues) { + it.removeSelectedValue(value) fragmentView?.onSettingChanged() + } else { + it.addSelectedValue(value) } - it.setSelectedValues(value) } is AbstractMultiShortSetting -> { val value = getValueForMultiChoiceSelection(it, which, is_checked).toShort() if (value !in it.selectedValues.map { it.toShort() }) { + it.removeSelectedValue(value) fragmentView?.onSettingChanged() + } else { + it.addSelectedValue(value) } - it.setSelectedValues(value) } else -> throw IllegalStateException("Unrecognized type used for MultiChoiceSetting!") } - fragmentView?.putSetting(setting) + fragmentView?.putSetting(setting as AbstractSetting) fragmentView.loadSettingsList() closeDialog() } @@ -743,19 +747,27 @@ class SettingsAdapter( val setting = when (it.setting) { is AbstractMultiStringSetting -> { val value = it.getValueAt(which) - if (value !in it.selectedValues ) fragmentView?.onSettingChanged() - it.setSelectedValues(value ?: "") + if (value !in it.selectedValues ) { + it.removeSelectedValue(value ?: "") + fragmentView?.onSettingChanged() + } else { + it.addSelectedValue(value ?: "") + } } is AbstractMultiShortSetting -> { - if (is_checked != it.selectValueIndices[which]) fragmentView?.onSettingChanged() - it.setSelectedValues(it.getValueAt(which)?.toShort() ?: 1) + if (is_checked != it.selectValueIndices[which]) { + it.removeSelectedValue(it.getValueAt(which)?.toShort() ?: 1) + fragmentView?.onSettingChanged() + } else { + it.addSelectedValue(it.getValueAt(which)?.toShort() ?: 1) + } } else -> throw IllegalStateException("Unrecognized type used for StringMultiChoiceSetting!") } - fragmentView?.putSetting(setting) + fragmentView?.putSetting(setting as AbstractSetting) fragmentView.loadSettingsList() closeDialog() } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt index 4e8e6dfb3..8cd1c2193 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -21,6 +21,7 @@ import org.citra.citra_emu.display.PortraitScreenLayout import org.citra.citra_emu.display.ScreenLayout import org.citra.citra_emu.features.settings.model.AbstractBooleanSetting import org.citra.citra_emu.features.settings.model.AbstractIntSetting +import org.citra.citra_emu.features.settings.model.AbstractMultiStringSetting import org.citra.citra_emu.features.settings.model.AbstractSetting import org.citra.citra_emu.features.settings.model.AbstractShortSetting import org.citra.citra_emu.features.settings.model.AbstractStringSetting @@ -38,6 +39,7 @@ import org.citra.citra_emu.features.settings.model.view.SettingsItem import org.citra.citra_emu.features.settings.model.view.SingleChoiceSetting import org.citra.citra_emu.features.settings.model.view.SliderSetting import org.citra.citra_emu.features.settings.model.view.StringInputSetting +import org.citra.citra_emu.features.settings.model.view.StringMultiChoiceSetting import org.citra.citra_emu.features.settings.model.view.StringSingleChoiceSetting import org.citra.citra_emu.features.settings.model.view.SubmenuSetting import org.citra.citra_emu.features.settings.model.view.SwitchSetting @@ -809,6 +811,26 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) private fun addComboButtonSettings(sl: ArrayList) { settingsActivity.setToolbarTitle(settingsActivity.getString(R.string.combo_key)) + val comboSetting = object : AbstractMultiStringSetting { + override var strings: MutableSet + get() { + return Settings.comboSelection + } + set(values) { + for (item in values) { + Settings.comboSelection.add(item) + } + } + override val key = null + override val section = null + override val isRuntimeEditable = false + override val valueAsString get() = "" + override val defaultValue = "" + } + + val buttons = settingsActivity.resources.getStringArray(R.array.n3dsButtons).take(10).toTypedArray() + val combo_values = settingsActivity.resources.getStringArray(R.array.combovalues) + sl.apply { add( SwitchSetting( @@ -819,20 +841,15 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) BooleanSetting.ENABLE_COMBO_KEY.defaultValue, ) ) - add(HeaderSetting(R.string.combo_key_options)) - // TODO: Implement displaying selectable buttons - /* add( - StringSingleChoiceSetting( + StringMultiChoiceSetting( comboSetting, - R.string.emulated_language, + R.string.combo_key_options, 0, - R.array.n3dsButtons, - R.array. + buttons, + combo_values ) ) - - */ } } diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 543b59913..bbf104653 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -169,6 +169,20 @@ @string/button_turbo + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + + @string/blank @string/still_image