diff options
Diffstat (limited to 'src/android')
24 files changed, 418 insertions, 363 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractBooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractBooleanSetting.kt new file mode 100644 index 000000000..a6e9833ee --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractBooleanSetting.kt | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | // SPDX-FileCopyrightText: 2023 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | package org.yuzu.yuzu_emu.features.settings.model | ||
| 5 | |||
| 6 | interface AbstractBooleanSetting : AbstractSetting { | ||
| 7 | var boolean: Boolean | ||
| 8 | } | ||
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractFloatSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractFloatSetting.kt new file mode 100644 index 000000000..6fe4bc263 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractFloatSetting.kt | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | // SPDX-FileCopyrightText: 2023 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | package org.yuzu.yuzu_emu.features.settings.model | ||
| 5 | |||
| 6 | interface AbstractFloatSetting : AbstractSetting { | ||
| 7 | var float: Float | ||
| 8 | } | ||
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractIntSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractIntSetting.kt new file mode 100644 index 000000000..892b7dcfe --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractIntSetting.kt | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | // SPDX-FileCopyrightText: 2023 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | package org.yuzu.yuzu_emu.features.settings.model | ||
| 5 | |||
| 6 | interface AbstractIntSetting : AbstractSetting { | ||
| 7 | var int: Int | ||
| 8 | } | ||
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractSetting.kt new file mode 100644 index 000000000..0ebf55ab7 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractSetting.kt | |||
| @@ -0,0 +1,11 @@ | |||
| 1 | // SPDX-FileCopyrightText: 2023 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | package org.yuzu.yuzu_emu.features.settings.model | ||
| 5 | |||
| 6 | interface AbstractSetting { | ||
| 7 | val key: String? | ||
| 8 | val section: String? | ||
| 9 | val isRuntimeEditable: Boolean | ||
| 10 | val valueAsString: String | ||
| 11 | } | ||
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractStringSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractStringSetting.kt new file mode 100644 index 000000000..0d02c5997 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractStringSetting.kt | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | // SPDX-FileCopyrightText: 2023 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | package org.yuzu.yuzu_emu.features.settings.model | ||
| 5 | |||
| 6 | interface AbstractStringSetting : AbstractSetting { | ||
| 7 | var string: String | ||
| 8 | } | ||
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt index f0f270c76..837e5b89d 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt | |||
| @@ -3,10 +3,33 @@ | |||
| 3 | 3 | ||
| 4 | package org.yuzu.yuzu_emu.features.settings.model | 4 | package org.yuzu.yuzu_emu.features.settings.model |
| 5 | 5 | ||
| 6 | class BooleanSetting( | 6 | enum class BooleanSetting( |
| 7 | key: String, | 7 | override val key: String, |
| 8 | section: String, | 8 | override val section: String, |
| 9 | var value: Boolean | 9 | val defaultValue: Boolean |
| 10 | ) : Setting(key, section) { | 10 | ) : AbstractBooleanSetting { |
| 11 | override val valueAsString get() = if (value) "True" else "False" | 11 | // No boolean settings currently exist |
| 12 | EMPTY_SETTING("", "", false); | ||
| 13 | |||
| 14 | override var boolean: Boolean = defaultValue | ||
| 15 | |||
| 16 | override val valueAsString: String | ||
| 17 | get() = boolean.toString() | ||
| 18 | |||
| 19 | override val isRuntimeEditable: Boolean | ||
| 20 | get() { | ||
| 21 | for (setting in NOT_RUNTIME_EDITABLE) { | ||
| 22 | if (setting == this) { | ||
| 23 | return false | ||
| 24 | } | ||
| 25 | } | ||
| 26 | return true | ||
| 27 | } | ||
| 28 | |||
| 29 | companion object { | ||
| 30 | private val NOT_RUNTIME_EDITABLE = emptyList<BooleanSetting>() | ||
| 31 | |||
| 32 | fun from(key: String): BooleanSetting? = | ||
| 33 | BooleanSetting.values().firstOrNull { it.key == key } | ||
| 34 | } | ||
| 12 | } | 35 | } |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FloatSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FloatSetting.kt index f78242a47..4c83e9527 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FloatSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FloatSetting.kt | |||
| @@ -3,10 +3,32 @@ | |||
| 3 | 3 | ||
| 4 | package org.yuzu.yuzu_emu.features.settings.model | 4 | package org.yuzu.yuzu_emu.features.settings.model |
| 5 | 5 | ||
| 6 | class FloatSetting( | 6 | enum class FloatSetting( |
| 7 | key: String, | 7 | override val key: String, |
| 8 | section: String, | 8 | override val section: String, |
| 9 | var value: Float | 9 | val defaultValue: Float |
| 10 | ) : Setting(key, section) { | 10 | ) : AbstractFloatSetting { |
| 11 | override val valueAsString get() = value.toString() | 11 | // No float settings currently exist |
| 12 | EMPTY_SETTING("", "", 0f); | ||
| 13 | |||
| 14 | override var float: Float = defaultValue | ||
| 15 | |||
| 16 | override val valueAsString: String | ||
| 17 | get() = float.toString() | ||
| 18 | |||
| 19 | override val isRuntimeEditable: Boolean | ||
| 20 | get() { | ||
| 21 | for (setting in NOT_RUNTIME_EDITABLE) { | ||
| 22 | if (setting == this) { | ||
| 23 | return false | ||
| 24 | } | ||
| 25 | } | ||
| 26 | return true | ||
| 27 | } | ||
| 28 | |||
| 29 | companion object { | ||
| 30 | private val NOT_RUNTIME_EDITABLE = emptyList<FloatSetting>() | ||
| 31 | |||
| 32 | fun from(key: String): FloatSetting? = FloatSetting.values().firstOrNull { it.key == key } | ||
| 33 | } | ||
| 12 | } | 34 | } |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt index 32d9b8b85..164888016 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt | |||
| @@ -3,10 +3,121 @@ | |||
| 3 | 3 | ||
| 4 | package org.yuzu.yuzu_emu.features.settings.model | 4 | package org.yuzu.yuzu_emu.features.settings.model |
| 5 | 5 | ||
| 6 | class IntSetting( | 6 | enum class IntSetting( |
| 7 | key: String, | 7 | override val key: String, |
| 8 | section: String, | 8 | override val section: String, |
| 9 | var value: Int | 9 | val defaultValue: Int |
| 10 | ) : Setting(key, section) { | 10 | ) : AbstractIntSetting { |
| 11 | override val valueAsString get() = value.toString() | 11 | RENDERER_USE_SPEED_LIMIT( |
| 12 | "use_speed_limit", | ||
| 13 | Settings.SECTION_RENDERER, | ||
| 14 | 1 | ||
| 15 | ), | ||
| 16 | USE_DOCKED_MODE( | ||
| 17 | "use_docked_mode", | ||
| 18 | Settings.SECTION_SYSTEM, | ||
| 19 | 0 | ||
| 20 | ), | ||
| 21 | RENDERER_USE_DISK_SHADER_CACHE( | ||
| 22 | "use_disk_shader_cache", | ||
| 23 | Settings.SECTION_RENDERER, | ||
| 24 | 1 | ||
| 25 | ), | ||
| 26 | RENDERER_FORCE_MAX_CLOCK( | ||
| 27 | "force_max_clock", | ||
| 28 | Settings.SECTION_RENDERER, | ||
| 29 | 1 | ||
| 30 | ), | ||
| 31 | RENDERER_ASYNCHRONOUS_SHADERS( | ||
| 32 | "use_asynchronous_shaders", | ||
| 33 | Settings.SECTION_RENDERER, | ||
| 34 | 0 | ||
| 35 | ), | ||
| 36 | RENDERER_DEBUG( | ||
| 37 | "debug", | ||
| 38 | Settings.SECTION_RENDERER, | ||
| 39 | 0 | ||
| 40 | ), | ||
| 41 | RENDERER_SPEED_LIMIT( | ||
| 42 | "speed_limit", | ||
| 43 | Settings.SECTION_RENDERER, | ||
| 44 | 100 | ||
| 45 | ), | ||
| 46 | CPU_ACCURACY( | ||
| 47 | "cpu_accuracy", | ||
| 48 | Settings.SECTION_CPU, | ||
| 49 | 0 | ||
| 50 | ), | ||
| 51 | REGION_INDEX( | ||
| 52 | "region_index", | ||
| 53 | Settings.SECTION_SYSTEM, | ||
| 54 | -1 | ||
| 55 | ), | ||
| 56 | LANGUAGE_INDEX( | ||
| 57 | "language_index", | ||
| 58 | Settings.SECTION_SYSTEM, | ||
| 59 | 1 | ||
| 60 | ), | ||
| 61 | RENDERER_BACKEND( | ||
| 62 | "backend", | ||
| 63 | Settings.SECTION_RENDERER, | ||
| 64 | 1 | ||
| 65 | ), | ||
| 66 | RENDERER_ACCURACY( | ||
| 67 | "gpu_accuracy", | ||
| 68 | Settings.SECTION_RENDERER, | ||
| 69 | 0 | ||
| 70 | ), | ||
| 71 | RENDERER_RESOLUTION( | ||
| 72 | "resolution_setup", | ||
| 73 | Settings.SECTION_RENDERER, | ||
| 74 | 2 | ||
| 75 | ), | ||
| 76 | RENDERER_SCALING_FILTER( | ||
| 77 | "scaling_filter", | ||
| 78 | Settings.SECTION_RENDERER, | ||
| 79 | 1 | ||
| 80 | ), | ||
| 81 | RENDERER_ANTI_ALIASING( | ||
| 82 | "anti_aliasing", | ||
| 83 | Settings.SECTION_RENDERER, | ||
| 84 | 0 | ||
| 85 | ), | ||
| 86 | RENDERER_ASPECT_RATIO( | ||
| 87 | "aspect_ratio", | ||
| 88 | Settings.SECTION_RENDERER, | ||
| 89 | 0 | ||
| 90 | ), | ||
| 91 | AUDIO_VOLUME( | ||
| 92 | "volume", | ||
| 93 | Settings.SECTION_AUDIO, | ||
| 94 | 100 | ||
| 95 | ); | ||
| 96 | |||
| 97 | override var int: Int = defaultValue | ||
| 98 | |||
| 99 | override val valueAsString: String | ||
| 100 | get() = int.toString() | ||
| 101 | |||
| 102 | override val isRuntimeEditable: Boolean | ||
| 103 | get() { | ||
| 104 | for (setting in NOT_RUNTIME_EDITABLE) { | ||
| 105 | if (setting == this) { | ||
| 106 | return false | ||
| 107 | } | ||
| 108 | } | ||
| 109 | return true | ||
| 110 | } | ||
| 111 | |||
| 112 | companion object { | ||
| 113 | private val NOT_RUNTIME_EDITABLE = listOf( | ||
| 114 | RENDERER_USE_DISK_SHADER_CACHE, | ||
| 115 | RENDERER_ASYNCHRONOUS_SHADERS, | ||
| 116 | RENDERER_DEBUG, | ||
| 117 | RENDERER_BACKEND, | ||
| 118 | RENDERER_RESOLUTION | ||
| 119 | ) | ||
| 120 | |||
| 121 | fun from(key: String): IntSetting? = IntSetting.values().firstOrNull { it.key == key } | ||
| 122 | } | ||
| 12 | } | 123 | } |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Setting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Setting.kt deleted file mode 100644 index befd40257..000000000 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Setting.kt +++ /dev/null | |||
| @@ -1,27 +0,0 @@ | |||
| 1 | // SPDX-FileCopyrightText: 2023 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | package org.yuzu.yuzu_emu.features.settings.model | ||
| 5 | |||
| 6 | /** | ||
| 7 | * Abstraction for a setting item as read from / written to yuzu's configuration ini files. | ||
| 8 | * These files generally consist of a key/value pair, though the type of value is ambiguous and | ||
| 9 | * must be inferred at read-time. The type of value determines which child of this class is used | ||
| 10 | * to represent the Setting. | ||
| 11 | */ | ||
| 12 | abstract class Setting( | ||
| 13 | /** | ||
| 14 | * @return The identifier used to write this setting to the ini file. | ||
| 15 | */ | ||
| 16 | val key: String, | ||
| 17 | /** | ||
| 18 | * @return The name of the header under which this Setting should be written in the ini file. | ||
| 19 | */ | ||
| 20 | val section: String | ||
| 21 | ) { | ||
| 22 | |||
| 23 | /** | ||
| 24 | * @return A representation of this Setting's backing value converted to a String (e.g. for serialization). | ||
| 25 | */ | ||
| 26 | abstract val valueAsString: String | ||
| 27 | } | ||
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/SettingSection.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/SettingSection.kt index 94f85a12a..474f598a9 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/SettingSection.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/SettingSection.kt | |||
| @@ -8,15 +8,15 @@ package org.yuzu.yuzu_emu.features.settings.model | |||
| 8 | * internally stored as a HashMap. | 8 | * internally stored as a HashMap. |
| 9 | */ | 9 | */ |
| 10 | class SettingSection(val name: String) { | 10 | class SettingSection(val name: String) { |
| 11 | val settings = HashMap<String, Setting>() | 11 | val settings = HashMap<String, AbstractSetting>() |
| 12 | 12 | ||
| 13 | /** | 13 | /** |
| 14 | * Convenience method; inserts a value directly into the backing HashMap. | 14 | * Convenience method; inserts a value directly into the backing HashMap. |
| 15 | * | 15 | * |
| 16 | * @param setting The Setting to be inserted. | 16 | * @param setting The Setting to be inserted. |
| 17 | */ | 17 | */ |
| 18 | fun putSetting(setting: Setting) { | 18 | fun putSetting(setting: AbstractSetting) { |
| 19 | settings[setting.key] = setting | 19 | settings[setting.key!!] = setting |
| 20 | } | 20 | } |
| 21 | 21 | ||
| 22 | /** | 22 | /** |
| @@ -25,7 +25,7 @@ class SettingSection(val name: String) { | |||
| 25 | * @param key Used to retrieve the Setting. | 25 | * @param key Used to retrieve the Setting. |
| 26 | * @return A Setting object (you should probably cast this before using) | 26 | * @return A Setting object (you should probably cast this before using) |
| 27 | */ | 27 | */ |
| 28 | fun getSetting(key: String): Setting? { | 28 | fun getSetting(key: String): AbstractSetting? { |
| 29 | return settings[key] | 29 | return settings[key] |
| 30 | } | 30 | } |
| 31 | 31 | ||
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/StringSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/StringSetting.kt index c78be39d7..3fe43de26 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/StringSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/StringSetting.kt | |||
| @@ -3,10 +3,32 @@ | |||
| 3 | 3 | ||
| 4 | package org.yuzu.yuzu_emu.features.settings.model | 4 | package org.yuzu.yuzu_emu.features.settings.model |
| 5 | 5 | ||
| 6 | class StringSetting( | 6 | enum class StringSetting( |
| 7 | key: String, | 7 | override val key: String, |
| 8 | section: String, | 8 | override val section: String, |
| 9 | var value: String | 9 | defaultValue: String |
| 10 | ) : Setting(key, section) { | 10 | ) : AbstractStringSetting { |
| 11 | override val valueAsString get() = value | 11 | // No string settings currently exist |
| 12 | EMPTY_SETTING("", "", ""); | ||
| 13 | |||
| 14 | override var string: String = defaultValue | ||
| 15 | |||
| 16 | override val valueAsString: String | ||
| 17 | get() = string | ||
| 18 | |||
| 19 | override val isRuntimeEditable: Boolean | ||
| 20 | get() { | ||
| 21 | for (setting in NOT_RUNTIME_EDITABLE) { | ||
| 22 | if (setting == this) { | ||
| 23 | return false | ||
| 24 | } | ||
| 25 | } | ||
| 26 | return true | ||
| 27 | } | ||
| 28 | |||
| 29 | companion object { | ||
| 30 | private val NOT_RUNTIME_EDITABLE = emptyList<StringSetting>() | ||
| 31 | |||
| 32 | fun from(key: String): StringSetting? = StringSetting.values().firstOrNull { it.key == key } | ||
| 33 | } | ||
| 12 | } | 34 | } |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/DateTimeSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/DateTimeSetting.kt index 041d59f19..cf60798ff 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/DateTimeSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/DateTimeSetting.kt | |||
| @@ -3,36 +3,30 @@ | |||
| 3 | 3 | ||
| 4 | package org.yuzu.yuzu_emu.features.settings.model.view | 4 | package org.yuzu.yuzu_emu.features.settings.model.view |
| 5 | 5 | ||
| 6 | import org.yuzu.yuzu_emu.features.settings.model.Setting | 6 | import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting |
| 7 | import org.yuzu.yuzu_emu.features.settings.model.AbstractStringSetting | ||
| 7 | import org.yuzu.yuzu_emu.features.settings.model.StringSetting | 8 | import org.yuzu.yuzu_emu.features.settings.model.StringSetting |
| 8 | 9 | ||
| 9 | class DateTimeSetting( | 10 | class DateTimeSetting( |
| 10 | key: String, | 11 | val key: String? = null, |
| 11 | section: String, | 12 | setting: AbstractSetting?, |
| 12 | titleId: Int, | 13 | titleId: Int, |
| 13 | descriptionId: Int, | 14 | descriptionId: Int, |
| 14 | private val defaultValue: String, | 15 | private val defaultValue: String? = null |
| 15 | setting: Setting | 16 | ) : SettingsItem(setting, titleId, descriptionId) { |
| 16 | ) : SettingsItem(key, section, setting, titleId, descriptionId) { | ||
| 17 | override val type = TYPE_DATETIME_SETTING | 17 | override val type = TYPE_DATETIME_SETTING |
| 18 | 18 | ||
| 19 | val value: String | 19 | val value: String |
| 20 | get() = if (setting != null) { | 20 | get() = if (setting != null) { |
| 21 | val setting = setting as StringSetting | 21 | val setting = setting as StringSetting |
| 22 | setting.value | 22 | setting.string |
| 23 | } else { | 23 | } else { |
| 24 | defaultValue | 24 | defaultValue!! |
| 25 | } | 25 | } |
| 26 | 26 | ||
| 27 | fun setSelectedValue(datetime: String): StringSetting? { | 27 | fun setSelectedValue(datetime: String): AbstractStringSetting { |
| 28 | return if (setting == null) { | 28 | val stringSetting = setting as AbstractStringSetting |
| 29 | val newSetting = StringSetting(key!!, section!!, datetime) | 29 | stringSetting.string = datetime |
| 30 | setting = newSetting | 30 | return stringSetting |
| 31 | newSetting | ||
| 32 | } else { | ||
| 33 | val newSetting = setting as StringSetting | ||
| 34 | newSetting.value = datetime | ||
| 35 | null | ||
| 36 | } | ||
| 37 | } | 31 | } |
| 38 | } | 32 | } |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/HeaderSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/HeaderSetting.kt index 0d98a9eac..abba64e93 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/HeaderSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/HeaderSetting.kt | |||
| @@ -3,13 +3,12 @@ | |||
| 3 | 3 | ||
| 4 | package org.yuzu.yuzu_emu.features.settings.model.view | 4 | package org.yuzu.yuzu_emu.features.settings.model.view |
| 5 | 5 | ||
| 6 | import org.yuzu.yuzu_emu.features.settings.model.Setting | 6 | import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting |
| 7 | 7 | ||
| 8 | class HeaderSetting( | 8 | class HeaderSetting( |
| 9 | key: String?, | 9 | setting: AbstractSetting?, |
| 10 | setting: Setting?, | ||
| 11 | titleId: Int, | 10 | titleId: Int, |
| 12 | descriptionId: Int? | 11 | descriptionId: Int? |
| 13 | ) : SettingsItem(key, null, setting, titleId, descriptionId) { | 12 | ) : SettingsItem(setting, titleId, descriptionId) { |
| 14 | override val type = TYPE_HEADER | 13 | override val type = TYPE_HEADER |
| 15 | } | 14 | } |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index c7ad60046..599da1380 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt | |||
| @@ -3,19 +3,17 @@ | |||
| 3 | 3 | ||
| 4 | package org.yuzu.yuzu_emu.features.settings.model.view | 4 | package org.yuzu.yuzu_emu.features.settings.model.view |
| 5 | 5 | ||
| 6 | import org.yuzu.yuzu_emu.features.settings.model.Setting | 6 | import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting |
| 7 | 7 | ||
| 8 | /** | 8 | /** |
| 9 | * ViewModel abstraction for an Item in the RecyclerView powering SettingsFragments. | 9 | * ViewModel abstraction for an Item in the RecyclerView powering SettingsFragments. |
| 10 | * Each one corresponds to a [Setting] object, so this class's subclasses | 10 | * Each one corresponds to a [AbstractSetting] object, so this class's subclasses |
| 11 | * should vaguely correspond to those subclasses. There are a few with multiple analogues | 11 | * should vaguely correspond to those subclasses. There are a few with multiple analogues |
| 12 | * and a few with none (Headers, for example, do not correspond to anything in the ini | 12 | * and a few with none (Headers, for example, do not correspond to anything in the ini |
| 13 | * file.) | 13 | * file.) |
| 14 | */ | 14 | */ |
| 15 | abstract class SettingsItem( | 15 | abstract class SettingsItem( |
| 16 | val key: String?, | 16 | var setting: AbstractSetting?, |
| 17 | val section: String?, | ||
| 18 | var setting: Setting?, | ||
| 19 | val nameId: Int, | 17 | val nameId: Int, |
| 20 | val descriptionId: Int? | 18 | val descriptionId: Int? |
| 21 | ) { | 19 | ) { |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SingleChoiceSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SingleChoiceSetting.kt index d094f891e..ed1742ac6 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SingleChoiceSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SingleChoiceSetting.kt | |||
| @@ -3,27 +3,26 @@ | |||
| 3 | 3 | ||
| 4 | package org.yuzu.yuzu_emu.features.settings.model.view | 4 | package org.yuzu.yuzu_emu.features.settings.model.view |
| 5 | 5 | ||
| 6 | import org.yuzu.yuzu_emu.features.settings.model.AbstractIntSetting | ||
| 6 | import org.yuzu.yuzu_emu.features.settings.model.IntSetting | 7 | import org.yuzu.yuzu_emu.features.settings.model.IntSetting |
| 7 | import org.yuzu.yuzu_emu.features.settings.model.Setting | ||
| 8 | 8 | ||
| 9 | class SingleChoiceSetting( | 9 | class SingleChoiceSetting( |
| 10 | key: String, | 10 | setting: AbstractIntSetting?, |
| 11 | section: String, | ||
| 12 | setting: Setting?, | ||
| 13 | titleId: Int, | 11 | titleId: Int, |
| 14 | descriptionId: Int, | 12 | descriptionId: Int, |
| 15 | val choicesId: Int, | 13 | val choicesId: Int, |
| 16 | val valuesId: Int, | 14 | val valuesId: Int, |
| 17 | private val defaultValue: Int, | 15 | val key: String? = null, |
| 18 | ) : SettingsItem(key, section, setting, titleId, descriptionId) { | 16 | val defaultValue: Int? = null |
| 17 | ) : SettingsItem(setting, titleId, descriptionId) { | ||
| 19 | override val type = TYPE_SINGLE_CHOICE | 18 | override val type = TYPE_SINGLE_CHOICE |
| 20 | 19 | ||
| 21 | val selectedValue: Int | 20 | val selectedValue: Int |
| 22 | get() = if (setting != null) { | 21 | get() = if (setting != null) { |
| 23 | val setting = setting as IntSetting | 22 | val setting = setting as IntSetting |
| 24 | setting.value | 23 | setting.int |
| 25 | } else { | 24 | } else { |
| 26 | defaultValue | 25 | defaultValue!! |
| 27 | } | 26 | } |
| 28 | 27 | ||
| 29 | /** | 28 | /** |
| @@ -31,17 +30,11 @@ class SingleChoiceSetting( | |||
| 31 | * initializes a new one and returns it, so it can be added to the Hashmap. | 30 | * initializes a new one and returns it, so it can be added to the Hashmap. |
| 32 | * | 31 | * |
| 33 | * @param selection New value of the int. | 32 | * @param selection New value of the int. |
| 34 | * @return null if overwritten successfully otherwise; a newly created IntSetting. | 33 | * @return the existing setting with the new value applied. |
| 35 | */ | 34 | */ |
| 36 | fun setSelectedValue(selection: Int): IntSetting? { | 35 | fun setSelectedValue(selection: Int): AbstractIntSetting { |
| 37 | return if (setting == null) { | 36 | val intSetting = setting as AbstractIntSetting |
| 38 | val newSetting = IntSetting(key!!, section!!, selection) | 37 | intSetting.int = selection |
| 39 | setting = newSetting | 38 | return intSetting |
| 40 | newSetting | ||
| 41 | } else { | ||
| 42 | val newSetting = setting as IntSetting | ||
| 43 | newSetting.value = selection | ||
| 44 | null | ||
| 45 | } | ||
| 46 | } | 39 | } |
| 47 | } | 40 | } |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SliderSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SliderSetting.kt index 832e9d858..e216d0b69 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SliderSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SliderSetting.kt | |||
| @@ -3,31 +3,32 @@ | |||
| 3 | 3 | ||
| 4 | package org.yuzu.yuzu_emu.features.settings.model.view | 4 | package org.yuzu.yuzu_emu.features.settings.model.view |
| 5 | 5 | ||
| 6 | import org.yuzu.yuzu_emu.features.settings.model.AbstractFloatSetting | ||
| 7 | import org.yuzu.yuzu_emu.features.settings.model.AbstractIntSetting | ||
| 8 | import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting | ||
| 6 | import org.yuzu.yuzu_emu.features.settings.model.FloatSetting | 9 | import org.yuzu.yuzu_emu.features.settings.model.FloatSetting |
| 7 | import org.yuzu.yuzu_emu.features.settings.model.IntSetting | 10 | import org.yuzu.yuzu_emu.features.settings.model.IntSetting |
| 8 | import org.yuzu.yuzu_emu.features.settings.model.Setting | ||
| 9 | import org.yuzu.yuzu_emu.utils.Log | 11 | import org.yuzu.yuzu_emu.utils.Log |
| 10 | import kotlin.math.roundToInt | 12 | import kotlin.math.roundToInt |
| 11 | 13 | ||
| 12 | class SliderSetting( | 14 | class SliderSetting( |
| 13 | key: String, | 15 | setting: AbstractSetting?, |
| 14 | section: String, | ||
| 15 | setting: Setting?, | ||
| 16 | titleId: Int, | 16 | titleId: Int, |
| 17 | descriptionId: Int, | 17 | descriptionId: Int, |
| 18 | val min: Int, | 18 | val min: Int, |
| 19 | val max: Int, | 19 | val max: Int, |
| 20 | val units: String, | 20 | val units: String, |
| 21 | val defaultValue: Int, | 21 | val key: String? = null, |
| 22 | ) : SettingsItem(key, section, setting, titleId, descriptionId) { | 22 | val defaultValue: Int? = null, |
| 23 | ) : SettingsItem(setting, titleId, descriptionId) { | ||
| 23 | override val type = TYPE_SLIDER | 24 | override val type = TYPE_SLIDER |
| 24 | 25 | ||
| 25 | val selectedValue: Int | 26 | val selectedValue: Int |
| 26 | get() { | 27 | get() { |
| 27 | val setting = setting ?: return defaultValue | 28 | val setting = setting ?: return defaultValue!! |
| 28 | return when (setting) { | 29 | return when (setting) { |
| 29 | is IntSetting -> setting.value | 30 | is IntSetting -> setting.int |
| 30 | is FloatSetting -> setting.value.roundToInt() | 31 | is FloatSetting -> setting.float.roundToInt() |
| 31 | else -> { | 32 | else -> { |
| 32 | Log.error("[SliderSetting] Error casting setting type.") | 33 | Log.error("[SliderSetting] Error casting setting type.") |
| 33 | -1 | 34 | -1 |
| @@ -40,18 +41,12 @@ class SliderSetting( | |||
| 40 | * initializes a new one and returns it, so it can be added to the Hashmap. | 41 | * initializes a new one and returns it, so it can be added to the Hashmap. |
| 41 | * | 42 | * |
| 42 | * @param selection New value of the int. | 43 | * @param selection New value of the int. |
| 43 | * @return null if overwritten successfully otherwise; a newly created IntSetting. | 44 | * @return the existing setting with the new value applied. |
| 44 | */ | 45 | */ |
| 45 | fun setSelectedValue(selection: Int): IntSetting? { | 46 | fun setSelectedValue(selection: Int): AbstractIntSetting { |
| 46 | return if (setting == null) { | 47 | val intSetting = setting as AbstractIntSetting |
| 47 | val newSetting = IntSetting(key!!, section!!, selection) | 48 | intSetting.int = selection |
| 48 | setting = newSetting | 49 | return intSetting |
| 49 | newSetting | ||
| 50 | } else { | ||
| 51 | val newSetting = setting as IntSetting | ||
| 52 | newSetting.value = selection | ||
| 53 | null | ||
| 54 | } | ||
| 55 | } | 50 | } |
| 56 | 51 | ||
| 57 | /** | 52 | /** |
| @@ -59,17 +54,11 @@ class SliderSetting( | |||
| 59 | * initializes a new one and returns it, so it can be added to the Hashmap. | 54 | * initializes a new one and returns it, so it can be added to the Hashmap. |
| 60 | * | 55 | * |
| 61 | * @param selection New value of the float. | 56 | * @param selection New value of the float. |
| 62 | * @return null if overwritten successfully otherwise; a newly created FloatSetting. | 57 | * @return the existing setting with the new value applied. |
| 63 | */ | 58 | */ |
| 64 | fun setSelectedValue(selection: Float): FloatSetting? { | 59 | fun setSelectedValue(selection: Float): AbstractFloatSetting { |
| 65 | return if (setting == null) { | 60 | val floatSetting = setting as AbstractFloatSetting |
| 66 | val newSetting = FloatSetting(key!!, section!!, selection) | 61 | floatSetting.float = selection |
| 67 | setting = newSetting | 62 | return floatSetting |
| 68 | newSetting | ||
| 69 | } else { | ||
| 70 | val newSetting = setting as FloatSetting | ||
| 71 | newSetting.value = selection | ||
| 72 | null | ||
| 73 | } | ||
| 74 | } | 63 | } |
| 75 | } | 64 | } |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/StringSingleChoiceSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/StringSingleChoiceSetting.kt index aa1ab2779..1a8173b3c 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/StringSingleChoiceSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/StringSingleChoiceSetting.kt | |||
| @@ -3,19 +3,19 @@ | |||
| 3 | 3 | ||
| 4 | package org.yuzu.yuzu_emu.features.settings.model.view | 4 | package org.yuzu.yuzu_emu.features.settings.model.view |
| 5 | 5 | ||
| 6 | import org.yuzu.yuzu_emu.features.settings.model.Setting | 6 | import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting |
| 7 | import org.yuzu.yuzu_emu.features.settings.model.AbstractStringSetting | ||
| 7 | import org.yuzu.yuzu_emu.features.settings.model.StringSetting | 8 | import org.yuzu.yuzu_emu.features.settings.model.StringSetting |
| 8 | 9 | ||
| 9 | class StringSingleChoiceSetting( | 10 | class StringSingleChoiceSetting( |
| 10 | key: String, | 11 | val key: String? = null, |
| 11 | section: String, | 12 | setting: AbstractSetting?, |
| 12 | setting: Setting?, | ||
| 13 | titleId: Int, | 13 | titleId: Int, |
| 14 | descriptionId: Int, | 14 | descriptionId: Int, |
| 15 | val choicesId: Array<String>, | 15 | val choicesId: Array<String>, |
| 16 | private val valuesId: Array<String>?, | 16 | private val valuesId: Array<String>?, |
| 17 | private val defaultValue: String | 17 | private val defaultValue: String? = null |
| 18 | ) : SettingsItem(key, section, setting, titleId, descriptionId) { | 18 | ) : SettingsItem(setting, titleId, descriptionId) { |
| 19 | override val type = TYPE_STRING_SINGLE_CHOICE | 19 | override val type = TYPE_STRING_SINGLE_CHOICE |
| 20 | 20 | ||
| 21 | fun getValueAt(index: Int): String? { | 21 | fun getValueAt(index: Int): String? { |
| @@ -28,9 +28,9 @@ class StringSingleChoiceSetting( | |||
| 28 | val selectedValue: String | 28 | val selectedValue: String |
| 29 | get() = if (setting != null) { | 29 | get() = if (setting != null) { |
| 30 | val setting = setting as StringSetting | 30 | val setting = setting as StringSetting |
| 31 | setting.value | 31 | setting.string |
| 32 | } else { | 32 | } else { |
| 33 | defaultValue | 33 | defaultValue!! |
| 34 | } | 34 | } |
| 35 | val selectValueIndex: Int | 35 | val selectValueIndex: Int |
| 36 | get() { | 36 | get() { |
| @@ -48,17 +48,11 @@ class StringSingleChoiceSetting( | |||
| 48 | * initializes a new one and returns it, so it can be added to the Hashmap. | 48 | * initializes a new one and returns it, so it can be added to the Hashmap. |
| 49 | * | 49 | * |
| 50 | * @param selection New value of the int. | 50 | * @param selection New value of the int. |
| 51 | * @return null if overwritten successfully otherwise; a newly created IntSetting. | 51 | * @return the existing setting with the new value applied. |
| 52 | */ | 52 | */ |
| 53 | fun setSelectedValue(selection: String?): StringSetting? { | 53 | fun setSelectedValue(selection: String): AbstractStringSetting { |
| 54 | return if (setting == null) { | 54 | val stringSetting = setting as AbstractStringSetting |
| 55 | val newSetting = StringSetting(key!!, section!!, selection!!) | 55 | stringSetting.string = selection |
| 56 | setting = newSetting | 56 | return stringSetting |
| 57 | newSetting | ||
| 58 | } else { | ||
| 59 | val newSetting = setting as StringSetting | ||
| 60 | newSetting.value = selection!! | ||
| 61 | null | ||
| 62 | } | ||
| 63 | } | 57 | } |
| 64 | } | 58 | } |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SubmenuSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SubmenuSetting.kt index cda7a9225..8c1af6396 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SubmenuSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SubmenuSetting.kt | |||
| @@ -3,16 +3,13 @@ | |||
| 3 | 3 | ||
| 4 | package org.yuzu.yuzu_emu.features.settings.model.view | 4 | package org.yuzu.yuzu_emu.features.settings.model.view |
| 5 | 5 | ||
| 6 | import org.yuzu.yuzu_emu.features.settings.model.Setting | 6 | import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting |
| 7 | 7 | ||
| 8 | class SubmenuSetting( | 8 | class SubmenuSetting( |
| 9 | key: String?, | 9 | setting: AbstractSetting?, |
| 10 | setting: Setting?, | ||
| 11 | titleId: Int, | 10 | titleId: Int, |
| 12 | descriptionId: Int, | 11 | descriptionId: Int, |
| 13 | val menuKey: String | 12 | val menuKey: String |
| 14 | ) : SettingsItem( | 13 | ) : SettingsItem(setting, titleId, descriptionId) { |
| 15 | key, null, setting, titleId, descriptionId | ||
| 16 | ) { | ||
| 17 | override val type = TYPE_SUBMENU | 14 | override val type = TYPE_SUBMENU |
| 18 | } | 15 | } |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SwitchSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SwitchSetting.kt index b793012cc..6ed1aa880 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SwitchSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SwitchSetting.kt | |||
| @@ -3,67 +3,42 @@ | |||
| 3 | 3 | ||
| 4 | package org.yuzu.yuzu_emu.features.settings.model.view | 4 | package org.yuzu.yuzu_emu.features.settings.model.view |
| 5 | 5 | ||
| 6 | import org.yuzu.yuzu_emu.R | 6 | import org.yuzu.yuzu_emu.features.settings.model.AbstractBooleanSetting |
| 7 | import org.yuzu.yuzu_emu.YuzuApplication | 7 | import org.yuzu.yuzu_emu.features.settings.model.AbstractIntSetting |
| 8 | import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting | ||
| 8 | import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting | 9 | import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting |
| 9 | import org.yuzu.yuzu_emu.features.settings.model.IntSetting | 10 | import org.yuzu.yuzu_emu.features.settings.model.IntSetting |
| 10 | import org.yuzu.yuzu_emu.features.settings.model.Setting | 11 | import org.yuzu.yuzu_emu.utils.Log |
| 11 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsFragmentView | ||
| 12 | 12 | ||
| 13 | class SwitchSetting : SettingsItem { | 13 | class SwitchSetting( |
| 14 | setting: AbstractSetting, | ||
| 15 | titleId: Int, | ||
| 16 | descriptionId: Int, | ||
| 17 | val key: String? = null, | ||
| 18 | val defaultValue: Boolean? = null | ||
| 19 | ) : SettingsItem(setting, titleId, descriptionId) { | ||
| 14 | override val type = TYPE_SWITCH | 20 | override val type = TYPE_SWITCH |
| 15 | 21 | ||
| 16 | private var defaultValue: Boolean | ||
| 17 | private var showPerformanceWarning: Boolean | ||
| 18 | private var fragmentView: SettingsFragmentView? = null | ||
| 19 | |||
| 20 | constructor( | ||
| 21 | key: String, | ||
| 22 | section: String, | ||
| 23 | setting: Setting?, | ||
| 24 | titleId: Int, | ||
| 25 | descriptionId: Int, | ||
| 26 | defaultValue: Boolean | ||
| 27 | ) : super(key, section, setting, titleId, descriptionId) { | ||
| 28 | this.defaultValue = defaultValue | ||
| 29 | showPerformanceWarning = false | ||
| 30 | } | ||
| 31 | |||
| 32 | constructor( | ||
| 33 | key: String, | ||
| 34 | section: String, | ||
| 35 | titleId: Int, | ||
| 36 | descriptionId: Int, | ||
| 37 | defaultValue: Boolean, | ||
| 38 | setting: Setting, | ||
| 39 | show_performance_warning: Boolean, | ||
| 40 | view: SettingsFragmentView | ||
| 41 | ) : super(key, section, setting, titleId, descriptionId) { | ||
| 42 | this.defaultValue = defaultValue | ||
| 43 | fragmentView = view | ||
| 44 | showPerformanceWarning = show_performance_warning | ||
| 45 | } | ||
| 46 | |||
| 47 | val isChecked: Boolean | 22 | val isChecked: Boolean |
| 48 | get() { | 23 | get() { |
| 49 | if (setting == null) { | 24 | if (setting == null) { |
| 50 | return defaultValue | 25 | return defaultValue!! |
| 51 | } | 26 | } |
| 52 | 27 | ||
| 53 | // Try integer setting | 28 | // Try integer setting |
| 54 | try { | 29 | try { |
| 55 | val setting = setting as IntSetting | 30 | val setting = setting as AbstractIntSetting |
| 56 | return setting.value == 1 | 31 | return setting.int == 1 |
| 57 | } catch (_: ClassCastException) { | 32 | } catch (_: ClassCastException) { |
| 58 | } | 33 | } |
| 59 | 34 | ||
| 60 | // Try boolean setting | 35 | // Try boolean setting |
| 61 | try { | 36 | try { |
| 62 | val setting = setting as BooleanSetting | 37 | val setting = setting as AbstractBooleanSetting |
| 63 | return setting.value | 38 | return setting.boolean |
| 64 | } catch (_: ClassCastException) { | 39 | } catch (_: ClassCastException) { |
| 65 | } | 40 | } |
| 66 | return defaultValue | 41 | return defaultValue!! |
| 67 | } | 42 | } |
| 68 | 43 | ||
| 69 | /** | 44 | /** |
| @@ -71,24 +46,20 @@ class SwitchSetting : SettingsItem { | |||
| 71 | * initializes a new one and returns it, so it can be added to the Hashmap. | 46 | * initializes a new one and returns it, so it can be added to the Hashmap. |
| 72 | * | 47 | * |
| 73 | * @param checked Pretty self explanatory. | 48 | * @param checked Pretty self explanatory. |
| 74 | * @return null if overwritten successfully; otherwise, a newly created BooleanSetting. | 49 | * @return the existing setting with the new value applied. |
| 75 | */ | 50 | */ |
| 76 | fun setChecked(checked: Boolean): IntSetting? { | 51 | fun setChecked(checked: Boolean): AbstractSetting { |
| 77 | // Show a performance warning if the setting has been disabled | 52 | // Try integer setting |
| 78 | if (showPerformanceWarning && !checked) { | 53 | try { |
| 79 | fragmentView!!.showToastMessage( | 54 | val setting = setting as AbstractIntSetting |
| 80 | YuzuApplication.appContext.getString(R.string.performance_warning), true | 55 | setting.int = if (checked) 1 else 0 |
| 81 | ) | 56 | return setting |
| 57 | } catch (_: ClassCastException) { | ||
| 82 | } | 58 | } |
| 83 | 59 | ||
| 84 | return if (setting == null) { | 60 | // Try boolean setting |
| 85 | val newSetting = IntSetting(key!!, section!!, if (checked) 1 else 0) | 61 | val setting = setting as AbstractBooleanSetting |
| 86 | setting = newSetting | 62 | setting.boolean = checked |
| 87 | newSetting | 63 | return setting |
| 88 | } else { | ||
| 89 | val newSetting = setting as IntSetting | ||
| 90 | newSetting.value = if (checked) 1 else 0 | ||
| 91 | null | ||
| 92 | } | ||
| 93 | } | 64 | } |
| 94 | } | 65 | } |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt index cdbdc78a0..286823562 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt | |||
| @@ -101,9 +101,7 @@ class SettingsAdapter( | |||
| 101 | 101 | ||
| 102 | fun onBooleanClick(item: SwitchSetting, position: Int, checked: Boolean) { | 102 | fun onBooleanClick(item: SwitchSetting, position: Int, checked: Boolean) { |
| 103 | val setting = item.setChecked(checked) | 103 | val setting = item.setChecked(checked) |
| 104 | if (setting != null) { | 104 | fragmentView.putSetting(setting) |
| 105 | fragmentView.putSetting(setting) | ||
| 106 | } | ||
| 107 | fragmentView.onSettingChanged() | 105 | fragmentView.onSettingChanged() |
| 108 | } | 106 | } |
| 109 | 107 | ||
| @@ -209,7 +207,7 @@ class SettingsAdapter( | |||
| 209 | .setPositiveButton(android.R.string.ok, this) | 207 | .setPositiveButton(android.R.string.ok, this) |
| 210 | .setNegativeButton(android.R.string.cancel, defaultCancelListener) | 208 | .setNegativeButton(android.R.string.cancel, defaultCancelListener) |
| 211 | .setNeutralButton(R.string.slider_default) { dialog: DialogInterface, which: Int -> | 209 | .setNeutralButton(R.string.slider_default) { dialog: DialogInterface, which: Int -> |
| 212 | sliderBinding.slider.value = item.defaultValue.toFloat() | 210 | sliderBinding.slider.value = item.defaultValue!!.toFloat() |
| 213 | onClick(dialog, which) | 211 | onClick(dialog, which) |
| 214 | } | 212 | } |
| 215 | .show() | 213 | .show() |
| @@ -230,19 +228,15 @@ class SettingsAdapter( | |||
| 230 | 228 | ||
| 231 | // Get the backing Setting, which may be null (if for example it was missing from the file) | 229 | // Get the backing Setting, which may be null (if for example it was missing from the file) |
| 232 | val setting = scSetting.setSelectedValue(value) | 230 | val setting = scSetting.setSelectedValue(value) |
| 233 | if (setting != null) { | 231 | fragmentView.putSetting(setting) |
| 234 | fragmentView.putSetting(setting) | ||
| 235 | } | ||
| 236 | closeDialog() | 232 | closeDialog() |
| 237 | } | 233 | } |
| 238 | is StringSingleChoiceSetting -> { | 234 | is StringSingleChoiceSetting -> { |
| 239 | val scSetting = clickedItem as StringSingleChoiceSetting | 235 | val scSetting = clickedItem as StringSingleChoiceSetting |
| 240 | val value = scSetting.getValueAt(which) | 236 | val value = scSetting.getValueAt(which) |
| 241 | if (scSetting.selectedValue != value) fragmentView.onSettingChanged() | 237 | if (scSetting.selectedValue != value) fragmentView.onSettingChanged() |
| 242 | val setting = scSetting.setSelectedValue(value) | 238 | val setting = scSetting.setSelectedValue(value!!) |
| 243 | if (setting != null) { | 239 | fragmentView.putSetting(setting) |
| 244 | fragmentView.putSetting(setting) | ||
| 245 | } | ||
| 246 | closeDialog() | 240 | closeDialog() |
| 247 | } | 241 | } |
| 248 | is SliderSetting -> { | 242 | is SliderSetting -> { |
| @@ -253,14 +247,10 @@ class SettingsAdapter( | |||
| 253 | if (sliderSetting.setting is FloatSetting) { | 247 | if (sliderSetting.setting is FloatSetting) { |
| 254 | val value = sliderProgress.toFloat() | 248 | val value = sliderProgress.toFloat() |
| 255 | val setting = sliderSetting.setSelectedValue(value) | 249 | val setting = sliderSetting.setSelectedValue(value) |
| 256 | if (setting != null) { | 250 | fragmentView.putSetting(setting) |
| 257 | fragmentView.putSetting(setting) | ||
| 258 | } | ||
| 259 | } else { | 251 | } else { |
| 260 | val setting = sliderSetting.setSelectedValue(sliderProgress) | 252 | val setting = sliderSetting.setSelectedValue(sliderProgress) |
| 261 | if (setting != null) { | 253 | fragmentView.putSetting(setting) |
| 262 | fragmentView.putSetting(setting) | ||
| 263 | } | ||
| 264 | } | 254 | } |
| 265 | closeDialog() | 255 | closeDialog() |
| 266 | } | 256 | } |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt index a9cfdc21f..687d06f2f 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt | |||
| @@ -15,8 +15,7 @@ import androidx.fragment.app.Fragment | |||
| 15 | import androidx.recyclerview.widget.LinearLayoutManager | 15 | import androidx.recyclerview.widget.LinearLayoutManager |
| 16 | import com.google.android.material.divider.MaterialDividerItemDecoration | 16 | import com.google.android.material.divider.MaterialDividerItemDecoration |
| 17 | import org.yuzu.yuzu_emu.databinding.FragmentSettingsBinding | 17 | import org.yuzu.yuzu_emu.databinding.FragmentSettingsBinding |
| 18 | import org.yuzu.yuzu_emu.features.settings.model.Setting | 18 | import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting |
| 19 | import org.yuzu.yuzu_emu.features.settings.model.Settings | ||
| 20 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem | 19 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem |
| 21 | 20 | ||
| 22 | class SettingsFragment : Fragment(), SettingsFragmentView { | 21 | class SettingsFragment : Fragment(), SettingsFragmentView { |
| @@ -91,7 +90,7 @@ class SettingsFragment : Fragment(), SettingsFragmentView { | |||
| 91 | activityView!!.showToastMessage(message!!, is_long) | 90 | activityView!!.showToastMessage(message!!, is_long) |
| 92 | } | 91 | } |
| 93 | 92 | ||
| 94 | override fun putSetting(setting: Setting) { | 93 | override fun putSetting(setting: AbstractSetting) { |
| 95 | fragmentPresenter.putSetting(setting) | 94 | fragmentPresenter.putSetting(setting) |
| 96 | } | 95 | } |
| 97 | 96 | ||
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index aeb262ce6..af85065d0 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt | |||
| @@ -6,7 +6,9 @@ package org.yuzu.yuzu_emu.features.settings.ui | |||
| 6 | import android.text.TextUtils | 6 | import android.text.TextUtils |
| 7 | import androidx.appcompat.app.AppCompatActivity | 7 | import androidx.appcompat.app.AppCompatActivity |
| 8 | import org.yuzu.yuzu_emu.R | 8 | import org.yuzu.yuzu_emu.R |
| 9 | import org.yuzu.yuzu_emu.features.settings.model.Setting | 9 | import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting |
| 10 | import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting | ||
| 11 | import org.yuzu.yuzu_emu.features.settings.model.IntSetting | ||
| 10 | import org.yuzu.yuzu_emu.features.settings.model.Settings | 12 | import org.yuzu.yuzu_emu.features.settings.model.Settings |
| 11 | import org.yuzu.yuzu_emu.features.settings.model.view.* | 13 | import org.yuzu.yuzu_emu.features.settings.model.view.* |
| 12 | import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile | 14 | import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile |
| @@ -28,8 +30,11 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) | |||
| 28 | loadSettingsList() | 30 | loadSettingsList() |
| 29 | } | 31 | } |
| 30 | 32 | ||
| 31 | fun putSetting(setting: Setting) { | 33 | fun putSetting(setting: AbstractSetting) { |
| 32 | settings.getSection(setting.section)!!.putSetting(setting) | 34 | val section = settings.getSection(setting.section!!)!! |
| 35 | if (section.getSetting(setting.key!!) == null) { | ||
| 36 | section.putSetting(setting) | ||
| 37 | } | ||
| 33 | } | 38 | } |
| 34 | 39 | ||
| 35 | fun loadSettingsList() { | 40 | fun loadSettingsList() { |
| @@ -61,7 +66,6 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) | |||
| 61 | add( | 66 | add( |
| 62 | SubmenuSetting( | 67 | SubmenuSetting( |
| 63 | null, | 68 | null, |
| 64 | null, | ||
| 65 | R.string.preferences_general, | 69 | R.string.preferences_general, |
| 66 | 0, | 70 | 0, |
| 67 | Settings.SECTION_GENERAL | 71 | Settings.SECTION_GENERAL |
| @@ -70,7 +74,6 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) | |||
| 70 | add( | 74 | add( |
| 71 | SubmenuSetting( | 75 | SubmenuSetting( |
| 72 | null, | 76 | null, |
| 73 | null, | ||
| 74 | R.string.preferences_system, | 77 | R.string.preferences_system, |
| 75 | 0, | 78 | 0, |
| 76 | Settings.SECTION_SYSTEM | 79 | Settings.SECTION_SYSTEM |
| @@ -79,7 +82,6 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) | |||
| 79 | add( | 82 | add( |
| 80 | SubmenuSetting( | 83 | SubmenuSetting( |
| 81 | null, | 84 | null, |
| 82 | null, | ||
| 83 | R.string.preferences_graphics, | 85 | R.string.preferences_graphics, |
| 84 | 0, | 86 | 0, |
| 85 | Settings.SECTION_RENDERER | 87 | Settings.SECTION_RENDERER |
| @@ -88,7 +90,6 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) | |||
| 88 | add( | 90 | add( |
| 89 | SubmenuSetting( | 91 | SubmenuSetting( |
| 90 | null, | 92 | null, |
| 91 | null, | ||
| 92 | R.string.preferences_audio, | 93 | R.string.preferences_audio, |
| 93 | 0, | 94 | 0, |
| 94 | Settings.SECTION_AUDIO | 95 | Settings.SECTION_AUDIO |
| @@ -99,45 +100,36 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) | |||
| 99 | 100 | ||
| 100 | private fun addGeneralSettings(sl: ArrayList<SettingsItem>) { | 101 | private fun addGeneralSettings(sl: ArrayList<SettingsItem>) { |
| 101 | settingsActivity.setTitle(R.string.preferences_general) | 102 | settingsActivity.setTitle(R.string.preferences_general) |
| 102 | val rendererSection = settings.getSection(Settings.SECTION_RENDERER) | ||
| 103 | val frameLimitEnable = | ||
| 104 | rendererSection!!.getSetting(SettingsFile.KEY_RENDERER_USE_SPEED_LIMIT) | ||
| 105 | val frameLimitValue = rendererSection.getSetting(SettingsFile.KEY_RENDERER_SPEED_LIMIT) | ||
| 106 | val cpuSection = settings.getSection(Settings.SECTION_CPU) | ||
| 107 | val cpuAccuracy = cpuSection!!.getSetting(SettingsFile.KEY_CPU_ACCURACY) | ||
| 108 | sl.apply { | 103 | sl.apply { |
| 109 | add( | 104 | add( |
| 110 | SwitchSetting( | 105 | SwitchSetting( |
| 111 | SettingsFile.KEY_RENDERER_USE_SPEED_LIMIT, | 106 | IntSetting.RENDERER_USE_SPEED_LIMIT, |
| 112 | Settings.SECTION_RENDERER, | ||
| 113 | frameLimitEnable, | ||
| 114 | R.string.frame_limit_enable, | 107 | R.string.frame_limit_enable, |
| 115 | R.string.frame_limit_enable_description, | 108 | R.string.frame_limit_enable_description, |
| 109 | IntSetting.RENDERER_USE_SPEED_LIMIT.key, | ||
| 116 | true | 110 | true |
| 117 | ) | 111 | ) |
| 118 | ) | 112 | ) |
| 119 | add( | 113 | add( |
| 120 | SliderSetting( | 114 | SliderSetting( |
| 121 | SettingsFile.KEY_RENDERER_SPEED_LIMIT, | 115 | IntSetting.RENDERER_SPEED_LIMIT, |
| 122 | Settings.SECTION_RENDERER, | ||
| 123 | frameLimitValue, | ||
| 124 | R.string.frame_limit_slider, | 116 | R.string.frame_limit_slider, |
| 125 | R.string.frame_limit_slider_description, | 117 | R.string.frame_limit_slider_description, |
| 126 | 1, | 118 | 1, |
| 127 | 200, | 119 | 200, |
| 128 | "%", | 120 | "%", |
| 121 | IntSetting.RENDERER_SPEED_LIMIT.key, | ||
| 129 | 100 | 122 | 100 |
| 130 | ) | 123 | ) |
| 131 | ) | 124 | ) |
| 132 | add( | 125 | add( |
| 133 | SingleChoiceSetting( | 126 | SingleChoiceSetting( |
| 134 | SettingsFile.KEY_CPU_ACCURACY, | 127 | IntSetting.CPU_ACCURACY, |
| 135 | Settings.SECTION_CPU, | ||
| 136 | cpuAccuracy, | ||
| 137 | R.string.cpu_accuracy, | 128 | R.string.cpu_accuracy, |
| 138 | 0, | 129 | 0, |
| 139 | R.array.cpuAccuracyNames, | 130 | R.array.cpuAccuracyNames, |
| 140 | R.array.cpuAccuracyValues, | 131 | R.array.cpuAccuracyValues, |
| 132 | IntSetting.CPU_ACCURACY.key, | ||
| 141 | 0 | 133 | 0 |
| 142 | ) | 134 | ) |
| 143 | ) | 135 | ) |
| @@ -146,42 +138,35 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) | |||
| 146 | 138 | ||
| 147 | private fun addSystemSettings(sl: ArrayList<SettingsItem>) { | 139 | private fun addSystemSettings(sl: ArrayList<SettingsItem>) { |
| 148 | settingsActivity.setTitle(R.string.preferences_system) | 140 | settingsActivity.setTitle(R.string.preferences_system) |
| 149 | val systemSection = settings.getSection(Settings.SECTION_SYSTEM) | ||
| 150 | val dockedMode = systemSection!!.getSetting(SettingsFile.KEY_USE_DOCKED_MODE) | ||
| 151 | val region = systemSection.getSetting(SettingsFile.KEY_REGION_INDEX) | ||
| 152 | val language = systemSection.getSetting(SettingsFile.KEY_LANGUAGE_INDEX) | ||
| 153 | sl.apply { | 141 | sl.apply { |
| 154 | add( | 142 | add( |
| 155 | SwitchSetting( | 143 | SwitchSetting( |
| 156 | SettingsFile.KEY_USE_DOCKED_MODE, | 144 | IntSetting.USE_DOCKED_MODE, |
| 157 | Settings.SECTION_SYSTEM, | ||
| 158 | dockedMode, | ||
| 159 | R.string.use_docked_mode, | 145 | R.string.use_docked_mode, |
| 160 | R.string.use_docked_mode_description, | 146 | R.string.use_docked_mode_description, |
| 161 | false, | 147 | IntSetting.USE_DOCKED_MODE.key, |
| 148 | false | ||
| 162 | ) | 149 | ) |
| 163 | ) | 150 | ) |
| 164 | add( | 151 | add( |
| 165 | SingleChoiceSetting( | 152 | SingleChoiceSetting( |
| 166 | SettingsFile.KEY_REGION_INDEX, | 153 | IntSetting.REGION_INDEX, |
| 167 | Settings.SECTION_SYSTEM, | ||
| 168 | region, | ||
| 169 | R.string.emulated_region, | 154 | R.string.emulated_region, |
| 170 | 0, | 155 | 0, |
| 171 | R.array.regionNames, | 156 | R.array.regionNames, |
| 172 | R.array.regionValues, | 157 | R.array.regionValues, |
| 158 | IntSetting.REGION_INDEX.key, | ||
| 173 | -1 | 159 | -1 |
| 174 | ) | 160 | ) |
| 175 | ) | 161 | ) |
| 176 | add( | 162 | add( |
| 177 | SingleChoiceSetting( | 163 | SingleChoiceSetting( |
| 178 | SettingsFile.KEY_LANGUAGE_INDEX, | 164 | IntSetting.LANGUAGE_INDEX, |
| 179 | Settings.SECTION_SYSTEM, | ||
| 180 | language, | ||
| 181 | R.string.emulated_language, | 165 | R.string.emulated_language, |
| 182 | 0, | 166 | 0, |
| 183 | R.array.languageNames, | 167 | R.array.languageNames, |
| 184 | R.array.languageValues, | 168 | R.array.languageValues, |
| 169 | IntSetting.LANGUAGE_INDEX.key, | ||
| 185 | 1 | 170 | 1 |
| 186 | ) | 171 | ) |
| 187 | ) | 172 | ) |
| @@ -190,133 +175,106 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) | |||
| 190 | 175 | ||
| 191 | private fun addGraphicsSettings(sl: ArrayList<SettingsItem>) { | 176 | private fun addGraphicsSettings(sl: ArrayList<SettingsItem>) { |
| 192 | settingsActivity.setTitle(R.string.preferences_graphics) | 177 | settingsActivity.setTitle(R.string.preferences_graphics) |
| 193 | val rendererSection = settings.getSection(Settings.SECTION_RENDERER) | ||
| 194 | val rendererBackend = rendererSection!!.getSetting(SettingsFile.KEY_RENDERER_BACKEND) | ||
| 195 | val rendererAccuracy = rendererSection.getSetting(SettingsFile.KEY_RENDERER_ACCURACY) | ||
| 196 | val rendererResolution = rendererSection.getSetting(SettingsFile.KEY_RENDERER_RESOLUTION) | ||
| 197 | val rendererScalingFilter = | ||
| 198 | rendererSection.getSetting(SettingsFile.KEY_RENDERER_SCALING_FILTER) | ||
| 199 | val rendererAntiAliasing = | ||
| 200 | rendererSection.getSetting(SettingsFile.KEY_RENDERER_ANTI_ALIASING) | ||
| 201 | val rendererAspectRatio = | ||
| 202 | rendererSection.getSetting(SettingsFile.KEY_RENDERER_ASPECT_RATIO) | ||
| 203 | val rendererUseDiskShaderCache = | ||
| 204 | rendererSection.getSetting(SettingsFile.KEY_RENDERER_USE_DISK_SHADER_CACHE) | ||
| 205 | val rendererForceMaxClocks = | ||
| 206 | rendererSection.getSetting(SettingsFile.KEY_RENDERER_FORCE_MAX_CLOCK) | ||
| 207 | val rendererAsynchronousShaders = | ||
| 208 | rendererSection.getSetting(SettingsFile.KEY_RENDERER_ASYNCHRONOUS_SHADERS) | ||
| 209 | val rendererDebug = rendererSection.getSetting(SettingsFile.KEY_RENDERER_DEBUG) | ||
| 210 | sl.apply { | 178 | sl.apply { |
| 211 | add( | 179 | add( |
| 212 | SingleChoiceSetting( | 180 | SingleChoiceSetting( |
| 213 | SettingsFile.KEY_RENDERER_BACKEND, | 181 | IntSetting.RENDERER_BACKEND, |
| 214 | Settings.SECTION_RENDERER, | ||
| 215 | rendererBackend, | ||
| 216 | R.string.renderer_api, | 182 | R.string.renderer_api, |
| 217 | 0, | 183 | 0, |
| 218 | R.array.rendererApiNames, | 184 | R.array.rendererApiNames, |
| 219 | R.array.rendererApiValues, | 185 | R.array.rendererApiValues, |
| 186 | IntSetting.RENDERER_BACKEND.key, | ||
| 220 | 1 | 187 | 1 |
| 221 | ) | 188 | ) |
| 222 | ) | 189 | ) |
| 223 | add( | 190 | add( |
| 224 | SingleChoiceSetting( | 191 | SingleChoiceSetting( |
| 225 | SettingsFile.KEY_RENDERER_ACCURACY, | 192 | IntSetting.RENDERER_ACCURACY, |
| 226 | Settings.SECTION_RENDERER, | ||
| 227 | rendererAccuracy, | ||
| 228 | R.string.renderer_accuracy, | 193 | R.string.renderer_accuracy, |
| 229 | 0, | 194 | 0, |
| 230 | R.array.rendererAccuracyNames, | 195 | R.array.rendererAccuracyNames, |
| 231 | R.array.rendererAccuracyValues, | 196 | R.array.rendererAccuracyValues, |
| 197 | IntSetting.RENDERER_ACCURACY.key, | ||
| 232 | 0 | 198 | 0 |
| 233 | ) | 199 | ) |
| 234 | ) | 200 | ) |
| 235 | add( | 201 | add( |
| 236 | SingleChoiceSetting( | 202 | SingleChoiceSetting( |
| 237 | SettingsFile.KEY_RENDERER_RESOLUTION, | 203 | IntSetting.RENDERER_RESOLUTION, |
| 238 | Settings.SECTION_RENDERER, | ||
| 239 | rendererResolution, | ||
| 240 | R.string.renderer_resolution, | 204 | R.string.renderer_resolution, |
| 241 | 0, | 205 | 0, |
| 242 | R.array.rendererResolutionNames, | 206 | R.array.rendererResolutionNames, |
| 243 | R.array.rendererResolutionValues, | 207 | R.array.rendererResolutionValues, |
| 208 | IntSetting.RENDERER_RESOLUTION.key, | ||
| 244 | 2 | 209 | 2 |
| 245 | ) | 210 | ) |
| 246 | ) | 211 | ) |
| 247 | add( | 212 | add( |
| 248 | SingleChoiceSetting( | 213 | SingleChoiceSetting( |
| 249 | SettingsFile.KEY_RENDERER_SCALING_FILTER, | 214 | IntSetting.RENDERER_SCALING_FILTER, |
| 250 | Settings.SECTION_RENDERER, | ||
| 251 | rendererScalingFilter, | ||
| 252 | R.string.renderer_scaling_filter, | 215 | R.string.renderer_scaling_filter, |
| 253 | 0, | 216 | 0, |
| 254 | R.array.rendererScalingFilterNames, | 217 | R.array.rendererScalingFilterNames, |
| 255 | R.array.rendererScalingFilterValues, | 218 | R.array.rendererScalingFilterValues, |
| 219 | IntSetting.RENDERER_SCALING_FILTER.key, | ||
| 256 | 1 | 220 | 1 |
| 257 | ) | 221 | ) |
| 258 | ) | 222 | ) |
| 259 | add( | 223 | add( |
| 260 | SingleChoiceSetting( | 224 | SingleChoiceSetting( |
| 261 | SettingsFile.KEY_RENDERER_ANTI_ALIASING, | 225 | IntSetting.RENDERER_ANTI_ALIASING, |
| 262 | Settings.SECTION_RENDERER, | ||
| 263 | rendererAntiAliasing, | ||
| 264 | R.string.renderer_anti_aliasing, | 226 | R.string.renderer_anti_aliasing, |
| 265 | 0, | 227 | 0, |
| 266 | R.array.rendererAntiAliasingNames, | 228 | R.array.rendererAntiAliasingNames, |
| 267 | R.array.rendererAntiAliasingValues, | 229 | R.array.rendererAntiAliasingValues, |
| 230 | IntSetting.RENDERER_ANTI_ALIASING.key, | ||
| 268 | 0 | 231 | 0 |
| 269 | ) | 232 | ) |
| 270 | ) | 233 | ) |
| 271 | add( | 234 | add( |
| 272 | SingleChoiceSetting( | 235 | SingleChoiceSetting( |
| 273 | SettingsFile.KEY_RENDERER_ASPECT_RATIO, | 236 | IntSetting.RENDERER_ASPECT_RATIO, |
| 274 | Settings.SECTION_RENDERER, | ||
| 275 | rendererAspectRatio, | ||
| 276 | R.string.renderer_aspect_ratio, | 237 | R.string.renderer_aspect_ratio, |
| 277 | 0, | 238 | 0, |
| 278 | R.array.rendererAspectRatioNames, | 239 | R.array.rendererAspectRatioNames, |
| 279 | R.array.rendererAspectRatioValues, | 240 | R.array.rendererAspectRatioValues, |
| 241 | IntSetting.RENDERER_ASPECT_RATIO.key, | ||
| 280 | 0 | 242 | 0 |
| 281 | ) | 243 | ) |
| 282 | ) | 244 | ) |
| 283 | add( | 245 | add( |
| 284 | SwitchSetting( | 246 | SwitchSetting( |
| 285 | SettingsFile.KEY_RENDERER_USE_DISK_SHADER_CACHE, | 247 | IntSetting.RENDERER_USE_DISK_SHADER_CACHE, |
| 286 | Settings.SECTION_RENDERER, | ||
| 287 | rendererUseDiskShaderCache, | ||
| 288 | R.string.use_disk_shader_cache, | 248 | R.string.use_disk_shader_cache, |
| 289 | R.string.use_disk_shader_cache_description, | 249 | R.string.use_disk_shader_cache_description, |
| 250 | IntSetting.RENDERER_USE_DISK_SHADER_CACHE.key, | ||
| 290 | true | 251 | true |
| 291 | ) | 252 | ) |
| 292 | ) | 253 | ) |
| 293 | add( | 254 | add( |
| 294 | SwitchSetting( | 255 | SwitchSetting( |
| 295 | SettingsFile.KEY_RENDERER_FORCE_MAX_CLOCK, | 256 | IntSetting.RENDERER_FORCE_MAX_CLOCK, |
| 296 | Settings.SECTION_RENDERER, | ||
| 297 | rendererForceMaxClocks, | ||
| 298 | R.string.renderer_force_max_clock, | 257 | R.string.renderer_force_max_clock, |
| 299 | R.string.renderer_force_max_clock_description, | 258 | R.string.renderer_force_max_clock_description, |
| 259 | IntSetting.RENDERER_FORCE_MAX_CLOCK.key, | ||
| 300 | true | 260 | true |
| 301 | ) | 261 | ) |
| 302 | ) | 262 | ) |
| 303 | add( | 263 | add( |
| 304 | SwitchSetting( | 264 | SwitchSetting( |
| 305 | SettingsFile.KEY_RENDERER_ASYNCHRONOUS_SHADERS, | 265 | IntSetting.RENDERER_ASYNCHRONOUS_SHADERS, |
| 306 | Settings.SECTION_RENDERER, | ||
| 307 | rendererAsynchronousShaders, | ||
| 308 | R.string.renderer_asynchronous_shaders, | 266 | R.string.renderer_asynchronous_shaders, |
| 309 | R.string.renderer_asynchronous_shaders_description, | 267 | R.string.renderer_asynchronous_shaders_description, |
| 268 | IntSetting.RENDERER_ASYNCHRONOUS_SHADERS.key, | ||
| 310 | false | 269 | false |
| 311 | ) | 270 | ) |
| 312 | ) | 271 | ) |
| 313 | add( | 272 | add( |
| 314 | SwitchSetting( | 273 | SwitchSetting( |
| 315 | SettingsFile.KEY_RENDERER_DEBUG, | 274 | IntSetting.RENDERER_DEBUG, |
| 316 | Settings.SECTION_RENDERER, | ||
| 317 | rendererDebug, | ||
| 318 | R.string.renderer_debug, | 275 | R.string.renderer_debug, |
| 319 | R.string.renderer_debug_description, | 276 | R.string.renderer_debug_description, |
| 277 | IntSetting.RENDERER_DEBUG.key, | ||
| 320 | false | 278 | false |
| 321 | ) | 279 | ) |
| 322 | ) | 280 | ) |
| @@ -325,18 +283,15 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) | |||
| 325 | 283 | ||
| 326 | private fun addAudioSettings(sl: ArrayList<SettingsItem>) { | 284 | private fun addAudioSettings(sl: ArrayList<SettingsItem>) { |
| 327 | settingsActivity.setTitle(R.string.preferences_audio) | 285 | settingsActivity.setTitle(R.string.preferences_audio) |
| 328 | val audioSection = settings.getSection(Settings.SECTION_AUDIO) | ||
| 329 | val audioVolume = audioSection!!.getSetting(SettingsFile.KEY_AUDIO_VOLUME) | ||
| 330 | sl.add( | 286 | sl.add( |
| 331 | SliderSetting( | 287 | SliderSetting( |
| 332 | SettingsFile.KEY_AUDIO_VOLUME, | 288 | IntSetting.AUDIO_VOLUME, |
| 333 | Settings.SECTION_AUDIO, | ||
| 334 | audioVolume, | ||
| 335 | R.string.audio_volume, | 289 | R.string.audio_volume, |
| 336 | R.string.audio_volume_description, | 290 | R.string.audio_volume_description, |
| 337 | 0, | 291 | 0, |
| 338 | 100, | 292 | 100, |
| 339 | "%", | 293 | "%", |
| 294 | IntSetting.AUDIO_VOLUME.key, | ||
| 340 | 100 | 295 | 100 |
| 341 | ) | 296 | ) |
| 342 | ) | 297 | ) |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentView.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentView.kt index 9a14c5795..1ebe35eaa 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentView.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentView.kt | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | package org.yuzu.yuzu_emu.features.settings.ui | 4 | package org.yuzu.yuzu_emu.features.settings.ui |
| 5 | 5 | ||
| 6 | import org.yuzu.yuzu_emu.features.settings.model.Setting | 6 | import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting |
| 7 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem | 7 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem |
| 8 | 8 | ||
| 9 | /** | 9 | /** |
| @@ -49,7 +49,7 @@ interface SettingsFragmentView { | |||
| 49 | * | 49 | * |
| 50 | * @param setting The (possibly previously missing) new setting. | 50 | * @param setting The (possibly previously missing) new setting. |
| 51 | */ | 51 | */ |
| 52 | fun putSetting(setting: Setting) | 52 | fun putSetting(setting: AbstractSetting) |
| 53 | 53 | ||
| 54 | /** | 54 | /** |
| 55 | * Have the fragment tell the containing Activity that a setting was modified. | 55 | * Have the fragment tell the containing Activity that a setting was modified. |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/utils/SettingsFile.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/utils/SettingsFile.kt index 493d90954..9c6515a54 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/utils/SettingsFile.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/utils/SettingsFile.kt | |||
| @@ -21,32 +21,7 @@ import java.util.* | |||
| 21 | */ | 21 | */ |
| 22 | object SettingsFile { | 22 | object SettingsFile { |
| 23 | const val FILE_NAME_CONFIG = "config" | 23 | const val FILE_NAME_CONFIG = "config" |
| 24 | const val KEY_DESIGN = "design" | 24 | |
| 25 | |||
| 26 | // CPU | ||
| 27 | const val KEY_CPU_ACCURACY = "cpu_accuracy" | ||
| 28 | |||
| 29 | // System | ||
| 30 | const val KEY_USE_DOCKED_MODE = "use_docked_mode" | ||
| 31 | const val KEY_REGION_INDEX = "region_index" | ||
| 32 | const val KEY_LANGUAGE_INDEX = "language_index" | ||
| 33 | const val KEY_RENDERER_BACKEND = "backend" | ||
| 34 | |||
| 35 | // Renderer | ||
| 36 | const val KEY_RENDERER_RESOLUTION = "resolution_setup" | ||
| 37 | const val KEY_RENDERER_SCALING_FILTER = "scaling_filter" | ||
| 38 | const val KEY_RENDERER_ANTI_ALIASING = "anti_aliasing" | ||
| 39 | const val KEY_RENDERER_ASPECT_RATIO = "aspect_ratio" | ||
| 40 | const val KEY_RENDERER_ACCURACY = "gpu_accuracy" | ||
| 41 | const val KEY_RENDERER_USE_DISK_SHADER_CACHE = "use_disk_shader_cache" | ||
| 42 | const val KEY_RENDERER_ASYNCHRONOUS_SHADERS = "use_asynchronous_shaders" | ||
| 43 | const val KEY_RENDERER_FORCE_MAX_CLOCK = "force_max_clock" | ||
| 44 | const val KEY_RENDERER_USE_SPEED_LIMIT = "use_speed_limit" | ||
| 45 | const val KEY_RENDERER_DEBUG = "debug" | ||
| 46 | const val KEY_RENDERER_SPEED_LIMIT = "speed_limit" | ||
| 47 | |||
| 48 | // Audio | ||
| 49 | const val KEY_AUDIO_VOLUME = "volume" | ||
| 50 | private val sectionsMap = BiMap<String?, String?>() | 25 | private val sectionsMap = BiMap<String?, String?>() |
| 51 | 26 | ||
| 52 | /** | 27 | /** |
| @@ -75,7 +50,7 @@ object SettingsFile { | |||
| 75 | current = sectionFromLine(line!!, isCustomGame) | 50 | current = sectionFromLine(line!!, isCustomGame) |
| 76 | sections[current.name] = current | 51 | sections[current.name] = current |
| 77 | } else if (current != null) { | 52 | } else if (current != null) { |
| 78 | val setting = settingFromLine(current, line!!) | 53 | val setting = settingFromLine(line!!) |
| 79 | if (setting != null) { | 54 | if (setting != null) { |
| 80 | current.putSetting(setting) | 55 | current.putSetting(setting) |
| 81 | } | 56 | } |
| @@ -201,11 +176,10 @@ object SettingsFile { | |||
| 201 | * For a line of text, determines what type of data is being represented, and returns | 176 | * For a line of text, determines what type of data is being represented, and returns |
| 202 | * a Setting object containing this data. | 177 | * a Setting object containing this data. |
| 203 | * | 178 | * |
| 204 | * @param current The section currently being parsed by the consuming method. | ||
| 205 | * @param line The line of text being parsed. | 179 | * @param line The line of text being parsed. |
| 206 | * @return A typed Setting containing the key/value contained in the line. | 180 | * @return A typed Setting containing the key/value contained in the line. |
| 207 | */ | 181 | */ |
| 208 | private fun settingFromLine(current: SettingSection, line: String): Setting? { | 182 | private fun settingFromLine(line: String): AbstractSetting? { |
| 209 | val splitLine = line.split("=".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() | 183 | val splitLine = line.split("=".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() |
| 210 | if (splitLine.size != 2) { | 184 | if (splitLine.size != 2) { |
| 211 | Log.warning("Skipping invalid config line \"$line\"") | 185 | Log.warning("Skipping invalid config line \"$line\"") |
| @@ -217,17 +191,25 @@ object SettingsFile { | |||
| 217 | Log.warning("Skipping null value in config line \"$line\"") | 191 | Log.warning("Skipping null value in config line \"$line\"") |
| 218 | return null | 192 | return null |
| 219 | } | 193 | } |
| 220 | try { | 194 | |
| 221 | val valueAsInt = value.toInt() | 195 | val booleanSetting = BooleanSetting.from(key) |
| 222 | return IntSetting(key, current.name, valueAsInt) | 196 | if (booleanSetting != null) { |
| 223 | } catch (_: NumberFormatException) { | 197 | booleanSetting.boolean = value.toBoolean() |
| 198 | return booleanSetting | ||
| 224 | } | 199 | } |
| 225 | try { | 200 | |
| 226 | val valueAsFloat = value.toFloat() | 201 | val intSetting = IntSetting.from(key) |
| 227 | return FloatSetting(key, current.name, valueAsFloat) | 202 | if (intSetting != null) { |
| 228 | } catch (_: NumberFormatException) { | 203 | intSetting.int = value.toInt() |
| 204 | return intSetting | ||
| 205 | } | ||
| 206 | |||
| 207 | val floatSetting = FloatSetting.from(key) | ||
| 208 | if (floatSetting != null) { | ||
| 209 | floatSetting.float = value.toFloat() | ||
| 210 | return floatSetting | ||
| 229 | } | 211 | } |
| 230 | return StringSetting(key, current.name, value) | 212 | return StringSetting.from(key) |
| 231 | } | 213 | } |
| 232 | 214 | ||
| 233 | /** | 215 | /** |