diff --git a/core/base/src/main/res/values/strings.xml b/core/base/src/main/res/values/strings.xml index e7778fdc..9f727888 100644 --- a/core/base/src/main/res/values/strings.xml +++ b/core/base/src/main/res/values/strings.xml @@ -1102,6 +1102,7 @@ Enable unit group Reorder unit group Disable unit group + Open menu Version name About Unitto diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/MenuButton.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/MenuButton.kt new file mode 100644 index 00000000..2d9ce43e --- /dev/null +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/MenuButton.kt @@ -0,0 +1,42 @@ +/* + * Unitto is a unit converter for Android + * Copyright (c) 2022 Elshan Agaev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sadellie.unitto.core.ui.common + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.MenuOpen +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import com.sadellie.unitto.core.ui.R + +/** + * Button that is used in Top bars + * + * @param onClick Action to be called when button is clicked. + */ +@Composable +fun MenuButton(onClick: () -> Unit) { + IconButton(onClick = onClick) { + Icon( + Icons.Outlined.MenuOpen, + contentDescription = stringResource(R.string.open_menu_description) + ) + } +} diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/UnittoTopAppBar.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/UnittoScreenWithTopBar.kt similarity index 68% rename from core/ui/src/main/java/com/sadellie/unitto/core/ui/common/UnittoTopAppBar.kt rename to core/ui/src/main/java/com/sadellie/unitto/core/ui/common/UnittoScreenWithTopBar.kt index bc909d17..09ee24ee 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/UnittoTopAppBar.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/UnittoScreenWithTopBar.kt @@ -20,39 +20,38 @@ package com.sadellie.unitto.core.ui.common import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.RowScope +import androidx.compose.material3.CenterAlignedTopAppBar import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarColors import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier /** - * Commonly used TopAppBar with scroll behavior. + * Template screen. Uses [Scaffold] and [CenterAlignedTopAppBar] * - * @param title Text that is displayed in top bar. - * @param navigateUpAction Action when user click arrow button at the top. - * @param content Content that can be scrolled. Don't forget to use padding values. + * @param modifier See [Scaffold] + * @param title See [CenterAlignedTopAppBar] + * @param navigationIcon See [CenterAlignedTopAppBar] + * @param actions See [CenterAlignedTopAppBar] + * @param colors See [CenterAlignedTopAppBar] + * @param content See [Scaffold] */ @Composable -fun UnittoTopAppBar( - title: String, - navigateUpAction: () -> Unit, +fun UnittoScreenWithTopBar( + modifier: Modifier = Modifier, + title: @Composable () -> Unit, + navigationIcon: @Composable () -> Unit, actions: @Composable RowScope.() -> Unit = {}, colors: TopAppBarColors = TopAppBarDefaults.topAppBarColors(), content: @Composable (PaddingValues) -> Unit ) { Scaffold( - modifier = Modifier, + modifier = modifier, topBar = { - TopAppBar( - title = { - Text(text = title) - }, - navigationIcon = { - NavigateUpButton { navigateUpAction() } - }, + CenterAlignedTopAppBar( + title = title, + navigationIcon = navigationIcon, actions = actions, colors = colors ) diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt index 2511c8ea..909a5ad1 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt @@ -60,7 +60,8 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.sadellie.unitto.core.ui.common.UnittoTopAppBar +import com.sadellie.unitto.core.ui.common.MenuButton +import com.sadellie.unitto.core.ui.common.UnittoScreenWithTopBar import com.sadellie.unitto.core.ui.theme.NumbersTextStyleDisplayMedium import com.sadellie.unitto.data.model.HistoryItem import com.sadellie.unitto.feature.calculator.components.CalculatorKeyboard @@ -112,9 +113,9 @@ private fun CalculatorScreen( var textThingyHeight by remember { mutableStateOf(0) } var historyItemHeight by remember { mutableStateOf(0) } - UnittoTopAppBar( - title = stringResource(R.string.calculator), - navigateUpAction = navigateUpAction, + UnittoScreenWithTopBar( + title = { Text(stringResource(R.string.calculator)) }, + navigationIcon = { MenuButton { navigateUpAction() } }, colors = TopAppBarDefaults.topAppBarColors(MaterialTheme.colorScheme.surfaceVariant), actions = { AnimatedVisibility( @@ -179,7 +180,9 @@ private fun CalculatorScreen( verticalArrangement = Arrangement.spacedBy(8.dp) ) { InputTextField( - modifier = Modifier.fillMaxWidth().padding(horizontal = 8.dp), + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 8.dp), value = TextFieldValue( text = uiState.input, selection = TextRange(uiState.selection.first, uiState.selection.last) @@ -188,7 +191,9 @@ private fun CalculatorScreen( pasteCallback = addSymbol ) Text( - modifier = Modifier.fillMaxWidth().padding(horizontal = 8.dp), + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 8.dp), text = uiState.output, textAlign = TextAlign.End, softWrap = false, diff --git a/feature/epoch/src/main/java/com/sadellie/unitto/feature/epoch/EpochScreen.kt b/feature/epoch/src/main/java/com/sadellie/unitto/feature/epoch/EpochScreen.kt index b9a287e6..aa4e3b31 100644 --- a/feature/epoch/src/main/java/com/sadellie/unitto/feature/epoch/EpochScreen.kt +++ b/feature/epoch/src/main/java/com/sadellie/unitto/feature/epoch/EpochScreen.kt @@ -19,6 +19,7 @@ package com.sadellie.unitto.feature.epoch import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -26,8 +27,9 @@ import androidx.compose.ui.text.TextRange import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.sadellie.unitto.core.ui.common.MenuButton import com.sadellie.unitto.core.ui.common.PortraitLandscape -import com.sadellie.unitto.core.ui.common.UnittoTopAppBar +import com.sadellie.unitto.core.ui.common.UnittoScreenWithTopBar import com.sadellie.unitto.feature.epoch.component.EpochKeyboard import com.sadellie.unitto.feature.epoch.component.TopPart @@ -58,9 +60,9 @@ private fun EpochScreen( swap: () -> Unit, onCursorChange: (IntRange) -> Unit ) { - UnittoTopAppBar( - title = stringResource(R.string.epoch_converter), - navigateUpAction = navigateUpAction + UnittoScreenWithTopBar( + title = { Text(stringResource(R.string.epoch_converter)) }, + navigationIcon = { MenuButton { navigateUpAction() } } ) { padding -> PortraitLandscape( modifier = Modifier.padding(padding),