mirror of
https://github.com/Myzel394/NumberHub.git
synced 2025-06-18 16:25:27 +02:00
parent
b0a04f4797
commit
76685339d7
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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,
|
||||||
|
@ -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")
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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")
|
||||||
|
@ -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 = {},
|
||||||
|
)
|
||||||
}
|
}
|
@ -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()
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user