correction de la navbar + remise en forme du AppNavigator

pull/39/head
brongniart 2 months ago
parent dc4b501aea
commit 0a06a5ab1c

@ -1,6 +1,7 @@
plugins { plugins {
alias(libs.plugins.android.application) alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlinx.serialization)
} }
android { android {

@ -0,0 +1,64 @@
package com.example.what_the_fantasy.ui.components
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
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.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.AccountCircle
import androidx.compose.material.icons.rounded.ArrowBack
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.IconButtonColors
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import com.example.what_the_fantasy.R
import com.example.what_the_fantasy.ui.theme.colorButtonNav
import com.example.what_the_fantasy.ui.theme.colorNavBar
@Composable
fun BackBar(navBack : () ->Unit ,
content : @Composable ()-> Unit ){
Column(
modifier = Modifier
.fillMaxSize()
) {
Row(
modifier = Modifier
.fillMaxWidth()
.height(70.dp)
.background(colorNavBar),
Arrangement.SpaceBetween,
verticalAlignment = Alignment.Bottom
) {
IconButton(onClick = {navBack()},
modifier = Modifier
.size(60.dp)
) {
Icon(Icons.Rounded.ArrowBack,
contentDescription = "Back",
modifier = Modifier
.size(60.dp)
)
}
}
Box(modifier = Modifier.background(Color.Black).fillMaxHeight()) {
content()
}
}
}

@ -44,7 +44,6 @@ fun NavBar(onProfile : Boolean = false ,
navControllerAccueil: (Int) -> Unit, navControllerAccueil: (Int) -> Unit,
navControllerQuiz: (Int) -> Unit, navControllerQuiz: (Int) -> Unit,
content : @Composable ()-> Unit ) { content : @Composable ()-> Unit ) {
Column( Column(
@ -89,25 +88,11 @@ fun NavBar(onProfile : Boolean = false ,
ButtonIconPainterInt(painterResource(R.mipmap.ic_launcher_foreground),"Accueil",navControllerAccueil,index,onAccueil) ButtonIconPainterInt(painterResource(R.mipmap.ic_launcher_foreground),"Accueil",navControllerAccueil,index,onAccueil)
ButtonIconVectorInt(Icons.Rounded.Create,"Quiz",navControllerQuiz,index,onQuiz) ButtonIconVectorInt(Icons.Rounded.Create,"Quiz",navControllerQuiz,index,onQuiz)
} }
} }
} }
@Composable
fun ButtonIconVector(img : ImageVector, name : String, nav : ()->Unit ,onPage : Boolean){
IconButton(onClick = {nav()},
enabled = !onPage,
colors = IconButtonColors(Color.Transparent,Color.White,//couleur quand il n'est pas selectionné
Color.Transparent, colorButtonNav),//couleur quand il est selectionné
modifier = Modifier
.size(60.dp)
) {
Icon(img,
contentDescription = name,
modifier = Modifier
.size(60.dp)
)
}
}
@Composable @Composable
fun ButtonIconVectorInt(img : ImageVector, name : String, nav : (Int)->Unit ,index: Int,onPage : Boolean){ fun ButtonIconVectorInt(img : ImageVector, name : String, nav : (Int)->Unit ,index: Int,onPage : Boolean){
IconButton(onClick = {nav(index)}, IconButton(onClick = {nav(index)},
@ -126,22 +111,6 @@ fun ButtonIconVectorInt(img : ImageVector, name : String, nav : (Int)->Unit ,ind
} }
@Composable
fun ButtonIconPainter(img : Painter, name : String, nav : ()->Unit,onPage : Boolean){
IconButton(onClick = {nav()},
enabled = !onPage,
colors = IconButtonColors(Color.Transparent,Color.White,//couleur quand il n'est pas selectionné
Color.Transparent, colorButtonNav),//couleur quand il est selectionné
modifier = Modifier
.size(60.dp)
) {
Icon(img,
contentDescription = name,
modifier = Modifier
.size(60.dp)
)
}
}
@Composable @Composable
fun ButtonIconPainterInt(img : Painter, name : String, nav : (Int)->Unit,index: Int,onPage : Boolean){ fun ButtonIconPainterInt(img : Painter, name : String, nav : (Int)->Unit,index: Int,onPage : Boolean){
IconButton(onClick = {nav(index)}, IconButton(onClick = {nav(index)},

@ -4,6 +4,7 @@ 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 androidx.navigation.toRoute
import com.example.what_the_fantasy.data.services.ServicesStub import com.example.what_the_fantasy.data.services.ServicesStub
import com.example.what_the_fantasy.ui.screens.AccueilPage import com.example.what_the_fantasy.ui.screens.AccueilPage
import com.example.what_the_fantasy.ui.screens.FavoritePage import com.example.what_the_fantasy.ui.screens.FavoritePage
@ -16,155 +17,128 @@ import com.example.what_the_fantasy.ui.screens.QuotePage
import com.example.what_the_fantasy.ui.screens.SearchPage import com.example.what_the_fantasy.ui.screens.SearchPage
import com.example.what_the_fantasy.ui.screens.SignUpPage import com.example.what_the_fantasy.ui.screens.SignUpPage
import com.example.what_the_fantasy.ui.screens.SubmitQuotePage import com.example.what_the_fantasy.ui.screens.SubmitQuotePage
import kotlinx.serialization.Serializable
@Serializable
data class Accueil(val userIndex: Int)
@Serializable
data object Login
@Serializable
data class Favorite(val userIndex: Int)
@Serializable
data class Profil(val userIndex: Int)
@Serializable
data class QuizMenu(val userIndex: Int)
@Serializable
data class Quiz(val userIndex : Int, val idQuiz : Int)
@Serializable
data class QuizEnd(val userIndex : Int, val idQuiz : Int,val pts : Int)
@Serializable
data object Quote
@Serializable
data object Search
@Serializable
data object SignUp
@Serializable
data object SubmitQuote
sealed class Destination(val route: String) {
data object Login : Destination("Login")
data object Accueil : Destination("Accueil/{userIndex}") { // Ajout du paramètre userIndex
fun createRoute(userIndex: Int) = "Accueil/$userIndex" // Fonction pour créer la route avec l'index
}
data object Favorite : Destination("Favorite/{userIndex}") { // Ajout du paramètre userIndex
fun createRoute(userIndex: Int) = "Favorite/$userIndex" // Fonction pour créer la route avec l'index
}
data object Profil : Destination("Profil/{userIndex}") { // Ajout du paramètre userIndex
fun createRoute(userIndex: Int) = "Profil/$userIndex" // Fonction pour créer la route avec l'index
}
data object QuizMenu : Destination("QuizMenu/{userIndex}") { // Ajout du paramètre userIndex
fun createRoute(userIndex: Int) = "QuizMenu/$userIndex" // Fonction pour créer la route avec l'index
}
data object Quiz : Destination("Quiz/{idQuiz}") {
// Ajout paramètre idQuiz
fun createId(idQuiz : Int) = "Quiz/$idQuiz"
}
data object QuizEnd : Destination("QuizEnd/{idQuiz}/{pts}") {
// Ajout paramètres idQuiz et pts
fun createIdAndPts(idQuiz : Int, pts : Int) = "QuizEnd/$idQuiz/$pts"
}
data object Quote : Destination("Quote")
data object Search : Destination("Search")
data object SignUp : Destination("SignUp")
data object SubmitQuote : Destination("SubmitQuote")
}
@Composable @Composable
fun AppNavigator() { fun AppNavigator() {
val navController = rememberNavController() val navController = rememberNavController()
val services = ServicesStub() val services = ServicesStub()
NavHost(navController, startDestination = Destination.Login.route) { NavHost(navController, startDestination = Login) {
composable(Destination.Login.route) { composable<Login> {
LoginPage( LoginPage(
navControllerSignUp = { navControllerSignUp = { navController.navigate(SignUp) },
navController.navigate(Destination.SignUp.route)
},
navControllerProfil = { userIndex -> navControllerProfil = { userIndex ->
navController.navigate(Destination.Profil.createRoute(userIndex)) { navController.navigate(Profil(userIndex)) {
// Vider pile de navigation pour empêcher le retour à la page Login // Vider pile de navigation pour empêcher le retour à la page Login
popUpTo(Destination.Login.route) { inclusive = true } popUpTo(Login) { inclusive = true }
} }
}, },
services services = services
) )
} }
composable(Destination.Accueil.route) { composable<Accueil> {
val userIndex = it.arguments?.getString("userIndex")?.toInt() ?: -1 val accueil: Accueil = it.toRoute()
AccueilPage( AccueilPage(
index = userIndex, index = accueil.userIndex,
navFavorite = { userIndex -> navFavorite = { navController.navigate(Favorite(accueil.userIndex)) },
navController.navigate(Destination.Favorite.createRoute(userIndex)) // Passe l'index à Profil navQuiz = { navController.navigate(QuizMenu(accueil.userIndex)) },
}, navProfil = { navController.navigate(Profil(accueil.userIndex)) }
navQuiz = { userIndex ->
navController.navigate(Destination.QuizMenu.createRoute(userIndex)) // Passe l'index à Profil
},
navProfil = { userIndex ->
navController.navigate(Destination.Profil.createRoute(userIndex)) // Passe l'index à Profil
}
) } ) }
composable(Destination.Favorite.route) { composable<Favorite> {
val userIndex = it.arguments?.getString("userIndex")?.toInt() ?: -1 val favorite: Favorite = it.toRoute()
FavoritePage( FavoritePage(
index = userIndex, index = favorite.userIndex,
navAccueil ={ userIndex -> navAccueil ={ navController.navigate( Accueil(favorite.userIndex) ) },
navController.navigate(Destination.Accueil.createRoute(userIndex)) // Passe l'index à Profil navQuiz = { navController.navigate(QuizMenu(favorite.userIndex)) },
}, navProfil = { navController.navigate(Profil(favorite.userIndex)) }
navQuiz = { userIndex ->
navController.navigate(Destination.QuizMenu.createRoute(userIndex)) // Passe l'index à Profil
},
navProfil = { userIndex ->
navController.navigate(Destination.Profil.createRoute(userIndex)) // Passe l'index à Profil
}
) } ) }
composable(Destination.Profil.route) { composable<Profil>{
// Récupère l'index passé dans la route val profil:Profil = it.toRoute()
val userIndex = it.arguments?.getString("userIndex")?.toInt() ?: -1
ProfilPage( ProfilPage(
index = userIndex, index = profil.userIndex,
navFavorite = { userIndex -> navFavorite = { navController.navigate(Favorite(profil.userIndex)) },
navController.navigate(Destination.Favorite.createRoute(userIndex)) // Passe l'index à Profil navAccueil ={ navController.navigate( Accueil(profil.userIndex) ) },
}, navQuiz = { navController.navigate( QuizMenu(profil.userIndex)) },
navAccueil ={ userIndex ->
navController.navigate(Destination.Accueil.createRoute(userIndex)) // Passe l'index à Profil
},
navQuiz = { userIndex ->
navController.navigate(Destination.QuizMenu.createRoute(userIndex)) // Passe l'index à Profil
},
navUnLog = { navUnLog = {
navController.navigate(Destination.Login.route) { navController.navigate(Login) {
// Vider pile de navigation pour empêcher le retour à la page profil // Vider pile de navigation pour empêcher le retour à la page profil
popUpTo(Destination.Profil.route) { inclusive = true } popUpTo(profil) { inclusive = true }
} }
}, },
services = services services = services
) )
} }
composable(Destination.Quote.route) { QuotePage() } composable<Quote> { QuotePage() }
composable(Destination.Search.route) { SearchPage() } composable<Search> { SearchPage() }
composable(Destination.SignUp.route) { SignUpPage( composable<SignUp> { SignUpPage(
navControllerLogin = { navControllerLogin = {
navController.navigate(Destination.Login.route){ navController.navigate(Login){
// Vider pile de navigation pour empêcher le retour à la page Sign up // Vider pile de navigation pour empêcher le retour à la page Sign up
popUpTo(Destination.Login.route) { inclusive = true } popUpTo(Login) { inclusive = true }
} }
},services) } },services) }
composable(Destination.SubmitQuote.route) { SubmitQuotePage() } composable<SubmitQuote> { SubmitQuotePage() }
composable(Destination.QuizMenu.route) { composable<QuizMenu> {
//val userIndex = it.arguments?.getString("userIndex")?.toInt() ?: -1 val quizMenu:QuizMenu=it.toRoute()
QuizMenu( QuizMenu(
//index = userIndex, index = quizMenu.userIndex,
// navAccueil = { userIndex -> navAccueil = { navController.navigate( Accueil(quizMenu.userIndex) ) },
// navController.navigate(Destination.Accueil.createRoute(userIndex)) // Passe l'index à Profil navFavorite = { navController.navigate(Favorite(quizMenu.userIndex)) },
// }, navProfil = { navController.navigate(Profil(quizMenu.userIndex)) },
// navFavorite = { userIndex -> navControllerQuiz = { idQuiz ->
// navController.navigate(Destination.Favorite.createRoute(userIndex)) // Passe l'index à Profil navController.navigate(Quiz(quizMenu.userIndex,idQuiz))
// },
// navProfil = { userIndex ->
// navController.navigate(Destination.Profil.createRoute(userIndex)) // Passe l'index à Profil
// },
navControllerQuiz = { id ->
navController.navigate(Destination.Quiz.createId(id))
} }
) )
} }
composable(Destination.Quiz.route) { backStackEntry -> composable<Quiz> {
val idQuiz = backStackEntry.arguments?.getString("idQuiz")?.toInt() ?: 0 val quiz:Quiz=it.toRoute()
QuizPage( QuizPage(
index = quiz.userIndex,
navAccueil = { navController.navigate( Accueil(quiz.userIndex) ) },
navFavorite = { navController.navigate(Favorite(quiz.userIndex)) },
navProfil = { navController.navigate(Profil(quiz.userIndex)) },
navQuiz = { navController.navigate(QuizMenu(quiz.userIndex)) },
navControllerQuizEnd = { idQuiz, pts -> navControllerQuizEnd = { idQuiz, pts ->
navController.navigate(Destination.QuizEnd.createIdAndPts(idQuiz, pts)) navController.navigate(QuizEnd(quiz.userIndex,idQuiz, pts))
}, },
navControllerQuizMenu = { navController.navigate(Destination.QuizMenu.route) }, idQuiz = quiz.idQuiz
navControllerMenu = { navController.navigate(Destination.Accueil.route) },
idQuiz
) )
} }
composable(Destination.QuizEnd.route) { backStackEntry -> composable<QuizEnd> {
val idQuiz = backStackEntry.arguments?.getString("idQuiz")?.toInt() ?: 0 val quizEnd: QuizEnd = it.toRoute()
val pts = backStackEntry.arguments?.getString("pts")?.toInt() ?: 0
QuizEndPage( QuizEndPage(
idQuiz, idQuiz = quizEnd.idQuiz,
pts, points = quizEnd.pts,
navControllerQuizMenu = { navController.navigate(Destination.QuizMenu.route) }, index = quizEnd.userIndex,
navControllerMenu = { navController.navigate(Destination.Accueil.route) } navAccueil = { navController.navigate( Accueil(quizEnd.userIndex) ) },
navFavorite = { navController.navigate(Favorite(quizEnd.userIndex)) },
navProfil = { navController.navigate(Profil(quizEnd.userIndex)) },
navQuiz = { navController.navigate(QuizMenu(quizEnd.userIndex)) }
) )
} }
} }

@ -26,6 +26,7 @@ import androidx.compose.ui.unit.sp
import com.example.what_the_fantasy.R import com.example.what_the_fantasy.R
import com.example.what_the_fantasy.data.local.QuestionStub import com.example.what_the_fantasy.data.local.QuestionStub
import com.example.what_the_fantasy.data.local.QuizStub import com.example.what_the_fantasy.data.local.QuizStub
import com.example.what_the_fantasy.ui.components.NavBar
val gradient = Brush.linearGradient( val gradient = Brush.linearGradient(
colors = listOf(Color(0xFF7B1FA2), Color(0xFF311B92)), colors = listOf(Color(0xFF7B1FA2), Color(0xFF311B92)),
@ -37,132 +38,107 @@ val gradient = Brush.linearGradient(
fun QuizEndPage( fun QuizEndPage(
idQuiz: Int, idQuiz: Int,
points: Int, points: Int,
navControllerQuizMenu: () -> Unit, index: Int,
navControllerMenu: () -> Unit navFavorite: (Int) -> Unit,
navAccueil: (Int) -> Unit,
navProfil:(Int) -> Unit,
navQuiz: (Int) -> Unit,
) { ) {
Column( NavBar(onQuiz = true,
modifier = Modifier.fillMaxSize().background(Color(0xFF100C1B)) index = index,
) { navControllerFavorite = navFavorite,
// Bandeau supérieur navControllerAccueil = navAccueil,
Row( navControllerProfil = navProfil,
modifier = Modifier navControllerQuiz = navQuiz) {
.fillMaxWidth()
.weight(0.1f)
.padding(20.dp),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Image(
painter = painterResource(id = R.drawable.profile_icon),
contentDescription = "Profil",
modifier = Modifier.size(50.dp)
)
Image(
painter = painterResource(id = R.drawable.toggle),
contentDescription = "Profil"
)
}
// Contenu principal
Column( Column(
modifier = Modifier modifier = Modifier.fillMaxSize().background(Color(0xFF100C1B))
.weight(0.8f)
.padding(horizontal = 50.dp, vertical = 20.dp)
.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally
) { ) {
Text(
text = "▶ Résultats ◀", // Contenu principal
color = Color.White, Column(
style = TextStyle(fontSize = 25.sp, fontWeight = FontWeight.Bold, textAlign = TextAlign.Center)
)
Spacer(modifier = Modifier.height(16.dp))
Column (
modifier = Modifier modifier = Modifier
.background(brush = gradient, shape = RoundedCornerShape(20.dp)) .weight(0.8f)
.padding(30.dp) .padding(horizontal = 50.dp, vertical = 20.dp)
.fillMaxSize(), .fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally
verticalArrangement = Arrangement.SpaceEvenly
) { ) {
val quiz = QuizStub.getQuizById(idQuiz) Text(
val nbQuestions = quiz?.questions?.size text = "▶ Résultats ◀",
Text (
text = "${quiz?.name}",
color = Color.White, color = Color.White,
style = TextStyle(fontSize = 25.sp, fontWeight = FontWeight.Bold, textAlign = TextAlign.Center) style = TextStyle(
) fontSize = 25.sp,
Text ( fontWeight = FontWeight.Bold,
text = "Nombres de Questions : $nbQuestions", textAlign = TextAlign.Center
color = Color.White, )
style = TextStyle(fontSize = 15.sp, fontWeight = FontWeight.Bold, textAlign = TextAlign.Center)
)
Text (
text = "Nombres de bonnes réponses : $points",
color = Color.White,
style = TextStyle(fontSize = 15.sp, fontWeight = FontWeight.Bold, textAlign = TextAlign.Center)
) )
Spacer(modifier = Modifier.height(16.dp))
val pourcentage = (points.toDouble() / nbQuestions!!) * 100 Column(
val note = when {
pourcentage == 100.0 -> "S"
pourcentage >= 70.0 -> "A"
pourcentage >= 40.0 -> "B"
else -> "C"
}
println("Note obtenue : $note")
Box(
contentAlignment = Alignment.Center,
modifier = Modifier modifier = Modifier
.size(100.dp) .background(brush = gradient, shape = RoundedCornerShape(20.dp))
.background(Color.White, shape = RoundedCornerShape(50.dp)) .padding(30.dp)
.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.SpaceEvenly
) { ) {
val quiz = QuizStub.getQuizById(idQuiz)
val nbQuestions = quiz?.questions?.size
Text( Text(
text = note, text = "${quiz?.name}",
color = Color.Red, color = Color.White,
style = TextStyle( style = TextStyle(
fontSize = 40.sp, fontSize = 25.sp,
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
textAlign = TextAlign.Center textAlign = TextAlign.Center
) )
) )
Text(
text = "Nombres de Questions : $nbQuestions",
color = Color.White,
style = TextStyle(
fontSize = 15.sp,
fontWeight = FontWeight.Bold,
textAlign = TextAlign.Center
)
)
Text(
text = "Nombres de bonnes réponses : $points",
color = Color.White,
style = TextStyle(
fontSize = 15.sp,
fontWeight = FontWeight.Bold,
textAlign = TextAlign.Center
)
)
val pourcentage = (points.toDouble() / nbQuestions!!) * 100
val note = when {
pourcentage == 100.0 -> "S"
pourcentage >= 70.0 -> "A"
pourcentage >= 40.0 -> "B"
else -> "C"
}
println("Note obtenue : $note")
Box(
contentAlignment = Alignment.Center,
modifier = Modifier
.size(100.dp)
.background(Color.White, shape = RoundedCornerShape(50.dp))
) {
Text(
text = note,
color = Color.Red,
style = TextStyle(
fontSize = 40.sp,
fontWeight = FontWeight.Bold,
textAlign = TextAlign.Center
)
)
}
} }
} }
} }
// Bandeau inférieur
Row(
modifier = Modifier
.fillMaxWidth()
.weight(0.1f)
.background(Color(0xFF300052))
.padding(20.dp),
horizontalArrangement = Arrangement.SpaceAround,
verticalAlignment = Alignment.CenterVertically
) {
// Bouton Likes
Image(
painter = painterResource(id = R.drawable.like_icon),
contentDescription = "Bouton",
modifier = Modifier.size(50.dp)
)
// Bouton WhatTheFantasy
Image(
painter = painterResource(R.drawable.wf_logo),
contentDescription = "Menu Button",
Modifier.clickable { navControllerMenu() }
)
// Bouton Menu Quiz
Image(
painter = painterResource(id = R.drawable.quiz_icon),
contentDescription = "Bouton",
modifier = Modifier
.size(50.dp)
.clickable { navControllerQuizMenu() }
)
}
} }
} }

@ -41,123 +41,92 @@ import com.example.what_the_fantasy.ui.components.NavBar
@Composable @Composable
fun QuizMenu(navControllerQuiz: (Int) -> Unit) { fun QuizMenu( index: Int,
navFavorite: (Int) -> Unit,
Column ( navAccueil: (Int) -> Unit,
modifier = Modifier.fillMaxSize().background(Color(0xFF100C1B)) navProfil:(Int) -> Unit,
navControllerQuiz: (Int) -> Unit
) {
NavBar(onQuiz = true,
index = index,
navControllerFavorite = navFavorite,
navControllerAccueil = navAccueil,
navControllerProfil = navProfil,
navControllerQuiz = { }
) { ) {
// Bandeau supérieur
Row(
modifier = Modifier
.fillMaxWidth()
.weight(0.1f)
//background(Color(0xFF300052))
.padding(20.dp),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Image(
painter = painterResource(id = R.drawable.profile_icon),
contentDescription = "Profil"
)
Image(
painter = painterResource(id = R.drawable.toggle),
contentDescription = "Profil"
)
}
// Contenu princiapl
Column( Column(
modifier = Modifier modifier = Modifier.fillMaxSize().background(Color(0xFF100C1B))
.weight(0.9f)
.fillMaxSize()
.padding(20.dp),
horizontalAlignment = Alignment.CenterHorizontally
) { ) {
Text( // Contenu princiapl
text = "▶ Menu des Quiz ◀", Column(
color = Color.White,
style = TextStyle(fontSize = 25.sp, fontWeight = FontWeight.Bold, textAlign = TextAlign.Center)
)
Spacer(Modifier.height(20.dp))
Column (
modifier = Modifier modifier = Modifier
.background(brush = gradient, shape = RoundedCornerShape(20.dp)) .weight(0.9f)
.fillMaxSize() .fillMaxSize()
.padding(vertical = 30.dp) .padding(20.dp),
.verticalScroll(rememberScrollState()),
horizontalAlignment = Alignment.CenterHorizontally horizontalAlignment = Alignment.CenterHorizontally
) { ) {
val quizzes = QuizStub.allQuizzes.chunked(2) Text(
val context = LocalContext.current text = "▶ Menu des Quiz ◀",
for (rowQuizzes in quizzes) { color = Color.White,
Row( style = TextStyle(
modifier = Modifier.fillMaxWidth(), fontSize = 25.sp,
horizontalArrangement = Arrangement.SpaceEvenly fontWeight = FontWeight.Bold,
) { textAlign = TextAlign.Center
for (quiz in rowQuizzes) { )
val imageResId = context.resources.getIdentifier( )
quiz.img, Spacer(Modifier.height(20.dp))
"drawable", Column(
context.packageName modifier = Modifier
) .background(brush = gradient, shape = RoundedCornerShape(20.dp))
Column ( .fillMaxSize()
modifier = Modifier .padding(vertical = 30.dp)
.size(width = 150.dp, height = 145.dp) .verticalScroll(rememberScrollState()),
.clickable { navControllerQuiz(quiz.id) }, horizontalAlignment = Alignment.CenterHorizontally
) { ) {
Image( val quizzes = QuizStub.allQuizzes.chunked(2)
painter = painterResource(id = imageResId), val context = LocalContext.current
contentDescription = quiz.name, for (rowQuizzes in quizzes) {
modifier = Modifier Row(
.size(width = 150.dp, height = 100.dp) modifier = Modifier.fillMaxWidth(),
.clip(shape = RoundedCornerShape(20.dp)), horizontalArrangement = Arrangement.SpaceEvenly
contentScale = ContentScale.Crop ) {
for (quiz in rowQuizzes) {
val imageResId = context.resources.getIdentifier(
quiz.img,
"drawable",
context.packageName
) )
Spacer(Modifier.height(10.dp)) Column(
Text( modifier = Modifier
text = quiz.name, .size(width = 150.dp, height = 145.dp)
style = TextStyle( .clickable { navControllerQuiz(quiz.id) },
fontSize = 17.sp, ) {
fontWeight = FontWeight.Medium, Image(
textAlign = TextAlign.Center, painter = painterResource(id = imageResId),
color = Color.White contentDescription = quiz.name,
modifier = Modifier
.size(width = 150.dp, height = 100.dp)
.clip(shape = RoundedCornerShape(20.dp)),
contentScale = ContentScale.Crop
) )
) Spacer(Modifier.height(10.dp))
Text(
text = quiz.name,
style = TextStyle(
fontSize = 17.sp,
fontWeight = FontWeight.Medium,
textAlign = TextAlign.Center,
color = Color.White
)
)
}
} }
} }
Spacer(Modifier.height(30.dp))
} }
Spacer(Modifier.height(30.dp))
} }
} }
} }
// Bandeau inférieur
Row(
modifier = Modifier
.fillMaxWidth()
.weight(0.1f)
.background(Color(0xFF300052))
.padding(20.dp),
horizontalArrangement = Arrangement.SpaceAround,
verticalAlignment = Alignment.CenterVertically
) {
// Bouton Likes
Image(
painter = painterResource(id = R.drawable.like_icon),
contentDescription = "Bouton"
)
// Bouton WhatTheFantasy
Image(
painter = painterResource(R.drawable.wf_logo),
contentDescription = "Menu Button",
Modifier.clickable { }
)
// Bouton Quiz
Image(
painter = painterResource(id = R.drawable.quiz_icon),
contentDescription = "Bouton"
)
}
} }
} }

@ -22,12 +22,19 @@ import androidx.compose.ui.unit.sp
import com.example.what_the_fantasy.R import com.example.what_the_fantasy.R
import com.example.what_the_fantasy.data.local.QuestionStub import com.example.what_the_fantasy.data.local.QuestionStub
import com.example.what_the_fantasy.data.local.QuizStub import com.example.what_the_fantasy.data.local.QuizStub
import com.example.what_the_fantasy.ui.components.BackBar
import com.example.what_the_fantasy.ui.components.NavBar
@Composable @Composable
fun QuizPage( fun QuizPage(
index: Int,
navFavorite: (Int) -> Unit,
navAccueil: (Int) -> Unit,
navProfil:(Int) -> Unit,
navQuiz: (Int) -> Unit,
navControllerQuizEnd: (Int, Int) -> Unit, navControllerQuizEnd: (Int, Int) -> Unit,
navControllerQuizMenu: () -> Unit,
navControllerMenu: () -> Unit,
idQuiz: Int idQuiz: Int
) { ) {
val quiz = QuizStub.getQuizById(idQuiz) val quiz = QuizStub.getQuizById(idQuiz)
@ -54,128 +61,90 @@ fun QuizPage(
if (idCurrentQuestion < questions.size - 1) idCurrentQuestion++ if (idCurrentQuestion < questions.size - 1) idCurrentQuestion++
else navControllerQuizEnd(idQuiz, pts) // Retour menu else navControllerQuizEnd(idQuiz, pts) // Retour menu
} }
NavBar(onQuiz = true,
Column ( index = index,
navControllerFavorite = navFavorite,
navControllerAccueil = navAccueil,
navControllerProfil = navProfil,
navControllerQuiz = navQuiz
){
Column (
modifier = Modifier.fillMaxSize().background(Color(0xFF100C1B)) modifier = Modifier.fillMaxSize().background(Color(0xFF100C1B))
) { ) {
// Bandeau supérieur // Contenu princiapl
Row(
modifier = Modifier
.fillMaxWidth()
.weight(0.1f)
//.background(Color(0xFF300052))
.padding(20.dp),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Image(
painter = painterResource(id = R.drawable.profile_icon),
contentDescription = "Profil"
)
Image(
painter = painterResource(id = R.drawable.toggle),
contentDescription = "Profil"
)
}
// Contenu princiapl
Column(
modifier = Modifier
.weight(0.8f)
.fillMaxWidth()
.padding(horizontal = 50.dp, vertical = 20.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
val question = questions[idCurrentQuestion]
Column( Column(
horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier
.weight(0.8f)
.fillMaxWidth()
.padding(horizontal = 50.dp, vertical = 20.dp),
horizontalAlignment = Alignment.CenterHorizontally
) { ) {
if (quiz != null) { val question = questions[idCurrentQuestion]
Text(
text = "${quiz.name}", Column(
color = Color.White, horizontalAlignment = Alignment.CenterHorizontally,
style = TextStyle(fontSize = 20.sp, fontWeight = FontWeight.Bold, textAlign = TextAlign.Center)
)
}
Spacer(Modifier.height(20.dp))
Column (
modifier = Modifier
.background(brush = gradient, shape = RoundedCornerShape(20.dp)),
horizontalAlignment = Alignment.CenterHorizontally
) { ) {
Text( if (quiz != null) {
"Question ${idCurrentQuestion+1}", Text(
color = Color.White, text = "${quiz.name}",
fontSize = 18.sp, color = Color.White,
modifier = Modifier.padding(top = 20.dp), style = TextStyle(
style = TextStyle( fontSize = 20.sp,
fontSize = 25.sp, fontWeight = FontWeight.Bold,
fontWeight = FontWeight.Bold, textAlign = TextAlign.Center
textAlign = TextAlign.Center )
) )
) }
Text( Spacer(Modifier.height(20.dp))
question.question,
color = Color.White,
fontSize = 22.sp,
modifier = Modifier.padding(40.dp)
)
Column( Column(
modifier = Modifier modifier = Modifier
.padding(top = 30.dp) .background(brush = gradient, shape = RoundedCornerShape(20.dp)),
horizontalAlignment = Alignment.CenterHorizontally
) { ) {
listOf( Text(
question.ansA, "Question ${idCurrentQuestion + 1}",
question.ansB, color = Color.White,
question.ansC, fontSize = 18.sp,
question.ansD modifier = Modifier.padding(top = 20.dp),
).forEach { answer -> style = TextStyle(
Box( fontSize = 25.sp,
modifier = Modifier fontWeight = FontWeight.Bold,
.width(220.dp) textAlign = TextAlign.Center
.height(50.dp) )
.background(Color.White, shape = RoundedCornerShape(16.dp)) )
.clickable { onAnswerSelected(answer) } Text(
.padding(horizontal = 8.dp), question.question,
contentAlignment = Alignment.Center color = Color.White,
) { fontSize = 22.sp,
Text(answer, color = Color.Black, fontSize = 18.sp) modifier = Modifier.padding(40.dp)
)
Column(
modifier = Modifier
.padding(top = 30.dp)
) {
listOf(
question.ansA,
question.ansB,
question.ansC,
question.ansD
).forEach { answer ->
Box(
modifier = Modifier
.width(220.dp)
.height(50.dp)
.background(Color.White, shape = RoundedCornerShape(16.dp))
.clickable { onAnswerSelected(answer) }
.padding(horizontal = 8.dp),
contentAlignment = Alignment.Center
) {
Text(answer, color = Color.Black, fontSize = 18.sp)
}
Spacer(modifier = Modifier.height(60.dp))
} }
Spacer(modifier = Modifier.height(60.dp))
} }
} }
} }
} }
} }
// Bandeau inférieur
Row(
modifier = Modifier
.fillMaxWidth()
.weight(0.1f)
.background(Color(0xFF300052))
.padding(20.dp),
horizontalArrangement = Arrangement.SpaceAround,
verticalAlignment = Alignment.CenterVertically
) {
// Bouton Likes
Image(
painter = painterResource(id = R.drawable.like_icon),
contentDescription = "Bouton"
)
// Bouton WhatTheFantasy
Image(
painter = painterResource(R.drawable.wf_logo),
contentDescription = "Menu Button",
Modifier.clickable { navControllerMenu() }
)
// Bouton Menu Quiz
Image(
painter = painterResource(id = R.drawable.quiz_icon),
contentDescription = "Bouton",
Modifier.clickable { navControllerQuizMenu() }
)
}
} }
} }

@ -38,4 +38,4 @@ androidx-navigation-common-android = { group = "androidx.navigation", name = "na
[plugins] [plugins]
android-application = { id = "com.android.application", version.ref = "agp" } android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlinx-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin"}

Loading…
Cancel
Save