init
This commit is contained in:
@@ -487,7 +487,7 @@ fun NumberKeyboard(
|
||||
onLongClick = onLongBackspaceClick
|
||||
)
|
||||
|
||||
"+", "/", "-", "*" -> KeyboardButton(
|
||||
"+", "÷", "-", "×" -> KeyboardButton(
|
||||
text = key,
|
||||
onClick = { onOperatorClick(key) },
|
||||
modifier = Modifier.weight(1f),
|
||||
@@ -531,7 +531,7 @@ fun KeyboardButton(
|
||||
) {
|
||||
when {
|
||||
text != null -> Text(
|
||||
text,
|
||||
text = text,
|
||||
style = MaterialTheme.typography.headlineMedium
|
||||
)
|
||||
|
||||
@@ -541,7 +541,7 @@ fun KeyboardButton(
|
||||
}
|
||||
|
||||
val keyboard = listOf(
|
||||
listOf("+", "-", "*", "/"),
|
||||
listOf("+", "-", "×", "÷"),
|
||||
listOf("1", "2", "3"),
|
||||
listOf("4", "5", "6"),
|
||||
listOf("7", "8", "9"),
|
||||
|
||||
@@ -2,6 +2,7 @@ package cc.n0th1ng.tripmoney.screens.listexpense
|
||||
|
||||
import android.os.Build
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.material3.AlertDialog
|
||||
import androidx.compose.material3.DatePicker
|
||||
import androidx.compose.material3.DatePickerDialog
|
||||
@@ -20,13 +21,15 @@ import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import cc.n0th1ng.tripmoney.R.*
|
||||
import cc.n0th1ng.tripmoney.theme.TripMoneyTheme
|
||||
import cc.n0th1ng.tripmoney.utils.AllPreviews
|
||||
import java.time.Instant
|
||||
import java.time.LocalDate
|
||||
import java.time.LocalDateTime
|
||||
import java.time.LocalTime
|
||||
import java.time.ZoneId
|
||||
import java.util.Calendar
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.O)
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@@ -38,8 +41,10 @@ fun DateRangePicker(
|
||||
onConfirm: (LocalDate, LocalDate) -> Unit
|
||||
) {
|
||||
val datePickerState =
|
||||
rememberDateRangePickerState(initialSelectedStartDateMillis = startDate.toEpochMilli(),
|
||||
initialSelectedEndDateMillis = endDate.toEpochMilli())
|
||||
rememberDateRangePickerState(
|
||||
initialSelectedStartDateMillis = startDate.toEpochMilli(),
|
||||
initialSelectedEndDateMillis = endDate.toEpochMilli()
|
||||
)
|
||||
|
||||
DatePickerDialog(
|
||||
onDismissRequest = onDismiss,
|
||||
@@ -64,7 +69,8 @@ fun DateRangePicker(
|
||||
TextButton(onClick = onDismiss) { Text(stringResource(string.cancel)) }
|
||||
}
|
||||
) {
|
||||
DateRangePicker(state = datePickerState, showModeToggle = false,
|
||||
DateRangePicker(
|
||||
state = datePickerState, showModeToggle = false,
|
||||
title = {})
|
||||
}
|
||||
}
|
||||
@@ -73,27 +79,35 @@ fun DateRangePicker(
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
fun DatePicker(
|
||||
dateTime: LocalDate = LocalDate.now(),
|
||||
date: LocalDate = LocalDate.now(),
|
||||
onDismiss: () -> Unit,
|
||||
onConfirm: (LocalDate) -> Unit
|
||||
) {
|
||||
val datePickerState =
|
||||
rememberDatePickerState(initialSelectedDateMillis = dateTime.toEpochMilli())
|
||||
rememberDatePickerState(initialSelectedDateMillis = date.toEpochMilli())
|
||||
|
||||
DatePickerDialog(
|
||||
onDismissRequest = onDismiss,
|
||||
confirmButton = {
|
||||
TextButton(onClick = {
|
||||
val selectedMillis = datePickerState.selectedDateMillis
|
||||
if (selectedMillis != null) {
|
||||
val selectedDate = Instant.ofEpochMilli(selectedMillis)
|
||||
.atZone(ZoneId.systemDefault())
|
||||
.toLocalDate()
|
||||
onConfirm(selectedDate)
|
||||
Row() {
|
||||
TextButton(onClick = {
|
||||
onConfirm(LocalDate.now().minusDays(1))
|
||||
}) {
|
||||
Text(stringResource(string.yesterday))
|
||||
}
|
||||
TextButton(onClick = {
|
||||
val selectedMillis = datePickerState.selectedDateMillis
|
||||
if (selectedMillis != null) {
|
||||
val selectedDate = Instant.ofEpochMilli(selectedMillis)
|
||||
.atZone(ZoneId.systemDefault())
|
||||
.toLocalDate()
|
||||
onConfirm(selectedDate)
|
||||
}
|
||||
}) {
|
||||
Text("OK")
|
||||
}
|
||||
}) {
|
||||
Text("OK")
|
||||
}
|
||||
|
||||
},
|
||||
dismissButton = {
|
||||
TextButton(onClick = onDismiss) { Text(stringResource(string.cancel)) }
|
||||
@@ -103,13 +117,17 @@ fun DatePicker(
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.O)
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
fun TimePicker(onDismiss: () -> Unit, onConfirm: (TimePickerState) -> Unit) {
|
||||
val currentTime = Calendar.getInstance()
|
||||
fun TimePicker(
|
||||
onDismiss: () -> Unit,
|
||||
onConfirm: (TimePickerState) -> Unit,
|
||||
time: LocalTime = LocalTime.now()
|
||||
) {
|
||||
val timePickerState = rememberTimePickerState(
|
||||
initialHour = currentTime.get(Calendar.HOUR_OF_DAY),
|
||||
initialMinute = currentTime.get(Calendar.MINUTE),
|
||||
initialHour = time.hour,
|
||||
initialMinute = time.minute,
|
||||
is24Hour = true
|
||||
)
|
||||
|
||||
@@ -141,7 +159,9 @@ fun DateTimePicker(
|
||||
var date by remember { mutableStateOf(dateTime.toLocalDate()) }
|
||||
|
||||
if (showDatePicker) {
|
||||
DatePicker(onDismiss = { showDatePicker = false }, onConfirm = { newDate ->
|
||||
DatePicker(
|
||||
date = dateTime.toLocalDate(),
|
||||
onDismiss = { showDatePicker = false }, onConfirm = { newDate ->
|
||||
date = newDate
|
||||
showDatePicker = false
|
||||
showTimePicker = true
|
||||
@@ -157,7 +177,7 @@ fun DateTimePicker(
|
||||
showDatePicker = true
|
||||
val newTime = LocalTime.of(timePickerState.hour, timePickerState.minute)
|
||||
onChange(LocalDateTime.of(date, newTime))
|
||||
})
|
||||
}, time = dateTime.toLocalTime())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -167,4 +187,13 @@ fun LocalDateTime.toEpochMilli(): Long =
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.O)
|
||||
fun LocalDate.toEpochMilli(): Long =
|
||||
this.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()
|
||||
this.atStartOfDay().atZone(ZoneId.of("UTC")).toInstant().toEpochMilli()
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.O)
|
||||
@AllPreviews
|
||||
@Composable
|
||||
fun DatePickerPreview() {
|
||||
TripMoneyTheme {
|
||||
DatePicker(LocalDate.now(), {}, {})
|
||||
}
|
||||
}
|
||||
@@ -104,7 +104,7 @@ fun AddTripBottomSheet(
|
||||
|
||||
var endDate by remember {
|
||||
mutableStateOf(
|
||||
tripToEdit?.startDate ?: LocalDate.now()
|
||||
tripToEdit?.endDate ?: LocalDate.now()
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,8 @@ package cc.n0th1ng.tripmoney.utils
|
||||
enum class Currencies {
|
||||
PLN,
|
||||
EUR,
|
||||
USD;
|
||||
USD,
|
||||
RON;
|
||||
|
||||
companion object {
|
||||
fun default(): Currencies {
|
||||
|
||||
@@ -39,4 +39,5 @@
|
||||
<string name="budget">Budget</string>
|
||||
<string name="money_left">Money left</string>
|
||||
<string name="add_expense_settings">Open add expense form on startup</string>
|
||||
<string name="yesterday">Yesterday</string>
|
||||
</resources>
|
||||
Reference in New Issue
Block a user