Save calculator keyboard state

closes #175
This commit is contained in:
Sad Ellie 2024-02-14 22:42:13 +03:00
parent b0a04f4797
commit 76685339d7
12 changed files with 124 additions and 50 deletions

View File

@ -96,4 +96,8 @@ interface UserPreferencesRepository {
suspend fun updatePartialHistoryView(enabled: Boolean) suspend fun updatePartialHistoryView(enabled: Boolean)
suspend fun updateAcButton(enabled: Boolean) suspend fun updateAcButton(enabled: Boolean)
suspend fun updateAdditionalButtons(enabled: Boolean)
suspend fun updateInverseMode(enabled: Boolean)
} }

View File

@ -25,6 +25,8 @@ interface CalculatorPreferences {
val formatterSymbols: FormatterSymbols val formatterSymbols: FormatterSymbols
val middleZero: Boolean val middleZero: Boolean
val acButton: Boolean val acButton: Boolean
val additionalButtons: Boolean
val inverseMode: Boolean
val partialHistoryView: Boolean val partialHistoryView: Boolean
val precision: Int val precision: Int
val outputFormat: Int val outputFormat: Int

View File

@ -147,6 +147,14 @@ internal fun Preferences.getAcButton(): Boolean {
return this[PrefsKeys.AC_BUTTON] ?: true return this[PrefsKeys.AC_BUTTON] ?: true
} }
internal fun Preferences.getAdditionalButtons(): Boolean {
return this[PrefsKeys.ADDITIONAL_BUTTONS] ?: false
}
internal fun Preferences.getInverseMode(): Boolean {
return this[PrefsKeys.INVERSE_MODE] ?: false
}
internal fun List<UnitGroup>.packToString(): String = this.joinToString(",") internal fun List<UnitGroup>.packToString(): String = this.joinToString(",")
private inline fun <T, R> T.letTryOrNull(block: (T) -> R): R? = try { private inline fun <T, R> T.letTryOrNull(block: (T) -> R): R? = try {

View File

@ -57,6 +57,8 @@ data class CalculatorPreferencesImpl(
override val formatterSymbols: FormatterSymbols, override val formatterSymbols: FormatterSymbols,
override val middleZero: Boolean, override val middleZero: Boolean,
override val acButton: Boolean, override val acButton: Boolean,
override val additionalButtons: Boolean,
override val inverseMode: Boolean,
override val partialHistoryView: Boolean, override val partialHistoryView: Boolean,
override val precision: Int, override val precision: Int,
override val outputFormat: Int, override val outputFormat: Int,

View File

@ -49,6 +49,8 @@ object PrefsKeys {
// CALCULATOR // CALCULATOR
val RADIAN_MODE = booleanPreferencesKey("RADIAN_MODE_PREF_KEY") val RADIAN_MODE = booleanPreferencesKey("RADIAN_MODE_PREF_KEY")
val PARTIAL_HISTORY_VIEW = booleanPreferencesKey("PARTIAL_HISTORY_VIEW_PREF_KEY") val PARTIAL_HISTORY_VIEW = booleanPreferencesKey("PARTIAL_HISTORY_VIEW_PREF_KEY")
val ADDITIONAL_BUTTONS = booleanPreferencesKey("ADDITIONAL_BUTTONS_PREF_KEY")
val INVERSE_MODE = booleanPreferencesKey("INVERSE_MODE_PREF_KEY")
// UNIT CONVERTER // UNIT CONVERTER
val LATEST_LEFT_SIDE = stringPreferencesKey("LATEST_LEFT_SIDE_PREF_KEY") val LATEST_LEFT_SIDE = stringPreferencesKey("LATEST_LEFT_SIDE_PREF_KEY")

View File

@ -84,6 +84,8 @@ class UserPreferencesRepositoryImpl @Inject constructor(
precision = preferences.getDigitsPrecision(), precision = preferences.getDigitsPrecision(),
outputFormat = preferences.getOutputFormat(), outputFormat = preferences.getOutputFormat(),
acButton = preferences.getAcButton(), acButton = preferences.getAcButton(),
additionalButtons = preferences.getAdditionalButtons(),
inverseMode = preferences.getInverseMode(),
) )
} }
@ -312,4 +314,16 @@ class UserPreferencesRepositoryImpl @Inject constructor(
preferences[PrefsKeys.AC_BUTTON] = enabled preferences[PrefsKeys.AC_BUTTON] = enabled
} }
} }
override suspend fun updateAdditionalButtons(enabled: Boolean) {
dataStore.edit { preferences ->
preferences[PrefsKeys.ADDITIONAL_BUTTONS] = enabled
}
}
override suspend fun updateInverseMode(enabled: Boolean) {
dataStore.edit { preferences ->
preferences[PrefsKeys.INVERSE_MODE] = enabled
}
}
} }

