summaryrefslogtreecommitdiff
path: root/src/android
diff options
context:
space:
mode:
authorGravatar Charles Lombardo2023-04-18 03:43:33 -0400
committerGravatar bunnei2023-06-03 00:05:52 -0700
commitc609847e4956eaafbf2990f0442e78a0a664fac6 (patch)
tree2ddb106899a57725a482ce0af282ee3fc391f24f /src/android
parentandroid: Implement gamepad input (diff)
downloadyuzu-c609847e4956eaafbf2990f0442e78a0a664fac6.tar.gz
yuzu-c609847e4956eaafbf2990f0442e78a0a664fac6.tar.xz
yuzu-c609847e4956eaafbf2990f0442e78a0a664fac6.zip
android: Abstract settings
Previously we could only add settings that would change our ini file. Now we can create abstract settings in our presenter to alter things like shared preferences for theme support!
Diffstat (limited to 'src/android')
-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 /**