From d40e946662dc41304f995276620457e81e24bddc Mon Sep 17 00:00:00 2001 From: Renaud BEURET Date: Thu, 28 Mar 2024 08:33:55 +0100 Subject: [PATCH 1/4] [ADD] Pendu UI State --- .../iut/sciencequest/ViewModels/UiStates/PenduUIState.kt | 9 +++++++++ .../ViewModels/UiStates/ScientifiqueDecouvertsUIState.kt | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt new file mode 100644 index 0000000..98b6e7c --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt @@ -0,0 +1,9 @@ +package fr.iut.sciencequest.ViewModels.UiStates + +data class PenduUIState( + val isActionGood: Boolean, + val nbViesRestantes: Int, + val motATrouver: String, + val motATrou: String, + val lettreJoue: Char +) diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/ScientifiqueDecouvertsUIState.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/ScientifiqueDecouvertsUIState.kt index 4af7448..68eec9e 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/ScientifiqueDecouvertsUIState.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/ScientifiqueDecouvertsUIState.kt @@ -3,7 +3,7 @@ package fr.iut.sciencequest.ViewModels.UiStates import fr.iut.sciencequest.model.metier.Scientifique class ScientifiqueDecouvertsUIState { - lateinit var scientifiques: MutableList + var scientifiques: MutableList constructor() { scientifiques = ArrayList().toMutableList() From 1e6a25a5a37d225edd064c289a4f5dcf587c24f7 Mon Sep 17 00:00:00 2001 From: Renaud BEURET Date: Thu, 28 Mar 2024 08:34:15 +0100 Subject: [PATCH 2/4] [ADD] Logique partie pendu (a tester) --- .../iut/sciencequest/model/buisness/Pendu.kt | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 android/app/src/main/java/fr/iut/sciencequest/model/buisness/Pendu.kt diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Pendu.kt b/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Pendu.kt new file mode 100644 index 0000000..1a5eab2 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Pendu.kt @@ -0,0 +1,31 @@ +package fr.iut.sciencequest.model.buisness + +import fr.iut.sciencequest.ViewModels.UiStates.PenduUIState + +// mot : mot à trouver +// motAct : état actuel du mot trouvé par l'utilisateur +public fun PlayAction(uiState: PenduUIState): PenduUIState { + if (uiState.motATrou.contains(uiState.lettreJoue)) { + return PenduUIState(false,uiState.nbViesRestantes,uiState.motATrouver,uiState.motATrou,' ') + } + if (uiState.motATrouver.contains(uiState.lettreJoue)) { + var nvMotATrou = uiState.motATrou + for (index in uiState.motATrouver.indices) { + if (uiState.motATrouver[index] == uiState.lettreJoue) { + nvMotATrou = nvMotATrou.replaceRange(index,index, uiState.lettreJoue.toString()) + } + } + return PenduUIState(true, + uiState.nbViesRestantes, + uiState.motATrouver, + uiState.motATrou, + ' ') + } else { + return PenduUIState(true, + uiState.nbViesRestantes - 1, + uiState.motATrouver, + uiState.motATrou, + ' ') + } +} + From 042f9399afd5074a9e429af4cb6ae775c2915e56 Mon Sep 17 00:00:00 2001 From: Renaud BEURET Date: Thu, 28 Mar 2024 08:43:37 +0100 Subject: [PATCH 3/4] =?UTF-8?q?[FIX]=20D=C3=A9placer=20logique=20dans=20Vi?= =?UTF-8?q?ewModel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sciencequest/ViewModels/PenduVIewModel.kt | 39 +++++++++++++++++++ .../ViewModels/UiStates/PenduUIState.kt | 9 ++--- .../iut/sciencequest/model/buisness/Pendu.kt | 31 --------------- 3 files changed, 43 insertions(+), 36 deletions(-) create mode 100644 android/app/src/main/java/fr/iut/sciencequest/ViewModels/PenduVIewModel.kt delete mode 100644 android/app/src/main/java/fr/iut/sciencequest/model/buisness/Pendu.kt diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/PenduVIewModel.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/PenduVIewModel.kt new file mode 100644 index 0000000..52fc848 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/PenduVIewModel.kt @@ -0,0 +1,39 @@ +package fr.iut.sciencequest.ViewModels + +import fr.iut.sciencequest.ViewModels.UiStates.PenduUIState +import kotlinx.coroutines.flow.MutableStateFlow + +class PenduVIewModel { + var uiState = MutableStateFlow(PenduUIState()) + + // mot : mot à trouver + // motAct : état actuel du mot trouvé par l'utilisateur + public fun PlayAction(lettre: Char) { + if (uiState.value.motATrou.contains(lettre)) { + uiState.value = PenduUIState(false, + uiState.value.nbViesRestantes, + uiState.value.motATrouver, + uiState.value.motATrou + ) + } + if (uiState.value.motATrouver.contains(lettre)) { + var nvMotATrou = uiState.value.motATrou + for (index in uiState.value.motATrouver.indices) { + if (uiState.value.motATrouver[index] == lettre) { + nvMotATrou = nvMotATrou.replaceRange(index,index, lettre.toString()) + } + } + uiState.value = PenduUIState(true, + uiState.value.nbViesRestantes, + uiState.value.motATrouver, + uiState.value.motATrou + ) + } else { + uiState.value = PenduUIState(true, + uiState.value.nbViesRestantes - 1, + uiState.value.motATrouver, + uiState.value.motATrou + ) + } + } +} \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt index 98b6e7c..fc3326d 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt @@ -1,9 +1,8 @@ package fr.iut.sciencequest.ViewModels.UiStates data class PenduUIState( - val isActionGood: Boolean, - val nbViesRestantes: Int, - val motATrouver: String, - val motATrou: String, - val lettreJoue: Char + val isActionGood: Boolean = false, + val nbViesRestantes: Int = 10, + val motATrouver: String = "", + val motATrou: String = "" ) diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Pendu.kt b/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Pendu.kt deleted file mode 100644 index 1a5eab2..0000000 --- a/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Pendu.kt +++ /dev/null @@ -1,31 +0,0 @@ -package fr.iut.sciencequest.model.buisness - -import fr.iut.sciencequest.ViewModels.UiStates.PenduUIState - -// mot : mot à trouver -// motAct : état actuel du mot trouvé par l'utilisateur -public fun PlayAction(uiState: PenduUIState): PenduUIState { - if (uiState.motATrou.contains(uiState.lettreJoue)) { - return PenduUIState(false,uiState.nbViesRestantes,uiState.motATrouver,uiState.motATrou,' ') - } - if (uiState.motATrouver.contains(uiState.lettreJoue)) { - var nvMotATrou = uiState.motATrou - for (index in uiState.motATrouver.indices) { - if (uiState.motATrouver[index] == uiState.lettreJoue) { - nvMotATrou = nvMotATrou.replaceRange(index,index, uiState.lettreJoue.toString()) - } - } - return PenduUIState(true, - uiState.nbViesRestantes, - uiState.motATrouver, - uiState.motATrou, - ' ') - } else { - return PenduUIState(true, - uiState.nbViesRestantes - 1, - uiState.motATrouver, - uiState.motATrou, - ' ') - } -} - From d0faf2e97269d47570da0be8b12393913d78e41a Mon Sep 17 00:00:00 2001 From: Renaud BEURET Date: Thu, 28 Mar 2024 09:35:25 +0100 Subject: [PATCH 4/4] [ADD] Logique fonctionnelle --- .../java/fr/iut/sciencequest/MainActivity.kt | 3 +-- .../{PenduVIewModel.kt => PenduViewModel.kt} | 8 ++++++- .../ViewModels/UiStates/PenduUIState.kt | 4 ++-- .../fr/iut/sciencequest/navigation/NavHost.kt | 8 +++---- .../fr/iut/sciencequest/view/games/Pendu.kt | 23 ++++++++++++++++++- 5 files changed, 35 insertions(+), 11 deletions(-) rename android/app/src/main/java/fr/iut/sciencequest/ViewModels/{PenduVIewModel.kt => PenduViewModel.kt} (77%) diff --git a/android/app/src/main/java/fr/iut/sciencequest/MainActivity.kt b/android/app/src/main/java/fr/iut/sciencequest/MainActivity.kt index 5ed99f9..3ea7785 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/MainActivity.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/MainActivity.kt @@ -18,7 +18,6 @@ import fr.iut.sciencequest.ui.theme.ScienceQuestTheme class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val vm by viewModels() setContent { ScienceQuestTheme { // A surface container using the 'background' color from the theme @@ -26,7 +25,7 @@ class MainActivity : ComponentActivity() { modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { - NavHost(vm) + NavHost() } } } diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/PenduVIewModel.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/PenduViewModel.kt similarity index 77% rename from android/app/src/main/java/fr/iut/sciencequest/ViewModels/PenduVIewModel.kt rename to android/app/src/main/java/fr/iut/sciencequest/ViewModels/PenduViewModel.kt index 52fc848..94ebd4f 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/PenduVIewModel.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/PenduViewModel.kt @@ -1,15 +1,19 @@ package fr.iut.sciencequest.ViewModels +import android.util.Log +import androidx.lifecycle.ViewModel import fr.iut.sciencequest.ViewModels.UiStates.PenduUIState import kotlinx.coroutines.flow.MutableStateFlow -class PenduVIewModel { +class PenduViewModel : ViewModel() { var uiState = MutableStateFlow(PenduUIState()) // mot : mot à trouver // motAct : état actuel du mot trouvé par l'utilisateur public fun PlayAction(lettre: Char) { + Log.d("PenduViewModel","Un utilisateur joue une action") if (uiState.value.motATrou.contains(lettre)) { + Log.d("PenduViewModel","L'utilisateur a fait une action invalide") uiState.value = PenduUIState(false, uiState.value.nbViesRestantes, uiState.value.motATrouver, @@ -17,6 +21,7 @@ class PenduVIewModel { ) } if (uiState.value.motATrouver.contains(lettre)) { + Log.d("PenduViewModel","L'utilisateur a trouvé une lettre") var nvMotATrou = uiState.value.motATrou for (index in uiState.value.motATrouver.indices) { if (uiState.value.motATrouver[index] == lettre) { @@ -29,6 +34,7 @@ class PenduVIewModel { uiState.value.motATrou ) } else { + Log.d("PenduViewModel","L'utilisateur s'est trompé de lettre") uiState.value = PenduUIState(true, uiState.value.nbViesRestantes - 1, uiState.value.motATrouver, diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt index fc3326d..0717bed 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt @@ -3,6 +3,6 @@ package fr.iut.sciencequest.ViewModels.UiStates data class PenduUIState( val isActionGood: Boolean = false, val nbViesRestantes: Int = 10, - val motATrouver: String = "", - val motATrou: String = "" + val motATrouver: String = "Mot", + val motATrou: String = "___" ) diff --git a/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt b/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt index 65889c6..4d0176a 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt @@ -1,16 +1,14 @@ package fr.iut.sciencequest.navigation -import android.util.Log import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController +import fr.iut.sciencequest.ViewModels.PenduViewModel import fr.iut.sciencequest.ViewModels.ScientifiquesDecouvertsVM -import fr.iut.sciencequest.model.dto.extensions.ToModel import fr.iut.sciencequest.stub.StubQuestionWithReponses -import fr.iut.sciencequest.stub.getScientifiqueListeStub import fr.iut.sciencequest.view.AccountScreen import fr.iut.sciencequest.view.HomeScreen import fr.iut.sciencequest.view.LoginScreen @@ -20,12 +18,12 @@ import fr.iut.sciencequest.view.scientifiques.scientifiqueListeScreen @Composable -fun NavHost(scientifiquesDecouvertsVM: ScientifiquesDecouvertsVM) { +fun NavHost() { val navController = rememberNavController() NavHost( modifier = Modifier.fillMaxSize(), navController = navController, - startDestination = "listeScientifiques" + startDestination = "pendu" ) { composable(route = "home") { HomeScreen( diff --git a/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt b/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt index 98abfc5..1a86694 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt @@ -2,18 +2,39 @@ package fr.iut.sciencequest.view.games import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.material3.TextField import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel import fr.iut.sciencequest.R +import fr.iut.sciencequest.ViewModels.PenduViewModel import fr.iut.sciencequest.view.TopBar @Composable -fun PenduScreen(goToAccount: () -> Unit, goToHome: () -> Unit) { +fun PenduScreen(viewModel: PenduViewModel = viewModel(), + goToAccount: () -> Unit, + goToHome: () -> Unit) { + val state = viewModel.uiState.collectAsState() Column(modifier = Modifier.fillMaxWidth()) { TopBar(goToAccount, goToHome, stringResource(id = R.string.pendu)) //Text(text = stringResource(id = R.string.pendu), modifier = Modifier.padding(top=10.dp)) + Column(modifier = Modifier.align(Alignment.CenterHorizontally)) + { + Text(text = state.value.motATrou) + TextField(value = "", + onValueChange = { + if (it.isNotEmpty()) { + viewModel.PlayAction(it[0]) + }}, + modifier = Modifier.padding(20.dp)) + } } }