From d5e2aa35783ceb61e51609cce83206a8282399dc Mon Sep 17 00:00:00 2001 From: SalatielGenol Date: Thu, 15 Dec 2022 11:05:39 +0100 Subject: [PATCH] =?UTF-8?q?A=C3=B1adido=20ejemplo=20calculadora?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ejemplosCodigo/Calculadora.kt | 397 ++++++++++++++++++ .../genol_salatiel_ex1tdist/ui/theme/Color.kt | 3 +- 2 files changed, 399 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/es/genol/genol_salatiel_ex1tdist/ejemplosCodigo/Calculadora.kt diff --git a/app/src/main/java/es/genol/genol_salatiel_ex1tdist/ejemplosCodigo/Calculadora.kt b/app/src/main/java/es/genol/genol_salatiel_ex1tdist/ejemplosCodigo/Calculadora.kt new file mode 100644 index 0000000..8e9359b --- /dev/null +++ b/app/src/main/java/es/genol/genol_salatiel_ex1tdist/ejemplosCodigo/Calculadora.kt @@ -0,0 +1,397 @@ +package es.genol.genol_salatiel_ex1tdist.ejemplosCodigo + +import android.content.res.Configuration +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import es.genol.genol_salatiel_ex1tdist.MainActivity +import es.genol.genol_salatiel_ex1tdist.ui.theme.OrangeMine +import kotlin.system.exitProcess + +/* +Clase principal del programa, donde se inicializan todos los componentes, y se realizan algunas +operaciones simples mediante estados mutables y funciones personalizadas. + +La orientación del dispositivo modifica los margenes para que se vea decentemente en cualquier +situación. + +La lógica de programación es muy rudimentaria, es algo que he de mejorar. + */ + +val numActualSB = StringBuilder() +val numHistoricoSB = StringBuilder() +var operador : Char = ' ' +var huboResultado = false + +@Preview +@Composable +fun Principal() { + var numHistorico by rememberSaveable{ mutableStateOf( "" ) } + var numActual by rememberSaveable{ mutableStateOf( "" ) } + val configuration = LocalConfiguration.current + + val modificador: Modifier = when (configuration.orientation) { + Configuration.ORIENTATION_LANDSCAPE -> { + Modifier.padding(all = 0.dp) + } + else -> { + Modifier.padding(start = 8.dp, end = 8.dp, top = 50.dp, bottom = 50.dp) + + } + } + + Box( + modifier = Modifier + .fillMaxSize() + .then(modificador) + ){ + Column ( + modifier = Modifier + .fillMaxWidth(), + verticalArrangement = Arrangement.spacedBy(10.dp), + horizontalAlignment = Alignment.CenterHorizontally + ){ + Display(historico = numHistorico, numActual = numActual) + Botonera(accionPulsar = { + numActual = operacion(pulsador = it) + numHistorico = historico() + }) + } + } +} + +fun operacion(pulsador: String): String { + when (pulsador) { + "+" -> sumar() + "-" -> restar() + "×" -> multiplicar() + "÷" -> dividir() + "." -> numActualSB.append(pulsador) + "=" -> resultado() + "DEL" -> if (numActualSB.isNotEmpty()) numActualSB.deleteCharAt(numActualSB.lastIndex) + "AC" -> { + numActualSB.clear() + numHistoricoSB.clear() + } + else -> { + if (huboResultado) { + numActualSB.clear() + numActualSB.append(pulsador) + huboResultado = false + }else{ + numActualSB.append(pulsador) + } + } + } + + return numActualSB.toString() +} + +fun sumar() { + if (numHistoricoSB.isBlank()) { + numHistoricoSB.append(numActualSB.toString()) + numActualSB.clear() + operador = '+' + } +} + +fun restar() { + if (numHistoricoSB.isBlank()) { + numHistoricoSB.append(numActualSB.toString()) + numActualSB.clear() + operador = '-' + } +} + +fun multiplicar() { + if (numHistoricoSB.isBlank()) { + numHistoricoSB.append(numActualSB.toString()) + numActualSB.clear() + operador = '×' + } +} + +fun dividir() { + if (numHistoricoSB.isBlank()) { + numHistoricoSB.append(numActualSB.toString()) + numActualSB.clear() + operador = '÷' + } +} + +fun resultado() { + var resultado = 0 + + if (numActualSB.isNotBlank() && numHistoricoSB.isNotBlank()) { + when (operador) { + '+' -> resultado = numHistoricoSB.toString().toInt() + numActualSB.toString().toInt() + '-' -> resultado = numHistoricoSB.toString().toInt() - numActualSB.toString().toInt() + '×' -> resultado = numHistoricoSB.toString().toInt() * numActualSB.toString().toInt() + '÷' -> resultado = numHistoricoSB.toString().toInt() / numActualSB.toString().toInt() + } + } + + numHistoricoSB.clear() + numActualSB.clear() + huboResultado = true + numActualSB.append(resultado) +} + +fun historico(): String { + return numHistoricoSB.toString() +} + +/* +Composable que imita un display de una calculadora con dos lineas de texto con diferentes +tamaños. + */ + +@Composable +fun Display(historico: String, numActual: String){ + + Column( + modifier = Modifier + .clip(shape = RoundedCornerShape(20)) + .background(Color.DarkGray) + .fillMaxWidth(), + horizontalAlignment = Alignment.End, + verticalArrangement = Arrangement.Center + ) { + val separacion = 15.dp + Text(text = historico, + fontWeight = FontWeight.ExtraBold, + fontSize = 20.sp, + color = Color.White, + modifier = Modifier.padding(end = separacion)) + Text( + text = numActual, + fontWeight = FontWeight.ExtraBold, + fontSize = 50.sp, + color = Color.White, + modifier = Modifier.padding(end = separacion) + ) + } +} + +/* +Composable que define el pulsador y al que se le puede modificar el color de fondo, del texto, +el propio texto, y se le puede pasar un modificador completo si fuese necesario. + */ + +@Composable +fun Pulsador( + simbolo: String, + modifier: Modifier = Modifier, + color: Color = Color.Yellow, + colorFuente: Color = Color.Black, + onClick: () -> Unit //Evento al que se le pasará una lambda +){ + Box(modifier = Modifier + .clip(shape = RoundedCornerShape(30)) + .background(color) + .clickable { onClick() } + .then(modifier), + contentAlignment = Alignment.Center) { + Text( + text = simbolo, + fontWeight = FontWeight.ExtraBold, + fontSize = 30.sp, + color = colorFuente + ) + } +} + +/* +Composable que crea una columna de varias filas donde se generan los diferentes pulsadores de +la calculadora, pasándole los parámetros necesarios. + +La función recibe una lambda a la que devuelve un string. En este caso, el símbolo del pulsador. + */ + +@Composable +fun Botonera(accionPulsar: (String) -> Unit){ + val simple = 1f + val doble = 2f + val colorOperandos = Color.LightGray + Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { + Row( + modifier = Modifier + .fillMaxWidth() + .weight(1f), + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + Pulsador( + simbolo = "OFF", + modifier = Modifier + .fillMaxHeight() + .weight(simple), + color = Color.Black, + colorFuente = Color.Yellow + ) { + val activity = MainActivity() + activity.finish() + exitProcess(0) + } + Pulsador( + simbolo = "DEL", + modifier = Modifier + .fillMaxHeight() + .weight(simple), + color = Color.Blue + ) { accionPulsar("DEL") } + Pulsador( + simbolo = "AC", + modifier = Modifier + .fillMaxHeight() + .weight(simple), + color = Color.Red + ) { accionPulsar("AC") } + Pulsador( + simbolo = "÷", + modifier = Modifier + .fillMaxHeight() + .weight(simple), + color = colorOperandos + ) { accionPulsar("÷") } + } + Row( + modifier = Modifier + .fillMaxWidth() + .weight(1f), + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + Pulsador( + simbolo = "7", + modifier = Modifier + .fillMaxHeight() + .weight(simple), + ) { accionPulsar("7") } + Pulsador( + simbolo = "8", + modifier = Modifier + .fillMaxHeight() + .weight(simple), + ) { accionPulsar("8") } + Pulsador( + simbolo = "9", + modifier = Modifier + .fillMaxHeight() + .weight(simple), + /*.aspectRatio(simple),*/ + ) { accionPulsar("9") } + Pulsador( + simbolo = "×", + modifier = Modifier + .fillMaxHeight() + .weight(simple), + color = colorOperandos + ) { accionPulsar("×") } + } + Row( + modifier = Modifier + .fillMaxWidth() + .weight(1f), + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + Pulsador( + simbolo = "4", + modifier = Modifier + .fillMaxHeight() + .weight(simple), + ) { accionPulsar("4") } + Pulsador( + simbolo = "5", + modifier = Modifier + .fillMaxHeight() + .weight(simple), + ) { accionPulsar("5") } + Pulsador( + simbolo = "6", + modifier = Modifier + .fillMaxHeight() + .weight(simple), + ) { accionPulsar("6") } + Pulsador( + simbolo = "-", + modifier = Modifier + .fillMaxHeight() + .weight(simple), + color = colorOperandos + ) { accionPulsar("-") } + } + Row( + modifier = Modifier + .fillMaxWidth() + .weight(1f), + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + Pulsador( + simbolo = "1", + modifier = Modifier + .fillMaxHeight() + .weight(simple), + ) { accionPulsar("1") } + Pulsador( + simbolo = "2", + modifier = Modifier + .fillMaxHeight() + .weight(simple), + ) { accionPulsar("2") } + Pulsador( + simbolo = "3", + modifier = Modifier + .fillMaxHeight() + .weight(simple), + ) { accionPulsar("3") } + Pulsador( + simbolo = "+", + modifier = Modifier + .fillMaxHeight() + .weight(simple), + color = colorOperandos + ) { accionPulsar("+") } + } + Row( + modifier = Modifier + .fillMaxWidth() + .weight(1f), + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + Pulsador( + simbolo = "0", + modifier = Modifier + .fillMaxHeight() + .weight(simple), + ) { accionPulsar("0") } + Pulsador( + simbolo = ".", + modifier = Modifier + .fillMaxHeight() + .weight(simple), + ) { accionPulsar(".") } + Pulsador( + simbolo = "=", + modifier = Modifier + .fillMaxHeight() + .weight(doble), + color = OrangeMine + ) { accionPulsar("=") } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/es/genol/genol_salatiel_ex1tdist/ui/theme/Color.kt b/app/src/main/java/es/genol/genol_salatiel_ex1tdist/ui/theme/Color.kt index e4069ab..5c7c2a5 100644 --- a/app/src/main/java/es/genol/genol_salatiel_ex1tdist/ui/theme/Color.kt +++ b/app/src/main/java/es/genol/genol_salatiel_ex1tdist/ui/theme/Color.kt @@ -9,4 +9,5 @@ val RedWine = Color(0xFF7E212B) val PantoneLightGray = Color(0xFFD9D7C8) val PantoneSloganDarkGray = Color(0xFF40444F) val PantoneProcessBlue = Color(0xFF0085CA) -val PantoneClassicGreen = Color(0xFF009F53) \ No newline at end of file +val PantoneClassicGreen = Color(0xFF009F53) +val OrangeMine = Color(0xFFFF5722) \ No newline at end of file