View File

@ -51,6 +51,8 @@ class CalculatorScreenTest {
history = emptyList(), history = emptyList(),
middleZero = false, middleZero = false,
acButton = true, acButton = true,
additionalButtons = false,
inverseMode = false,
partialHistoryView = true partialHistoryView = true
), ),
openDrawer = {}, openDrawer = {},
@ -60,9 +62,12 @@ class CalculatorScreenTest {
onDeleteClick = {}, onDeleteClick = {},
onClearClick = {}, onClearClick = {},
onEqualClick = {}, onEqualClick = {},
onAngleClick = {}, onRadianModeClick = {},
onAdditionalButtonsClick = {},
onInverseModeClick = {},
onClearHistoryClick = {}, onClearHistoryClick = {},
) {} onDeleteHistoryItemClick = {},
)
} }
onNodeWithTag("loading").assertDoesNotExist() onNodeWithTag("loading").assertDoesNotExist()
@ -83,6 +88,8 @@ class CalculatorScreenTest {
history = emptyList(), history = emptyList(),
middleZero = false, middleZero = false,
acButton = true, acButton = true,
additionalButtons = false,
inverseMode = false,
partialHistoryView = true partialHistoryView = true
), ),
openDrawer = {}, openDrawer = {},
@ -92,9 +99,12 @@ class CalculatorScreenTest {
onDeleteClick = {}, onDeleteClick = {},
onClearClick = {}, onClearClick = {},
onEqualClick = {}, onEqualClick = {},
onAngleClick = {}, onRadianModeClick = {},
onAdditionalButtonsClick = {},
onInverseModeClick = {},
onClearHistoryClick = {}, onClearHistoryClick = {},
) {} onDeleteHistoryItemClick = {},
)
} }
onNodeWithTag("inputBox") onNodeWithTag("inputBox")

View File

