mirror of
https://github.com/LucasVbr/Queezer.git
synced 2026-05-13 17:11:55 +00:00
feat: Add score screen
This commit is contained in:
@@ -1,17 +1,16 @@
|
|||||||
package fr.univpau.queezer
|
package fr.univpau.queezer
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.navigation.compose.NavHost
|
import androidx.navigation.compose.NavHost
|
||||||
import androidx.navigation.compose.composable
|
import androidx.navigation.compose.composable
|
||||||
import androidx.navigation.compose.rememberNavController
|
import androidx.navigation.compose.rememberNavController
|
||||||
import fr.univpau.queezer.screen.GameScreen
|
import fr.univpau.queezer.view.screens.GameScreen
|
||||||
import fr.univpau.queezer.screen.HomeScreen
|
import fr.univpau.queezer.view.screens.HomeScreen
|
||||||
import fr.univpau.queezer.screen.ScoreScreen
|
import fr.univpau.queezer.view.screens.ScoreScreen
|
||||||
import fr.univpau.queezer.screen.SettingsScreen
|
import fr.univpau.queezer.view.screens.SettingsScreen
|
||||||
import fr.univpau.queezer.service.DatabaseService
|
import fr.univpau.queezer.service.DatabaseService
|
||||||
import fr.univpau.queezer.viewmodel.GameViewModel
|
import fr.univpau.queezer.viewmodel.GameViewModel
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class GameManager() {
|
|||||||
constructor(settings: Settings, playlist: Playlist, onTick: () -> Unit, databaseService: DatabaseService) : this() {
|
constructor(settings: Settings, playlist: Playlist, onTick: () -> Unit, databaseService: DatabaseService) : this() {
|
||||||
this.databaseService = databaseService
|
this.databaseService = databaseService
|
||||||
this.settings = settings
|
this.settings = settings
|
||||||
this.playlist = playlist
|
this.playlist = Playlist(playlist.title, playlist.tracks.subList(0, settings.numberOfTitles!!))
|
||||||
|
|
||||||
this.countDownManager = CountdownManager(30000L, onTickTimer = onTick, onFinishTimer = { nextTrack() })
|
this.countDownManager = CountdownManager(30000L, onTickTimer = onTick, onFinishTimer = { nextTrack() })
|
||||||
|
|
||||||
@@ -109,12 +109,7 @@ class GameManager() {
|
|||||||
fun nextTrack() {
|
fun nextTrack() {
|
||||||
mediaPlayer.release()
|
mediaPlayer.release()
|
||||||
|
|
||||||
|
if (currentTrackIndex + 1 >= playlist.tracks.size) {
|
||||||
if (currentTrackIndex >= playlist.tracks.size - 1) {
|
|
||||||
return; // TODO vérifier avant meme de lancer la partie si le nombre de titres est suffisant
|
|
||||||
}
|
|
||||||
|
|
||||||
if (currentTrackIndex >= settings.numberOfTitles!! - 1) {
|
|
||||||
gameFinished = true
|
gameFinished = true
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,5 @@ fun loadSettings(context: Context): Settings {
|
|||||||
// Si le JSON n'est pas null, le convertir en objet Settings
|
// Si le JSON n'est pas null, le convertir en objet Settings
|
||||||
return if (json != null) {
|
return if (json != null) {
|
||||||
Gson().fromJson(json, Settings::class.java)
|
Gson().fromJson(json, Settings::class.java)
|
||||||
} else {
|
} else Settings()
|
||||||
Settings()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,164 +0,0 @@
|
|||||||
package fr.univpau.queezer.screen
|
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
|
||||||
import androidx.compose.foundation.layout.Box
|
|
||||||
import androidx.compose.foundation.layout.Column
|
|
||||||
import androidx.compose.foundation.layout.Row
|
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
|
||||||
import androidx.compose.foundation.layout.padding
|
|
||||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
||||||
import androidx.compose.material3.Button
|
|
||||||
import androidx.compose.material3.Text
|
|
||||||
import androidx.compose.runtime.Composable
|
|
||||||
import androidx.compose.runtime.livedata.observeAsState
|
|
||||||
import androidx.compose.ui.Alignment
|
|
||||||
import androidx.compose.ui.Modifier
|
|
||||||
import androidx.compose.ui.platform.LocalContext
|
|
||||||
import androidx.compose.ui.unit.dp
|
|
||||||
import androidx.compose.ui.unit.sp
|
|
||||||
import androidx.navigation.NavHostController
|
|
||||||
import fr.univpau.queezer.R
|
|
||||||
import fr.univpau.queezer.data.Game
|
|
||||||
import fr.univpau.queezer.viewmodel.GameViewModel
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun ScoreScreen(navController: NavHostController, gameViewModel: GameViewModel) {
|
|
||||||
val context = LocalContext.current
|
|
||||||
val gameList : List<Game>? = gameViewModel.games.observeAsState().value
|
|
||||||
|
|
||||||
Column(
|
|
||||||
modifier = Modifier
|
|
||||||
.fillMaxSize()
|
|
||||||
.padding(16.dp),
|
|
||||||
horizontalAlignment = Alignment.CenterHorizontally,
|
|
||||||
verticalArrangement = Arrangement.spacedBy(16.dp)
|
|
||||||
) {
|
|
||||||
// Titre des paramètres
|
|
||||||
Text(
|
|
||||||
text = context.resources.getString(R.string.score),
|
|
||||||
fontSize = 32.sp,
|
|
||||||
modifier = Modifier.padding(bottom = 32.dp)
|
|
||||||
)
|
|
||||||
|
|
||||||
// Nombre de parties jouées
|
|
||||||
Row(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
horizontalArrangement = Arrangement.SpaceBetween
|
|
||||||
) {
|
|
||||||
Text(
|
|
||||||
text = context.resources.getString(R.string.games_played),
|
|
||||||
fontSize = 24.sp,
|
|
||||||
)
|
|
||||||
if (gameList?.isNotEmpty() == true) {
|
|
||||||
Text(
|
|
||||||
text = gameList.size.toString(),
|
|
||||||
fontSize = 24.sp,
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
Text(
|
|
||||||
text = "0",
|
|
||||||
fontSize = 24.sp,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// pourcentage de réussite moyen
|
|
||||||
Row(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
horizontalArrangement = Arrangement.SpaceBetween
|
|
||||||
) {
|
|
||||||
Text(
|
|
||||||
text = context.resources.getString(R.string.average_success_rate),
|
|
||||||
fontSize = 24.sp,
|
|
||||||
)
|
|
||||||
if (gameList?.isNotEmpty() == true) {
|
|
||||||
Text(
|
|
||||||
text = (gameList.sumOf { it.score }.div(gameList.size).toString()) + "%",
|
|
||||||
fontSize = 24.sp,
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
Text(
|
|
||||||
text = "0%",
|
|
||||||
fontSize = 24.sp,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// filtres
|
|
||||||
// - date
|
|
||||||
// - mode de jeu –titre/artiste/les deux
|
|
||||||
// - nombre de titres
|
|
||||||
Row(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
horizontalArrangement = Arrangement.SpaceBetween
|
|
||||||
) {
|
|
||||||
Text(
|
|
||||||
text = context.resources.getString(R.string.filters),
|
|
||||||
fontSize = 24.sp,
|
|
||||||
)
|
|
||||||
|
|
||||||
Row(
|
|
||||||
horizontalArrangement = Arrangement.SpaceBetween
|
|
||||||
){
|
|
||||||
Button(
|
|
||||||
onClick = { /* TODO: Filtre par date */ },
|
|
||||||
shape = RoundedCornerShape(8.dp),
|
|
||||||
modifier = Modifier
|
|
||||||
.padding(vertical = 8.dp)
|
|
||||||
) {
|
|
||||||
Text(context.resources.getString(R.string.date))
|
|
||||||
}
|
|
||||||
|
|
||||||
Button(
|
|
||||||
onClick = { /* TODO: Filtre par date */ },
|
|
||||||
shape = RoundedCornerShape(8.dp),
|
|
||||||
modifier = Modifier
|
|
||||||
.padding(vertical = 8.dp)
|
|
||||||
) {
|
|
||||||
Text("Mode de jeu")
|
|
||||||
}
|
|
||||||
|
|
||||||
Button(
|
|
||||||
onClick = { /* TODO: Filtre par date */ },
|
|
||||||
shape = RoundedCornerShape(8.dp),
|
|
||||||
modifier = Modifier
|
|
||||||
.padding(vertical = 8.dp)
|
|
||||||
) {
|
|
||||||
Text("Nombre de titres")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Historique des parties (score, nom)
|
|
||||||
// - cliquer sur une partie pour voir les détails
|
|
||||||
|
|
||||||
gameList?.forEach {
|
|
||||||
Row(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
horizontalArrangement = Arrangement.SpaceBetween
|
|
||||||
) {
|
|
||||||
Text(
|
|
||||||
text = it.playlist.title,
|
|
||||||
fontSize = 24.sp,
|
|
||||||
)
|
|
||||||
Text(
|
|
||||||
text = it.score.toString(),
|
|
||||||
fontSize = 24.sp,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Button(
|
|
||||||
onClick = { navController.navigate("home") },
|
|
||||||
shape = RoundedCornerShape(8.dp),
|
|
||||||
modifier = Modifier
|
|
||||||
.fillMaxWidth()
|
|
||||||
.padding(vertical = 8.dp)
|
|
||||||
) {
|
|
||||||
Text(context.resources.getString(R.string.back))
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
package fr.univpau.queezer.view.components
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.Row
|
||||||
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.material3.Card
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.material3.ModalBottomSheet
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.unit.sp
|
||||||
|
import fr.univpau.queezer.data.Game
|
||||||
|
import fr.univpau.queezer.data.GameMode
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
|
@Composable
|
||||||
|
fun GameCardItem(game: Game) {
|
||||||
|
val formatter = SimpleDateFormat("dd MMMM yyyy", Locale.getDefault())
|
||||||
|
val showBottomSheet = remember { mutableStateOf(false) }
|
||||||
|
val coroutineScope = rememberCoroutineScope()
|
||||||
|
|
||||||
|
val maxScore: Int = if (game.settings.gameMode == GameMode.ALL) {
|
||||||
|
(game.settings.numberOfTitles ?: 1) * 2
|
||||||
|
} else {
|
||||||
|
(game.settings.numberOfTitles ?: 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
Card(
|
||||||
|
onClick = { showBottomSheet.value = true },
|
||||||
|
modifier = Modifier.fillMaxWidth()
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.padding(16.dp)
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = game.playlist.title,
|
||||||
|
fontSize = 14.sp,
|
||||||
|
fontWeight = FontWeight.SemiBold
|
||||||
|
)
|
||||||
|
Text(text = formatter.format(game.date))
|
||||||
|
|
||||||
|
Text(text = "${game.score}/$maxScore")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modal BottomSheet
|
||||||
|
if (showBottomSheet.value) {
|
||||||
|
ModalBottomSheet(
|
||||||
|
onDismissRequest = {
|
||||||
|
showBottomSheet.value = false // Fermer la BottomSheet au clic en dehors
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
// Contenu de la BottomSheet
|
||||||
|
Column(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(16.dp),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(8.dp)
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
horizontalArrangement = Arrangement.SpaceBetween
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = game.playlist.title,
|
||||||
|
style = MaterialTheme.typography.titleMedium
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
text = "${game.score}/$maxScore",
|
||||||
|
style = MaterialTheme.typography.titleMedium
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Text(
|
||||||
|
text = formatter.format(game.date),
|
||||||
|
)
|
||||||
|
|
||||||
|
TrackCardItemList(game.playlist.tracks)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package fr.univpau.queezer.view.components
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.foundation.rememberScrollState
|
||||||
|
import androidx.compose.foundation.verticalScroll
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import fr.univpau.queezer.data.Game
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun GameCardItemList(games: List<Game>) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(horizontal = 16.dp)
|
||||||
|
.verticalScroll(rememberScrollState()),
|
||||||
|
|
||||||
|
verticalArrangement = Arrangement.spacedBy(16.dp),
|
||||||
|
) {
|
||||||
|
for (game in games) GameCardItem(game)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
package fr.univpau.queezer.view.components
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.material3.Card
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.unit.sp
|
||||||
|
import fr.univpau.queezer.data.Answer
|
||||||
|
import fr.univpau.queezer.data.Track
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun TrackCardItem(track: Track) {
|
||||||
|
val titleColor = when (track.title.answer) {
|
||||||
|
Answer.CORRECT -> {
|
||||||
|
MaterialTheme.colorScheme.primary
|
||||||
|
}
|
||||||
|
Answer.INCORRECT -> {
|
||||||
|
MaterialTheme.colorScheme.error
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
MaterialTheme.colorScheme.onSurface
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val artistColor = when (track.artist.answer) {
|
||||||
|
Answer.CORRECT -> {
|
||||||
|
MaterialTheme.colorScheme.primary
|
||||||
|
}
|
||||||
|
Answer.INCORRECT -> {
|
||||||
|
MaterialTheme.colorScheme.error
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
MaterialTheme.colorScheme.onSurface
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Card(
|
||||||
|
modifier = Modifier.fillMaxWidth()
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.padding(16.dp)
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = track.title.value,
|
||||||
|
fontSize = 14.sp,
|
||||||
|
fontWeight = FontWeight.SemiBold,
|
||||||
|
color = titleColor
|
||||||
|
)
|
||||||
|
|
||||||
|
Text(text = track.artist.value, color = artistColor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package fr.univpau.queezer.view.components
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import fr.univpau.queezer.data.Game
|
||||||
|
import fr.univpau.queezer.data.Track
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun TrackCardItemList(tracks: List<Track>) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(16.dp)
|
||||||
|
) {
|
||||||
|
for (track in tracks) TrackCardItem(track)
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-2
@@ -1,4 +1,4 @@
|
|||||||
package fr.univpau.queezer.screen
|
package fr.univpau.queezer.view.screens
|
||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
@@ -49,7 +49,7 @@ fun GameScreen(navController: NavHostController, database: DatabaseService) {
|
|||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val settings: Settings = loadSettings(context)
|
val settings: Settings = loadSettings(context)
|
||||||
|
|
||||||
var gameManager by remember { mutableStateOf(GameManager(settings, Playlist(), {}, database)) }
|
var gameManager by remember { mutableStateOf(GameManager()) }
|
||||||
var countdown by remember { mutableIntStateOf(30) }
|
var countdown by remember { mutableIntStateOf(30) }
|
||||||
|
|
||||||
LaunchedEffect(settings.playlistUrl) {
|
LaunchedEffect(settings.playlistUrl) {
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package fr.univpau.queezer.screen
|
package fr.univpau.queezer.view.screens
|
||||||
|
|
||||||
import androidx.compose.foundation.Image
|
import androidx.compose.foundation.Image
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
@@ -0,0 +1,236 @@
|
|||||||
|
package fr.univpau.queezer.view.screens
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.Row
|
||||||
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.automirrored.filled.ArrowBack
|
||||||
|
import androidx.compose.material3.CenterAlignedTopAppBar
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
|
import androidx.compose.material3.HorizontalDivider
|
||||||
|
import androidx.compose.material3.Icon
|
||||||
|
import androidx.compose.material3.IconButton
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.material3.Scaffold
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.material3.TopAppBarDefaults
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.livedata.observeAsState
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import androidx.compose.ui.text.style.TextOverflow
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.unit.sp
|
||||||
|
import androidx.navigation.NavHostController
|
||||||
|
import fr.univpau.queezer.R
|
||||||
|
import fr.univpau.queezer.data.Game
|
||||||
|
import fr.univpau.queezer.view.components.GameCardItemList
|
||||||
|
import fr.univpau.queezer.viewmodel.GameViewModel
|
||||||
|
import kotlin.math.max
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
|
@Composable
|
||||||
|
fun ScoreScreen(navController: NavHostController, gameViewModel: GameViewModel) {
|
||||||
|
val context = LocalContext.current
|
||||||
|
val games: List<Game> = gameViewModel.games.observeAsState().value ?: emptyList()
|
||||||
|
|
||||||
|
val nbGames = games.size;
|
||||||
|
val averageSuccessRate = games.sumOf { it.score }.div(max(games.size, 1))
|
||||||
|
|
||||||
|
Scaffold(
|
||||||
|
topBar = {
|
||||||
|
CenterAlignedTopAppBar(
|
||||||
|
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
|
||||||
|
containerColor = MaterialTheme.colorScheme.primaryContainer,
|
||||||
|
titleContentColor = MaterialTheme.colorScheme.primary,
|
||||||
|
),
|
||||||
|
title = {
|
||||||
|
Text(
|
||||||
|
text = context.resources.getString(R.string.score),
|
||||||
|
maxLines = 1,
|
||||||
|
overflow = TextOverflow.Ellipsis
|
||||||
|
)
|
||||||
|
},
|
||||||
|
navigationIcon = {
|
||||||
|
IconButton(onClick = { navController.popBackStack() }) {
|
||||||
|
Icon(
|
||||||
|
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
|
||||||
|
contentDescription = context.resources.getString(R.string.back)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
},
|
||||||
|
) { innerPadding ->
|
||||||
|
Column(
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(innerPadding),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(16.dp),
|
||||||
|
) {
|
||||||
|
|
||||||
|
Row(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(vertical = 12.dp),
|
||||||
|
horizontalArrangement = Arrangement.SpaceAround,
|
||||||
|
) {
|
||||||
|
Column(horizontalAlignment = Alignment.CenterHorizontally) {
|
||||||
|
Text(text = "$nbGames", fontSize = 24.sp, fontWeight = androidx.compose.ui.text.font.FontWeight.Bold)
|
||||||
|
Text(text = "Parties jouées", fontSize = 14.sp)
|
||||||
|
}
|
||||||
|
Column(horizontalAlignment = Alignment.CenterHorizontally) {
|
||||||
|
Text(text = "$averageSuccessRate%", fontSize = 24.sp, fontWeight = androidx.compose.ui.text.font.FontWeight.Bold)
|
||||||
|
Text(text = "De réussite", fontSize = 14.sp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HorizontalDivider()
|
||||||
|
|
||||||
|
// Todo add filters
|
||||||
|
|
||||||
|
GameCardItemList(games)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Column(
|
||||||
|
// modifier = Modifier
|
||||||
|
// .fillMaxSize()
|
||||||
|
// .padding(16.dp),
|
||||||
|
// horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
|
// verticalArrangement = Arrangement.spacedBy(16.dp)
|
||||||
|
// ) {
|
||||||
|
// // Titre des paramètres
|
||||||
|
// Text(
|
||||||
|
// text = context.resources.getString(R.string.score),
|
||||||
|
// fontSize = 32.sp,
|
||||||
|
// modifier = Modifier.padding(bottom = 32.dp)
|
||||||
|
// )
|
||||||
|
//
|
||||||
|
// // Nombre de parties jouées
|
||||||
|
// Row(
|
||||||
|
// modifier = Modifier.fillMaxWidth(),
|
||||||
|
// horizontalArrangement = Arrangement.SpaceBetween
|
||||||
|
// ) {
|
||||||
|
// Text(
|
||||||
|
// text = context.resources.getString(R.string.games_played),
|
||||||
|
// fontSize = 24.sp,
|
||||||
|
// )
|
||||||
|
// if (gameList?.isNotEmpty() == true) {
|
||||||
|
// Text(
|
||||||
|
// text = gameList.size.toString(),
|
||||||
|
// fontSize = 24.sp,
|
||||||
|
// )
|
||||||
|
// } else {
|
||||||
|
// Text(
|
||||||
|
// text = "0",
|
||||||
|
// fontSize = 24.sp,
|
||||||
|
// )
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // pourcentage de réussite moyen
|
||||||
|
// Row(
|
||||||
|
// modifier = Modifier.fillMaxWidth(),
|
||||||
|
// horizontalArrangement = Arrangement.SpaceBetween
|
||||||
|
// ) {
|
||||||
|
// Text(
|
||||||
|
// text = context.resources.getString(R.string.average_success_rate),
|
||||||
|
// fontSize = 24.sp,
|
||||||
|
// )
|
||||||
|
// if (gameList?.isNotEmpty() == true) {
|
||||||
|
// Text(
|
||||||
|
// text = (gameList.sumOf { it.score }.div(gameList.size).toString()) + "%",
|
||||||
|
// fontSize = 24.sp,
|
||||||
|
// )
|
||||||
|
// } else {
|
||||||
|
// Text(
|
||||||
|
// text = "0%",
|
||||||
|
// fontSize = 24.sp,
|
||||||
|
// )
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// filtres
|
||||||
|
// - date
|
||||||
|
// - mode de jeu –titre/artiste/les deux
|
||||||
|
// - nombre de titres
|
||||||
|
// Row(
|
||||||
|
// modifier = Modifier.fillMaxWidth(),
|
||||||
|
// horizontalArrangement = Arrangement.SpaceBetween
|
||||||
|
// ) {
|
||||||
|
// Text(
|
||||||
|
// text = context.resources.getString(R.string.filters),
|
||||||
|
// fontSize = 24.sp,
|
||||||
|
// )
|
||||||
|
//
|
||||||
|
// Row(
|
||||||
|
// horizontalArrangement = Arrangement.SpaceBetween
|
||||||
|
// ){
|
||||||
|
// Button(
|
||||||
|
// onClick = { /* TODO: Filtre par date */ },
|
||||||
|
// shape = RoundedCornerShape(8.dp),
|
||||||
|
// modifier = Modifier
|
||||||
|
// .padding(vertical = 8.dp)
|
||||||
|
// ) {
|
||||||
|
// Text(context.resources.getString(R.string.date))
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Button(
|
||||||
|
// onClick = { /* TODO: Filtre par date */ },
|
||||||
|
// shape = RoundedCornerShape(8.dp),
|
||||||
|
// modifier = Modifier
|
||||||
|
// .padding(vertical = 8.dp)
|
||||||
|
// ) {
|
||||||
|
// Text("Mode de jeu")
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Button(
|
||||||
|
// onClick = { /* TODO: Filtre par date */ },
|
||||||
|
// shape = RoundedCornerShape(8.dp),
|
||||||
|
// modifier = Modifier
|
||||||
|
// .padding(vertical = 8.dp)
|
||||||
|
// ) {
|
||||||
|
// Text("Nombre de titres")
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Historique des parties (score, nom)
|
||||||
|
// - cliquer sur une partie pour voir les détails
|
||||||
|
|
||||||
|
// gameList?.forEach {
|
||||||
|
// Row(
|
||||||
|
// modifier = Modifier.fillMaxWidth(),
|
||||||
|
// horizontalArrangement = Arrangement.SpaceBetween
|
||||||
|
// ) {
|
||||||
|
// Text(
|
||||||
|
// text = it.playlist.title,
|
||||||
|
// fontSize = 24.sp,
|
||||||
|
// )
|
||||||
|
// Text(
|
||||||
|
// text = it.score.toString(),
|
||||||
|
// fontSize = 24.sp,
|
||||||
|
// )
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (gameList !== null) {
|
||||||
|
// GameList(gameList)
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Button(
|
||||||
|
// onClick = { navController.navigate("home") },
|
||||||
|
// shape = RoundedCornerShape(8.dp),
|
||||||
|
// modifier = Modifier
|
||||||
|
// .fillMaxWidth()
|
||||||
|
// .padding(vertical = 8.dp)
|
||||||
|
// ) {
|
||||||
|
// Text(context.resources.getString(R.string.back))
|
||||||
|
// }
|
||||||
|
|
||||||
|
//}
|
||||||
|
}
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package fr.univpau.queezer.screen
|
package fr.univpau.queezer.view.screens
|
||||||
|
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
Reference in New Issue
Block a user