Update dependency androidx.compose:compose-bom-alpha to v2026.09.00 (#3752)
Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>
This commit is contained in:
@@ -6,8 +6,11 @@ import androidx.compose.foundation.layout.Column
|
|||||||
import androidx.compose.foundation.layout.RowScope
|
import androidx.compose.foundation.layout.RowScope
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.text.BasicTextField
|
import androidx.compose.foundation.text.BasicTextField
|
||||||
import androidx.compose.foundation.text.KeyboardActions
|
|
||||||
import androidx.compose.foundation.text.KeyboardOptions
|
import androidx.compose.foundation.text.KeyboardOptions
|
||||||
|
import androidx.compose.foundation.text.input.TextFieldLineLimits
|
||||||
|
import androidx.compose.foundation.text.input.clearText
|
||||||
|
import androidx.compose.foundation.text.input.rememberTextFieldState
|
||||||
|
import androidx.compose.foundation.text.input.setTextAndPlaceCursorAtEnd
|
||||||
import androidx.compose.material3.DropdownMenuItem
|
import androidx.compose.material3.DropdownMenuItem
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.IconButton
|
import androidx.compose.material3.IconButton
|
||||||
@@ -25,12 +28,15 @@ import androidx.compose.material3.TopAppBarScrollBehavior
|
|||||||
import androidx.compose.material3.rememberTooltipState
|
import androidx.compose.material3.rememberTooltipState
|
||||||
import androidx.compose.material3.surfaceColorAtElevation
|
import androidx.compose.material3.surfaceColorAtElevation
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.derivedStateOf
|
import androidx.compose.runtime.derivedStateOf
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.key
|
import androidx.compose.runtime.key
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.runtime.rememberUpdatedState
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
|
import androidx.compose.runtime.snapshotFlow
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.focus.FocusDirection
|
import androidx.compose.ui.focus.FocusDirection
|
||||||
import androidx.compose.ui.focus.FocusRequester
|
import androidx.compose.ui.focus.FocusRequester
|
||||||
@@ -42,10 +48,10 @@ import androidx.compose.ui.platform.LocalFocusManager
|
|||||||
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
|
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
|
||||||
import androidx.compose.ui.text.font.FontWeight
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
import androidx.compose.ui.text.input.ImeAction
|
import androidx.compose.ui.text.input.ImeAction
|
||||||
import androidx.compose.ui.text.input.VisualTransformation
|
|
||||||
import androidx.compose.ui.text.style.TextOverflow
|
import androidx.compose.ui.text.style.TextOverflow
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.unit.sp
|
import androidx.compose.ui.unit.sp
|
||||||
|
import kotlinx.coroutines.flow.drop
|
||||||
import mihon.icons.materialsymbols.MaterialSymbols
|
import mihon.icons.materialsymbols.MaterialSymbols
|
||||||
import mihon.icons.materialsymbols.automirroredrounded.ArrowBack
|
import mihon.icons.materialsymbols.automirroredrounded.ArrowBack
|
||||||
import mihon.icons.materialsymbols.rounded.Close
|
import mihon.icons.materialsymbols.rounded.Close
|
||||||
@@ -272,10 +278,26 @@ fun SearchToolbar(
|
|||||||
onClickCloseSearch: () -> Unit = { onChangeSearchQuery(null) },
|
onClickCloseSearch: () -> Unit = { onChangeSearchQuery(null) },
|
||||||
actions: @Composable RowScope.() -> Unit = {},
|
actions: @Composable RowScope.() -> Unit = {},
|
||||||
scrollBehavior: TopAppBarScrollBehavior? = null,
|
scrollBehavior: TopAppBarScrollBehavior? = null,
|
||||||
visualTransformation: VisualTransformation = VisualTransformation.None,
|
|
||||||
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
|
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
|
||||||
) {
|
) {
|
||||||
val focusRequester = remember { FocusRequester() }
|
val focusRequester = remember { FocusRequester() }
|
||||||
|
val searchFieldState = rememberTextFieldState(searchQuery.orEmpty())
|
||||||
|
val currentOnChangeSearchQuery by rememberUpdatedState(onChangeSearchQuery)
|
||||||
|
val searchOpen by rememberUpdatedState(searchQuery != null)
|
||||||
|
|
||||||
|
LaunchedEffect(searchFieldState) {
|
||||||
|
snapshotFlow { searchFieldState.text.toString() }
|
||||||
|
.drop(1)
|
||||||
|
.collect { if (searchOpen) currentOnChangeSearchQuery(it) }
|
||||||
|
}
|
||||||
|
LaunchedEffect(searchQuery) {
|
||||||
|
when {
|
||||||
|
searchQuery == null -> searchFieldState.clearText()
|
||||||
|
searchQuery != searchFieldState.text.toString() -> {
|
||||||
|
searchFieldState.setTextAndPlaceCursorAtEnd(searchQuery)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
AppBar(
|
AppBar(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
@@ -286,16 +308,16 @@ fun SearchToolbar(
|
|||||||
val focusManager = LocalFocusManager.current
|
val focusManager = LocalFocusManager.current
|
||||||
|
|
||||||
val searchAndClearFocus: () -> Unit = f@{
|
val searchAndClearFocus: () -> Unit = f@{
|
||||||
if (searchQuery.isBlank()) return@f
|
val query = searchFieldState.text.toString()
|
||||||
onSearch(searchQuery)
|
if (query.isBlank()) return@f
|
||||||
|
onSearch(query)
|
||||||
focusManager.clearFocus()
|
focusManager.clearFocus()
|
||||||
keyboardController?.hide()
|
keyboardController?.hide()
|
||||||
focusManager.moveFocus(FocusDirection.Next)
|
focusManager.moveFocus(FocusDirection.Next)
|
||||||
}
|
}
|
||||||
|
|
||||||
BasicTextField(
|
BasicTextField(
|
||||||
value = searchQuery,
|
state = searchFieldState,
|
||||||
onValueChange = onChangeSearchQuery,
|
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.focusRequester(focusRequester)
|
.focusRequester(focusRequester)
|
||||||
@@ -308,34 +330,30 @@ fun SearchToolbar(
|
|||||||
fontSize = 18.sp,
|
fontSize = 18.sp,
|
||||||
),
|
),
|
||||||
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search),
|
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search),
|
||||||
keyboardActions = KeyboardActions(onSearch = { searchAndClearFocus() }),
|
onKeyboardAction = { searchAndClearFocus() },
|
||||||
singleLine = true,
|
lineLimits = TextFieldLineLimits.SingleLine,
|
||||||
cursorBrush = SolidColor(MaterialTheme.colorScheme.onBackground),
|
cursorBrush = SolidColor(MaterialTheme.colorScheme.onBackground),
|
||||||
visualTransformation = visualTransformation,
|
|
||||||
interactionSource = interactionSource,
|
interactionSource = interactionSource,
|
||||||
decorationBox = { innerTextField ->
|
decorator = TextFieldDefaults.decorator(
|
||||||
TextFieldDefaults.DecorationBox(
|
state = searchFieldState,
|
||||||
value = searchQuery,
|
enabled = true,
|
||||||
innerTextField = innerTextField,
|
lineLimits = TextFieldLineLimits.SingleLine,
|
||||||
enabled = true,
|
outputTransformation = null,
|
||||||
singleLine = true,
|
interactionSource = interactionSource,
|
||||||
visualTransformation = visualTransformation,
|
placeholder = {
|
||||||
interactionSource = interactionSource,
|
Text(
|
||||||
placeholder = {
|
modifier = Modifier.secondaryItemAlpha(),
|
||||||
Text(
|
text = (placeholderText ?: stringResource(MR.strings.action_search_hint)),
|
||||||
modifier = Modifier.secondaryItemAlpha(),
|
maxLines = 1,
|
||||||
text = (placeholderText ?: stringResource(MR.strings.action_search_hint)),
|
overflow = TextOverflow.Ellipsis,
|
||||||
maxLines = 1,
|
style = MaterialTheme.typography.titleMedium.copy(
|
||||||
overflow = TextOverflow.Ellipsis,
|
fontSize = 18.sp,
|
||||||
style = MaterialTheme.typography.titleMedium.copy(
|
fontWeight = FontWeight.Normal,
|
||||||
fontSize = 18.sp,
|
),
|
||||||
fontWeight = FontWeight.Normal,
|
)
|
||||||
),
|
},
|
||||||
)
|
container = {},
|
||||||
},
|
),
|
||||||
container = {},
|
|
||||||
)
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
navigateUp = if (searchQuery == null) navigateUp else onClickCloseSearch,
|
navigateUp = if (searchQuery == null) navigateUp else onClickCloseSearch,
|
||||||
@@ -378,6 +396,7 @@ fun SearchToolbar(
|
|||||||
) {
|
) {
|
||||||
IconButton(
|
IconButton(
|
||||||
onClick = {
|
onClick = {
|
||||||
|
searchFieldState.clearText()
|
||||||
onClick()
|
onClick()
|
||||||
focusRequester.requestFocus()
|
focusRequester.requestFocus()
|
||||||
},
|
},
|
||||||
|
|||||||
+15
-17
@@ -7,6 +7,9 @@ import androidx.compose.foundation.layout.Row
|
|||||||
import androidx.compose.foundation.layout.RowScope
|
import androidx.compose.foundation.layout.RowScope
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.text.KeyboardOptions
|
import androidx.compose.foundation.text.KeyboardOptions
|
||||||
|
import androidx.compose.foundation.text.input.TextFieldLineLimits
|
||||||
|
import androidx.compose.foundation.text.input.TextObfuscationMode
|
||||||
|
import androidx.compose.foundation.text.input.rememberTextFieldState
|
||||||
import androidx.compose.material3.AlertDialog
|
import androidx.compose.material3.AlertDialog
|
||||||
import androidx.compose.material3.Button
|
import androidx.compose.material3.Button
|
||||||
import androidx.compose.material3.ButtonDefaults
|
import androidx.compose.material3.ButtonDefaults
|
||||||
@@ -14,6 +17,7 @@ import androidx.compose.material3.Icon
|
|||||||
import androidx.compose.material3.IconButton
|
import androidx.compose.material3.IconButton
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.OutlinedButton
|
import androidx.compose.material3.OutlinedButton
|
||||||
|
import androidx.compose.material3.OutlinedSecureTextField
|
||||||
import androidx.compose.material3.OutlinedTextField
|
import androidx.compose.material3.OutlinedTextField
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
@@ -33,9 +37,6 @@ import androidx.compose.ui.semantics.contentType
|
|||||||
import androidx.compose.ui.semantics.semantics
|
import androidx.compose.ui.semantics.semantics
|
||||||
import androidx.compose.ui.text.input.ImeAction
|
import androidx.compose.ui.text.input.ImeAction
|
||||||
import androidx.compose.ui.text.input.KeyboardType
|
import androidx.compose.ui.text.input.KeyboardType
|
||||||
import androidx.compose.ui.text.input.PasswordVisualTransformation
|
|
||||||
import androidx.compose.ui.text.input.TextFieldValue
|
|
||||||
import androidx.compose.ui.text.input.VisualTransformation
|
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import dev.icerock.moko.resources.StringResource
|
import dev.icerock.moko.resources.StringResource
|
||||||
@@ -204,8 +205,8 @@ object SettingsTrackingScreen : SearchableSettings {
|
|||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
|
|
||||||
var username by remember { mutableStateOf(TextFieldValue(tracker.getUsername())) }
|
val username = rememberTextFieldState(tracker.getUsername())
|
||||||
var password by remember { mutableStateOf(TextFieldValue(tracker.getPassword())) }
|
val password = rememberTextFieldState(tracker.getPassword())
|
||||||
var processing by remember { mutableStateOf(false) }
|
var processing by remember { mutableStateOf(false) }
|
||||||
var inputError by remember { mutableStateOf(false) }
|
var inputError by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
@@ -231,21 +232,19 @@ object SettingsTrackingScreen : SearchableSettings {
|
|||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.semantics { contentType = ContentType.Username + ContentType.EmailAddress },
|
.semantics { contentType = ContentType.Username + ContentType.EmailAddress },
|
||||||
value = username,
|
state = username,
|
||||||
onValueChange = { username = it },
|
|
||||||
label = { Text(text = stringResource(uNameStringRes)) },
|
label = { Text(text = stringResource(uNameStringRes)) },
|
||||||
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
|
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
|
||||||
singleLine = true,
|
lineLimits = TextFieldLineLimits.SingleLine,
|
||||||
isError = inputError && !processing,
|
isError = inputError && !processing,
|
||||||
)
|
)
|
||||||
|
|
||||||
var hidePassword by remember { mutableStateOf(true) }
|
var hidePassword by remember { mutableStateOf(true) }
|
||||||
OutlinedTextField(
|
OutlinedSecureTextField(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.semantics { contentType = ContentType.Password },
|
.semantics { contentType = ContentType.Password },
|
||||||
value = password,
|
state = password,
|
||||||
onValueChange = { password = it },
|
|
||||||
label = { Text(text = stringResource(MR.strings.password)) },
|
label = { Text(text = stringResource(MR.strings.password)) },
|
||||||
trailingIcon = {
|
trailingIcon = {
|
||||||
IconButton(onClick = { hidePassword = !hidePassword }) {
|
IconButton(onClick = { hidePassword = !hidePassword }) {
|
||||||
@@ -259,16 +258,15 @@ object SettingsTrackingScreen : SearchableSettings {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
visualTransformation = if (hidePassword) {
|
textObfuscationMode = if (hidePassword) {
|
||||||
PasswordVisualTransformation()
|
TextObfuscationMode.Hidden
|
||||||
} else {
|
} else {
|
||||||
VisualTransformation.None
|
TextObfuscationMode.Visible
|
||||||
},
|
},
|
||||||
keyboardOptions = KeyboardOptions(
|
keyboardOptions = KeyboardOptions(
|
||||||
keyboardType = KeyboardType.Password,
|
keyboardType = KeyboardType.Password,
|
||||||
imeAction = ImeAction.Done,
|
imeAction = ImeAction.Done,
|
||||||
),
|
),
|
||||||
singleLine = true,
|
|
||||||
isError = inputError && !processing,
|
isError = inputError && !processing,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -283,8 +281,8 @@ object SettingsTrackingScreen : SearchableSettings {
|
|||||||
val result = checkLogin(
|
val result = checkLogin(
|
||||||
context = context,
|
context = context,
|
||||||
tracker = tracker,
|
tracker = tracker,
|
||||||
username = username.text,
|
username = username.text.toString(),
|
||||||
password = password.text,
|
password = password.text.toString(),
|
||||||
)
|
)
|
||||||
inputError = !result
|
inputError = !result
|
||||||
if (result) onDismissRequest()
|
if (result) onDismissRequest()
|
||||||
|
|||||||
@@ -21,11 +21,13 @@ import androidx.compose.material3.Slider
|
|||||||
import androidx.compose.material3.SliderState
|
import androidx.compose.material3.SliderState
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.material3.VerticalSlider
|
import androidx.compose.material3.VerticalSlider
|
||||||
|
import androidx.compose.material3.rememberSliderState
|
||||||
import androidx.compose.material3.surfaceColorAtElevation
|
import androidx.compose.material3.surfaceColorAtElevation
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.CompositionLocalProvider
|
import androidx.compose.runtime.CompositionLocalProvider
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.runtime.key
|
||||||
import androidx.compose.runtime.mutableIntStateOf
|
import androidx.compose.runtime.mutableIntStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
@@ -75,16 +77,14 @@ fun ChapterNavigator(
|
|||||||
) {
|
) {
|
||||||
val haptic = LocalHapticFeedback.current
|
val haptic = LocalHapticFeedback.current
|
||||||
|
|
||||||
val state = remember(totalPages) {
|
val state = key(totalPages) {
|
||||||
SliderState(
|
rememberSliderState(
|
||||||
value = currentPage.toFloat(),
|
value = currentPage.toFloat(),
|
||||||
steps = totalPages - 2,
|
steps = totalPages - 2,
|
||||||
valueRange = 1f..totalPages.toFloat(),
|
trackRange = 1f..totalPages.toFloat(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
state.value = currentPage.toFloat()
|
state.value = currentPage.toFloat()
|
||||||
state.onValueChange = { onPageIndexChange(it.roundToInt() - 1) }
|
|
||||||
state.onValueChangeFinished = onPageIndexChangeFinished
|
|
||||||
|
|
||||||
val interactionSource = remember { MutableInteractionSource() }
|
val interactionSource = remember { MutableInteractionSource() }
|
||||||
val sliderDragged by interactionSource.collectIsDraggedAsState()
|
val sliderDragged by interactionSource.collectIsDraggedAsState()
|
||||||
@@ -106,6 +106,8 @@ fun ChapterNavigator(
|
|||||||
disabledContainerColor = backgroundColor,
|
disabledContainerColor = backgroundColor,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val onPageChange: (Int) -> Unit = { onPageIndexChange(it - 1) }
|
||||||
|
|
||||||
if (type.isHorizontal()) {
|
if (type.isHorizontal()) {
|
||||||
HorizontalChapterNavigator(
|
HorizontalChapterNavigator(
|
||||||
isRtl = type == ChapterNavigatorType.HORIZONTAL_RTL,
|
isRtl = type == ChapterNavigatorType.HORIZONTAL_RTL,
|
||||||
@@ -116,6 +118,8 @@ fun ChapterNavigator(
|
|||||||
enabledPrevious = enabledPrevious,
|
enabledPrevious = enabledPrevious,
|
||||||
currentPage = currentPage,
|
currentPage = currentPage,
|
||||||
totalPages = totalPages,
|
totalPages = totalPages,
|
||||||
|
onPageChange = onPageChange,
|
||||||
|
onPageChangeFinished = onPageIndexChangeFinished,
|
||||||
interactionSource = interactionSource,
|
interactionSource = interactionSource,
|
||||||
mainAxisPadding = mainAxisPadding,
|
mainAxisPadding = mainAxisPadding,
|
||||||
backgroundColor = backgroundColor,
|
backgroundColor = backgroundColor,
|
||||||
@@ -131,6 +135,8 @@ fun ChapterNavigator(
|
|||||||
enabledPrevious = enabledPrevious,
|
enabledPrevious = enabledPrevious,
|
||||||
currentPage = currentPage,
|
currentPage = currentPage,
|
||||||
totalPages = totalPages,
|
totalPages = totalPages,
|
||||||
|
onPageChange = onPageChange,
|
||||||
|
onPageChangeFinished = onPageIndexChangeFinished,
|
||||||
interactionSource = interactionSource,
|
interactionSource = interactionSource,
|
||||||
mainAxisPadding = mainAxisPadding,
|
mainAxisPadding = mainAxisPadding,
|
||||||
backgroundColor = backgroundColor,
|
backgroundColor = backgroundColor,
|
||||||
@@ -150,6 +156,8 @@ fun HorizontalChapterNavigator(
|
|||||||
enabledPrevious: Boolean,
|
enabledPrevious: Boolean,
|
||||||
currentPage: Int,
|
currentPage: Int,
|
||||||
totalPages: Int,
|
totalPages: Int,
|
||||||
|
onPageChange: (Int) -> Unit,
|
||||||
|
onPageChangeFinished: () -> Unit,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
mainAxisPadding: Dp,
|
mainAxisPadding: Dp,
|
||||||
backgroundColor: Color,
|
backgroundColor: Color,
|
||||||
@@ -200,6 +208,8 @@ fun HorizontalChapterNavigator(
|
|||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.weight(1f)
|
.weight(1f)
|
||||||
.padding(horizontal = 8.dp),
|
.padding(horizontal = 8.dp),
|
||||||
|
onValueChange = { onPageChange(it.roundToInt()) },
|
||||||
|
onValueChangeFinished = onPageChangeFinished,
|
||||||
interactionSource = interactionSource,
|
interactionSource = interactionSource,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -235,6 +245,8 @@ fun VerticalChapterNavigator(
|
|||||||
enabledPrevious: Boolean,
|
enabledPrevious: Boolean,
|
||||||
currentPage: Int,
|
currentPage: Int,
|
||||||
totalPages: Int,
|
totalPages: Int,
|
||||||
|
onPageChange: (Int) -> Unit,
|
||||||
|
onPageChangeFinished: () -> Unit,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
mainAxisPadding: Dp,
|
mainAxisPadding: Dp,
|
||||||
backgroundColor: Color,
|
backgroundColor: Color,
|
||||||
@@ -275,6 +287,8 @@ fun VerticalChapterNavigator(
|
|||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.weight(1f)
|
.weight(1f)
|
||||||
.padding(vertical = 8.dp),
|
.padding(vertical = 8.dp),
|
||||||
|
onValueChange = { onPageChange(it.roundToInt()) },
|
||||||
|
onValueChangeFinished = onPageChangeFinished,
|
||||||
interactionSource = interactionSource,
|
interactionSource = interactionSource,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ androidx-appCompat = "1.8.0"
|
|||||||
androidx-baselineProfile = "1.5.0"
|
androidx-baselineProfile = "1.5.0"
|
||||||
androidx-benchmark = "1.5.0"
|
androidx-benchmark = "1.5.0"
|
||||||
androidx-biometric = "1.2.0-alpha05"
|
androidx-biometric = "1.2.0-alpha05"
|
||||||
androidx-compose-bom = "2026.07.01"
|
androidx-compose-bom = "2026.09.00"
|
||||||
androidx-constraintLayout = "2.2.2"
|
androidx-constraintLayout = "2.2.2"
|
||||||
androidx-core = "1.19.0"
|
androidx-core = "1.19.0"
|
||||||
androidx-coreSplashScreen = "1.2.0"
|
androidx-coreSplashScreen = "1.2.0"
|
||||||
|
|||||||
+1
@@ -17,6 +17,7 @@ import androidx.compose.foundation.lazy.grid.LazyGridScope
|
|||||||
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
|
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
|
||||||
import androidx.compose.material3.Checkbox
|
import androidx.compose.material3.Checkbox
|
||||||
import androidx.compose.material3.DropdownMenuItem
|
import androidx.compose.material3.DropdownMenuItem
|
||||||
|
import androidx.compose.material3.ExposedDropdownMenu
|
||||||
import androidx.compose.material3.ExposedDropdownMenuAnchorType
|
import androidx.compose.material3.ExposedDropdownMenuAnchorType
|
||||||
import androidx.compose.material3.ExposedDropdownMenuBox
|
import androidx.compose.material3.ExposedDropdownMenuBox
|
||||||
import androidx.compose.material3.ExposedDropdownMenuDefaults
|
import androidx.compose.material3.ExposedDropdownMenuDefaults
|
||||||
|
|||||||
+12
-4
@@ -6,7 +6,9 @@ import androidx.compose.material3.Slider
|
|||||||
import androidx.compose.material3.SliderColors
|
import androidx.compose.material3.SliderColors
|
||||||
import androidx.compose.material3.SliderDefaults
|
import androidx.compose.material3.SliderDefaults
|
||||||
import androidx.compose.material3.SliderState
|
import androidx.compose.material3.SliderState
|
||||||
|
import androidx.compose.material3.rememberSliderState
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.key
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
@@ -33,13 +35,19 @@ fun Slider(
|
|||||||
SliderDefaults.Track(colors = colors, enabled = enabled, sliderState = sliderState)
|
SliderDefaults.Track(colors = colors, enabled = enabled, sliderState = sliderState)
|
||||||
},
|
},
|
||||||
) {
|
) {
|
||||||
|
val state = key(steps, valueRange) {
|
||||||
|
rememberSliderState(
|
||||||
|
value = value.toFloat(),
|
||||||
|
steps = steps,
|
||||||
|
trackRange = with(valueRange) { first.toFloat()..last.toFloat() },
|
||||||
|
)
|
||||||
|
}
|
||||||
|
state.value = value.toFloat()
|
||||||
Slider(
|
Slider(
|
||||||
value = value.toFloat(),
|
state = state,
|
||||||
onValueChange = { onValueChange(it.roundToInt()) },
|
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
enabled = enabled,
|
enabled = enabled,
|
||||||
valueRange = with(valueRange) { first.toFloat()..last.toFloat() },
|
onValueChange = { onValueChange(it.roundToInt()) },
|
||||||
steps = steps,
|
|
||||||
onValueChangeFinished = onValueChangeFinished,
|
onValueChangeFinished = onValueChangeFinished,
|
||||||
colors = colors,
|
colors = colors,
|
||||||
interactionSource = interactionSource,
|
interactionSource = interactionSource,
|
||||||
|
|||||||
Reference in New Issue
Block a user