diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/UnittoButton.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/UnittoButton.kt new file mode 100644 index 00000000..5890bc65 --- /dev/null +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/UnittoButton.kt @@ -0,0 +1,83 @@ +/* + * Unitto is a unit converter for Android + * Copyright (c) 2023 Elshan Agaev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sadellie.unitto.core.ui.common + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ProvideTextStyle +import androidx.compose.material3.Surface +import androidx.compose.material3.contentColorFor +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color + +@Composable +fun UnittoButton( + modifier: Modifier = Modifier, + onClick: () -> Unit, + onLongClick: (() -> Unit)? = null, + enabled: Boolean = true, + containerColor: Color, + contentColor: Color = contentColorFor(containerColor), + border: BorderStroke? = null, + contentPadding: PaddingValues = ButtonDefaults.ContentPadding, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, + content: @Composable RowScope.() -> Unit +) { + Surface( + modifier = modifier.squashable( + onClick = onClick, + onLongClick = onLongClick, + interactionSource = interactionSource, + cornerRadiusRange = 30..50, + enabled = enabled + ), + color = containerColor, + contentColor = contentColor, + border = border, + ) { + CompositionLocalProvider(LocalContentColor provides contentColor) { + ProvideTextStyle(value = MaterialTheme.typography.labelLarge) { + Row( + Modifier + .defaultMinSize( + minWidth = ButtonDefaults.MinWidth, + minHeight = ButtonDefaults.MinHeight + ) + .padding(contentPadding), + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically, + content = content + ) + } + } + } +} diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitSelectionButton.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitSelectionButton.kt index 5eae17ab..8d9a31eb 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitSelectionButton.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/UnitSelectionButton.kt @@ -26,18 +26,15 @@ import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically import androidx.compose.animation.togetherWith -import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.PaddingValues import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import com.sadellie.unitto.core.ui.common.squashable +import com.sadellie.unitto.core.ui.common.UnittoButton /** * Button to select a unit @@ -54,30 +51,22 @@ internal fun UnitSelectionButton( label: String, enabled: Boolean = true ) { - val interactionSource = remember { MutableInteractionSource() } - - Button( - modifier = modifier.squashable( - onClick = onClick, - onLongClick = null, - interactionSource = interactionSource, - cornerRadiusRange = 30..50, - enabled = enabled - ), + UnittoButton( + modifier = modifier, onClick = onClick, enabled = enabled, + containerColor = MaterialTheme.colorScheme.primaryContainer, contentPadding = PaddingValues(vertical = 16.dp, horizontal = 8.dp), - colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.primaryContainer) ) { AnimatedContent( targetState = label, transitionSpec = { if (targetState > initialState) { (slideInVertically { height -> height } + fadeIn()) togetherWith - slideOutVertically { height -> -height } + fadeOut() + slideOutVertically { height -> -height } + fadeOut() } else { (slideInVertically { height -> -height } + fadeIn()) togetherWith - slideOutVertically { height -> height } + fadeOut() + slideOutVertically { height -> height } + fadeOut() }.using( SizeTransform(clip = false) )