summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractBooleanSetting.kt8
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractFloatSetting.kt8
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractIntSetting.kt8
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractSetting.kt11
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractStringSetting.kt8
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt35
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FloatSetting.kt34
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt123
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Setting.kt27
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/SettingSection.kt8
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/StringSetting.kt34
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/DateTimeSetting.kt30
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/HeaderSetting.kt7
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt8
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SingleChoiceSetting.kt31
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SliderSetting.kt51
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/StringSingleChoiceSetting.kt32
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SubmenuSetting.kt9
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SwitchSetting.kt87
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt24
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt5
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt131
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentView.kt4
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/utils/SettingsFile.kt58
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
4package org.yuzu.yuzu_emu.features.settings.model
5
6interface 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
4package org.yuzu.yuzu_emu.features.settings.model
5
6interface 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
4package org.yuzu.yuzu_emu.features.settings.model
5
6interface 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
4package org.yuzu.yuzu_emu.features.settings.model
5
6interface 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
4package org.yuzu.yuzu_emu.features.settings.model
5
6interface 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
4package org.yuzu.yuzu_emu.features.settings.model 4package org.yuzu.yuzu_emu.features.settings.model
5 5
6class BooleanSetting( 6enum 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
4package org.yuzu.yuzu_emu.features.settings.model 4package org.yuzu.yuzu_emu.features.settings.model
5 5
6class FloatSetting( 6enum 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
4package org.yuzu.yuzu_emu.features.settings.model 4package org.yuzu.yuzu_emu.features.settings.model
5 5
6class IntSetting( 6enum 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
4package 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 */
12abstract 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 */
10class SettingSection(val name: String) { 10class 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
4package org.yuzu.yuzu_emu.features.settings.model 4package org.yuzu.yuzu_emu.features.settings.model
5 5
6class StringSetting( 6enum 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
4package org.yuzu.yuzu_emu.features.settings.model.view 4package org.yuzu.yuzu_emu.features.settings.model.view
5 5
6import org.yuzu.yuzu_emu.features.settings.model.Setting 6import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting
7import org.yuzu.yuzu_emu.features.settings.model.AbstractStringSetting
7import org.yuzu.yuzu_emu.features.settings.model.StringSetting 8import org.yuzu.yuzu_emu.features.settings.model.StringSetting
8 9
9class DateTimeSetting( 10class 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
4package org.yuzu.yuzu_emu.features.settings.model.view 4package org.yuzu.yuzu_emu.features.settings.model.view
5 5
6import org.yuzu.yuzu_emu.features.settings.model.Setting 6import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting
7 7
8class HeaderSetting( 8class 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
4package org.yuzu.yuzu_emu.features.settings.model.view 4package org.yuzu.yuzu_emu.features.settings.model.view
5 5
6import org.yuzu.yuzu_emu.features.settings.model.Setting 6import 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 */
15abstract class SettingsItem( 15abstract 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
4package org.yuzu.yuzu_emu.features.settings.model.view 4package org.yuzu.yuzu_emu.features.settings.model.view
5 5
6import org.yuzu.yuzu_emu.features.settings.model.AbstractIntSetting
6import org.yuzu.yuzu_emu.features.settings.model.IntSetting 7import org.yuzu.yuzu_emu.features.settings.model.IntSetting
7import org.yuzu.yuzu_emu.features.settings.model.Setting
8 8
9class SingleChoiceSetting( 9class 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
4package org.yuzu.yuzu_emu.features.settings.model.view 4package org.yuzu.yuzu_emu.features.settings.model.view
5 5
6import org.yuzu.yuzu_emu.features.settings.model.AbstractFloatSetting
7import org.yuzu.yuzu_emu.features.settings.model.AbstractIntSetting
8import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting
6import org.yuzu.yuzu_emu.features.settings.model.FloatSetting 9import org.yuzu.yuzu_emu.features.settings.model.FloatSetting
7import org.yuzu.yuzu_emu.features.settings.model.IntSetting 10import org.yuzu.yuzu_emu.features.settings.model.IntSetting
8import org.yuzu.yuzu_emu.features.settings.model.Setting
9import org.yuzu.yuzu_emu.utils.Log 11import org.yuzu.yuzu_emu.utils.Log
10import kotlin.math.roundToInt 12import kotlin.math.roundToInt
11 13
12class SliderSetting( 14class 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
4package org.yuzu.yuzu_emu.features.settings.model.view 4package org.yuzu.yuzu_emu.features.settings.model.view
5 5
6import org.yuzu.yuzu_emu.features.settings.model.Setting 6import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting
7import org.yuzu.yuzu_emu.features.settings.model.AbstractStringSetting
7import org.yuzu.yuzu_emu.features.settings.model.StringSetting 8import org.yuzu.yuzu_emu.features.settings.model.StringSetting
8 9
9class StringSingleChoiceSetting( 10class 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
4package org.yuzu.yuzu_emu.features.settings.model.view 4package org.yuzu.yuzu_emu.features.settings.model.view
5 5
6import org.yuzu.yuzu_emu.features.settings.model.Setting 6import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting
7 7
8class SubmenuSetting( 8class 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
4package org.yuzu.yuzu_emu.features.settings.model.view 4package org.yuzu.yuzu_emu.features.settings.model.view
5 5
6import org.yuzu.yuzu_emu.R 6import org.yuzu.yuzu_emu.features.settings.model.AbstractBooleanSetting
7import org.yuzu.yuzu_emu.YuzuApplication 7import org.yuzu.yuzu_emu.features.settings.model.AbstractIntSetting
8import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting
8import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting 9import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting
9import org.yuzu.yuzu_emu.features.settings.model.IntSetting 10import org.yuzu.yuzu_emu.features.settings.model.IntSetting
10import org.yuzu.yuzu_emu.features.settings.model.Setting 11import org.yuzu.yuzu_emu.utils.Log
11import org.yuzu.yuzu_emu.features.settings.ui.SettingsFragmentView
12 12
13class SwitchSetting : SettingsItem { 13class 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
15import androidx.recyclerview.widget.LinearLayoutManager 15import androidx.recyclerview.widget.LinearLayoutManager
16import com.google.android.material.divider.MaterialDividerItemDecoration 16import com.google.android.material.divider.MaterialDividerItemDecoration
17import org.yuzu.yuzu_emu.databinding.FragmentSettingsBinding 17import org.yuzu.yuzu_emu.databinding.FragmentSettingsBinding
18import org.yuzu.yuzu_emu.features.settings.model.Setting 18import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting
19import org.yuzu.yuzu_emu.features.settings.model.Settings
20import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem 19import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
21 20
22class SettingsFragment : Fragment(), SettingsFragmentView { 21class 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
6import android.text.TextUtils 6import android.text.TextUtils
7import androidx.appcompat.app.AppCompatActivity 7import androidx.appcompat.app.AppCompatActivity
8import org.yuzu.yuzu_emu.R 8import org.yuzu.yuzu_emu.R
9import org.yuzu.yuzu_emu.features.settings.model.Setting 9import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting
10import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting
11import org.yuzu.yuzu_emu.features.settings.model.IntSetting
10import org.yuzu.yuzu_emu.features.settings.model.Settings 12import org.yuzu.yuzu_emu.features.settings.model.Settings
11import org.yuzu.yuzu_emu.features.settings.model.view.* 13import org.yuzu.yuzu_emu.features.settings.model.view.*
12import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile 14import 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
4package org.yuzu.yuzu_emu.features.settings.ui 4package org.yuzu.yuzu_emu.features.settings.ui
5 5
6import org.yuzu.yuzu_emu.features.settings.model.Setting 6import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting
7import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem 7import 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 */
22object SettingsFile { 22object 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 /**