Endless PagedIsland

This commit is contained in:
Sad Ellie 2024-02-14 23:31:33 +03:00
parent 4be17569ba
commit 8b21721f48
3 changed files with 12 additions and 13 deletions

View File

@ -49,7 +49,7 @@ import kotlinx.coroutines.launch
* [HorizontalPager] with a background and a page indicator. * [HorizontalPager] with a background and a page indicator.
* *
* @param modifier [Modifier] that will be applied to the surround [Column]. * @param modifier [Modifier] that will be applied to the surround [Column].
* @param pagerState [PagerState] that will passed [HorizontalPager]. * @param pageCount Page count for [PagerState] that will passed [HorizontalPager].
* @param backgroundColor [Color] for background. * @param backgroundColor [Color] for background.
* @param pageIndicatorAlignment [Alignment.Horizontal] for page indicator. * @param pageIndicatorAlignment [Alignment.Horizontal] for page indicator.
* @param onClick Called on all clicks, even if the page didn't change. * @param onClick Called on all clicks, even if the page didn't change.
@ -58,7 +58,7 @@ import kotlinx.coroutines.launch
@Composable @Composable
fun PagedIsland( fun PagedIsland(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
pagerState: PagerState, pageCount: Int,
backgroundColor: Color = MaterialTheme.colorScheme.secondaryContainer, backgroundColor: Color = MaterialTheme.colorScheme.secondaryContainer,
pageIndicatorAlignment: Alignment.Horizontal = Alignment.End, pageIndicatorAlignment: Alignment.Horizontal = Alignment.End,
onClick: () -> Unit = {}, onClick: () -> Unit = {},
@ -67,6 +67,8 @@ fun PagedIsland(
val contentColor = MaterialTheme.colorScheme.contentColorFor(backgroundColor) val contentColor = MaterialTheme.colorScheme.contentColorFor(backgroundColor)
val disabledContentColor = contentColor.copy(alpha = 0.5f) val disabledContentColor = contentColor.copy(alpha = 0.5f)
val corScope = rememberCoroutineScope() val corScope = rememberCoroutineScope()
// https://stackoverflow.com/a/75469260
val pagerState = rememberPagerState { pageCount * 1_000 }
ProvideColor(color = contentColor) { ProvideColor(color = contentColor) {
Column( Column(
@ -92,8 +94,8 @@ fun PagedIsland(
.padding(vertical = 8.dp), .padding(vertical = 8.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp, pageIndicatorAlignment), horizontalArrangement = Arrangement.spacedBy(8.dp, pageIndicatorAlignment),
) { ) {
repeat(pagerState.pageCount) { repeat(pageCount) {
PageDot(if (it == pagerState.currentPage) contentColor else disabledContentColor) PageDot(if (it == pagerState.currentPage % pageCount) contentColor else disabledContentColor)
} }
} }
@ -102,10 +104,9 @@ fun PagedIsland(
.animateContentSize() .animateContentSize()
.fillMaxWidth(), .fillMaxWidth(),
verticalAlignment = Alignment.Top, verticalAlignment = Alignment.Top,
state = pagerState state = pagerState,
) { page -> pageContent = { page -> pageContent(page % pageCount) }
pageContent(page) )
}
} }
} }
} }
@ -124,7 +125,7 @@ private fun PageDot(
private fun PreviewPagedIsland() { private fun PreviewPagedIsland() {
PagedIsland( PagedIsland(
modifier = Modifier.size(400.dp, 250.dp), modifier = Modifier.size(400.dp, 250.dp),
pagerState = rememberPagerState { 5 } pageCount = 5,
) { currentPage -> ) { currentPage ->
Column { Column {
Text("Current page: $currentPage") Text("Current page: $currentPage")

View File

@ -21,7 +21,6 @@ package com.sadellie.unitto.feature.datecalculator.components
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
@ -45,7 +44,7 @@ internal fun DateTimeResultBlock(
PagedIsland( PagedIsland(
modifier = modifier, modifier = modifier,
pagerState = rememberPagerState { 6 }, pageCount = 6,
onClick = { focusManager.clearFocus() }, onClick = { focusManager.clearFocus() },
backgroundColor = MaterialTheme.colorScheme.tertiaryContainer backgroundColor = MaterialTheme.colorScheme.tertiaryContainer
) { currentPage -> ) { currentPage ->

View File

@ -30,7 +30,6 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Architecture import androidx.compose.material.icons.filled.Architecture
@ -128,7 +127,7 @@ fun FormattingScreen(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(16.dp), .padding(16.dp),
pagerState = rememberPagerState { 2 }, pageCount = 2,
) { currentPage -> ) { currentPage ->
val preview = when (currentPage) { val preview = when (currentPage) {
0 -> "123456.${"789123456".repeat(ceil(uiState.precision.toDouble() / 9.0).toInt())}" 0 -> "123456.${"789123456".repeat(ceil(uiState.precision.toDouble() / 9.0).toInt())}"