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