diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/AbstractMultiFloatSetting.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/AbstractListSetting.kt similarity index 68% rename from src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/AbstractMultiFloatSetting.kt rename to src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/AbstractListSetting.kt index 2d9d92873..25a7338fe 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/AbstractMultiFloatSetting.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/AbstractListSetting.kt @@ -4,6 +4,6 @@ package org.citra.citra_emu.features.settings.model -interface AbstractMultiFloatSetting : AbstractSetting { - var floats: MutableSet -} +interface AbstractListSetting : AbstractSetting { + var list: List +} \ No newline at end of file diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/AbstractMultiBooleanSetting.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/AbstractMultiBooleanSetting.kt deleted file mode 100644 index 2b3f2e1fc..000000000 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/AbstractMultiBooleanSetting.kt +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright Citra Emulator Project / Azahar Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -package org.citra.citra_emu.features.settings.model - -interface AbstractMultiBooleanSetting : AbstractSetting { - var booleans: MutableSet -} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/StringListSetting.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/StringListSetting.kt new file mode 100644 index 000000000..12f8d77f6 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/StringListSetting.kt @@ -0,0 +1,39 @@ +// Copyright Citra Emulator Project / Azahar Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +package org.citra.citra_emu.features.settings.model + +enum class StringListSetting( + override val key: String, + override val section: String, + override val defaultValue: List +) : AbstractListSetting { + COMBO_KEY_LIST("combo_key_list", Settings.SECTION_CONTROLS, listOf("A", "B", "X", "Y", "L", "R", "ZL", "ZR", "Start", "Select")); + + override var list: List = defaultValue + + override val valueAsString: String + get() = list.joinToString() + + + override val isRuntimeEditable: Boolean + get() { + for (setting in NOT_RUNTIME_EDITABLE) { + if (setting == this) { + return false + } + } + return true + } + + companion object { + private val NOT_RUNTIME_EDITABLE:List = listOf(); + + + fun from(key: String): StringListSetting? = + values().firstOrNull { it.key == key } + + fun clear() = values().forEach { it.list = it.defaultValue } + } +} \ No newline at end of file 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 deleted file mode 100644 index b8cfe41f6..000000000 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/MultiChoiceSetting.kt +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright Citra Emulator Project / Azahar Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -package org.citra.citra_emu.features.settings.model.view - -import org.citra.citra_emu.features.settings.model.AbstractMultiIntSetting -import org.citra.citra_emu.features.settings.model.AbstractSetting -import org.citra.citra_emu.features.settings.model.AbstractMultiShortSetting -import org.citra.citra_emu.features.settings.model.AbstractIntSetting -import org.citra.citra_emu.features.settings.model.AbstractShortSetting - -class MultiChoiceSetting( - setting: AbstractSetting?, - titleId: Int, - descriptionId: Int, - val choicesId: Int, - val valuesId: Int, - val key: String? = null, - val defaultValues: List? = null, - override var isEnabled: Boolean = true -) : SettingsItem(setting, titleId, descriptionId) { - override val type = TYPE_MULTI_CHOICE - - val selectedValues: List - get() { - if (setting == null) { - return defaultValues!! - } - - try { - val setting = setting as AbstractMultiIntSetting - return setting.ints.toList() - } catch (_: ClassCastException) { - } - - try { - val setting = setting as AbstractMultiShortSetting - return setting.shorts.map { it.toInt() } - } catch (_: ClassCastException) { - } - - return defaultValues!! - } - - /** - * Add values to multi choice backing mutable sets. - * - * @param selection New value of the int. - * @return the existing setting with the new value added. - */ - fun addSelectedValue(selection: Int): AbstractMultiIntSetting { - val intSetting = setting as AbstractMultiIntSetting - intSetting.ints.add(selection) - return intSetting - } - - 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 8330ed186..f99b2719c 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 @@ -7,6 +7,7 @@ package org.citra.citra_emu.features.settings.model.view import org.citra.citra_emu.features.settings.model.AbstractSetting import org.citra.citra_emu.features.settings.model.AbstractMultiShortSetting import org.citra.citra_emu.features.settings.model.AbstractMultiStringSetting +import org.citra.citra_emu.features.settings.model.StringListSetting class StringMultiChoiceSetting( setting: AbstractSetting?, 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 13476ae24..73006bb81 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 @@ -38,7 +38,6 @@ import org.citra.citra_emu.databinding.ListItemSettingsHeaderBinding import org.citra.citra_emu.features.settings.model.AbstractBooleanSetting import org.citra.citra_emu.features.settings.model.AbstractFloatSetting import org.citra.citra_emu.features.settings.model.AbstractIntSetting -import org.citra.citra_emu.features.settings.model.AbstractMultiIntSetting import org.citra.citra_emu.features.settings.model.AbstractMultiShortSetting import org.citra.citra_emu.features.settings.model.AbstractMultiStringSetting import org.citra.citra_emu.features.settings.model.AbstractSetting @@ -49,7 +48,6 @@ import org.citra.citra_emu.features.settings.model.AbstractShortSetting import org.citra.citra_emu.features.settings.model.Settings import org.citra.citra_emu.features.settings.model.view.DateTimeSetting import org.citra.citra_emu.features.settings.model.view.InputBindingSetting -import org.citra.citra_emu.features.settings.model.view.MultiChoiceSetting 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 @@ -61,7 +59,7 @@ import org.citra.citra_emu.features.settings.model.view.SwitchSetting import org.citra.citra_emu.features.settings.ui.viewholder.DateTimeViewHolder import org.citra.citra_emu.features.settings.ui.viewholder.HeaderViewHolder import org.citra.citra_emu.features.settings.ui.viewholder.InputBindingSettingViewHolder -import org.citra.citra_emu.features.settings.ui.viewholder.MultiChoiceViewHolder +import org.citra.citra_emu.features.settings.ui.viewholder.StringMultiChoiceViewHolder import org.citra.citra_emu.features.settings.ui.viewholder.RunnableViewHolder import org.citra.citra_emu.features.settings.ui.viewholder.SettingViewHolder import org.citra.citra_emu.features.settings.ui.viewholder.SingleChoiceViewHolder @@ -136,7 +134,7 @@ class SettingsAdapter( } SettingsItem.TYPE_MULTI_CHOICE, SettingsItem.TYPE_STRING_MULTI_CHOICE -> { - MultiChoiceViewHolder(ListItemSettingBinding.inflate(inflater), this) + StringMultiChoiceViewHolder(ListItemSettingBinding.inflate(inflater), this) } else -> { @@ -207,6 +205,9 @@ class SettingsAdapter( SettingsItem.TYPE_STRING_INPUT -> { (oldItem as StringInputSetting).isEnabled == (newItem as StringInputSetting).isEnabled } + SettingsItem.TYPE_STRING_MULTI_CHOICE -> { + (oldItem as StringMultiChoiceSetting).isEnabled == (newItem as StringMultiChoiceSetting).isEnabled + } else -> { oldItem == newItem } @@ -659,55 +660,7 @@ class SettingsAdapter( return -1 } - private fun getSelectionForMultiChoiceValues(item: MultiChoiceSetting): BooleanArray { - val checked_values = mutableListOf() - val values = item.selectedValues - val valuesId = item.valuesId - if (valuesId > 0) { - val valuesArray = context.resources.getIntArray(valuesId) - for (index in valuesArray.indices) { - val current = valuesArray[index] - if (current in values) { - checked_values.add(true) - } else { - checked_values.add(false) - } - } - } - if (checked_values == null) { - return booleanArrayOf(false) - } else { - return checked_values.toBooleanArray() - } - } - // TODO: Part of MultiChoice Impl - /* - private fun getValueForMultiChoiceSelection(item: MultiChoiceSetting, which: Int, is_checked: Boolean): Int { - val valuesId = item.valuesId - if (valuesId > 0) { - val valuesArray = context.resources.getIntArray(valuesId) - if (is_checked) { - return valuesArray[which] - } - } - return which - } - */ - - private fun onMultiChoiceClick(item: MultiChoiceSetting) { - clickedItem = item - val values = getSelectionForMultiChoiceValues(item) - dialog = MaterialAlertDialogBuilder(context) - .setTitle(item.nameId) - .setMultiChoiceItems(item.choicesId, values, this) - .show() - } - - fun onMultiChoiceClick(item: MultiChoiceSetting, position: Int) { - clickedPosition = position - onMultiChoiceClick(item) - } private fun onStringMultiChoiceClick(item: StringMultiChoiceSetting) { clickedItem = item @@ -765,8 +718,8 @@ class SettingsAdapter( //TODO: Don't fully know how to grab the setting itself for the buttons so I'm adding them to a backing array to be called later //TODO: Likely need to be reimplemented is StringMultiChoiceSetting -> { - val scSetting = clickedItem as? StringMultiChoiceSetting - scSetting?.let { + val mcSetting = clickedItem as? StringMultiChoiceSetting + mcSetting?.let { val setting = when (it.setting) { is AbstractMultiStringSetting -> { val value = it.getValueAt(which) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/MultiChoiceViewHolder.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/StringMultiChoiceViewHolder.kt similarity index 74% rename from src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/MultiChoiceViewHolder.kt rename to src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/StringMultiChoiceViewHolder.kt index 76fe809fc..35d4d6e79 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/MultiChoiceViewHolder.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/StringMultiChoiceViewHolder.kt @@ -6,12 +6,11 @@ package org.citra.citra_emu.features.settings.ui.viewholder import android.view.View import org.citra.citra_emu.databinding.ListItemSettingBinding -import org.citra.citra_emu.features.settings.model.view.MultiChoiceSetting import org.citra.citra_emu.features.settings.model.view.SettingsItem import org.citra.citra_emu.features.settings.model.view.StringMultiChoiceSetting import org.citra.citra_emu.features.settings.ui.SettingsAdapter -class MultiChoiceViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : +class StringMultiChoiceViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { private lateinit var setting: SettingsItem @@ -40,16 +39,6 @@ class MultiChoiceViewHolder(val binding: ListItemSettingBinding, adapter: Settin private fun getTextSetting(): String { when (val item = setting) { - is MultiChoiceSetting -> { - val resMgr = binding.textSettingDescription.context.resources - val values = resMgr.getIntArray(item.valuesId) - values.forEachIndexed { i: Int, value: Int -> - if (value in (setting as MultiChoiceSetting).selectedValues) { - return resMgr.getStringArray(item.choicesId)[i] - } - } - return "" - } is StringMultiChoiceSetting -> { item.values?.forEachIndexed { i: Int, value: String -> @@ -69,13 +58,7 @@ class MultiChoiceViewHolder(val binding: ListItemSettingBinding, adapter: Settin adapter.onClickDisabledSetting(!setting.isEditable) return } - - if (setting is MultiChoiceSetting) { - adapter.onMultiChoiceClick( - (setting as MultiChoiceSetting), - bindingAdapterPosition - ) - } else if (setting is StringMultiChoiceSetting) { + if (setting is StringMultiChoiceSetting) { adapter.onStringMultiChoiceClick( (setting as StringMultiChoiceSetting), bindingAdapterPosition diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.kt index dec3e4e0a..ba94a6a1a 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.kt @@ -16,6 +16,7 @@ import org.citra.citra_emu.features.settings.model.IntSetting import org.citra.citra_emu.features.settings.model.ScaledFloatSetting import org.citra.citra_emu.features.settings.model.SettingSection import org.citra.citra_emu.features.settings.model.Settings.SettingsSectionMap +import org.citra.citra_emu.features.settings.model.StringListSetting import org.citra.citra_emu.features.settings.model.StringSetting import org.citra.citra_emu.features.settings.ui.SettingsActivityView import org.citra.citra_emu.utils.BiMap @@ -255,6 +256,11 @@ object SettingsFile { return stringSetting } + val stringListSetting = StringListSetting.from(key) + if (stringListSetting != null) { + stringListSetting.list = value.split(", ").map { it } + } + return null }