Przeglądaj źródła

Remove redundant preference composables

arkon 2 lat temu
rodzic
commit
dd1923fe88

+ 10 - 5
app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt

@@ -54,9 +54,10 @@ import eu.kanade.presentation.components.DIVIDER_ALPHA
 import eu.kanade.presentation.components.Divider
 import eu.kanade.presentation.components.EmptyScreen
 import eu.kanade.presentation.components.LoadingScreen
-import eu.kanade.presentation.components.PreferenceRow
 import eu.kanade.presentation.components.Scaffold
 import eu.kanade.presentation.components.ScrollbarLazyColumn
+import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget
+import eu.kanade.presentation.more.settings.widget.TrailingWidgetBuffer
 import eu.kanade.presentation.util.horizontalPadding
 import eu.kanade.tachiyomi.R
 import eu.kanade.tachiyomi.extension.model.Extension
@@ -376,15 +377,14 @@ private fun SourceSwitchPreference(
 ) {
     val context = LocalContext.current
 
-    PreferenceRow(
+    TextPreferenceWidget(
         modifier = modifier,
         title = if (source.labelAsName) {
             source.source.toString()
         } else {
             LocaleHelper.getSourceDisplayName(source.source.lang, context)
         },
-        onClick = { onClickSource(source.source.id) },
-        action = {
+        widget = {
             Row(
                 verticalAlignment = Alignment.CenterVertically,
             ) {
@@ -398,9 +398,14 @@ private fun SourceSwitchPreference(
                     }
                 }
 
-                Switch(checked = source.enabled, onCheckedChange = null)
+                Switch(
+                    checked = source.enabled,
+                    onCheckedChange = null,
+                    modifier = Modifier.padding(start = TrailingWidgetBuffer),
+                )
             }
         },
+        onPreferenceClick = { onClickSource(source.source.id) },
     )
 }
 

+ 14 - 33
app/src/main/java/eu/kanade/presentation/browse/ExtensionFilterScreen.kt

@@ -3,7 +3,6 @@ package eu.kanade.presentation.browse
 import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.lazy.items
-import androidx.compose.material3.Switch
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.ui.Modifier
@@ -13,8 +12,8 @@ import eu.kanade.presentation.components.AppBar
 import eu.kanade.presentation.components.EmptyScreen
 import eu.kanade.presentation.components.FastScrollLazyColumn
 import eu.kanade.presentation.components.LoadingScreen
-import eu.kanade.presentation.components.PreferenceRow
 import eu.kanade.presentation.components.Scaffold
+import eu.kanade.presentation.more.settings.widget.SwitchPreferenceWidget
 import eu.kanade.tachiyomi.R
 import eu.kanade.tachiyomi.ui.browse.extension.ExtensionFilterPresenter
 import eu.kanade.tachiyomi.util.system.LocaleHelper
@@ -42,15 +41,13 @@ fun ExtensionFilterScreen(
                 textResource = R.string.empty_screen,
                 modifier = Modifier.padding(contentPadding),
             )
-            else -> {
-                SourceFilterContent(
-                    contentPadding = contentPadding,
-                    state = presenter,
-                    onClickLang = {
-                        presenter.toggleLanguage(it)
-                    },
-                )
-            }
+            else -> ExtensionFilterContent(
+                contentPadding = contentPadding,
+                state = presenter,
+                onClickLang = {
+                    presenter.toggleLanguage(it)
+                },
+            )
         }
     }
     LaunchedEffect(Unit) {
@@ -65,7 +62,7 @@ fun ExtensionFilterScreen(
 }
 
 @Composable
-private fun SourceFilterContent(
+private fun ExtensionFilterContent(
     contentPadding: PaddingValues,
     state: ExtensionFilterState,
     onClickLang: (String) -> Unit,
@@ -76,29 +73,13 @@ private fun SourceFilterContent(
         items(
             items = state.items,
         ) { model ->
-            ExtensionFilterItem(
+            val lang = model.lang
+            SwitchPreferenceWidget(
                 modifier = Modifier.animateItemPlacement(),
-                lang = model.lang,
-                enabled = model.enabled,
-                onClickItem = onClickLang,
+                title = LocaleHelper.getSourceDisplayName(lang, LocalContext.current),
+                checked = model.enabled,
+                onCheckedChanged = { onClickLang(lang) },
             )
         }
     }
 }
-
-@Composable
-private fun ExtensionFilterItem(
-    modifier: Modifier,
-    lang: String,
-    enabled: Boolean,
-    onClickItem: (String) -> Unit,
-) {
-    PreferenceRow(
-        modifier = modifier,
-        title = LocaleHelper.getSourceDisplayName(lang, LocalContext.current),
-        action = {
-            Switch(checked = enabled, onCheckedChange = null)
-        },
-        onClick = { onClickItem(lang) },
-    )
-}

+ 4 - 7
app/src/main/java/eu/kanade/presentation/browse/SourcesFilterScreen.kt

@@ -4,7 +4,6 @@ import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.lazy.items
 import androidx.compose.material3.Checkbox
-import androidx.compose.material3.Switch
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.ui.Modifier
@@ -16,8 +15,8 @@ import eu.kanade.presentation.components.AppBar
 import eu.kanade.presentation.components.EmptyScreen
 import eu.kanade.presentation.components.FastScrollLazyColumn
 import eu.kanade.presentation.components.LoadingScreen
-import eu.kanade.presentation.components.PreferenceRow
 import eu.kanade.presentation.components.Scaffold
+import eu.kanade.presentation.more.settings.widget.SwitchPreferenceWidget
 import eu.kanade.tachiyomi.R
 import eu.kanade.tachiyomi.ui.browse.source.FilterUiModel
 import eu.kanade.tachiyomi.ui.browse.source.SourcesFilterPresenter
@@ -119,13 +118,11 @@ private fun SourcesFilterHeader(
     enabled: Boolean,
     onClickItem: (String) -> Unit,
 ) {
-    PreferenceRow(
+    SwitchPreferenceWidget(
         modifier = modifier,
         title = LocaleHelper.getSourceDisplayName(language, LocalContext.current),
-        action = {
-            Switch(checked = enabled, onCheckedChange = null)
-        },
-        onClick = { onClickItem(language) },
+        checked = enabled,
+        onCheckedChanged = { onClickItem(language) },
     )
 }
 

+ 17 - 0
app/src/main/java/eu/kanade/presentation/components/Divider.kt

@@ -0,0 +1,17 @@
+package eu.kanade.presentation.components
+
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+
+const val DIVIDER_ALPHA = 0.2f
+
+@Composable
+fun Divider(
+    modifier: Modifier = Modifier,
+) {
+    androidx.compose.material3.Divider(
+        modifier = modifier,
+        color = MaterialTheme.colorScheme.onSurface.copy(alpha = DIVIDER_ALPHA),
+    )
+}

+ 0 - 167
app/src/main/java/eu/kanade/presentation/components/Preferences.kt

@@ -1,167 +0,0 @@
-package eu.kanade.presentation.components
-
-import androidx.compose.foundation.combinedClickable
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.heightIn
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.layout.widthIn
-import androidx.compose.material3.Icon
-import androidx.compose.material3.MaterialTheme
-import androidx.compose.material3.Switch
-import androidx.compose.material3.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.painter.Painter
-import androidx.compose.ui.tooling.preview.Preview
-import androidx.compose.ui.unit.dp
-import eu.kanade.core.prefs.PreferenceMutableState
-import eu.kanade.presentation.theme.TachiyomiTheme
-import eu.kanade.presentation.util.horizontalPadding
-
-const val DIVIDER_ALPHA = 0.2f
-
-@Composable
-fun Divider(
-    modifier: Modifier = Modifier,
-) {
-    androidx.compose.material3.Divider(
-        modifier = modifier,
-        color = MaterialTheme.colorScheme.onSurface.copy(alpha = DIVIDER_ALPHA),
-    )
-}
-
-@Composable
-fun PreferenceRow(
-    modifier: Modifier = Modifier,
-    title: String,
-    painter: Painter? = null,
-    onClick: () -> Unit = {},
-    onLongClick: () -> Unit = {},
-    subtitle: String? = null,
-    action: @Composable (() -> Unit)? = null,
-) {
-    val height = if (subtitle != null) 72.dp else 56.dp
-
-    val titleTextStyle = MaterialTheme.typography.bodyLarge
-    val subtitleTextStyle = MaterialTheme.typography.bodyMedium.copy(
-        color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.75f),
-    )
-
-    Row(
-        modifier = modifier
-            .fillMaxWidth()
-            .heightIn(min = height)
-            .combinedClickable(
-                onLongClick = onLongClick,
-                onClick = onClick,
-            ),
-        verticalAlignment = Alignment.CenterVertically,
-    ) {
-        if (painter != null) {
-            Icon(
-                painter = painter,
-                modifier = Modifier
-                    .padding(start = horizontalPadding, end = 16.dp)
-                    .size(24.dp),
-                tint = MaterialTheme.colorScheme.primary,
-                contentDescription = null,
-            )
-        }
-        Column(
-            Modifier
-                .padding(horizontal = 16.dp)
-                .weight(1f),
-        ) {
-            Text(
-                text = title,
-                style = titleTextStyle,
-            )
-            if (subtitle != null) {
-                Text(
-                    modifier = Modifier.padding(top = 4.dp),
-                    text = subtitle,
-                    style = subtitleTextStyle,
-                )
-            }
-        }
-        if (action != null) {
-            Box(
-                Modifier
-                    .widthIn(min = 56.dp)
-                    .padding(end = horizontalPadding),
-            ) {
-                action()
-            }
-        }
-    }
-}
-
-@Composable
-fun SwitchPreference(
-    modifier: Modifier = Modifier,
-    checked: Boolean,
-    onClick: () -> Unit,
-    title: String,
-    subtitle: String? = null,
-    painter: Painter? = null,
-) {
-    PreferenceRow(
-        modifier = modifier,
-        title = title,
-        subtitle = subtitle,
-        painter = painter,
-        action = { Switch(checked = checked, onCheckedChange = null) },
-        onClick = onClick,
-    )
-}
-
-@Composable
-fun SwitchPreference(
-    modifier: Modifier = Modifier,
-    preference: PreferenceMutableState<Boolean>,
-    title: String,
-    subtitle: String? = null,
-    painter: Painter? = null,
-) {
-    SwitchPreference(
-        modifier = modifier,
-        title = title,
-        subtitle = subtitle,
-        painter = painter,
-        checked = preference.value,
-        onClick = { preference.value = !preference.value },
-    )
-}
-
-@Preview
-@Composable
-private fun PreferencesPreview() {
-    TachiyomiTheme {
-        Column {
-            PreferenceRow(
-                title = "Plain",
-                subtitle = "Subtitle",
-            )
-
-            Divider()
-
-            SwitchPreference(
-                title = "Switch (on)",
-                subtitle = "Subtitle",
-                checked = true,
-                onClick = {},
-            )
-            SwitchPreference(
-                title = "Switch (off)",
-                subtitle = "Subtitle",
-                checked = false,
-                onClick = {},
-            )
-        }
-    }
-}

+ 33 - 34
app/src/main/java/eu/kanade/presentation/more/settings/widget/BasePreferenceWidget.kt

@@ -44,43 +44,42 @@ internal fun BasePreferenceWidget(
     widget: @Composable (() -> Unit)? = null,
 ) {
     val highlighted = LocalPreferenceHighlighted.current
-    Box(modifier = Modifier.highlightBackground(highlighted)) {
-        Row(
-            modifier = modifier
-                .sizeIn(minHeight = 56.dp)
-                .clickable(enabled = onClick != null, onClick = { onClick?.invoke() })
-                .fillMaxWidth(),
-            verticalAlignment = Alignment.CenterVertically,
+    Row(
+        modifier = modifier
+            .highlightBackground(highlighted)
+            .sizeIn(minHeight = 56.dp)
+            .clickable(enabled = onClick != null, onClick = { onClick?.invoke() })
+            .fillMaxWidth(),
+        verticalAlignment = Alignment.CenterVertically,
+    ) {
+        if (icon != null) {
+            Box(
+                modifier = Modifier.padding(start = PrefsHorizontalPadding, end = 8.dp),
+                content = { icon() },
+            )
+        }
+        Column(
+            modifier = Modifier
+                .weight(1f)
+                .padding(vertical = PrefsVerticalPadding),
         ) {
-            if (icon != null) {
-                Box(
-                    modifier = Modifier.padding(start = PrefsHorizontalPadding, end = 8.dp),
-                    content = { icon() },
-                )
-            }
-            Column(
-                modifier = Modifier
-                    .weight(1f)
-                    .padding(vertical = PrefsVerticalPadding),
-            ) {
-                if (!title.isNullOrBlank()) {
-                    Text(
-                        modifier = Modifier.padding(horizontal = PrefsHorizontalPadding),
-                        text = title,
-                        overflow = TextOverflow.Ellipsis,
-                        maxLines = 2,
-                        style = MaterialTheme.typography.titleLarge,
-                        fontSize = TitleFontSize,
-                    )
-                }
-                subcomponent?.invoke(this)
-            }
-            if (widget != null) {
-                Box(
-                    modifier = Modifier.padding(end = PrefsHorizontalPadding),
-                    content = { widget() },
+            if (!title.isNullOrBlank()) {
+                Text(
+                    modifier = Modifier.padding(horizontal = PrefsHorizontalPadding),
+                    text = title,
+                    overflow = TextOverflow.Ellipsis,
+                    maxLines = 2,
+                    style = MaterialTheme.typography.titleLarge,
+                    fontSize = TitleFontSize,
                 )
             }
+            subcomponent?.invoke(this)
+        }
+        if (widget != null) {
+            Box(
+                modifier = Modifier.padding(end = PrefsHorizontalPadding),
+                content = { widget() },
+            )
         }
     }
 }

+ 2 - 0
app/src/main/java/eu/kanade/presentation/more/settings/widget/SwitchPreferenceWidget.kt

@@ -14,6 +14,7 @@ import androidx.compose.ui.tooling.preview.Preview
 
 @Composable
 fun SwitchPreferenceWidget(
+    modifier: Modifier = Modifier,
     title: String,
     subtitle: String? = null,
     icon: ImageVector? = null,
@@ -21,6 +22,7 @@ fun SwitchPreferenceWidget(
     onCheckedChanged: (Boolean) -> Unit,
 ) {
     TextPreferenceWidget(
+        modifier = modifier,
         title = title,
         subtitle = subtitle,
         icon = icon,

+ 0 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionFilterPresenter.kt

@@ -13,7 +13,6 @@ import kotlinx.coroutines.channels.Channel
 import kotlinx.coroutines.flow.catch
 import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.flow.receiveAsFlow
-import kotlinx.coroutines.flow.stateIn
 import logcat.LogPriority
 import uy.kohesive.injekt.Injekt
 import uy.kohesive.injekt.api.get
@@ -36,7 +35,6 @@ class ExtensionFilterPresenter(
                     logcat(LogPriority.ERROR, exception)
                     _events.send(Event.FailedFetchingLanguages)
                 }
-                .stateIn(presenterScope)
                 .collectLatest(::collectLatestSourceLangMap)
         }
     }

+ 0 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesFilterPresenter.kt

@@ -15,7 +15,6 @@ import kotlinx.coroutines.channels.Channel
 import kotlinx.coroutines.flow.catch
 import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.flow.receiveAsFlow
-import kotlinx.coroutines.flow.stateIn
 import logcat.LogPriority
 import uy.kohesive.injekt.Injekt
 import uy.kohesive.injekt.api.get
@@ -40,7 +39,6 @@ class SourcesFilterPresenter(
                     logcat(LogPriority.ERROR, exception)
                     _events.send(Event.FailedFetchingLanguages)
                 }
-                .stateIn(presenterScope)
                 .collectLatest(::collectLatestSourceLangMap)
         }
     }