diff --git a/feature/calculator/src/main/java/app/myzel394/numberhub/feature/calculator/CalculatorScreen.kt b/feature/calculator/src/main/java/app/myzel394/numberhub/feature/calculator/CalculatorScreen.kt index 2824d554..41430fa8 100644 --- a/feature/calculator/src/main/java/app/myzel394/numberhub/feature/calculator/CalculatorScreen.kt +++ b/feature/calculator/src/main/java/app/myzel394/numberhub/feature/calculator/CalculatorScreen.kt @@ -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 = {}, diff --git a/feature/calculator/src/main/java/app/myzel394/numberhub/feature/calculator/CalculatorViewModel.kt b/feature/calculator/src/main/java/app/myzel394/numberhub/feature/calculator/CalculatorViewModel.kt index 2644cdd8..104e5cea 100644 --- a/feature/calculator/src/main/java/app/myzel394/numberhub/feature/calculator/CalculatorViewModel.kt +++ b/feature/calculator/src/main/java/app/myzel394/numberhub/feature/calculator/CalculatorViewModel.kt @@ -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) { diff --git a/feature/calculator/src/main/java/app/myzel394/numberhub/feature/calculator/components/CalculatorKeyboard.kt b/feature/calculator/src/main/java/app/myzel394/numberhub/feature/calculator/components/CalculatorKeyboard.kt index 674b23c3..3130e044 100644 --- a/feature/calculator/src/main/java/app/myzel394/numberhub/feature/calculator/components/CalculatorKeyboard.kt +++ b/feature/calculator/src/main/java/app/myzel394/numberhub/feature/calculator/components/CalculatorKeyboard.kt @@ -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,