Add vertical chapter navigator for paged reader with height adjustment option (#3531)
This commit is contained in:
@@ -212,4 +212,25 @@ sealed class AndroidPreference<T>(
|
||||
putInt(key, serializer(value))
|
||||
}
|
||||
}
|
||||
|
||||
class ObjectSetAsStringSet<T>(
|
||||
preferences: SharedPreferences,
|
||||
keyFlow: Flow<String?>,
|
||||
key: String,
|
||||
defaultValue: Set<T>,
|
||||
private val serializer: (T) -> String,
|
||||
private val deserializer: (String) -> T?,
|
||||
) : AndroidPreference<Set<T>>(preferences, keyFlow, key, defaultValue) {
|
||||
override fun read(preferences: SharedPreferences, key: String, defaultValue: Set<T>): Set<T> {
|
||||
return try {
|
||||
preferences.getStringSet(key, null)?.mapNotNull(deserializer)?.toSet() ?: defaultValue
|
||||
} catch (_: Exception) {
|
||||
defaultValue
|
||||
}
|
||||
}
|
||||
|
||||
override fun write(key: String, value: Set<T>): Editor.() -> Unit = {
|
||||
putStringSet(key, value.map(serializer).toSet())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+17
@@ -11,6 +11,7 @@ import tachiyomi.core.common.preference.AndroidPreference.IntPrimitive
|
||||
import tachiyomi.core.common.preference.AndroidPreference.LongPrimitive
|
||||
import tachiyomi.core.common.preference.AndroidPreference.ObjectAsInt
|
||||
import tachiyomi.core.common.preference.AndroidPreference.ObjectAsString
|
||||
import tachiyomi.core.common.preference.AndroidPreference.ObjectSetAsStringSet
|
||||
import tachiyomi.core.common.preference.AndroidPreference.StringPrimitive
|
||||
import tachiyomi.core.common.preference.AndroidPreference.StringSetPrimitive
|
||||
|
||||
@@ -77,6 +78,22 @@ class AndroidPreferenceStore(
|
||||
)
|
||||
}
|
||||
|
||||
override fun <T> getObjectSetFromStringSet(
|
||||
key: String,
|
||||
defaultValue: Set<T>,
|
||||
serializer: (T) -> String,
|
||||
deserializer: (String) -> T?,
|
||||
): Preference<Set<T>> {
|
||||
return ObjectSetAsStringSet(
|
||||
preferences = sharedPreferences,
|
||||
keyFlow = keyFlow,
|
||||
key = key,
|
||||
defaultValue = defaultValue,
|
||||
serializer = serializer,
|
||||
deserializer = deserializer,
|
||||
)
|
||||
}
|
||||
|
||||
override fun getAll(): Map<String, *> {
|
||||
return sharedPreferences.all ?: emptyMap<String, Any>()
|
||||
}
|
||||
|
||||
+17
-1
@@ -48,7 +48,11 @@ class InMemoryPreferenceStore(
|
||||
}
|
||||
|
||||
override fun getStringSet(key: String, defaultValue: Set<String>): Preference<Set<String>> {
|
||||
TODO("Not yet implemented")
|
||||
val default = InMemoryPreference(key, null, defaultValue)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
val data: Set<String>? = preferences[key]?.get() as? Set<String>
|
||||
return if (data == null) default else InMemoryPreference(key, data, defaultValue)
|
||||
}
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
@@ -75,6 +79,18 @@ class InMemoryPreferenceStore(
|
||||
return if (data == null) default else InMemoryPreference(key, data, defaultValue)
|
||||
}
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun <T> getObjectSetFromStringSet(
|
||||
key: String,
|
||||
defaultValue: Set<T>,
|
||||
serializer: (T) -> String,
|
||||
deserializer: (String) -> T?,
|
||||
): Preference<Set<T>> {
|
||||
val default = InMemoryPreference(key, null, defaultValue)
|
||||
val data: Set<T>? = preferences[key]?.get() as? Set<T>
|
||||
return if (data == null) default else InMemoryPreference(key, data, defaultValue)
|
||||
}
|
||||
|
||||
override fun getAll(): Map<String, *> {
|
||||
return preferences
|
||||
}
|
||||
|
||||
@@ -28,6 +28,13 @@ interface PreferenceStore {
|
||||
deserializer: (Int) -> T,
|
||||
): Preference<T>
|
||||
|
||||
fun <T> getObjectSetFromStringSet(
|
||||
key: String,
|
||||
defaultValue: Set<T>,
|
||||
serializer: (T) -> String,
|
||||
deserializer: (String) -> T?,
|
||||
): Preference<Set<T>>
|
||||
|
||||
fun getAll(): Map<String, *>
|
||||
}
|
||||
|
||||
@@ -60,3 +67,21 @@ inline fun <reified T : Enum<T>> PreferenceStore.getEnum(
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
inline fun <reified T : Enum<T>> PreferenceStore.getEnumSet(
|
||||
key: String,
|
||||
defaultValue: Set<T>,
|
||||
): Preference<Set<T>> {
|
||||
return getObjectSetFromStringSet(
|
||||
key = key,
|
||||
defaultValue = defaultValue,
|
||||
serializer = { it.name },
|
||||
deserializer = {
|
||||
try {
|
||||
enumValueOf<T>(it)
|
||||
} catch (_: IllegalArgumentException) {
|
||||
null
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user