Code Cleanup and Start of Reimplementation based off #1430

This commit is contained in:
ADAS2024 2026-03-04 15:59:05 -05:00
parent 2ef7c17799
commit 4baecabd8c
8 changed files with 58 additions and 160 deletions

View file

@ -4,6 +4,6 @@
package org.citra.citra_emu.features.settings.model
interface AbstractMultiFloatSetting : AbstractSetting {
var floats: MutableSet<Float>
}
interface AbstractListSetting<E> : AbstractSetting {
var list: List<E>
}

View file

@ -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<Boolean>
}

View file

@ -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<String>
) : AbstractListSetting<String> {
COMBO_KEY_LIST("combo_key_list", Settings.SECTION_CONTROLS, listOf("A", "B", "X", "Y", "L", "R", "ZL", "ZR", "Start", "Select"));
override var list: List<String> = 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<StringListSetting> = listOf();
fun from(key: String): StringListSetting? =
values().firstOrNull { it.key == key }
fun clear() = values().forEach { it.list = it.defaultValue }
}
}

View file

@ -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<Int>? = null,
override var isEnabled: Boolean = true
) : SettingsItem(setting, titleId, descriptionId) {
override val type = TYPE_MULTI_CHOICE
val selectedValues: List<Int>
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
}
}

View file

@ -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?,

View file

@ -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<Boolean>()
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)

View file

@ -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

View file

@ -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
}