package eu.kanade.presentation.more.settings import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.graphics.vector.ImageVector import eu.kanade.tachiyomi.data.track.Tracker import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableMap import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.core.preference.Preference as PreferenceData sealed class Preference { abstract val title: String abstract val enabled: Boolean sealed class PreferenceItem : Preference() { abstract val subtitle: String? abstract val icon: ImageVector? abstract val onValueChanged: suspend (newValue: T) -> Boolean /** * A basic [PreferenceItem] that only displays texts. */ data class TextPreference( override val title: String, override val subtitle: String? = null, override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (newValue: String) -> Boolean = { true }, val onClick: (() -> Unit)? = null, ) : PreferenceItem() /** * A [PreferenceItem] that provides a two-state toggleable option. */ data class SwitchPreference( val pref: PreferenceData, override val title: String, override val subtitle: String? = null, override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (newValue: Boolean) -> Boolean = { true }, ) : PreferenceItem() /** * A [PreferenceItem] that provides a slider to select an integer number. */ data class SliderPreference( val value: Int, val min: Int = 0, val max: Int, override val title: String = "", override val subtitle: String? = null, override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (newValue: Int) -> Boolean = { true }, ) : PreferenceItem() /** * A [PreferenceItem] that displays a list of entries as a dialog. */ @Suppress("UNCHECKED_CAST") data class ListPreference( val pref: PreferenceData, override val title: String, override val subtitle: String? = "%s", val subtitleProvider: @Composable (value: T, entries: ImmutableMap) -> String? = { v, e -> subtitle?.format(e[v]) }, override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (newValue: T) -> Boolean = { true }, val entries: ImmutableMap, ) : PreferenceItem() { internal fun internalSet(newValue: Any) = pref.set(newValue as T) internal suspend fun internalOnValueChanged(newValue: Any) = onValueChanged(newValue as T) @Composable internal fun internalSubtitleProvider(value: Any?, entries: ImmutableMap) = subtitleProvider(value as T, entries as ImmutableMap) } /** * [ListPreference] but with no connection to a [PreferenceData] */ data class BasicListPreference( val value: String, override val title: String, override val subtitle: String? = "%s", val subtitleProvider: @Composable (value: String, entries: ImmutableMap) -> String? = { v, e -> subtitle?.format(e[v]) }, override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (newValue: String) -> Boolean = { true }, val entries: ImmutableMap, ) : PreferenceItem() /** * A [PreferenceItem] that displays a list of entries as a dialog. * Multiple entries can be selected at the same time. */ data class MultiSelectListPreference( val pref: PreferenceData>, override val title: String, override val subtitle: String? = "%s", val subtitleProvider: @Composable ( value: Set, entries: ImmutableMap, ) -> String? = { v, e -> val combined = remember(v) { v.map { e[it] } .takeIf { it.isNotEmpty() } ?.joinToString() } ?: stringResource(MR.strings.none) subtitle?.format(combined) }, override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (newValue: Set) -> Boolean = { true }, val entries: ImmutableMap, ) : PreferenceItem>() /** * A [PreferenceItem] that shows a EditText in the dialog. */ data class EditTextPreference( val pref: PreferenceData, override val title: String, override val subtitle: String? = "%s", override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (newValue: String) -> Boolean = { true }, ) : PreferenceItem() /** * A [PreferenceItem] for individual tracker. */ data class TrackerPreference( val tracker: Tracker, override val title: String, val login: () -> Unit, val logout: () -> Unit, ) : PreferenceItem() { override val enabled: Boolean = true override val subtitle: String? = null override val icon: ImageVector? = null override val onValueChanged: suspend (newValue: String) -> Boolean = { true } } data class InfoPreference( override val title: String, ) : PreferenceItem() { override val enabled: Boolean = true override val subtitle: String? = null override val icon: ImageVector? = null override val onValueChanged: suspend (newValue: String) -> Boolean = { true } } data class CustomPreference( override val title: String, val content: @Composable (PreferenceItem) -> Unit, ) : PreferenceItem() { override val enabled: Boolean = true override val subtitle: String? = null override val icon: ImageVector? = null override val onValueChanged: suspend (newValue: String) -> Boolean = { true } } } data class PreferenceGroup( override val title: String, override val enabled: Boolean = true, val preferenceItems: ImmutableList>, ) : Preference() }