summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar t8952023-12-10 20:10:36 -0500
committerGravatar t8952023-12-12 17:25:36 -0500
commit70c3d36536ad98a5569d51f1d0f68a6f01890f11 (patch)
tree19fa4ccec7477ca8b963885633004d76aaa00a52
parentMerge pull request #12342 from FearlessTobi/fix-msvc (diff)
downloadyuzu-70c3d36536ad98a5569d51f1d0f68a6f01890f11.tar.gz
yuzu-70c3d36536ad98a5569d51f1d0f68a6f01890f11.tar.xz
yuzu-70c3d36536ad98a5569d51f1d0f68a6f01890f11.zip
android: Refactor settings to expose more options
In AbstractSetting, this removes the category, androidDefault, and valueAsString properties as they are no longer needed and have replacements. isSwitchable, global, and getValueAsString are all exposed and give better options for working with global/per-game settings.
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt20
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractBooleanSetting.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractByteSetting.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractFloatSetting.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractIntSetting.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractLongSetting.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractSetting.kt14
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractShortSetting.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractStringSetting.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt54
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ByteSetting.kt22
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FloatSetting.kt22
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt53
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/LongSetting.kt22
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt51
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ShortSetting.kt22
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/StringSetting.kt23
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/DateTimeSetting.kt5
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt24
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SingleChoiceSetting.kt17
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SliderSetting.kt30
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/StringSingleChoiceSetting.kt7
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SwitchSetting.kt24
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt11
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt29
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt2
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt4
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SliderViewHolder.kt2
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt2
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt6
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SettingsDialogFragment.kt12
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeConfig.kt47
-rw-r--r--src/android/app/src/main/jni/native_config.cpp126
-rw-r--r--src/common/settings_setting.h5
34 files changed, 324 insertions, 353 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt
index f41d7bdbf..9b08f008d 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt
@@ -172,7 +172,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
172 172
173 override fun onUserLeaveHint() { 173 override fun onUserLeaveHint() {
174 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { 174 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
175 if (BooleanSetting.PICTURE_IN_PICTURE.boolean && !isInPictureInPictureMode) { 175 if (BooleanSetting.PICTURE_IN_PICTURE.getBoolean() && !isInPictureInPictureMode) {
176 val pictureInPictureParamsBuilder = PictureInPictureParams.Builder() 176 val pictureInPictureParamsBuilder = PictureInPictureParams.Builder()
177 .getPictureInPictureActionsBuilder().getPictureInPictureAspectBuilder() 177 .getPictureInPictureActionsBuilder().getPictureInPictureAspectBuilder()
178 enterPictureInPictureMode(pictureInPictureParamsBuilder.build()) 178 enterPictureInPictureMode(pictureInPictureParamsBuilder.build())
@@ -284,7 +284,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
284 284
285 private fun PictureInPictureParams.Builder.getPictureInPictureAspectBuilder(): 285 private fun PictureInPictureParams.Builder.getPictureInPictureAspectBuilder():
286 PictureInPictureParams.Builder { 286 PictureInPictureParams.Builder {
287 val aspectRatio = when (IntSetting.RENDERER_ASPECT_RATIO.int) { 287 val aspectRatio = when (IntSetting.RENDERER_ASPECT_RATIO.getInt()) {
288 0 -> Rational(16, 9) 288 0 -> Rational(16, 9)
289 1 -> Rational(4, 3) 289 1 -> Rational(4, 3)
290 2 -> Rational(21, 9) 290 2 -> Rational(21, 9)
@@ -331,7 +331,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
331 pictureInPictureActions.add(pauseRemoteAction) 331 pictureInPictureActions.add(pauseRemoteAction)
332 } 332 }
333 333
334 if (BooleanSetting.AUDIO_MUTED.boolean) { 334 if (BooleanSetting.AUDIO_MUTED.getBoolean()) {
335 val unmuteIcon = Icon.createWithResource( 335 val unmuteIcon = Icon.createWithResource(
336 this@EmulationActivity, 336 this@EmulationActivity,
337 R.drawable.ic_pip_unmute 337 R.drawable.ic_pip_unmute
@@ -376,7 +376,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
376 val isEmulationActive = emulationViewModel.emulationStarted.value && 376 val isEmulationActive = emulationViewModel.emulationStarted.value &&
377 !emulationViewModel.isEmulationStopping.value 377 !emulationViewModel.isEmulationStopping.value
378 pictureInPictureParamsBuilder.setAutoEnterEnabled( 378 pictureInPictureParamsBuilder.setAutoEnterEnabled(
379 BooleanSetting.PICTURE_IN_PICTURE.boolean && isEmulationActive 379 BooleanSetting.PICTURE_IN_PICTURE.getBoolean() && isEmulationActive
380 ) 380 )
381 } 381 }
382 setPictureInPictureParams(pictureInPictureParamsBuilder.build()) 382 setPictureInPictureParams(pictureInPictureParamsBuilder.build())
@@ -390,9 +390,13 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
390 if (!NativeLibrary.isPaused()) NativeLibrary.pauseEmulation() 390 if (!NativeLibrary.isPaused()) NativeLibrary.pauseEmulation()
391 } 391 }
392 if (intent.action == actionUnmute) { 392 if (intent.action == actionUnmute) {
393 if (BooleanSetting.AUDIO_MUTED.boolean) BooleanSetting.AUDIO_MUTED.setBoolean(false) 393 if (BooleanSetting.AUDIO_MUTED.getBoolean()) {
394 BooleanSetting.AUDIO_MUTED.setBoolean(false)
395 }
394 } else if (intent.action == actionMute) { 396 } else if (intent.action == actionMute) {
395 if (!BooleanSetting.AUDIO_MUTED.boolean) BooleanSetting.AUDIO_MUTED.setBoolean(true) 397 if (!BooleanSetting.AUDIO_MUTED.getBoolean()) {
398 BooleanSetting.AUDIO_MUTED.setBoolean(true)
399 }
396 } 400 }
397 buildPictureInPictureParams() 401 buildPictureInPictureParams()
398 } 402 }
@@ -423,7 +427,9 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
423 } catch (ignored: Exception) { 427 } catch (ignored: Exception) {
424 } 428 }
425 // Always resume audio, since there is no UI button 429 // Always resume audio, since there is no UI button
426 if (BooleanSetting.AUDIO_MUTED.boolean) BooleanSetting.AUDIO_MUTED.setBoolean(false) 430 if (BooleanSetting.AUDIO_MUTED.getBoolean()) {
431 BooleanSetting.AUDIO_MUTED.setBoolean(false)
432 }
427 } 433 }
428 } 434 }
429 435
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
index aeda8d222..0ba465356 100644
--- 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
@@ -4,7 +4,6 @@
4package org.yuzu.yuzu_emu.features.settings.model 4package org.yuzu.yuzu_emu.features.settings.model
5 5
6interface AbstractBooleanSetting : AbstractSetting { 6interface AbstractBooleanSetting : AbstractSetting {
7 val boolean: Boolean 7 fun getBoolean(needsGlobal: Boolean = false): Boolean
8
9 fun setBoolean(value: Boolean) 8 fun setBoolean(value: Boolean)
10} 9}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractByteSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractByteSetting.kt
index 606519ad8..cf6300535 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractByteSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractByteSetting.kt
@@ -4,7 +4,6 @@
4package org.yuzu.yuzu_emu.features.settings.model 4package org.yuzu.yuzu_emu.features.settings.model
5 5
6interface AbstractByteSetting : AbstractSetting { 6interface AbstractByteSetting : AbstractSetting {
7 val byte: Byte 7 fun getByte(needsGlobal: Boolean = false): Byte
8
9 fun setByte(value: Byte) 8 fun setByte(value: Byte)
10} 9}
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
index 974925eed..c6c0bcf34 100644
--- 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
@@ -4,7 +4,6 @@
4package org.yuzu.yuzu_emu.features.settings.model 4package org.yuzu.yuzu_emu.features.settings.model
5 5
6interface AbstractFloatSetting : AbstractSetting { 6interface AbstractFloatSetting : AbstractSetting {
7 val float: Float 7 fun getFloat(needsGlobal: Boolean = false): Float
8
9 fun setFloat(value: Float) 8 fun setFloat(value: Float)
10} 9}
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
index 89b285b10..826402c34 100644
--- 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
@@ -4,7 +4,6 @@
4package org.yuzu.yuzu_emu.features.settings.model 4package org.yuzu.yuzu_emu.features.settings.model
5 5
6interface AbstractIntSetting : AbstractSetting { 6interface AbstractIntSetting : AbstractSetting {
7 val int: Int 7 fun getInt(needsGlobal: Boolean = false): Int
8
9 fun setInt(value: Int) 8 fun setInt(value: Int)
10} 9}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractLongSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractLongSetting.kt
index 4873942db..2b62cc06b 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractLongSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractLongSetting.kt
@@ -4,7 +4,6 @@
4package org.yuzu.yuzu_emu.features.settings.model 4package org.yuzu.yuzu_emu.features.settings.model
5 5
6interface AbstractLongSetting : AbstractSetting { 6interface AbstractLongSetting : AbstractSetting {
7 val long: Long 7 fun getLong(needsGlobal: Boolean = false): Long
8
9 fun setLong(value: Long) 8 fun setLong(value: Long)
10} 9}
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
index 8b6d29fe5..e384c78c2 100644
--- 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
@@ -7,12 +7,7 @@ import org.yuzu.yuzu_emu.utils.NativeConfig
7 7
8interface AbstractSetting { 8interface AbstractSetting {
9 val key: String 9 val key: String
10 val category: Settings.Category
11 val defaultValue: Any 10 val defaultValue: Any
12 val androidDefault: Any?
13 get() = null
14 val valueAsString: String
15 get() = ""
16 11
17 val isRuntimeModifiable: Boolean 12 val isRuntimeModifiable: Boolean
18 get() = NativeConfig.getIsRuntimeModifiable(key) 13 get() = NativeConfig.getIsRuntimeModifiable(key)
@@ -20,5 +15,14 @@ interface AbstractSetting {
20 val pairedSettingKey: String 15 val pairedSettingKey: String
21 get() = NativeConfig.getPairedSettingKey(key) 16 get() = NativeConfig.getPairedSettingKey(key)
22 17
18 val isSwitchable: Boolean
19 get() = NativeConfig.getIsSwitchable(key)
20
21 var global: Boolean
22 get() = NativeConfig.usingGlobal(key)
23 set(value) = NativeConfig.setGlobal(key, value)
24
25 fun getValueAsString(needsGlobal: Boolean = false): String
26
23 fun reset() 27 fun reset()
24} 28}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractShortSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractShortSetting.kt
index 91407ccbb..8bfa81e4a 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractShortSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractShortSetting.kt
@@ -4,7 +4,6 @@
4package org.yuzu.yuzu_emu.features.settings.model 4package org.yuzu.yuzu_emu.features.settings.model
5 5
6interface AbstractShortSetting : AbstractSetting { 6interface AbstractShortSetting : AbstractSetting {
7 val short: Short 7 fun getShort(needsGlobal: Boolean = false): Short
8
9 fun setShort(value: Short) 8 fun setShort(value: Short)
10} 9}
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
index c8935cc48..6ff8fd3f9 100644
--- 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
@@ -4,7 +4,6 @@
4package org.yuzu.yuzu_emu.features.settings.model 4package org.yuzu.yuzu_emu.features.settings.model
5 5
6interface AbstractStringSetting : AbstractSetting { 6interface AbstractStringSetting : AbstractSetting {
7 val string: String 7 fun getString(needsGlobal: Boolean = false): String
8
9 fun setString(value: String) 8 fun setString(value: String)
10} 9}
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 8476ce867..16f06cd0a 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
@@ -5,36 +5,34 @@ package org.yuzu.yuzu_emu.features.settings.model
5 5
6import org.yuzu.yuzu_emu.utils.NativeConfig 6import org.yuzu.yuzu_emu.utils.NativeConfig
7 7
8enum class BooleanSetting( 8enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
9 override val key: String, 9 AUDIO_MUTED("audio_muted"),
10 override val category: Settings.Category, 10 CPU_DEBUG_MODE("cpu_debug_mode"),
11 override val androidDefault: Boolean? = null 11 FASTMEM("cpuopt_fastmem"),
12) : AbstractBooleanSetting { 12 FASTMEM_EXCLUSIVES("cpuopt_fastmem_exclusives"),
13 AUDIO_MUTED("audio_muted", Settings.Category.Audio), 13 RENDERER_USE_SPEED_LIMIT("use_speed_limit"),
14 CPU_DEBUG_MODE("cpu_debug_mode", Settings.Category.Cpu), 14 USE_DOCKED_MODE("use_docked_mode"),
15 FASTMEM("cpuopt_fastmem", Settings.Category.Cpu), 15 RENDERER_USE_DISK_SHADER_CACHE("use_disk_shader_cache"),
16 FASTMEM_EXCLUSIVES("cpuopt_fastmem_exclusives", Settings.Category.Cpu), 16 RENDERER_FORCE_MAX_CLOCK("force_max_clock"),
17 RENDERER_USE_SPEED_LIMIT("use_speed_limit", Settings.Category.Core), 17 RENDERER_ASYNCHRONOUS_SHADERS("use_asynchronous_shaders"),
18 USE_DOCKED_MODE("use_docked_mode", Settings.Category.System, false), 18 RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"),
19 RENDERER_USE_DISK_SHADER_CACHE("use_disk_shader_cache", Settings.Category.Renderer), 19 RENDERER_DEBUG("debug"),
20 RENDERER_FORCE_MAX_CLOCK("force_max_clock", Settings.Category.Renderer), 20 PICTURE_IN_PICTURE("picture_in_picture"),
21 RENDERER_ASYNCHRONOUS_SHADERS("use_asynchronous_shaders", Settings.Category.Renderer), 21 USE_CUSTOM_RTC("custom_rtc_enabled");
22 RENDERER_REACTIVE_FLUSHING("use_reactive_flushing", Settings.Category.Renderer, false), 22
23 RENDERER_DEBUG("debug", Settings.Category.Renderer), 23 override fun getBoolean(needsGlobal: Boolean): Boolean =
24 PICTURE_IN_PICTURE("picture_in_picture", Settings.Category.Android), 24 NativeConfig.getBoolean(key, needsGlobal)
25 USE_CUSTOM_RTC("custom_rtc_enabled", Settings.Category.System); 25
26 26 override fun setBoolean(value: Boolean) {
27 override val boolean: Boolean 27 if (NativeConfig.isPerGameConfigLoaded()) {
28 get() = NativeConfig.getBoolean(key, false) 28 global = false
29 29 }
30 override fun setBoolean(value: Boolean) = NativeConfig.setBoolean(key, value) 30 NativeConfig.setBoolean(key, value)
31
32 override val defaultValue: Boolean by lazy {
33 androidDefault ?: NativeConfig.getBoolean(key, true)
34 } 31 }
35 32
36 override val valueAsString: String 33 override val defaultValue: Boolean by lazy { NativeConfig.getDefaultToString(key).toBoolean() }
37 get() = if (boolean) "1" else "0" 34
35 override fun getValueAsString(needsGlobal: Boolean): String = getBoolean(needsGlobal).toString()
38 36
39 override fun reset() = NativeConfig.setBoolean(key, defaultValue) 37 override fun reset() = NativeConfig.setBoolean(key, defaultValue)
40} 38}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ByteSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ByteSetting.kt
index 6ec0a765e..7b7fac211 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ByteSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ByteSetting.kt
@@ -5,21 +5,21 @@ package org.yuzu.yuzu_emu.features.settings.model
5 5
6import org.yuzu.yuzu_emu.utils.NativeConfig 6import org.yuzu.yuzu_emu.utils.NativeConfig
7 7
8enum class ByteSetting( 8enum class ByteSetting(override val key: String) : AbstractByteSetting {
9 override val key: String, 9 AUDIO_VOLUME("volume");
10 override val category: Settings.Category
11) : AbstractByteSetting {
12 AUDIO_VOLUME("volume", Settings.Category.Audio);
13 10
14 override val byte: Byte 11 override fun getByte(needsGlobal: Boolean): Byte = NativeConfig.getByte(key, needsGlobal)
15 get() = NativeConfig.getByte(key, false)
16 12
17 override fun setByte(value: Byte) = NativeConfig.setByte(key, value) 13 override fun setByte(value: Byte) {
14 if (NativeConfig.isPerGameConfigLoaded()) {
15 global = false
16 }
17 NativeConfig.setByte(key, value)
18 }
18 19
19 override val defaultValue: Byte by lazy { NativeConfig.getByte(key, true) } 20 override val defaultValue: Byte by lazy { NativeConfig.getDefaultToString(key).toByte() }
20 21
21 override val valueAsString: String 22 override fun getValueAsString(needsGlobal: Boolean): String = getByte(needsGlobal).toString()
22 get() = byte.toString()
23 23
24 override fun reset() = NativeConfig.setByte(key, defaultValue) 24 override fun reset() = NativeConfig.setByte(key, defaultValue)
25} 25}
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 0181d06f2..4644824d8 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
@@ -5,22 +5,22 @@ package org.yuzu.yuzu_emu.features.settings.model
5 5
6import org.yuzu.yuzu_emu.utils.NativeConfig 6import org.yuzu.yuzu_emu.utils.NativeConfig
7 7
8enum class FloatSetting( 8enum class FloatSetting(override val key: String) : AbstractFloatSetting {
9 override val key: String,
10 override val category: Settings.Category
11) : AbstractFloatSetting {
12 // No float settings currently exist 9 // No float settings currently exist
13 EMPTY_SETTING("", Settings.Category.UiGeneral); 10 EMPTY_SETTING("");
14 11
15 override val float: Float 12 override fun getFloat(needsGlobal: Boolean): Float = NativeConfig.getFloat(key, false)
16 get() = NativeConfig.getFloat(key, false)
17 13
18 override fun setFloat(value: Float) = NativeConfig.setFloat(key, value) 14 override fun setFloat(value: Float) {
15 if (NativeConfig.isPerGameConfigLoaded()) {
16 global = false
17 }
18 NativeConfig.setFloat(key, value)
19 }
19 20
20 override val defaultValue: Float by lazy { NativeConfig.getFloat(key, true) } 21 override val defaultValue: Float by lazy { NativeConfig.getDefaultToString(key).toFloat() }
21 22
22 override val valueAsString: String 23 override fun getValueAsString(needsGlobal: Boolean): String = getFloat(needsGlobal).toString()
23 get() = float.toString()
24 24
25 override fun reset() = NativeConfig.setFloat(key, defaultValue) 25 override fun reset() = NativeConfig.setFloat(key, defaultValue)
26} 26}
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 ef10b209f..21e4e1afd 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
@@ -5,36 +5,33 @@ package org.yuzu.yuzu_emu.features.settings.model
5 5
6import org.yuzu.yuzu_emu.utils.NativeConfig 6import org.yuzu.yuzu_emu.utils.NativeConfig
7 7
8enum class IntSetting( 8enum class IntSetting(override val key: String) : AbstractIntSetting {
9 override val key: String, 9 CPU_BACKEND("cpu_backend"),
10 override val category: Settings.Category, 10 CPU_ACCURACY("cpu_accuracy"),
11 override val androidDefault: Int? = null 11 REGION_INDEX("region_index"),
12) : AbstractIntSetting { 12 LANGUAGE_INDEX("language_index"),
13 CPU_BACKEND("cpu_backend", Settings.Category.Cpu), 13 RENDERER_BACKEND("backend"),
14 CPU_ACCURACY("cpu_accuracy", Settings.Category.Cpu), 14 RENDERER_ACCURACY("gpu_accuracy"),
15 REGION_INDEX("region_index", Settings.Category.System), 15 RENDERER_RESOLUTION("resolution_setup"),
16 LANGUAGE_INDEX("language_index", Settings.Category.System), 16 RENDERER_VSYNC("use_vsync"),
17 RENDERER_BACKEND("backend", Settings.Category.Renderer), 17 RENDERER_SCALING_FILTER("scaling_filter"),
18 RENDERER_ACCURACY("gpu_accuracy", Settings.Category.Renderer, 0), 18 RENDERER_ANTI_ALIASING("anti_aliasing"),
19 RENDERER_RESOLUTION("resolution_setup", Settings.Category.Renderer), 19 RENDERER_SCREEN_LAYOUT("screen_layout"),
20 RENDERER_VSYNC("use_vsync", Settings.Category.Renderer), 20 RENDERER_ASPECT_RATIO("aspect_ratio"),
21 RENDERER_SCALING_FILTER("scaling_filter", Settings.Category.Renderer), 21 AUDIO_OUTPUT_ENGINE("output_engine");
22 RENDERER_ANTI_ALIASING("anti_aliasing", Settings.Category.Renderer), 22
23 RENDERER_SCREEN_LAYOUT("screen_layout", Settings.Category.Android), 23 override fun getInt(needsGlobal: Boolean): Int = NativeConfig.getInt(key, needsGlobal)
24 RENDERER_ASPECT_RATIO("aspect_ratio", Settings.Category.Renderer), 24
25 AUDIO_OUTPUT_ENGINE("output_engine", Settings.Category.Audio); 25 override fun setInt(value: Int) {
26 26 if (NativeConfig.isPerGameConfigLoaded()) {
27 override val int: Int 27 global = false
28 get() = NativeConfig.getInt(key, false) 28 }
29 29 NativeConfig.setInt(key, value)
30 override fun setInt(value: Int) = NativeConfig.setInt(key, value)
31
32 override val defaultValue: Int by lazy {
33 androidDefault ?: NativeConfig.getInt(key, true)
34 } 30 }
35 31
36 override val valueAsString: String 32 override val defaultValue: Int by lazy { NativeConfig.getDefaultToString(key).toInt() }
37 get() = int.toString() 33
34 override fun getValueAsString(needsGlobal: Boolean): String = getInt(needsGlobal).toString()
38 35
39 override fun reset() = NativeConfig.setInt(key, defaultValue) 36 override fun reset() = NativeConfig.setInt(key, defaultValue)
40} 37}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/LongSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/LongSetting.kt
index c526fc4cf..e3efd516c 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/LongSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/LongSetting.kt
@@ -5,21 +5,21 @@ package org.yuzu.yuzu_emu.features.settings.model
5 5
6import org.yuzu.yuzu_emu.utils.NativeConfig 6import org.yuzu.yuzu_emu.utils.NativeConfig
7 7
8enum class LongSetting( 8enum class LongSetting(override val key: String) : AbstractLongSetting {
9 override val key: String, 9 CUSTOM_RTC("custom_rtc");
10 override val category: Settings.Category
11) : AbstractLongSetting {
12 CUSTOM_RTC("custom_rtc", Settings.Category.System);
13 10
14 override val long: Long 11 override fun getLong(needsGlobal: Boolean): Long = NativeConfig.getLong(key, needsGlobal)
15 get() = NativeConfig.getLong(key, false)
16 12
17 override fun setLong(value: Long) = NativeConfig.setLong(key, value) 13 override fun setLong(value: Long) {
14 if (NativeConfig.isPerGameConfigLoaded()) {
15 global = false
16 }
17 NativeConfig.setLong(key, value)
18 }
18 19
19 override val defaultValue: Long by lazy { NativeConfig.getLong(key, true) } 20 override val defaultValue: Long by lazy { NativeConfig.getDefaultToString(key).toLong() }
20 21
21 override val valueAsString: String 22 override fun getValueAsString(needsGlobal: Boolean): String = getLong(needsGlobal).toString()
22 get() = long.toString()
23 23
24 override fun reset() = NativeConfig.setLong(key, defaultValue) 24 override fun reset() = NativeConfig.setLong(key, defaultValue)
25} 25}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt
index e3cd66185..9551fc05e 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt
@@ -6,62 +6,11 @@ package org.yuzu.yuzu_emu.features.settings.model
6import org.yuzu.yuzu_emu.R 6import org.yuzu.yuzu_emu.R
7 7
8object Settings { 8object Settings {
9 enum class Category {
10 Android,
11 Audio,
12 Core,
13 Cpu,
14 CpuDebug,
15 CpuUnsafe,
16 Renderer,
17 RendererAdvanced,
18 RendererDebug,
19 System,
20 SystemAudio,
21 DataStorage,
22 Debugging,
23 DebuggingGraphics,
24 Miscellaneous,
25 Network,
26 WebService,
27 AddOns,
28 Controls,
29 Ui,
30 UiGeneral,
31 UiLayout,
32 UiGameList,
33 Screenshots,
34 Shortcuts,
35 Multiplayer,
36 Services,
37 Paths,
38 MaxEnum
39 }
40
41 val settingsList = listOf<AbstractSetting>(
42 *BooleanSetting.values(),
43 *ByteSetting.values(),
44 *ShortSetting.values(),
45 *IntSetting.values(),
46 *FloatSetting.values(),
47 *LongSetting.values(),
48 *StringSetting.values()
49 )
50
51 const val SECTION_GENERAL = "General"
52 const val SECTION_SYSTEM = "System"
53 const val SECTION_RENDERER = "Renderer"
54 const val SECTION_AUDIO = "Audio"
55 const val SECTION_CPU = "Cpu"
56 const val SECTION_THEME = "Theme"
57 const val SECTION_DEBUG = "Debug"
58
59 enum class MenuTag(val titleId: Int) { 9 enum class MenuTag(val titleId: Int) {
60 SECTION_ROOT(R.string.advanced_settings), 10 SECTION_ROOT(R.string.advanced_settings),
61 SECTION_SYSTEM(R.string.preferences_system), 11 SECTION_SYSTEM(R.string.preferences_system),
62 SECTION_RENDERER(R.string.preferences_graphics), 12 SECTION_RENDERER(R.string.preferences_graphics),
63 SECTION_AUDIO(R.string.preferences_audio), 13 SECTION_AUDIO(R.string.preferences_audio),
64 SECTION_CPU(R.string.cpu),
65 SECTION_THEME(R.string.preferences_theme), 14 SECTION_THEME(R.string.preferences_theme),
66 SECTION_DEBUG(R.string.preferences_debug); 15 SECTION_DEBUG(R.string.preferences_debug);
67 } 16 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ShortSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ShortSetting.kt
index c9a0c664c..16eb4ffdd 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ShortSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ShortSetting.kt
@@ -5,21 +5,21 @@ package org.yuzu.yuzu_emu.features.settings.model
5 5
6import org.yuzu.yuzu_emu.utils.NativeConfig 6import org.yuzu.yuzu_emu.utils.NativeConfig
7 7
8enum class ShortSetting( 8enum class ShortSetting(override val key: String) : AbstractShortSetting {
9 override val key: String, 9 RENDERER_SPEED_LIMIT("speed_limit");
10 override val category: Settings.Category
11) : AbstractShortSetting {
12 RENDERER_SPEED_LIMIT("speed_limit", Settings.Category.Core);
13 10
14 override val short: Short 11 override fun getShort(needsGlobal: Boolean): Short = NativeConfig.getShort(key, needsGlobal)
15 get() = NativeConfig.getShort(key, false)
16 12
17 override fun setShort(value: Short) = NativeConfig.setShort(key, value) 13 override fun setShort(value: Short) {
14 if (NativeConfig.isPerGameConfigLoaded()) {
15 global = false
16 }
17 NativeConfig.setShort(key, value)
18 }
18 19
19 override val defaultValue: Short by lazy { NativeConfig.getShort(key, true) } 20 override val defaultValue: Short by lazy { NativeConfig.getDefaultToString(key).toShort() }
20 21
21 override val valueAsString: String 22 override fun getValueAsString(needsGlobal: Boolean): String = getShort(needsGlobal).toString()
22 get() = short.toString()
23 23
24 override fun reset() = NativeConfig.setShort(key, defaultValue) 24 override fun reset() = NativeConfig.setShort(key, defaultValue)
25} 25}
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 9bb3e66d4..a0d8cfede 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
@@ -5,22 +5,21 @@ package org.yuzu.yuzu_emu.features.settings.model
5 5
6import org.yuzu.yuzu_emu.utils.NativeConfig 6import org.yuzu.yuzu_emu.utils.NativeConfig
7 7
8enum class StringSetting( 8enum class StringSetting(override val key: String) : AbstractStringSetting {
9 override val key: String, 9 DRIVER_PATH("driver_path");
10 override val category: Settings.Category
11) : AbstractStringSetting {
12 // No string settings currently exist
13 EMPTY_SETTING("", Settings.Category.UiGeneral);
14 10
15 override val string: String 11 override fun getString(needsGlobal: Boolean): String = NativeConfig.getString(key, needsGlobal)
16 get() = NativeConfig.getString(key, false)
17 12
18 override fun setString(value: String) = NativeConfig.setString(key, value) 13 override fun setString(value: String) {
14 if (NativeConfig.isPerGameConfigLoaded()) {
15 global = false
16 }
17 NativeConfig.setString(key, value)
18 }
19 19
20 override val defaultValue: String by lazy { NativeConfig.getString(key, true) } 20 override val defaultValue: String by lazy { NativeConfig.getDefaultToString(key) }
21 21
22 override val valueAsString: String 22 override fun getValueAsString(needsGlobal: Boolean): String = getString(needsGlobal)
23 get() = string
24 23
25 override fun reset() = NativeConfig.setString(key, defaultValue) 24 override fun reset() = NativeConfig.setString(key, defaultValue)
26} 25}
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 8bc164197..1d81f5f2b 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
@@ -12,7 +12,6 @@ class DateTimeSetting(
12) : SettingsItem(longSetting, titleId, descriptionId) { 12) : SettingsItem(longSetting, titleId, descriptionId) {
13 override val type = TYPE_DATETIME_SETTING 13 override val type = TYPE_DATETIME_SETTING
14 14
15 var value: Long 15 fun getValue(needsGlobal: Boolean = false): Long = longSetting.getLong(needsGlobal)
16 get() = longSetting.long 16 fun setValue(value: Long) = (setting as AbstractLongSetting).setLong(value)
17 set(value) = (setting as AbstractLongSetting).setLong(value)
18} 17}
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 e198b18a0..384527294 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
@@ -11,7 +11,6 @@ import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting
11import org.yuzu.yuzu_emu.features.settings.model.ByteSetting 11import org.yuzu.yuzu_emu.features.settings.model.ByteSetting
12import org.yuzu.yuzu_emu.features.settings.model.IntSetting 12import org.yuzu.yuzu_emu.features.settings.model.IntSetting
13import org.yuzu.yuzu_emu.features.settings.model.LongSetting 13import org.yuzu.yuzu_emu.features.settings.model.LongSetting
14import org.yuzu.yuzu_emu.features.settings.model.Settings
15import org.yuzu.yuzu_emu.features.settings.model.ShortSetting 14import org.yuzu.yuzu_emu.features.settings.model.ShortSetting
16 15
17/** 16/**
@@ -48,8 +47,8 @@ abstract class SettingsItem(
48 47
49 val emptySetting = object : AbstractSetting { 48 val emptySetting = object : AbstractSetting {
50 override val key: String = "" 49 override val key: String = ""
51 override val category: Settings.Category = Settings.Category.Ui
52 override val defaultValue: Any = false 50 override val defaultValue: Any = false
51 override fun getValueAsString(needsGlobal: Boolean): String = ""
53 override fun reset() {} 52 override fun reset() {}
54 } 53 }
55 54
@@ -270,9 +269,9 @@ abstract class SettingsItem(
270 ) 269 )
271 270
272 val fastmem = object : AbstractBooleanSetting { 271 val fastmem = object : AbstractBooleanSetting {
273 override val boolean: Boolean 272 override fun getBoolean(needsGlobal: Boolean): Boolean =
274 get() = 273 BooleanSetting.FASTMEM.getBoolean() &&
275 BooleanSetting.FASTMEM.boolean && BooleanSetting.FASTMEM_EXCLUSIVES.boolean 274 BooleanSetting.FASTMEM_EXCLUSIVES.getBoolean()
276 275
277 override fun setBoolean(value: Boolean) { 276 override fun setBoolean(value: Boolean) {
278 BooleanSetting.FASTMEM.setBoolean(value) 277 BooleanSetting.FASTMEM.setBoolean(value)
@@ -280,9 +279,22 @@ abstract class SettingsItem(
280 } 279 }
281 280
282 override val key: String = FASTMEM_COMBINED 281 override val key: String = FASTMEM_COMBINED
283 override val category = Settings.Category.Cpu
284 override val isRuntimeModifiable: Boolean = false 282 override val isRuntimeModifiable: Boolean = false
285 override val defaultValue: Boolean = true 283 override val defaultValue: Boolean = true
284 override val isSwitchable: Boolean = true
285 override var global: Boolean
286 get() {
287 return BooleanSetting.FASTMEM.global &&
288 BooleanSetting.FASTMEM_EXCLUSIVES.global
289 }
290 set(value) {
291 BooleanSetting.FASTMEM.global = value
292 BooleanSetting.FASTMEM_EXCLUSIVES.global = value
293 }
294
295 override fun getValueAsString(needsGlobal: Boolean): String =
296 getBoolean().toString()
297
286 override fun reset() = setBoolean(defaultValue) 298 override fun reset() = setBoolean(defaultValue)
287 } 299 }
288 put(SwitchSetting(fastmem, R.string.fastmem, 0)) 300 put(SwitchSetting(fastmem, R.string.fastmem, 0))
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 705527a73..97a5a9e59 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
@@ -15,16 +15,11 @@ class SingleChoiceSetting(
15) : SettingsItem(setting, titleId, descriptionId) { 15) : SettingsItem(setting, titleId, descriptionId) {
16 override val type = TYPE_SINGLE_CHOICE 16 override val type = TYPE_SINGLE_CHOICE
17 17
18 var selectedValue: Int 18 fun getSelectedValue(needsGlobal: Boolean = false) =
19 get() { 19 when (setting) {
20 return when (setting) { 20 is AbstractIntSetting -> setting.getInt(needsGlobal)
21 is AbstractIntSetting -> setting.int 21 else -> -1
22 else -> -1
23 }
24 }
25 set(value) {
26 when (setting) {
27 is AbstractIntSetting -> setting.setInt(value)
28 }
29 } 22 }
23
24 fun setSelectedValue(value: Int) = (setting as AbstractIntSetting).setInt(value)
30} 25}
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 c3b5df02c..b9b709bf7 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
@@ -20,22 +20,20 @@ class SliderSetting(
20) : SettingsItem(setting, titleId, descriptionId) { 20) : SettingsItem(setting, titleId, descriptionId) {
21 override val type = TYPE_SLIDER 21 override val type = TYPE_SLIDER
22 22
23 var selectedValue: Int 23 fun getSelectedValue(needsGlobal: Boolean = false) =
24 get() { 24 when (setting) {
25 return when (setting) { 25 is AbstractByteSetting -> setting.getByte(needsGlobal).toInt()
26 is AbstractByteSetting -> setting.byte.toInt() 26 is AbstractShortSetting -> setting.getShort(needsGlobal).toInt()
27 is AbstractShortSetting -> setting.short.toInt() 27 is AbstractIntSetting -> setting.getInt(needsGlobal)
28 is AbstractIntSetting -> setting.int 28 is AbstractFloatSetting -> setting.getFloat(needsGlobal).roundToInt()
29 is AbstractFloatSetting -> setting.float.roundToInt() 29 else -> -1
30 else -> -1
31 }
32 } 30 }
33 set(value) { 31
34 when (setting) { 32 fun setSelectedValue(value: Int) =
35 is AbstractByteSetting -> setting.setByte(value.toByte()) 33 when (setting) {
36 is AbstractShortSetting -> setting.setShort(value.toShort()) 34 is AbstractByteSetting -> setting.setByte(value.toByte())
37 is AbstractIntSetting -> setting.setInt(value) 35 is AbstractShortSetting -> setting.setShort(value.toShort())
38 is AbstractFloatSetting -> setting.setFloat(value.toFloat()) 36 is AbstractFloatSetting -> setting.setFloat(value.toFloat())
39 } 37 else -> (setting as AbstractIntSetting).setInt(value)
40 } 38 }
41} 39}
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 871dab4f3..ba7920f50 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
@@ -17,14 +17,13 @@ class StringSingleChoiceSetting(
17 fun getValueAt(index: Int): String = 17 fun getValueAt(index: Int): String =
18 if (index >= 0 && index < values.size) values[index] else "" 18 if (index >= 0 && index < values.size) values[index] else ""
19 19
20 var selectedValue: String 20 fun getSelectedValue(needsGlobal: Boolean = false) = stringSetting.getString(needsGlobal)
21 get() = stringSetting.string 21 fun setSelectedValue(value: String) = stringSetting.setString(value)
22 set(value) = stringSetting.setString(value)
23 22
24 val selectValueIndex: Int 23 val selectValueIndex: Int
25 get() { 24 get() {
26 for (i in values.indices) { 25 for (i in values.indices) {
27 if (values[i] == selectedValue) { 26 if (values[i] == getSelectedValue()) {
28 return i 27 return i
29 } 28 }
30 } 29 }
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 416967e64..44d47dd69 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
@@ -14,18 +14,18 @@ class SwitchSetting(
14) : SettingsItem(setting, titleId, descriptionId) { 14) : SettingsItem(setting, titleId, descriptionId) {
15 override val type = TYPE_SWITCH 15 override val type = TYPE_SWITCH
16 16
17 var checked: Boolean 17 fun getIsChecked(needsGlobal: Boolean = false): Boolean {
18 get() { 18 return when (setting) {
19 return when (setting) { 19 is AbstractIntSetting -> setting.getInt(needsGlobal) == 1
20 is AbstractIntSetting -> setting.int == 1 20 is AbstractBooleanSetting -> setting.getBoolean(needsGlobal)
21 is AbstractBooleanSetting -> setting.boolean 21 else -> false
22 else -> false
23 }
24 } 22 }
25 set(value) { 23 }
26 when (setting) { 24
27 is AbstractIntSetting -> setting.setInt(if (value) 1 else 0) 25 fun setChecked(value: Boolean) {
28 is AbstractBooleanSetting -> setting.setBoolean(value) 26 when (setting) {
29 } 27 is AbstractIntSetting -> setting.setInt(if (value) 1 else 0)
28 is AbstractBooleanSetting -> setting.setBoolean(value)
30 } 29 }
30 }
31} 31}
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 af2c1e582..3f23c064e 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
@@ -102,8 +102,9 @@ class SettingsAdapter(
102 return currentList[position].type 102 return currentList[position].type
103 } 103 }
104 104
105 fun onBooleanClick(item: SwitchSetting, checked: Boolean) { 105 fun onBooleanClick(item: SwitchSetting, checked: Boolean, position: Int) {
106 item.checked = checked 106 item.setChecked(checked)
107 notifyItemChanged(position)
107 settingsViewModel.setShouldReloadSettingsList(true) 108 settingsViewModel.setShouldReloadSettingsList(true)
108 } 109 }
109 110
@@ -126,7 +127,7 @@ class SettingsAdapter(
126 } 127 }
127 128
128 fun onDateTimeClick(item: DateTimeSetting, position: Int) { 129 fun onDateTimeClick(item: DateTimeSetting, position: Int) {
129 val storedTime = item.value * 1000 130 val storedTime = item.getValue() * 1000
130 131
131 // Helper to extract hour and minute from epoch time 132 // Helper to extract hour and minute from epoch time
132 val calendar: Calendar = Calendar.getInstance() 133 val calendar: Calendar = Calendar.getInstance()
@@ -159,9 +160,9 @@ class SettingsAdapter(
159 var epochTime: Long = datePicker.selection!! / 1000 160 var epochTime: Long = datePicker.selection!! / 1000
160 epochTime += timePicker.hour.toLong() * 60 * 60 161 epochTime += timePicker.hour.toLong() * 60 * 60
161 epochTime += timePicker.minute.toLong() * 60 162 epochTime += timePicker.minute.toLong() * 60
162 if (item.value != epochTime) { 163 if (item.getValue() != epochTime) {
163 notifyItemChanged(position) 164 notifyItemChanged(position)
164 item.value = epochTime 165 item.setValue(epochTime)
165 } 166 }
166 } 167 }
167 datePicker.show( 168 datePicker.show(
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 7425728c6..12a389b37 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
@@ -36,7 +36,14 @@ class SettingsFragmentPresenter(
36 val item = SettingsItem.settingsItems[key]!! 36 val item = SettingsItem.settingsItems[key]!!
37 val pairedSettingKey = item.setting.pairedSettingKey 37 val pairedSettingKey = item.setting.pairedSettingKey
38 if (pairedSettingKey.isNotEmpty()) { 38 if (pairedSettingKey.isNotEmpty()) {
39 val pairedSettingValue = NativeConfig.getBoolean(pairedSettingKey, false) 39 val pairedSettingValue = NativeConfig.getBoolean(
40 pairedSettingKey,
41 if (NativeLibrary.isRunning() && !NativeConfig.isPerGameConfigLoaded()) {
42 !NativeConfig.usingGlobal(pairedSettingKey)
43 } else {
44 NativeConfig.usingGlobal(pairedSettingKey)
45 }
46 )
40 if (!pairedSettingValue) return 47 if (!pairedSettingValue) return
41 } 48 }
42 add(item) 49 add(item)
@@ -153,8 +160,8 @@ class SettingsFragmentPresenter(
153 private fun addThemeSettings(sl: ArrayList<SettingsItem>) { 160 private fun addThemeSettings(sl: ArrayList<SettingsItem>) {
154 sl.apply { 161 sl.apply {
155 val theme: AbstractIntSetting = object : AbstractIntSetting { 162 val theme: AbstractIntSetting = object : AbstractIntSetting {
156 override val int: Int 163 override fun getInt(needsGlobal: Boolean): Int =
157 get() = preferences.getInt(Settings.PREF_THEME, 0) 164 preferences.getInt(Settings.PREF_THEME, 0)
158 165
159 override fun setInt(value: Int) { 166 override fun setInt(value: Int) {
160 preferences.edit() 167 preferences.edit()
@@ -164,8 +171,8 @@ class SettingsFragmentPresenter(
164 } 171 }
165 172
166 override val key: String = Settings.PREF_THEME 173 override val key: String = Settings.PREF_THEME
167 override val category = Settings.Category.UiGeneral
168 override val isRuntimeModifiable: Boolean = false 174 override val isRuntimeModifiable: Boolean = false
175 override fun getValueAsString(needsGlobal: Boolean): String = getInt().toString()
169 override val defaultValue: Int = 0 176 override val defaultValue: Int = 0
170 override fun reset() { 177 override fun reset() {
171 preferences.edit() 178 preferences.edit()
@@ -197,8 +204,8 @@ class SettingsFragmentPresenter(
197 } 204 }
198 205
199 val themeMode: AbstractIntSetting = object : AbstractIntSetting { 206 val themeMode: AbstractIntSetting = object : AbstractIntSetting {
200 override val int: Int 207 override fun getInt(needsGlobal: Boolean): Int =
201 get() = preferences.getInt(Settings.PREF_THEME_MODE, -1) 208 preferences.getInt(Settings.PREF_THEME_MODE, -1)
202 209
203 override fun setInt(value: Int) { 210 override fun setInt(value: Int) {
204 preferences.edit() 211 preferences.edit()
@@ -208,8 +215,8 @@ class SettingsFragmentPresenter(
208 } 215 }
209 216
210 override val key: String = Settings.PREF_THEME_MODE 217 override val key: String = Settings.PREF_THEME_MODE
211 override val category = Settings.Category.UiGeneral
212 override val isRuntimeModifiable: Boolean = false 218 override val isRuntimeModifiable: Boolean = false
219 override fun getValueAsString(needsGlobal: Boolean): String = getInt().toString()
213 override val defaultValue: Int = -1 220 override val defaultValue: Int = -1
214 override fun reset() { 221 override fun reset() {
215 preferences.edit() 222 preferences.edit()
@@ -230,8 +237,8 @@ class SettingsFragmentPresenter(
230 ) 237 )
231 238
232 val blackBackgrounds: AbstractBooleanSetting = object : AbstractBooleanSetting { 239 val blackBackgrounds: AbstractBooleanSetting = object : AbstractBooleanSetting {
233 override val boolean: Boolean 240 override fun getBoolean(needsGlobal: Boolean): Boolean =
234 get() = preferences.getBoolean(Settings.PREF_BLACK_BACKGROUNDS, false) 241 preferences.getBoolean(Settings.PREF_BLACK_BACKGROUNDS, false)
235 242
236 override fun setBoolean(value: Boolean) { 243 override fun setBoolean(value: Boolean) {
237 preferences.edit() 244 preferences.edit()
@@ -241,8 +248,10 @@ class SettingsFragmentPresenter(
241 } 248 }
242 249
243 override val key: String = Settings.PREF_BLACK_BACKGROUNDS 250 override val key: String = Settings.PREF_BLACK_BACKGROUNDS
244 override val category = Settings.Category.UiGeneral
245 override val isRuntimeModifiable: Boolean = false 251 override val isRuntimeModifiable: Boolean = false
252 override fun getValueAsString(needsGlobal: Boolean): String =
253 getBoolean().toString()
254
246 override val defaultValue: Boolean = false 255 override val defaultValue: Boolean = false
247 override fun reset() { 256 override fun reset() {
248 preferences.edit() 257 preferences.edit()
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt
index 525f013f8..4e159a799 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt
@@ -29,7 +29,7 @@ class DateTimeViewHolder(val binding: ListItemSettingBinding, adapter: SettingsA
29 } 29 }
30 30
31 binding.textSettingValue.visibility = View.VISIBLE 31 binding.textSettingValue.visibility = View.VISIBLE
32 val epochTime = setting.value 32 val epochTime = setting.getValue()
33 val instant = Instant.ofEpochMilli(epochTime * 1000) 33 val instant = Instant.ofEpochMilli(epochTime * 1000)
34 val zonedTime = ZonedDateTime.ofInstant(instant, ZoneId.of("UTC")) 34 val zonedTime = ZonedDateTime.ofInstant(instant, ZoneId.of("UTC"))
35 val dateFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM) 35 val dateFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt
index 80d1b22c1..28c4d1777 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt
@@ -29,14 +29,14 @@ class SingleChoiceViewHolder(val binding: ListItemSettingBinding, adapter: Setti
29 val resMgr = binding.textSettingValue.context.resources 29 val resMgr = binding.textSettingValue.context.resources
30 val values = resMgr.getIntArray(item.valuesId) 30 val values = resMgr.getIntArray(item.valuesId)
31 for (i in values.indices) { 31 for (i in values.indices) {
32 if (values[i] == item.selectedValue) { 32 if (values[i] == item.getSelectedValue()) {
33 binding.textSettingValue.text = resMgr.getStringArray(item.choicesId)[i] 33 binding.textSettingValue.text = resMgr.getStringArray(item.choicesId)[i]
34 break 34 break
35 } 35 }
36 } 36 }
37 } else if (item is StringSingleChoiceSetting) { 37 } else if (item is StringSingleChoiceSetting) {
38 for (i in item.values.indices) { 38 for (i in item.values.indices) {
39 if (item.values[i] == item.selectedValue) { 39 if (item.values[i] == item.getSelectedValue()) {
40 binding.textSettingValue.text = item.choices[i] 40 binding.textSettingValue.text = item.choices[i]
41 break 41 break
42 } 42 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SliderViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SliderViewHolder.kt
index b83c90100..67432f88e 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SliderViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SliderViewHolder.kt
@@ -26,7 +26,7 @@ class SliderViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAda
26 binding.textSettingValue.visibility = View.VISIBLE 26 binding.textSettingValue.visibility = View.VISIBLE
27 binding.textSettingValue.text = String.format( 27 binding.textSettingValue.text = String.format(
28 binding.textSettingValue.context.getString(R.string.value_with_units), 28 binding.textSettingValue.context.getString(R.string.value_with_units),
29 setting.selectedValue, 29 setting.getSelectedValue(),
30 setting.units 30 setting.units
31 ) 31 )
32 32
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt
index 57fdeaa20..98ed888cb 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt
@@ -27,7 +27,7 @@ class SwitchSettingViewHolder(val binding: ListItemSettingSwitchBinding, adapter
27 } 27 }
28 28
29 binding.switchWidget.setOnCheckedChangeListener(null) 29 binding.switchWidget.setOnCheckedChangeListener(null)
30 binding.switchWidget.isChecked = setting.checked 30 binding.switchWidget.isChecked = setting.getIsChecked(setting.needsRuntimeGlobal)
31 binding.switchWidget.setOnCheckedChangeListener { _: CompoundButton, _: Boolean -> 31 binding.switchWidget.setOnCheckedChangeListener { _: CompoundButton, _: Boolean ->
32 adapter.onBooleanClick(item, binding.switchWidget.isChecked) 32 adapter.onBooleanClick(item, binding.switchWidget.isChecked)
33 } 33 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
index 734c1d5ca..b09df7db3 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
@@ -435,7 +435,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
435 @SuppressLint("SourceLockedOrientationActivity") 435 @SuppressLint("SourceLockedOrientationActivity")
436 private fun updateOrientation() { 436 private fun updateOrientation() {
437 emulationActivity?.let { 437 emulationActivity?.let {
438 it.requestedOrientation = when (IntSetting.RENDERER_SCREEN_LAYOUT.int) { 438 it.requestedOrientation = when (IntSetting.RENDERER_SCREEN_LAYOUT.getInt()) {
439 Settings.LayoutOption_MobileLandscape -> 439 Settings.LayoutOption_MobileLandscape ->
440 ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE 440 ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
441 Settings.LayoutOption_MobilePortrait -> 441 Settings.LayoutOption_MobilePortrait ->
@@ -617,7 +617,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
617 @SuppressLint("SourceLockedOrientationActivity") 617 @SuppressLint("SourceLockedOrientationActivity")
618 private fun startConfiguringControls() { 618 private fun startConfiguringControls() {
619 // Lock the current orientation to prevent editing inconsistencies 619 // Lock the current orientation to prevent editing inconsistencies
620 if (IntSetting.RENDERER_SCREEN_LAYOUT.int == Settings.LayoutOption_Unspecified) { 620 if (IntSetting.RENDERER_SCREEN_LAYOUT.getInt() == Settings.LayoutOption_Unspecified) {
621 emulationActivity?.let { 621 emulationActivity?.let {
622 it.requestedOrientation = 622 it.requestedOrientation =
623 if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) { 623 if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) {
@@ -635,7 +635,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
635 binding.doneControlConfig.visibility = View.GONE 635 binding.doneControlConfig.visibility = View.GONE
636 binding.surfaceInputOverlay.setIsInEditMode(false) 636 binding.surfaceInputOverlay.setIsInEditMode(false)
637 // Unlock the orientation if it was locked for editing 637 // Unlock the orientation if it was locked for editing
638 if (IntSetting.RENDERER_SCREEN_LAYOUT.int == Settings.LayoutOption_Unspecified) { 638 if (IntSetting.RENDERER_SCREEN_LAYOUT.getInt() == Settings.LayoutOption_Unspecified) {
639 emulationActivity?.let { 639 emulationActivity?.let {
640 it.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED 640 it.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
641 } 641 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SettingsDialogFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SettingsDialogFragment.kt
index b88d2c038..60e029f34 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SettingsDialogFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SettingsDialogFragment.kt
@@ -70,7 +70,7 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
70 sliderBinding = DialogSliderBinding.inflate(layoutInflater) 70 sliderBinding = DialogSliderBinding.inflate(layoutInflater)
71 val item = settingsViewModel.clickedItem as SliderSetting 71 val item = settingsViewModel.clickedItem as SliderSetting
72 72
73 settingsViewModel.setSliderTextValue(item.selectedValue.toFloat(), item.units) 73 settingsViewModel.setSliderTextValue(item.getSelectedValue().toFloat(), item.units)
74 sliderBinding.slider.apply { 74 sliderBinding.slider.apply {
75 valueFrom = item.min.toFloat() 75 valueFrom = item.min.toFloat()
76 valueTo = item.max.toFloat() 76 valueTo = item.max.toFloat()
@@ -136,18 +136,18 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
136 is SingleChoiceSetting -> { 136 is SingleChoiceSetting -> {
137 val scSetting = settingsViewModel.clickedItem as SingleChoiceSetting 137 val scSetting = settingsViewModel.clickedItem as SingleChoiceSetting
138 val value = getValueForSingleChoiceSelection(scSetting, which) 138 val value = getValueForSingleChoiceSelection(scSetting, which)
139 scSetting.selectedValue = value 139 scSetting.setSelectedValue(value)
140 } 140 }
141 141
142 is StringSingleChoiceSetting -> { 142 is StringSingleChoiceSetting -> {
143 val scSetting = settingsViewModel.clickedItem as StringSingleChoiceSetting 143 val scSetting = settingsViewModel.clickedItem as StringSingleChoiceSetting
144 val value = scSetting.getValueAt(which) 144 val value = scSetting.getValueAt(which)
145 scSetting.selectedValue = value 145 scSetting.setSelectedValue(value)
146 } 146 }
147 147
148 is SliderSetting -> { 148 is SliderSetting -> {
149 val sliderSetting = settingsViewModel.clickedItem as SliderSetting 149 val sliderSetting = settingsViewModel.clickedItem as SliderSetting
150 sliderSetting.selectedValue = settingsViewModel.sliderProgress.value 150 sliderSetting.setSelectedValue(settingsViewModel.sliderProgress.value)
151 } 151 }
152 } 152 }
153 closeDialog() 153 closeDialog()
@@ -171,7 +171,7 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
171 } 171 }
172 172
173 private fun getSelectionForSingleChoiceValue(item: SingleChoiceSetting): Int { 173 private fun getSelectionForSingleChoiceValue(item: SingleChoiceSetting): Int {
174 val value = item.selectedValue 174 val value = item.getSelectedValue()
175 val valuesId = item.valuesId 175 val valuesId = item.valuesId
176 if (valuesId > 0) { 176 if (valuesId > 0) {
177 val valuesArray = requireContext().resources.getIntArray(valuesId) 177 val valuesArray = requireContext().resources.getIntArray(valuesId)
@@ -211,7 +211,7 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
211 throw IllegalArgumentException("[SettingsDialogFragment] Incompatible type!") 211 throw IllegalArgumentException("[SettingsDialogFragment] Incompatible type!")
212 212
213 SettingsItem.TYPE_SLIDER -> settingsViewModel.setSliderProgress( 213 SettingsItem.TYPE_SLIDER -> settingsViewModel.setSliderProgress(
214 (clickedItem as SliderSetting).selectedValue.toFloat() 214 (clickedItem as SliderSetting).getSelectedValue().toFloat()
215 ) 215 )
216 } 216 }
217 settingsViewModel.clickedItem = clickedItem 217 settingsViewModel.clickedItem = clickedItem
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeConfig.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeConfig.kt
index f4e1bb13f..4c7316ba3 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeConfig.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeConfig.kt
@@ -31,32 +31,63 @@ object NativeConfig {
31 external fun saveSettings() 31 external fun saveSettings()
32 32
33 external fun getBoolean(key: String, getDefault: Boolean): Boolean 33 external fun getBoolean(key: String, getDefault: Boolean): Boolean
34
35 @Synchronized
36 external fun getBoolean(key: String, needsGlobal: Boolean): Boolean
37
38 @Synchronized
34 external fun setBoolean(key: String, value: Boolean) 39 external fun setBoolean(key: String, value: Boolean)
35 40
36 external fun getByte(key: String, getDefault: Boolean): Byte 41 @Synchronized
42 external fun getByte(key: String, needsGlobal: Boolean): Byte
43
44 @Synchronized
37 external fun setByte(key: String, value: Byte) 45 external fun setByte(key: String, value: Byte)
38 46
39 external fun getShort(key: String, getDefault: Boolean): Short 47 @Synchronized
48 external fun getShort(key: String, needsGlobal: Boolean): Short
49
50 @Synchronized
40 external fun setShort(key: String, value: Short) 51 external fun setShort(key: String, value: Short)
41 52
42 external fun getInt(key: String, getDefault: Boolean): Int 53 @Synchronized
54 external fun getInt(key: String, needsGlobal: Boolean): Int
55
56 @Synchronized
43 external fun setInt(key: String, value: Int) 57 external fun setInt(key: String, value: Int)
44 58
45 external fun getFloat(key: String, getDefault: Boolean): Float 59 @Synchronized
60 external fun getFloat(key: String, needsGlobal: Boolean): Float
61
62 @Synchronized
46 external fun setFloat(key: String, value: Float) 63 external fun setFloat(key: String, value: Float)
47 64
48 external fun getLong(key: String, getDefault: Boolean): Long 65 @Synchronized
66 external fun getLong(key: String, needsGlobal: Boolean): Long
67
68 @Synchronized
49 external fun setLong(key: String, value: Long) 69 external fun setLong(key: String, value: Long)
50 70
51 external fun getString(key: String, getDefault: Boolean): String 71 @Synchronized
72 external fun getString(key: String, needsGlobal: Boolean): String
73
74 @Synchronized
52 external fun setString(key: String, value: String) 75 external fun setString(key: String, value: String)
53 76
54 external fun getIsRuntimeModifiable(key: String): Boolean 77 external fun getIsRuntimeModifiable(key: String): Boolean
55 78
56 external fun getConfigHeader(category: Int): String
57
58 external fun getPairedSettingKey(key: String): String 79 external fun getPairedSettingKey(key: String): String
59 80
81 external fun getIsSwitchable(key: String): Boolean
82
83 @Synchronized
84 external fun usingGlobal(key: String): Boolean
85
86 @Synchronized
87 external fun setGlobal(key: String, global: Boolean)
88
89 external fun getDefaultToString(key: String): String
90
60 /** 91 /**
61 * Gets every [GameDir] in AndroidSettings::values.game_dirs 92 * Gets every [GameDir] in AndroidSettings::values.game_dirs
62 */ 93 */
diff --git a/src/android/app/src/main/jni/native_config.cpp b/src/android/app/src/main/jni/native_config.cpp
index 763b2164c..9439d11e1 100644
--- a/src/android/app/src/main/jni/native_config.cpp
+++ b/src/android/app/src/main/jni/native_config.cpp
@@ -49,18 +49,12 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_saveSettings(JNIEnv* env, jobjec
49} 49}
50 50
51jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getBoolean(JNIEnv* env, jobject obj, 51jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getBoolean(JNIEnv* env, jobject obj,
52 jstring jkey, jboolean getDefault) { 52 jstring jkey, jboolean needGlobal) {
53 auto setting = getSetting<bool>(env, jkey); 53 auto setting = getSetting<bool>(env, jkey);
54 if (setting == nullptr) { 54 if (setting == nullptr) {
55 return false; 55 return false;
56 } 56 }
57 setting->SetGlobal(true); 57 return setting->GetValue(static_cast<bool>(needGlobal));
58
59 if (static_cast<bool>(getDefault)) {
60 return setting->GetDefault();
61 }
62
63 return setting->GetValue();
64} 58}
65 59
66void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setBoolean(JNIEnv* env, jobject obj, jstring jkey, 60void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setBoolean(JNIEnv* env, jobject obj, jstring jkey,
@@ -69,23 +63,16 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setBoolean(JNIEnv* env, jobject
69 if (setting == nullptr) { 63 if (setting == nullptr) {
70 return; 64 return;
71 } 65 }
72 setting->SetGlobal(true);
73 setting->SetValue(static_cast<bool>(value)); 66 setting->SetValue(static_cast<bool>(value));
74} 67}
75 68
76jbyte Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getByte(JNIEnv* env, jobject obj, jstring jkey, 69jbyte Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getByte(JNIEnv* env, jobject obj, jstring jkey,
77 jboolean getDefault) { 70 jboolean needGlobal) {
78 auto setting = getSetting<u8>(env, jkey); 71 auto setting = getSetting<u8>(env, jkey);
79 if (setting == nullptr) { 72 if (setting == nullptr) {
80 return -1; 73 return -1;
81 } 74 }
82 setting->SetGlobal(true); 75 return setting->GetValue(static_cast<bool>(needGlobal));
83
84 if (static_cast<bool>(getDefault)) {
85 return setting->GetDefault();
86 }
87
88 return setting->GetValue();
89} 76}
90 77
91void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setByte(JNIEnv* env, jobject obj, jstring jkey, 78void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setByte(JNIEnv* env, jobject obj, jstring jkey,
@@ -94,23 +81,16 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setByte(JNIEnv* env, jobject obj
94 if (setting == nullptr) { 81 if (setting == nullptr) {
95 return; 82 return;
96 } 83 }
97 setting->SetGlobal(true);
98 setting->SetValue(value); 84 setting->SetValue(value);
99} 85}
100 86
101jshort Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getShort(JNIEnv* env, jobject obj, jstring jkey, 87jshort Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getShort(JNIEnv* env, jobject obj, jstring jkey,
102 jboolean getDefault) { 88 jboolean needGlobal) {
103 auto setting = getSetting<u16>(env, jkey); 89 auto setting = getSetting<u16>(env, jkey);
104 if (setting == nullptr) { 90 if (setting == nullptr) {
105 return -1; 91 return -1;
106 } 92 }
107 setting->SetGlobal(true); 93 return setting->GetValue(static_cast<bool>(needGlobal));
108
109 if (static_cast<bool>(getDefault)) {
110 return setting->GetDefault();
111 }
112
113 return setting->GetValue();
114} 94}
115 95
116void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setShort(JNIEnv* env, jobject obj, jstring jkey, 96void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setShort(JNIEnv* env, jobject obj, jstring jkey,
@@ -119,23 +99,16 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setShort(JNIEnv* env, jobject ob
119 if (setting == nullptr) { 99 if (setting == nullptr) {
120 return; 100 return;
121 } 101 }
122 setting->SetGlobal(true);
123 setting->SetValue(value); 102 setting->SetValue(value);
124} 103}
125 104
126jint Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getInt(JNIEnv* env, jobject obj, jstring jkey, 105jint Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getInt(JNIEnv* env, jobject obj, jstring jkey,
127 jboolean getDefault) { 106 jboolean needGlobal) {
128 auto setting = getSetting<int>(env, jkey); 107 auto setting = getSetting<int>(env, jkey);
129 if (setting == nullptr) { 108 if (setting == nullptr) {
130 return -1; 109 return -1;
131 } 110 }
132 setting->SetGlobal(true); 111 return setting->GetValue(needGlobal);
133
134 if (static_cast<bool>(getDefault)) {
135 return setting->GetDefault();
136 }
137
138 return setting->GetValue();
139} 112}
140 113
141void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setInt(JNIEnv* env, jobject obj, jstring jkey, 114void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setInt(JNIEnv* env, jobject obj, jstring jkey,
@@ -144,23 +117,16 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setInt(JNIEnv* env, jobject obj,
144 if (setting == nullptr) { 117 if (setting == nullptr) {
145 return; 118 return;
146 } 119 }
147 setting->SetGlobal(true);
148 setting->SetValue(value); 120 setting->SetValue(value);
149} 121}
150 122
151jfloat Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getFloat(JNIEnv* env, jobject obj, jstring jkey, 123jfloat Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getFloat(JNIEnv* env, jobject obj, jstring jkey,
152 jboolean getDefault) { 124 jboolean needGlobal) {
153 auto setting = getSetting<float>(env, jkey); 125 auto setting = getSetting<float>(env, jkey);
154 if (setting == nullptr) { 126 if (setting == nullptr) {
155 return -1; 127 return -1;
156 } 128 }
157 setting->SetGlobal(true); 129 return setting->GetValue(static_cast<bool>(needGlobal));
158
159 if (static_cast<bool>(getDefault)) {
160 return setting->GetDefault();
161 }
162
163 return setting->GetValue();
164} 130}
165 131
166void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setFloat(JNIEnv* env, jobject obj, jstring jkey, 132void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setFloat(JNIEnv* env, jobject obj, jstring jkey,
@@ -169,23 +135,16 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setFloat(JNIEnv* env, jobject ob
169 if (setting == nullptr) { 135 if (setting == nullptr) {
170 return; 136 return;
171 } 137 }
172 setting->SetGlobal(true);
173 setting->SetValue(value); 138 setting->SetValue(value);
174} 139}
175 140
176jlong Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getLong(JNIEnv* env, jobject obj, jstring jkey, 141jlong Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getLong(JNIEnv* env, jobject obj, jstring jkey,
177 jboolean getDefault) { 142 jboolean needGlobal) {
178 auto setting = getSetting<long>(env, jkey); 143 auto setting = getSetting<s64>(env, jkey);
179 if (setting == nullptr) { 144 if (setting == nullptr) {
180 return -1; 145 return -1;
181 } 146 }
182 setting->SetGlobal(true); 147 return setting->GetValue(static_cast<bool>(needGlobal));
183
184 if (static_cast<bool>(getDefault)) {
185 return setting->GetDefault();
186 }
187
188 return setting->GetValue();
189} 148}
190 149
191void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setLong(JNIEnv* env, jobject obj, jstring jkey, 150void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setLong(JNIEnv* env, jobject obj, jstring jkey,
@@ -194,23 +153,16 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setLong(JNIEnv* env, jobject obj
194 if (setting == nullptr) { 153 if (setting == nullptr) {
195 return; 154 return;
196 } 155 }
197 setting->SetGlobal(true);
198 setting->SetValue(value); 156 setting->SetValue(value);
199} 157}
200 158
201jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getString(JNIEnv* env, jobject obj, jstring jkey, 159jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getString(JNIEnv* env, jobject obj, jstring jkey,
202 jboolean getDefault) { 160 jboolean needGlobal) {
203 auto setting = getSetting<std::string>(env, jkey); 161 auto setting = getSetting<std::string>(env, jkey);
204 if (setting == nullptr) { 162 if (setting == nullptr) {
205 return ToJString(env, ""); 163 return ToJString(env, "");
206 } 164 }
207 setting->SetGlobal(true); 165 return ToJString(env, setting->GetValue(static_cast<bool>(needGlobal)));
208
209 if (static_cast<bool>(getDefault)) {
210 return ToJString(env, setting->GetDefault());
211 }
212
213 return ToJString(env, setting->GetValue());
214} 166}
215 167
216void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setString(JNIEnv* env, jobject obj, jstring jkey, 168void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setString(JNIEnv* env, jobject obj, jstring jkey,
@@ -220,27 +172,18 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setString(JNIEnv* env, jobject o
220 return; 172 return;
221 } 173 }
222 174
223 setting->SetGlobal(true);
224 setting->SetValue(GetJString(env, value)); 175 setting->SetValue(GetJString(env, value));
225} 176}
226 177
227jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getIsRuntimeModifiable(JNIEnv* env, jobject obj, 178jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getIsRuntimeModifiable(JNIEnv* env, jobject obj,
228 jstring jkey) { 179 jstring jkey) {
229 auto key = GetJString(env, jkey); 180 auto setting = getSetting<std::string>(env, jkey);
230 auto setting = Settings::values.linkage.by_key[key]; 181 if (setting != nullptr) {
231 if (setting != 0) {
232 return setting->RuntimeModfiable(); 182 return setting->RuntimeModfiable();
233 } 183 }
234 LOG_ERROR(Frontend, "[Android Native] Could not find setting - {}", key);
235 return true; 184 return true;
236} 185}
237 186
238jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getConfigHeader(JNIEnv* env, jobject obj,
239 jint jcategory) {
240 auto category = static_cast<Settings::Category>(jcategory);
241 return ToJString(env, Settings::TranslateCategory(category));
242}
243
244jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getPairedSettingKey(JNIEnv* env, jobject obj, 187jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getPairedSettingKey(JNIEnv* env, jobject obj,
245 jstring jkey) { 188 jstring jkey) {
246 auto setting = getSetting<std::string>(env, jkey); 189 auto setting = getSetting<std::string>(env, jkey);
@@ -254,6 +197,41 @@ jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getPairedSettingKey(JNIEnv* e
254 return ToJString(env, setting->PairedSetting()->GetLabel()); 197 return ToJString(env, setting->PairedSetting()->GetLabel());
255} 198}
256 199
200jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getIsSwitchable(JNIEnv* env, jobject obj,
201 jstring jkey) {
202 auto setting = getSetting<std::string>(env, jkey);
203 if (setting != nullptr) {
204 return setting->Switchable();
205 }
206 return false;
207}
208
209jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_usingGlobal(JNIEnv* env, jobject obj,
210 jstring jkey) {
211 auto setting = getSetting<std::string>(env, jkey);
212 if (setting != nullptr) {
213 return setting->UsingGlobal();
214 }
215 return true;
216}
217
218void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setGlobal(JNIEnv* env, jobject obj, jstring jkey,
219 jboolean global) {
220 auto setting = getSetting<std::string>(env, jkey);
221 if (setting != nullptr) {
222 setting->SetGlobal(static_cast<bool>(global));
223 }
224}
225
226jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getDefaultToString(JNIEnv* env, jobject obj,
227 jstring jkey) {
228 auto setting = getSetting<std::string>(env, jkey);
229 if (setting != nullptr) {
230 return ToJString(env, setting->DefaultToString());
231 }
232 return ToJString(env, "");
233}
234
257jobjectArray Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getGameDirs(JNIEnv* env, jobject obj) { 235jobjectArray Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getGameDirs(JNIEnv* env, jobject obj) {
258 jclass gameDirClass = IDCache::GetGameDirClass(); 236 jclass gameDirClass = IDCache::GetGameDirClass();
259 jmethodID gameDirConstructor = IDCache::GetGameDirConstructor(); 237 jmethodID gameDirConstructor = IDCache::GetGameDirConstructor();
diff --git a/src/common/settings_setting.h b/src/common/settings_setting.h
index 3175ab07d..0b18ca5ec 100644
--- a/src/common/settings_setting.h
+++ b/src/common/settings_setting.h
@@ -81,6 +81,9 @@ public:
81 [[nodiscard]] virtual const Type& GetValue() const { 81 [[nodiscard]] virtual const Type& GetValue() const {
82 return value; 82 return value;
83 } 83 }
84 [[nodiscard]] virtual const Type& GetValue(bool need_global) const {
85 return value;
86 }
84 87
85 /** 88 /**
86 * Sets the setting to the given value. 89 * Sets the setting to the given value.
@@ -353,7 +356,7 @@ public:
353 } 356 }
354 return custom; 357 return custom;
355 } 358 }
356 [[nodiscard]] const Type& GetValue(bool need_global) const { 359 [[nodiscard]] const Type& GetValue(bool need_global) const override final {
357 if (use_global || need_global) { 360 if (use_global || need_global) {
358 return this->value; 361 return this->value;
359 } 362 }