Add vertical chapter navigator for paged reader with height adjustment option (#3531)

This commit is contained in:
AntsyLich
2026-07-09 14:11:56 +06:00
committed by GitHub
parent 8407439b8a
commit 44780e74b5
22 changed files with 261 additions and 64 deletions
@@ -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())
}
}
}
@@ -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>()
}
@@ -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
}
},
)
}