Fix rounding errors in keypad

This commit is contained in:
Sad Ellie 2023-11-21 23:07:49 +03:00
parent ba43fe82da
commit a12916e7b6
4 changed files with 34 additions and 27 deletions

View File

@ -39,14 +39,16 @@ import androidx.compose.ui.Modifier
* @param content Content, usually some buttons. Use `width` and `height` in [fillMaxWidth] * @param content Content, usually some buttons. Use `width` and `height` in [fillMaxWidth]
* and [fillMaxHeight] to build a [Modifier]. Passed [Composable]s are equally distributed, occupy * and [fillMaxHeight] to build a [Modifier]. Passed [Composable]s are equally distributed, occupy
* entire height and width. * entire height and width.
*
* _Note_: Do not use provided `width` if [horizontalPadding] is 0. Use `weight` modifier.
*/ */
@Composable @Composable
fun KeypadFlow( fun KeypadFlow(
modifier: Modifier, modifier: Modifier,
rows: Int, rows: Int,
columns: Int, columns: Int,
@IntRange(0, 100) verticalPadding: Int = 10,
@IntRange(0, 100) horizontalPadding: Int = 10, @IntRange(0, 100) horizontalPadding: Int = 10,
@IntRange(0, 100) verticalPadding: Int = 10,
content: @Composable FlowRowScope.(width: Float, height: Float) -> Unit content: @Composable FlowRowScope.(width: Float, height: Float) -> Unit
) { ) {
val height: Float = remember { (1f - verticalPadding / 100f) / rows } val height: Float = remember { (1f - verticalPadding / 100f) / rows }

View File

@ -116,8 +116,8 @@ private fun RPNCalculatorKeyboardPortrait(
columns = 4 columns = 4
) { width, height -> ) { width, height ->
val aModifier = Modifier val aModifier = Modifier
.fillMaxHeight(height)
.fillMaxWidth(width) .fillMaxWidth(width)
.fillMaxHeight(height)
KeyboardButtonAdditional(aModifier, UnittoIcons.Swap, allowVibration, KeyboardButtonContentHeightWide) { onCalculationClick(RPNCalculation.Swap) } KeyboardButtonAdditional(aModifier, UnittoIcons.Swap, allowVibration, KeyboardButtonContentHeightWide) { onCalculationClick(RPNCalculation.Swap) }
KeyboardButtonAdditional(aModifier, UnittoIcons.Up, allowVibration, KeyboardButtonContentHeightWide) { onCalculationClick(RPNCalculation.RotateUp) } KeyboardButtonAdditional(aModifier, UnittoIcons.Up, allowVibration, KeyboardButtonContentHeightWide) { onCalculationClick(RPNCalculation.RotateUp) }
@ -131,8 +131,8 @@ private fun RPNCalculatorKeyboardPortrait(
columns = 4 columns = 4
) { width, height -> ) { width, height ->
val bModifier = Modifier val bModifier = Modifier
.fillMaxHeight(height)
.fillMaxWidth(width) .fillMaxWidth(width)
.fillMaxHeight(height)
KeyboardButtonTertiary(bModifier, UnittoIcons.Clear, allowVibration, KeyboardButtonContentHeightTall) { onCalculationClick(RPNCalculation.Clear) } KeyboardButtonTertiary(bModifier, UnittoIcons.Clear, allowVibration, KeyboardButtonContentHeightTall) { onCalculationClick(RPNCalculation.Clear) }
KeyboardButtonFilled(bModifier, UnittoIcons.Unary, allowVibration, KeyboardButtonContentHeightTall) { onCalculationClick(RPNCalculation.Negate) } KeyboardButtonFilled(bModifier, UnittoIcons.Unary, allowVibration, KeyboardButtonContentHeightTall) { onCalculationClick(RPNCalculation.Negate) }

View File

@ -210,6 +210,7 @@ private fun PortraitKeyboard(
) { inverse -> ) { inverse ->
if (inverse) { if (inverse) {
AdditionalPortrait( AdditionalPortrait(
modifier = Modifier.fillMaxWidth(),
showAdditional = showAdditional, showAdditional = showAdditional,
buttonHeight = additionalButtonHeight, buttonHeight = additionalButtonHeight,
content1 = { buttonModifier -> content1 = { buttonModifier ->
@ -232,6 +233,7 @@ private fun PortraitKeyboard(
) )
} else { } else {
AdditionalPortrait( AdditionalPortrait(
modifier = Modifier.fillMaxWidth(),
showAdditional = showAdditional, showAdditional = showAdditional,
buttonHeight = additionalButtonHeight, buttonHeight = additionalButtonHeight,
content1 = { buttonModifier -> content1 = { buttonModifier ->
@ -335,6 +337,7 @@ private fun PortraitKeyboard(
*/ */
@Composable @Composable
private fun AdditionalPortrait( private fun AdditionalPortrait(
modifier: Modifier,
showAdditional: Boolean, showAdditional: Boolean,
buttonHeight: Dp, buttonHeight: Dp,
content1: @Composable (buttonModifier: Modifier) -> Unit, content1: @Composable (buttonModifier: Modifier) -> Unit,
@ -342,7 +345,7 @@ private fun AdditionalPortrait(
) { ) {
AnimatedContent( AnimatedContent(
targetState = showAdditional, targetState = showAdditional,
modifier = Modifier, modifier = modifier,
transitionSpec = { transitionSpec = {
expandVertically(expandFrom = Alignment.Top) togetherWith expandVertically(expandFrom = Alignment.Top) togetherWith
shrinkVertically(shrinkTowards = Alignment.Top) using (SizeTransform()) shrinkVertically(shrinkTowards = Alignment.Top) using (SizeTransform())
@ -355,12 +358,14 @@ private fun AdditionalPortrait(
.fillMaxWidth(), .fillMaxWidth(),
rows = 3, rows = 3,
columns = 4, columns = 4,
verticalPadding = 0,
horizontalPadding = 0, horizontalPadding = 0,
) { width, height -> verticalPadding = 0,
) { _, _ ->
// Can't use provided width and height due to rounding errors. It's ok since weight
// achieves same result (no padding and equally distributed).
val buttonModifier = Modifier val buttonModifier = Modifier
.fillMaxWidth(width) .weight(1f)
.fillMaxHeight(height) .height(buttonHeight)
content1(buttonModifier) content1(buttonModifier)
content2(buttonModifier) content2(buttonModifier)
@ -372,12 +377,12 @@ private fun AdditionalPortrait(
.fillMaxWidth(), .fillMaxWidth(),
rows = 1, rows = 1,
columns = 4, columns = 4,
verticalPadding = 0,
horizontalPadding = 0, horizontalPadding = 0,
) { width, height -> verticalPadding = 0,
) { _, _ ->
val buttonModifier = Modifier val buttonModifier = Modifier
.fillMaxWidth(width) .weight(1f)
.fillMaxHeight(height) .height(buttonHeight)
content1(buttonModifier) content1(buttonModifier)
} }
@ -527,7 +532,7 @@ private fun LandscapeKeyboard(
@Composable @Composable
private fun PreviewCalculatorKeyboard() { private fun PreviewCalculatorKeyboard() {
CalculatorKeyboard( CalculatorKeyboard(
modifier = Modifier, modifier = Modifier.fillMaxHeight(0.75f),
radianMode = true, radianMode = true,
fractional = ".", fractional = ".",
addSymbol = {}, addSymbol = {},

View File

@ -71,26 +71,26 @@ internal fun AddSubtractKeyboard(
.weight(3f), .weight(3f),
rows = 4, rows = 4,
columns = 3 columns = 3
) { width, height -> ) { width, height ->
val mainButtonModifier = Modifier val buttonModifier = Modifier
.fillMaxWidth(width) .fillMaxWidth(width)
.fillMaxHeight(height) .fillMaxHeight(height)
KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key7, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._7) } KeyboardButtonLight(buttonModifier, UnittoIcons.Key7, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._7) }
KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key8, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._8) } KeyboardButtonLight(buttonModifier, UnittoIcons.Key8, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._8) }
KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key9, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._9) } KeyboardButtonLight(buttonModifier, UnittoIcons.Key9, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._9) }
KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key4, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._4) } KeyboardButtonLight(buttonModifier, UnittoIcons.Key4, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._4) }
KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key5, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._5) } KeyboardButtonLight(buttonModifier, UnittoIcons.Key5, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._5) }
KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key6, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._6) } KeyboardButtonLight(buttonModifier, UnittoIcons.Key6, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._6) }
KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key1, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._1) } KeyboardButtonLight(buttonModifier, UnittoIcons.Key1, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._1) }
KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key2, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._2) } KeyboardButtonLight(buttonModifier, UnittoIcons.Key2, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._2) }
KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key3, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._3) } KeyboardButtonLight(buttonModifier, UnittoIcons.Key3, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._3) }
Spacer(mainButtonModifier) Spacer(buttonModifier)
KeyboardButtonLight(mainButtonModifier, UnittoIcons.Key0, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._0) } KeyboardButtonLight(buttonModifier, UnittoIcons.Key0, allowVibration, KeyboardButtonContentHeightTall) { addSymbol(Token.Digit._0) }
Spacer(mainButtonModifier) Spacer(buttonModifier)
} }
KeypadFlow( KeypadFlow(