package eu.kanade.presentation.more.settings import androidx.compose.ui.graphics.vector.ImageVector import eu.kanade.domain.ui.model.AppTheme import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.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 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", override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (newValue: T) -> Boolean = { true }, val entries: Map, ) : PreferenceItem() { internal fun internalSet(newValue: Any) = pref.set(newValue as T) internal suspend fun internalOnValueChanged(newValue: Any) = onValueChanged(newValue as T) } /** * [ListPreference] but with no connection to a [PreferenceData] */ data class BasicListPreference( val value: String, 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 }, val entries: Map, ) : 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? = null, override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (newValue: Set) -> Boolean = { true }, val entries: Map, ) : 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] that shows previews of [AppTheme] selection. */ data class AppThemePreference( val pref: PreferenceData, 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: AppTheme) -> Boolean = { true } } /** * A [PreferenceItem] for individual tracking service. */ data class TrackingPreference( val service: TrackService, 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 PreferenceGroup( override val title: String, override val enabled: Boolean = true, val preferenceItems: List>, ) : Preference() }