@ -97,7 +97,9 @@ internal fun CalculatorRoute(
onDeleteClick = viewModel::deleteTokens, onDeleteClick = viewModel::deleteTokens,
onClearClick = viewModel::clearInput, onClearClick = viewModel::clearInput,
onEqualClick = viewModel::equal, onEqualClick = viewModel::equal,
onAngleClick = viewModel::updateRadianMode, onRadianModeClick = viewModel::updateRadianMode,
onAdditionalButtonsClick = viewModel::updateAdditionalButtons,
onInverseModeClick = viewModel::updateInverseMode,
onClearHistoryClick = viewModel::clearHistory, onClearHistoryClick = viewModel::clearHistory,
onDeleteHistoryItemClick = viewModel::deleteHistoryItem, onDeleteHistoryItemClick = viewModel::deleteHistoryItem,
) )
@ -114,7 +116,9 @@ internal fun Ready(
onDeleteClick: () -> Unit, onDeleteClick: () -> Unit,
onClearClick: () -> Unit, onClearClick: () -> Unit,
onEqualClick: () -> Unit, onEqualClick: () -> Unit,
onAngleClick: (Boolean) -> Unit, onRadianModeClick: (Boolean) -> Unit,
onAdditionalButtonsClick: (Boolean) -> Unit,
onInverseModeClick: (Boolean) -> Unit,
onClearHistoryClick: () -> Unit, onClearHistoryClick: () -> Unit,
onDeleteHistoryItemClick: (HistoryItem) -> Unit, onDeleteHistoryItemClick: (HistoryItem) -> Unit,
) { ) {
@ -248,8 +252,12 @@ internal fun Ready(
onDeleteClick = onDeleteClick, onDeleteClick = onDeleteClick,
onClearClick = onClearClick, onClearClick = onClearClick,
onEqualClick = { focusManager.clearFocus(); onEqualClick() }, onEqualClick = { focusManager.clearFocus(); onEqualClick() },
onAngleClick = onAngleClick,
radianMode = uiState.radianMode, radianMode = uiState.radianMode,
onRadianModeClick = onRadianModeClick,
additionalButtons = uiState.additionalButtons,
onAdditionalButtonsClick = onAdditionalButtonsClick,
inverseMode = uiState.inverseMode,
onInverseModeClick = onInverseModeClick,
showAcButton = uiState.acButton, showAcButton = uiState.acButton,
middleZero = uiState.middleZero, middleZero = uiState.middleZero,
fractional = uiState.formatterSymbols.fractional, fractional = uiState.formatterSymbols.fractional,
@ -329,6 +337,8 @@ private fun PreviewCalculatorScreen() {
history = historyItems, history = historyItems,
middleZero = false, middleZero = false,
acButton = true, acButton = true,
additionalButtons = false,
inverseMode = false,
partialHistoryView = true partialHistoryView = true
), ),
openDrawer = {}, openDrawer = {},
@ -338,7 +348,10 @@ private fun PreviewCalculatorScreen() {
onDeleteClick = {}, onDeleteClick = {},
onClearClick = {}, onClearClick = {},
onEqualClick = {}, onEqualClick = {},
onAngleClick = {}, onRadianModeClick = {},
onAdditionalButtonsClick = {},
onInverseModeClick = {},
onClearHistoryClick = {}, onClearHistoryClick = {},
) {} onDeleteHistoryItemClick = {},
)
} }

View File

@ -35,6 +35,8 @@ internal sealed class CalculatorUIState {
val history: List<HistoryItem>, val history: List<HistoryItem>,
val middleZero: Boolean, val middleZero: Boolean,
val acButton: Boolean, val acButton: Boolean,
val additionalButtons: Boolean,
val inverseMode: Boolean,
val partialHistoryView: Boolean, val partialHistoryView: Boolean,
) : CalculatorUIState() ) : CalculatorUIState()
} }

View File

@ -83,6 +83,8 @@ internal class CalculatorViewModel @Inject constructor(
history = history, history = history,
middleZero = prefs.middleZero, middleZero = prefs.middleZero,
acButton = prefs.acButton, acButton = prefs.acButton,
additionalButtons = prefs.additionalButtons,
inverseMode = prefs.inverseMode,
partialHistoryView = prefs.partialHistoryView, partialHistoryView = prefs.partialHistoryView,
) )
} }
@ -158,6 +160,14 @@ internal class CalculatorViewModel @Inject constructor(
userPrefsRepository.updateRadianMode(newValue) userPrefsRepository.updateRadianMode(newValue)
} }
fun updateAdditionalButtons(newValue: Boolean) = viewModelScope.launch {
userPrefsRepository.updateAdditionalButtons(newValue)
}
fun updateInverseMode(newValue: Boolean) = viewModelScope.launch {
userPrefsRepository.updateInverseMode(newValue)
}
fun clearHistory() = viewModelScope.launch(Dispatchers.IO) { fun clearHistory() = viewModelScope.launch(Dispatchers.IO) {
calculatorHistoryRepository.clear() calculatorHistoryRepository.clear()
} }

View File

