Allow more flexible custom preference composables
This commit is contained in:
parent
b6620434b3
commit
8ff0c9d61a
3 changed files with 27 additions and 29 deletions
|
@ -13,8 +13,6 @@ import androidx.compose.runtime.rememberCoroutineScope
|
||||||
import androidx.compose.runtime.structuralEqualityPolicy
|
import androidx.compose.runtime.structuralEqualityPolicy
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import eu.kanade.domain.track.service.TrackPreferences
|
import eu.kanade.domain.track.service.TrackPreferences
|
||||||
import eu.kanade.domain.ui.UiPreferences
|
|
||||||
import eu.kanade.presentation.more.settings.widget.AppThemePreferenceWidget
|
|
||||||
import eu.kanade.presentation.more.settings.widget.EditTextPreferenceWidget
|
import eu.kanade.presentation.more.settings.widget.EditTextPreferenceWidget
|
||||||
import eu.kanade.presentation.more.settings.widget.InfoWidget
|
import eu.kanade.presentation.more.settings.widget.InfoWidget
|
||||||
import eu.kanade.presentation.more.settings.widget.ListPreferenceWidget
|
import eu.kanade.presentation.more.settings.widget.ListPreferenceWidget
|
||||||
|
@ -158,16 +156,6 @@ internal fun PreferenceItem(
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
is Preference.PreferenceItem.AppThemePreference -> {
|
|
||||||
val value by item.pref.collectAsState()
|
|
||||||
val amoled by Injekt.get<UiPreferences>().themeDarkAmoled().collectAsState()
|
|
||||||
AppThemePreferenceWidget(
|
|
||||||
title = item.title,
|
|
||||||
value = value,
|
|
||||||
amoled = amoled,
|
|
||||||
onItemClick = { scope.launch { item.pref.set(it) } },
|
|
||||||
)
|
|
||||||
}
|
|
||||||
is Preference.PreferenceItem.TrackingPreference -> {
|
is Preference.PreferenceItem.TrackingPreference -> {
|
||||||
val uName by Injekt.get<PreferenceStore>()
|
val uName by Injekt.get<PreferenceStore>()
|
||||||
.getString(TrackPreferences.trackUsername(item.service.id))
|
.getString(TrackPreferences.trackUsername(item.service.id))
|
||||||
|
@ -183,6 +171,9 @@ internal fun PreferenceItem(
|
||||||
is Preference.PreferenceItem.InfoPreference -> {
|
is Preference.PreferenceItem.InfoPreference -> {
|
||||||
InfoWidget(text = item.title)
|
InfoWidget(text = item.title)
|
||||||
}
|
}
|
||||||
|
is Preference.PreferenceItem.CustomPreference -> {
|
||||||
|
item.content(item)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,6 @@ import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.graphics.vector.ImageVector
|
import androidx.compose.ui.graphics.vector.ImageVector
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import eu.kanade.domain.ui.model.AppTheme
|
|
||||||
import eu.kanade.presentation.more.settings.Preference.PreferenceItem
|
import eu.kanade.presentation.more.settings.Preference.PreferenceItem
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.track.TrackService
|
import eu.kanade.tachiyomi.data.track.TrackService
|
||||||
|
@ -133,19 +132,6 @@ sealed class Preference {
|
||||||
override val onValueChanged: suspend (newValue: String) -> Boolean = { true },
|
override val onValueChanged: suspend (newValue: String) -> Boolean = { true },
|
||||||
) : PreferenceItem<String>()
|
) : PreferenceItem<String>()
|
||||||
|
|
||||||
/**
|
|
||||||
* A [PreferenceItem] that shows previews of [AppTheme] selection.
|
|
||||||
*/
|
|
||||||
data class AppThemePreference(
|
|
||||||
val pref: PreferenceData<AppTheme>,
|
|
||||||
override val title: String,
|
|
||||||
) : PreferenceItem<AppTheme>() {
|
|
||||||
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.
|
* A [PreferenceItem] for individual tracking service.
|
||||||
*/
|
*/
|
||||||
|
@ -169,6 +155,16 @@ sealed class Preference {
|
||||||
override val icon: ImageVector? = null
|
override val icon: ImageVector? = null
|
||||||
override val onValueChanged: suspend (newValue: String) -> Boolean = { true }
|
override val onValueChanged: suspend (newValue: String) -> Boolean = { true }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data class CustomPreference(
|
||||||
|
override val title: String,
|
||||||
|
val content: @Composable (PreferenceItem<String>) -> Unit,
|
||||||
|
) : PreferenceItem<String>() {
|
||||||
|
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(
|
data class PreferenceGroup(
|
||||||
|
|
|
@ -21,6 +21,7 @@ import eu.kanade.domain.ui.model.TabletUiMode
|
||||||
import eu.kanade.domain.ui.model.ThemeMode
|
import eu.kanade.domain.ui.model.ThemeMode
|
||||||
import eu.kanade.domain.ui.model.setAppCompatDelegateThemeMode
|
import eu.kanade.domain.ui.model.setAppCompatDelegateThemeMode
|
||||||
import eu.kanade.presentation.more.settings.Preference
|
import eu.kanade.presentation.more.settings.Preference
|
||||||
|
import eu.kanade.presentation.more.settings.widget.AppThemePreferenceWidget
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.util.system.LocaleHelper
|
import eu.kanade.tachiyomi.util.system.LocaleHelper
|
||||||
import eu.kanade.tachiyomi.util.system.toast
|
import eu.kanade.tachiyomi.util.system.toast
|
||||||
|
@ -59,8 +60,11 @@ object SettingsAppearanceScreen : SearchableSettings {
|
||||||
): Preference.PreferenceGroup {
|
): Preference.PreferenceGroup {
|
||||||
val themeModePref = uiPreferences.themeMode()
|
val themeModePref = uiPreferences.themeMode()
|
||||||
val themeMode by themeModePref.collectAsState()
|
val themeMode by themeModePref.collectAsState()
|
||||||
|
|
||||||
val appThemePref = uiPreferences.appTheme()
|
val appThemePref = uiPreferences.appTheme()
|
||||||
|
|
||||||
val amoledPref = uiPreferences.themeDarkAmoled()
|
val amoledPref = uiPreferences.themeDarkAmoled()
|
||||||
|
val amoled by amoledPref.collectAsState()
|
||||||
|
|
||||||
LaunchedEffect(themeMode) {
|
LaunchedEffect(themeMode) {
|
||||||
setAppCompatDelegateThemeMode(themeMode)
|
setAppCompatDelegateThemeMode(themeMode)
|
||||||
|
@ -91,10 +95,17 @@ object SettingsAppearanceScreen : SearchableSettings {
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
Preference.PreferenceItem.AppThemePreference(
|
Preference.PreferenceItem.CustomPreference(
|
||||||
title = stringResource(R.string.pref_app_theme),
|
title = stringResource(R.string.pref_app_theme),
|
||||||
pref = appThemePref,
|
) { item ->
|
||||||
),
|
val value by appThemePref.collectAsState()
|
||||||
|
AppThemePreferenceWidget(
|
||||||
|
title = item.title,
|
||||||
|
value = value,
|
||||||
|
amoled = amoled,
|
||||||
|
onItemClick = { appThemePref.set(it) },
|
||||||
|
)
|
||||||
|
},
|
||||||
Preference.PreferenceItem.SwitchPreference(
|
Preference.PreferenceItem.SwitchPreference(
|
||||||
pref = amoledPref,
|
pref = amoledPref,
|
||||||
title = stringResource(R.string.pref_dark_theme_pure_black),
|
title = stringResource(R.string.pref_dark_theme_pure_black),
|
||||||
|
|
Reference in a new issue