feat(calculator): Add smart delete functionality to calculator

Signed-off-by: Myzel394 <50424412+Myzel394@users.noreply.github.com>
This commit is contained in:
Myzel394 2024-07-25 23:09:49 +02:00
parent 04dabe60af
commit 358f5b4582
No known key found for this signature in database
GPG Key ID: DEC4AAB876F73185
3 changed files with 35 additions and 2 deletions

View File

@ -95,6 +95,7 @@ internal fun CalculatorRoute(
onAddTokenClick = viewModel::addTokens,
onBracketsClick = viewModel::addBracket,
onDeleteClick = viewModel::deleteTokens,
onSmartDeleteClick = viewModel::smartDeleteTokens,
onClearClick = viewModel::clearInput,
onEqualClick = viewModel::equal,
onRadianModeClick = viewModel::updateRadianMode,
@ -114,6 +115,7 @@ internal fun Ready(
onAddTokenClick: (String) -> Unit,
onBracketsClick: () -> Unit,
onDeleteClick: () -> Unit,
onSmartDeleteClick: () -> Unit,
onClearClick: () -> Unit,
onEqualClick: () -> Unit,
onRadianModeClick: (Boolean) -> Unit,
@ -250,6 +252,7 @@ internal fun Ready(
onAddTokenClick = onAddTokenClick,
onBracketsClick = onBracketsClick,
onDeleteClick = onDeleteClick,
onSmartDeleteClick = onSmartDeleteClick,
onClearClick = onClearClick,
onEqualClick = {
focusManager.clearFocus()
@ -349,6 +352,7 @@ private fun PreviewCalculatorScreen() {
onAddTokenClick = {},
onBracketsClick = {},
onDeleteClick = {},
onSmartDeleteClick = {},
onClearClick = {},
onEqualClick = {},
onRadianModeClick = {},

View File

@ -28,6 +28,7 @@ import app.myzel394.numberhub.core.ui.common.textfield.addTokens
import app.myzel394.numberhub.core.ui.common.textfield.deleteTokens
import app.myzel394.numberhub.core.ui.common.textfield.getTextField
import app.myzel394.numberhub.core.ui.common.textfield.placeCursorAtTheEnd
import app.myzel394.numberhub.core.ui.common.textfield.smartDeleteTokens
import app.myzel394.numberhub.data.common.format
import app.myzel394.numberhub.data.common.isExpression
import app.myzel394.numberhub.data.common.isGreaterThan
@ -120,6 +121,15 @@ internal class CalculatorViewModel @Inject constructor(
updateInput(newValue)
}
fun smartDeleteTokens() {
val newValue = if (equalClicked.value) {
TextFieldValue()
} else {
input.value.smartDeleteTokens()
}
updateInput(newValue)
}
fun clearInput() = updateInput(TextFieldValue())
fun updateInput(value: TextFieldValue) {

View File

@ -112,6 +112,7 @@ internal fun CalculatorKeyboard(
onAddTokenClick: (String) -> Unit,
onBracketsClick: () -> Unit,
onDeleteClick: () -> Unit,
onSmartDeleteClick: () -> Unit,
onClearClick: () -> Unit,
onEqualClick: () -> Unit,
radianMode: Boolean,
@ -130,6 +131,7 @@ internal fun CalculatorKeyboard(
onAddTokenClick = onAddTokenClick,
onBracketsClick = onBracketsClick,
onDeleteClick = onDeleteClick,
onSmartDeleteClick = onSmartDeleteClick,
onClearClick = onClearClick,
onEqualClick = onEqualClick,
radianMode = radianMode,
@ -146,6 +148,7 @@ internal fun CalculatorKeyboard(
onAddTokenClick = onAddTokenClick,
onBracketsClick = onBracketsClick,
onDeleteClick = onDeleteClick,
onSmartDeleteClick = onSmartDeleteClick,
onClearClick = onClearClick,
onEqualClick = onEqualClick,
radianMode = radianMode,
@ -167,6 +170,7 @@ private fun PortraitKeyboard(
onAddTokenClick: (String) -> Unit,
onBracketsClick: () -> Unit,
onDeleteClick: () -> Unit,
onSmartDeleteClick: () -> Unit,
onClearClick: () -> Unit,
onEqualClick: () -> Unit,
radianMode: Boolean,
@ -318,7 +322,13 @@ private fun PortraitKeyboard(
KeyboardButtonLight(mainButtonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Digit._0) }
KeyboardButtonLight(mainButtonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onAddTokenClick(Token.Digit.dot) }
}
KeyboardButtonLight(mainButtonModifier, IconPack.Backspace, stringResource(R.string.delete_label), KeyboardButtonToken.CONTENT_HEIGHT_TALL, onClearClick) { onDeleteClick() }
KeyboardButtonLight(
mainButtonModifier,
IconPack.Backspace,
stringResource(R.string.delete_label),
KeyboardButtonToken.CONTENT_HEIGHT_TALL,
onSmartDeleteClick,
) { onDeleteClick() }
KeyboardButtonFilled(mainButtonModifier, IconPack.Equal, stringResource(R.string.keyboard_equal), KeyboardButtonToken.CONTENT_HEIGHT_TALL) { onEqualClick() }
}
@ -400,6 +410,7 @@ private fun LandscapeKeyboard(
onAddTokenClick: (String) -> Unit,
onBracketsClick: () -> Unit,
onDeleteClick: () -> Unit,
onSmartDeleteClick: () -> Unit,
onClearClick: () -> Unit,
onEqualClick: () -> Unit,
radianMode: Boolean,
@ -473,7 +484,13 @@ private fun LandscapeKeyboard(
KeyboardButtonLight(buttonModifier, IconPack.Key0, Token.Digit._0, KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit._0) }
KeyboardButtonLight(buttonModifier, fractionalIcon, stringResource(fractionalIconDescription), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Digit.dot) }
}
KeyboardButtonLight(buttonModifier, IconPack.Backspace, stringResource(R.string.delete_label), KeyboardButtonToken.CONTENT_HEIGHT_SHORT, onClearClick) { onDeleteClick() }
KeyboardButtonLight(
buttonModifier,
IconPack.Backspace,
stringResource(R.string.delete_label),
KeyboardButtonToken.CONTENT_HEIGHT_SHORT,
onSmartDeleteClick,
) { onDeleteClick() }
KeyboardButtonFilled(buttonModifier, IconPack.Plus, stringResource(R.string.keyboard_plus), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onAddTokenClick(Token.Operator.plus) }
KeyboardButtonFilled(buttonModifier, IconPack.Equal, stringResource(R.string.keyboard_equal), KeyboardButtonToken.CONTENT_HEIGHT_SHORT) { onEqualClick() }
}
@ -545,6 +562,7 @@ private fun PreviewPortraitKeyboard() {
onAddTokenClick = {},
onBracketsClick = {},
onDeleteClick = {},
onSmartDeleteClick = {},
onClearClick = {},
onEqualClick = {},
radianMode = true,
@ -567,6 +585,7 @@ private fun PreviewLandscapeKeyboard() {
onAddTokenClick = {},
onBracketsClick = {},
onDeleteClick = {},
onSmartDeleteClick = {},
onClearClick = {},
onEqualClick = {},
radianMode = true,