@ -44,9 +44,7 @@ import androidx.compose.material3.IconButtonDefaults
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.rotate import androidx.compose.ui.draw.rotate
@ -119,14 +117,16 @@ internal fun CalculatorKeyboard(
onDeleteClick: () -> Unit, onDeleteClick: () -> Unit,
onClearClick: () -> Unit, onClearClick: () -> Unit,
onEqualClick: () -> Unit, onEqualClick: () -> Unit,
onAngleClick: (Boolean) -> Unit,
radianMode: Boolean, radianMode: Boolean,
onRadianModeClick: (Boolean) -> Unit,
additionalButtons: Boolean,
onAdditionalButtonsClick: (Boolean) -> Unit,
inverseMode: Boolean,
onInverseModeClick: (Boolean) -> Unit,
showAcButton: Boolean, showAcButton: Boolean,
middleZero: Boolean, middleZero: Boolean,
fractional: String, fractional: String,
) { ) {
var showInvButtons: Boolean by remember { mutableStateOf(false) }
if (LocalWindowSize.current.heightSizeClass < WindowHeightSizeClass.Medium) { if (LocalWindowSize.current.heightSizeClass < WindowHeightSizeClass.Medium) {
LandscapeKeyboard( LandscapeKeyboard(
modifier = modifier, modifier = modifier,
@ -135,10 +135,10 @@ internal fun CalculatorKeyboard(
onDeleteClick = onDeleteClick, onDeleteClick = onDeleteClick,
onClearClick = onClearClick, onClearClick = onClearClick,
onEqualClick = onEqualClick, onEqualClick = onEqualClick,
onInvClick = { showInvButtons = !showInvButtons },
onAngleClick = onAngleClick,
showInvButtons = showInvButtons,
radianMode = radianMode, radianMode = radianMode,
onRadianModeClick = onRadianModeClick,
inverseMode = inverseMode,
onInverseModeClick = onInverseModeClick,
showAcButton = showAcButton, showAcButton = showAcButton,
middleZero = middleZero, middleZero = middleZero,
fractional = fractional, fractional = fractional,
@ -151,10 +151,12 @@ internal fun CalculatorKeyboard(
onDeleteClick = onDeleteClick, onDeleteClick = onDeleteClick,
onClearClick = onClearClick, onClearClick = onClearClick,
onEqualClick = onEqualClick, onEqualClick = onEqualClick,
onInvClick = { showInvButtons = !showInvButtons },
onAngleClick = onAngleClick,
showInvButtons = showInvButtons,
radianMode = radianMode, radianMode = radianMode,
onRadianModeClick = onRadianModeClick,
additionalButtons = additionalButtons,
onAdditionalButtonsClick = onAdditionalButtonsClick,
inverseMode = inverseMode,
onInverseModeClick = onInverseModeClick,
showAcButton = showAcButton, showAcButton = showAcButton,
middleZero = middleZero, middleZero = middleZero,
fractional = fractional, fractional = fractional,
@ -170,10 +172,12 @@ private fun PortraitKeyboard(
onDeleteClick: () -> Unit, onDeleteClick: () -> Unit,
onClearClick: () -> Unit, onClearClick: () -> Unit,
onEqualClick: () -> Unit, onEqualClick: () -> Unit,
onInvClick: () -> Unit,
onAngleClick: (Boolean) -> Unit,
showInvButtons: Boolean,
radianMode: Boolean, radianMode: Boolean,
onRadianModeClick: (Boolean) -> Unit,
additionalButtons: Boolean,
onAdditionalButtonsClick: (Boolean) -> Unit,
inverseMode: Boolean,
onInverseModeClick: (Boolean) -> Unit,
showAcButton: Boolean, showAcButton: Boolean,
middleZero: Boolean, middleZero: Boolean,
fractional: String, fractional: String,
@ -184,9 +188,8 @@ private fun PortraitKeyboard(
val fractionalIcon = remember(fractional) { if (fractional == Token.PERIOD) IconPack.Dot else IconPack.Comma } val fractionalIcon = remember(fractional) { if (fractional == Token.PERIOD) IconPack.Dot else IconPack.Comma }
val fractionalIconDescription = remember(fractional) { if (fractional == Token.PERIOD) R.string.keyboard_dot else R.string.comma } val fractionalIconDescription = remember(fractional) { if (fractional == Token.PERIOD) R.string.keyboard_dot else R.string.comma }
var showAdditional: Boolean by remember { mutableStateOf(false) }
val expandRotation: Float by animateFloatAsState( val expandRotation: Float by animateFloatAsState(
targetValue = if (showAdditional) 180f else 0f, targetValue = if (additionalButtons) 180f else 0f,
animationSpec = tween(easing = FastOutSlowInEasing), animationSpec = tween(easing = FastOutSlowInEasing),
label = "Rotate on expand" label = "Rotate on expand"
) )
@ -205,7 +208,7 @@ private fun PortraitKeyboard(
horizontalArrangement = Arrangement.Start horizontalArrangement = Arrangement.Start
) { ) {
Crossfade( Crossfade(
targetState = showInvButtons, targetState = inverseMode,
label = "Inverse switch", label = "Inverse switch",
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
@ -214,7 +217,7 @@ private fun PortraitKeyboard(
if (inverse) { if (inverse) {
AdditionalPortrait( AdditionalPortrait(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
showAdditional = showAdditional, additionalButtons = additionalButtons,
buttonHeight = additionalButtonHeight, buttonHeight = additionalButtonHeight,
content1 = { buttonModifier -> content1 = { buttonModifier ->
KeyboardButtonAdditional(buttonModifier, IconPack.Modulo, stringResource(R.string.keyboard_modulo), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.modulo) } KeyboardButtonAdditional(buttonModifier, IconPack.Modulo, stringResource(R.string.keyboard_modulo), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.modulo) }
@ -223,12 +226,12 @@ private fun PortraitKeyboard(
KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.factorial) } KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.factorial) }
}, },
content2 = { buttonModifier -> content2 = { buttonModifier ->
KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightTallAdditional) { onAngleClick(!radianMode) } KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightTallAdditional) { onRadianModeClick(!radianMode) }
KeyboardButtonAdditional(buttonModifier, IconPack.ArSin, stringResource(R.string.keyboard_arsin), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.arsinBracket) } KeyboardButtonAdditional(buttonModifier, IconPack.ArSin, stringResource(R.string.keyboard_arsin), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.arsinBracket) }
KeyboardButtonAdditional(buttonModifier, IconPack.ArCos, stringResource(R.string.keyboard_arcos), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.arcosBracket) } KeyboardButtonAdditional(buttonModifier, IconPack.ArCos, stringResource(R.string.keyboard_arcos), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.arcosBracket) }
KeyboardButtonAdditional(buttonModifier, IconPack.AcTan, stringResource(R.string.keyboard_actan), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.actanBracket) } KeyboardButtonAdditional(buttonModifier, IconPack.AcTan, stringResource(R.string.keyboard_actan), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.actanBracket) }
KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightTallAdditional) { onInvClick() } KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightTallAdditional) { onInverseModeClick(!inverseMode) }
KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_euler), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Const.e) } KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_euler), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Const.e) }
KeyboardButtonAdditional(buttonModifier, IconPack.Ex, stringResource(R.string.keyboard_exp), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.expBracket) } KeyboardButtonAdditional(buttonModifier, IconPack.Ex, stringResource(R.string.keyboard_exp), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.expBracket) }
KeyboardButtonAdditional(buttonModifier, IconPack.Power10, stringResource(R.string.keyboard_power_10), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Digit._1 + Token.Digit._0 + Token.Operator.power) } KeyboardButtonAdditional(buttonModifier, IconPack.Power10, stringResource(R.string.keyboard_power_10), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Digit._1 + Token.Digit._0 + Token.Operator.power) }
@ -237,7 +240,7 @@ private fun PortraitKeyboard(
} else { } else {
AdditionalPortrait( AdditionalPortrait(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
showAdditional = showAdditional, additionalButtons = additionalButtons,
buttonHeight = additionalButtonHeight, buttonHeight = additionalButtonHeight,
content1 = { buttonModifier -> content1 = { buttonModifier ->
KeyboardButtonAdditional(buttonModifier, IconPack.Root, stringResource(R.string.keyboard_root), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.sqrt) } KeyboardButtonAdditional(buttonModifier, IconPack.Root, stringResource(R.string.keyboard_root), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.sqrt) }
@ -246,12 +249,12 @@ private fun PortraitKeyboard(
KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.factorial) } KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Operator.factorial) }
}, },
content2 = { buttonModifier -> content2 = { buttonModifier ->
KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightTallAdditional) { onAngleClick(!radianMode) } KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightTallAdditional) { onRadianModeClick(!radianMode) }
KeyboardButtonAdditional(buttonModifier, IconPack.Sin, stringResource(R.string.keyboard_sin), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.sinBracket) } KeyboardButtonAdditional(buttonModifier, IconPack.Sin, stringResource(R.string.keyboard_sin), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.sinBracket) }
KeyboardButtonAdditional(buttonModifier, IconPack.Cos, stringResource(R.string.keyboard_cos), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.cosBracket) } KeyboardButtonAdditional(buttonModifier, IconPack.Cos, stringResource(R.string.keyboard_cos), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.cosBracket) }
KeyboardButtonAdditional(buttonModifier, IconPack.Tan, stringResource(R.string.keyboard_tan), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.tanBracket) } KeyboardButtonAdditional(buttonModifier, IconPack.Tan, stringResource(R.string.keyboard_tan), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.tanBracket) }
KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightTallAdditional) { onInvClick() } KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightTallAdditional) { onInverseModeClick(!inverseMode) }
KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_exp), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Const.e) } KeyboardButtonAdditional(buttonModifier, IconPack.Euler, stringResource(R.string.keyboard_exp), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Const.e) }
KeyboardButtonAdditional(buttonModifier, IconPack.Ln, stringResource(R.string.keyboard_ln), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.lnBracket) } KeyboardButtonAdditional(buttonModifier, IconPack.Ln, stringResource(R.string.keyboard_ln), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.lnBracket) }
KeyboardButtonAdditional(buttonModifier, IconPack.Log, stringResource(R.string.keyboard_log), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.logBracket) } KeyboardButtonAdditional(buttonModifier, IconPack.Log, stringResource(R.string.keyboard_log), KeyboardButtonContentHeightTallAdditional) { onAddTokenClick(Token.Func.logBracket) }
@ -265,7 +268,7 @@ private fun PortraitKeyboard(
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {
IconButton( IconButton(
onClick = { showAdditional = !showAdditional }, onClick = { onAdditionalButtonsClick(!additionalButtons) },
colors = IconButtonDefaults.iconButtonColors(containerColor = MaterialTheme.colorScheme.inverseOnSurface) colors = IconButtonDefaults.iconButtonColors(containerColor = MaterialTheme.colorScheme.inverseOnSurface)
) { ) {
Icon(Icons.Default.ExpandMore, null, Modifier.rotate(expandRotation)) Icon(Icons.Default.ExpandMore, null, Modifier.rotate(expandRotation))
@ -333,7 +336,7 @@ private fun PortraitKeyboard(
* *
* Height: 3 buttons * Height: 3 buttons
* *
* @param showAdditional When `true` reveals [content2] with animation. * @param additionalButtons When `true` reveals [content2] with animation.
* @param buttonHeight Button height in [Dp]. * @param buttonHeight Button height in [Dp].
* @param content1 First row of buttons. * @param content1 First row of buttons.
* @param content2 Second and third rows of buttons. * @param content2 Second and third rows of buttons.
@ -341,13 +344,13 @@ private fun PortraitKeyboard(
@Composable @Composable
private fun AdditionalPortrait( private fun AdditionalPortrait(
modifier: Modifier, modifier: Modifier,
showAdditional: Boolean, additionalButtons: Boolean,
buttonHeight: Dp, buttonHeight: Dp,
content1: @Composable (buttonModifier: Modifier) -> Unit, content1: @Composable (buttonModifier: Modifier) -> Unit,
content2: @Composable (buttonModifier: Modifier) -> Unit content2: @Composable (buttonModifier: Modifier) -> Unit
) { ) {
AnimatedContent( AnimatedContent(
targetState = showAdditional, targetState = additionalButtons,
modifier = modifier, modifier = modifier,
label = "Additional buttons reveal", label = "Additional buttons reveal",
transitionSpec = { transitionSpec = {
@ -402,10 +405,10 @@ private fun LandscapeKeyboard(
onDeleteClick: () -> Unit, onDeleteClick: () -> Unit,
onClearClick: () -> Unit, onClearClick: () -> Unit,
onEqualClick: () -> Unit, onEqualClick: () -> Unit,
onInvClick: () -> Unit,
onAngleClick: (Boolean) -> Unit,
showInvButtons: Boolean,
radianMode: Boolean, radianMode: Boolean,
onRadianModeClick: (Boolean) -> Unit,
inverseMode: Boolean,
onInverseModeClick: (Boolean) -> Unit,
showAcButton: Boolean, showAcButton: Boolean,
middleZero: Boolean, middleZero: Boolean,
fractional: String, fractional: String,
@ -417,7 +420,7 @@ private fun LandscapeKeyboard(
val fractionalIconDescription = remember(fractional) { if (fractional == Token.PERIOD) R.string.keyboard_dot else R.string.comma } val fractionalIconDescription = remember(fractional) { if (fractional == Token.PERIOD) R.string.keyboard_dot else R.string.comma }
Crossfade( Crossfade(
targetState = showInvButtons, targetState = inverseMode,
label = "Inverse switch", label = "Inverse switch",
modifier = modifier modifier = modifier
) { inverse -> ) { inverse ->
@ -431,7 +434,7 @@ private fun LandscapeKeyboard(
.fillMaxWidth(width) .fillMaxWidth(width)
.fillMaxHeight(height) .fillMaxHeight(height)
KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightShortAdditional) { onAngleClick(!radianMode) } KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightShortAdditional) { onRadianModeClick(!radianMode) }
KeyboardButtonAdditional(buttonModifier, IconPack.Modulo, stringResource(R.string.keyboard_modulo), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.modulo) } KeyboardButtonAdditional(buttonModifier, IconPack.Modulo, stringResource(R.string.keyboard_modulo), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.modulo) }
KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Const.pi) } KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Const.pi) }
KeyboardButtonLight(buttonModifier, IconPack.Key7, Token.Digit._7, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._7) } KeyboardButtonLight(buttonModifier, IconPack.Key7, Token.Digit._7, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._7) }
@ -445,7 +448,7 @@ private fun LandscapeKeyboard(
KeyboardButtonFilled(buttonModifier, IconPack.RightBracket, stringResource(R.string.keyboard_right_bracket), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.rightBracket) } KeyboardButtonFilled(buttonModifier, IconPack.RightBracket, stringResource(R.string.keyboard_right_bracket), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.rightBracket) }
} }
KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightShortAdditional) { onInvClick() } KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightShortAdditional) { onInverseModeClick(!inverseMode) }
KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.power) } KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.power) }
KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.factorial) } KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.factorial) }
KeyboardButtonLight(buttonModifier, IconPack.Key4, Token.Digit._4, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._4) } KeyboardButtonLight(buttonModifier, IconPack.Key4, Token.Digit._4, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._4) }
@ -487,7 +490,7 @@ private fun LandscapeKeyboard(
.fillMaxWidth(width) .fillMaxWidth(width)
.fillMaxHeight(height) .fillMaxHeight(height)
KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightShortAdditional) { onAngleClick(!radianMode) } KeyboardButtonAdditional(buttonModifier, angleIcon, stringResource(angleIconDescription), KeyboardButtonContentHeightShortAdditional) { onRadianModeClick(!radianMode) }
KeyboardButtonAdditional(buttonModifier, IconPack.Root, stringResource(R.string.keyboard_root), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.sqrt) } KeyboardButtonAdditional(buttonModifier, IconPack.Root, stringResource(R.string.keyboard_root), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.sqrt) }
KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Const.pi) } KeyboardButtonAdditional(buttonModifier, IconPack.Pi, stringResource(R.string.keyboard_pi), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Const.pi) }
KeyboardButtonLight(buttonModifier, IconPack.Key7, Token.Digit._7, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._7) } KeyboardButtonLight(buttonModifier, IconPack.Key7, Token.Digit._7, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._7) }
@ -501,7 +504,7 @@ private fun LandscapeKeyboard(
KeyboardButtonFilled(buttonModifier, IconPack.RightBracket, stringResource(R.string.keyboard_right_bracket), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.rightBracket) } KeyboardButtonFilled(buttonModifier, IconPack.RightBracket, stringResource(R.string.keyboard_right_bracket), KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Operator.rightBracket) }
} }
KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightShortAdditional) { onInvClick() } KeyboardButtonAdditional(buttonModifier, IconPack.Inv, stringResource(R.string.keyboard_inverse), KeyboardButtonContentHeightShortAdditional) { onInverseModeClick(!inverseMode) }
KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.power) } KeyboardButtonAdditional(buttonModifier, IconPack.Power, stringResource(R.string.keyboard_power), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.power) }
KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.factorial) } KeyboardButtonAdditional(buttonModifier, IconPack.Factorial, stringResource(R.string.keyboard_factorial), KeyboardButtonContentHeightShortAdditional) { onAddTokenClick(Token.Operator.factorial) }
KeyboardButtonLight(buttonModifier, IconPack.Key4, Token.Digit._4, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._4) } KeyboardButtonLight(buttonModifier, IconPack.Key4, Token.Digit._4, KeyboardButtonContentHeightShort) { onAddTokenClick(Token.Digit._4) }
@ -547,10 +550,12 @@ private fun PreviewPortraitKeyboard() {
onDeleteClick = {}, onDeleteClick = {},
onClearClick = {}, onClearClick = {},
onEqualClick = {}, onEqualClick = {},
onInvClick = {},
onAngleClick = {},
showInvButtons = false,
radianMode = true, radianMode = true,
onRadianModeClick = {},
additionalButtons = false,
onAdditionalButtonsClick = {},
inverseMode = false,
onInverseModeClick = {},
showAcButton = true, showAcButton = true,
middleZero = false, middleZero = false,
fractional = Token.PERIOD, fractional = Token.PERIOD,
@ -567,10 +572,10 @@ private fun PreviewLandscapeKeyboard() {
onDeleteClick = {}, onDeleteClick = {},
onClearClick = {}, onClearClick = {},
onEqualClick = {}, onEqualClick = {},
onInvClick = {},
onAngleClick = {},
showInvButtons = false,
radianMode = true, radianMode = true,
onRadianModeClick = {},
inverseMode = false,
onInverseModeClick = {},
showAcButton = true, showAcButton = true,
middleZero = false, middleZero = false,
fractional = Token.PERIOD, fractional = Token.PERIOD,

View File

@ -87,6 +87,8 @@ private fun PreviewCalculatorSettingsScreenStandard() {
formatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD), formatterSymbols = FormatterSymbols(Token.SPACE, Token.PERIOD),
middleZero = false, middleZero = false,
acButton = false, acButton = false,
additionalButtons = false,
inverseMode = false,
partialHistoryView = false, partialHistoryView = false,
precision = 3, precision = 3,
outputFormat = OutputFormat.PLAIN outputFormat = OutputFormat.PLAIN