From a8a290d03dcd594171f38b15e973c9bdf95023b5 Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Sat, 26 Oct 2024 07:05:56 +0600 Subject: [PATCH] Cleanup Slider usage (cherry picked from commit df9fff60da3a38acd8fcd540b5fdd275be93f2d5) # Conflicts: # app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt # app/src/main/java/eu/kanade/presentation/reader/components/ChapterNavigator.kt --- .../reader/appbars/ReaderAppBars.kt | 8 ++-- .../reader/components/ChapterNavigator.kt | 34 ++++++------- .../tachiyomi/ui/reader/ReaderActivity.kt | 2 +- .../core/components/SettingsItems.kt | 19 ++++---- .../core/components/material/Slider.kt | 48 +++++++++++++++++++ 5 files changed, 76 insertions(+), 35 deletions(-) create mode 100644 presentation-core/src/main/java/tachiyomi/presentation/core/components/material/Slider.kt diff --git a/app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt b/app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt index c33331975..3b8e50e08 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt @@ -84,7 +84,7 @@ fun ReaderAppBars( enabledPrevious: Boolean, currentPage: Int, totalPages: Int, - onSliderValueChange: (Int) -> Unit, + onPageIndexChange: (Int) -> Unit, readingMode: ReadingMode, onClickReadingMode: () -> Unit, @@ -154,7 +154,7 @@ fun ReaderAppBars( enabledPrevious = enabledPrevious, currentPage = currentPage, totalPages = totalPages, - onSliderValueChange = onSliderValueChange, + onPageIndexChange = onPageIndexChange, isVerticalSlider = true, currentPageText = currentPageText, ) @@ -182,7 +182,7 @@ fun ReaderAppBars( enabledPrevious = enabledPrevious, currentPage = currentPage, totalPages = totalPages, - onSliderValueChange = onSliderValueChange, + onPageIndexChange = onPageIndexChange, isVerticalSlider = true, currentPageText = currentPageText, ) @@ -285,7 +285,7 @@ fun ReaderAppBars( enabledPrevious = enabledPrevious, currentPage = currentPage, totalPages = totalPages, - onSliderValueChange = onSliderValueChange, + onPageIndexChange = onPageIndexChange, isVerticalSlider = false, currentPageText = currentPageText, ) diff --git a/app/src/main/java/eu/kanade/presentation/reader/components/ChapterNavigator.kt b/app/src/main/java/eu/kanade/presentation/reader/components/ChapterNavigator.kt index 0a6dd5030..0dfda08f7 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/components/ChapterNavigator.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/components/ChapterNavigator.kt @@ -18,7 +18,6 @@ import androidx.compose.material3.FilledIconButton import androidx.compose.material3.Icon import androidx.compose.material3.IconButtonDefaults import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Slider import androidx.compose.material3.Text import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.runtime.Composable @@ -45,8 +44,8 @@ import androidx.compose.ui.unit.dp import eu.kanade.presentation.theme.TachiyomiPreviewTheme import eu.kanade.presentation.util.isTabletUi import tachiyomi.i18n.MR +import tachiyomi.presentation.core.components.material.Slider import tachiyomi.presentation.core.i18n.stringResource -import kotlin.math.roundToInt @Composable fun ChapterNavigator( @@ -61,7 +60,7 @@ fun ChapterNavigator( currentPageText: String, // SY <-- totalPages: Int, - onSliderValueChange: (Int) -> Unit, + onPageIndexChange: (Int) -> Unit, ) { // SY --> if (isVerticalSlider) { @@ -73,7 +72,7 @@ fun ChapterNavigator( currentPage = currentPage, currentPageText = currentPageText, totalPages = totalPages, - onSliderValueChange = onSliderValueChange, + onPageIndexChange = onPageIndexChange, ) return } @@ -138,14 +137,11 @@ fun ChapterNavigator( modifier = Modifier .weight(1f) .padding(horizontal = 8.dp), - value = currentPage.toFloat(), - valueRange = 1f..totalPages.toFloat(), - steps = totalPages - 2, - onValueChange = { - val new = it.roundToInt() - 1 - if (new != currentPage) { - onSliderValueChange(new) - } + value = currentPage, + valueRange = 1..totalPages, + onValueChange = f@{ + if (it == currentPage) return@f + onPageIndexChange(it - 1) }, interactionSource = interactionSource, ) @@ -184,7 +180,7 @@ fun ChapterNavigatorVert( currentPageText: String, // SY <-- totalPages: Int, - onSliderValueChange: (Int) -> Unit, + onPageIndexChange: (Int) -> Unit, ) { val isTabletUi = isTabletUi() val verticalPadding = if (isTabletUi) 24.dp else 8.dp @@ -259,11 +255,11 @@ fun ChapterNavigatorVert( } } .weight(1f), - value = currentPage.toFloat(), - valueRange = 1f..totalPages.toFloat(), - steps = totalPages, - onValueChange = { - onSliderValueChange(it.roundToInt() - 1) + value = currentPage, + valueRange = 1..totalPages, + onValueChange = f@{ + if (it == currentPage) return@f + onPageIndexChange(it - 1) }, interactionSource = interactionSource, ) @@ -301,7 +297,7 @@ private fun ChapterNavigatorPreview() { enabledPrevious = true, currentPage = currentPage, totalPages = 10, - onSliderValueChange = { currentPage = it }, + onPageIndexChange = { currentPage = (it + 1) }, // SY --> currentPageText = "1", isVerticalSlider = false, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index 2581a3765..e54e550e9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -478,7 +478,7 @@ class ReaderActivity : BaseActivity() { enabledPrevious = state.viewerChapters?.prevChapter != null, currentPage = state.currentPage, totalPages = state.totalPages, - onSliderValueChange = { + onPageIndexChange = { isScrollingThroughPages = true moveToPageIndex(it) }, diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt index 947eab5f2..288e3eb13 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt @@ -28,7 +28,6 @@ import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.RadioButton -import androidx.compose.material3.Slider import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -47,6 +46,7 @@ import tachiyomi.core.common.preference.Preference import tachiyomi.core.common.preference.TriState import tachiyomi.core.common.preference.toggle import tachiyomi.presentation.core.components.material.DISABLED_ALPHA +import tachiyomi.presentation.core.components.material.Slider import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.theme.header @@ -193,17 +193,14 @@ fun SliderItem( } Slider( - value = value.toFloat(), - onValueChange = { - val newValue = it.toInt() - if (newValue != value) { - onChange(newValue) - haptic.performHapticFeedback(HapticFeedbackType.TextHandleMove) - } - }, modifier = Modifier.weight(1.5f), - valueRange = min.toFloat()..max.toFloat(), - steps = max - min - 1, + value = value, + onValueChange = f@{ + if (it == value) return@f + onChange(it) + haptic.performHapticFeedback(HapticFeedbackType.TextHandleMove) + }, + valueRange = min..max, ) } } diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/Slider.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/Slider.kt new file mode 100644 index 000000000..aa562ab32 --- /dev/null +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/Slider.kt @@ -0,0 +1,48 @@ +package tachiyomi.presentation.core.components.material + +import androidx.annotation.IntRange +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.material3.Slider +import androidx.compose.material3.SliderColors +import androidx.compose.material3.SliderDefaults +import androidx.compose.material3.SliderState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier + +@Composable +fun Slider( + value: Int, + onValueChange: (Int) -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + valueRange: ClosedRange = 0..1, + @IntRange(from = 0) steps: Int = with(valueRange) { (endInclusive - start) - 1 }, + onValueChangeFinished: (() -> Unit)? = null, + colors: SliderColors = SliderDefaults.colors(), + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, + thumb: @Composable (SliderState) -> Unit = { + SliderDefaults.Thumb( + interactionSource = interactionSource, + colors = colors, + enabled = enabled, + ) + }, + track: @Composable (SliderState) -> Unit = { sliderState -> + SliderDefaults.Track(colors = colors, enabled = enabled, sliderState = sliderState) + }, +) { + Slider( + value = value.toFloat(), + onValueChange = { onValueChange(it.toInt()) }, + modifier = modifier, + enabled = enabled, + valueRange = with(valueRange) { start.toFloat()..endInclusive.toFloat() }, + steps = steps, + onValueChangeFinished = onValueChangeFinished, + colors = colors, + interactionSource = interactionSource, + thumb = thumb, + track = track, + ) +}