Navigation faite sur Accueil,Favorite,Quiz / A finir la nav vers Profil / Corection nav dans Quiz(supertion du passage en paramétre directement du nav controleur)

pull/24/head
Kentin BRONGNIART 2 months ago
parent a36665b102
commit 2c3ea83a4b

@ -1,7 +1,5 @@
package com.example.what_the_fantasy.ui.components
import android.widget.ImageView
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
@ -12,31 +10,39 @@ 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.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.BottomAppBar
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.*
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.material3.Text
import androidx.compose.runtime.Composable
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.layout.onGloballyPositioned
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.example.what_the_fantasy.R
import com.example.what_the_fantasy.ui.navigations.AppNavigator
import com.example.what_the_fantasy.ui.theme.colorNavBar
import com.example.what_the_fantasy.ui.theme.*
@Composable
fun NavBar(content : @Composable ()-> Unit ) {
val nav = AppNavigator()
fun NavBar(onProfile : Boolean = false ,
onFavorite : Boolean = false ,
onAccueil : Boolean = false ,
onQuiz : Boolean = false ,
navControllerProfil: (Int) -> Unit,
navControllerFavorite: () -> Unit,
navControllerAccueil: () -> Unit,
navControllerQuiz: () -> Unit,
content : @Composable ()-> Unit ) {
Column(
modifier = Modifier
@ -45,16 +51,17 @@ fun NavBar(content : @Composable ()-> Unit ) {
Row(
modifier = Modifier
.fillMaxWidth()
.height(55.dp)
.background(colorNavBar)
.padding(10.dp),
.height(70.dp)
.background(colorNavBar),
Arrangement.SpaceBetween,
verticalAlignment = Alignment.Bottom
) {
Button(onClick = {}, Modifier.background(Color.Unspecified)) {
Text("Profile", fontSize = 25.sp, color = Color.White)
}
Button(onClick = {}) {
ButtonIconVectorInt(Icons.Rounded.AccountCircle,"Profile",{},onProfile)
Button(onClick = {},
colors = ButtonDefaults.buttonColors(containerColor = Color.Transparent)
) {
Text("Theme", fontSize = 25.sp, color = Color.White)
}
@ -65,31 +72,67 @@ fun NavBar(content : @Composable ()-> Unit ) {
}
Row(modifier = Modifier
.background(colorNavBar)
.fillMaxSize(),
.background(colorNavBar)
.fillMaxSize(),
horizontalArrangement = Arrangement.SpaceAround,
verticalAlignment = Alignment.CenterVertically
) {
Button(onClick = {}) {
Text("Favorie", fontSize = 25.sp, color = Color.White)
}
ButtonIconVector(Icons.Rounded.Favorite,"Favorite",navControllerFavorite,onFavorite)
Button(onClick = {}) {
Image(
painter = painterResource(R.mipmap.ic_launcher_foreground),
contentDescription = "Accueil",
modifier = Modifier
.size(100.dp)
)
}
Button(onClick = {}) {
Text("Quiz", fontSize = 25.sp, color = Color.White)
}
ButtonIconPainter(painterResource(R.mipmap.ic_launcher_foreground),"Accueil",navControllerAccueil,onAccueil)
ButtonIconVector(Icons.Rounded.Create,"Quiz",navControllerQuiz,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
fun ButtonIconVectorInt(img : ImageVector, name : String, nav : (Int)->Unit ,onPage : Boolean){
IconButton(onClick = {},
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
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)
)
}
}
}

@ -8,6 +8,8 @@ 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.LoginPage
import com.example.what_the_fantasy.ui.screens.ProfilPage
import com.example.what_the_fantasy.ui.screens.QuizAccueil
import com.example.what_the_fantasy.ui.screens.QuizEndPage
import com.example.what_the_fantasy.ui.screens.QuizPage
import com.example.what_the_fantasy.ui.screens.QuotePage
import com.example.what_the_fantasy.ui.screens.SearchPage
@ -23,38 +25,69 @@ sealed class Destination(val route: String) {
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 Quiz : Destination("Quiz")
data object Quote : Destination("Quote")
data object Search : Destination("Search")
data object SignUp : Destination("SignUp")
data object SubmitQuote : Destination("SubmitQuote")
data object QuizAccueil : Destination("QuizAccueil")
data object QuizPage : Destination("QuizPage")
data object QuizEndPage : Destination("QuizEndPage")
}
@Composable
fun AppNavigator() {
val navController = rememberNavController()
NavHost(navController, startDestination = Destination.Login.route) {
composable(Destination.Login.route) {
LoginPage(
navControllerSignUp = { navController.navigate(Destination.SignUp.route) },
navControllerProfil = { userIndex ->
navController.navigate(Destination.Profil.createRoute(userIndex)) // Passe l'index à Profil
}
)
}
composable(Destination.Accueil.route) { AccueilPage() }
composable(Destination.Favorite.route) { FavoritePage() }
NavHost(navController, startDestination = Destination.Accueil.route) {
composable(Destination.Login.route) { LoginPage(
navControllerSignUp = { navController.navigate(Destination.SignUp.route) },
navControllerProfil = { userIndex ->
navController.navigate(Destination.Profil.createRoute(userIndex)) // Passe l'index à Profil
}
) }
composable(Destination.Accueil.route) { AccueilPage(
navFavorite = { navController.navigate(Destination.Favorite.route) },
navQuiz = { navController.navigate(Destination.QuizAccueil.route) }
) }
composable(Destination.Favorite.route) { FavoritePage(
navAccueil = { navController.navigate(Destination.Accueil.route) },
navQuiz = { navController.navigate(Destination.QuizAccueil.route) }
) }
composable(Destination.Profil.route) { backStackEntry ->
// Récupère l'index passé dans la route
val userIndex = backStackEntry.arguments?.getString("userIndex")?.toInt() ?: -1
ProfilPage(index = userIndex, navController = navController)
ProfilPage(index = userIndex,
navController = navController,
)
}
composable(Destination.Quiz.route) { QuizPage(navController) }
composable(Destination.Quote.route) { QuotePage() }
composable(Destination.Search.route) { SearchPage() }
composable(Destination.SignUp.route) { SignUpPage(navController) }
composable(Destination.SubmitQuote.route) { SubmitQuotePage() }
composable(Destination.QuizAccueil.route) { QuizAccueil(
navFavorite = { navController.navigate(Destination.Favorite.route) },
navAccueil = { navController.navigate(Destination.Accueil.route) },
navControllerQuizPage = { navController.navigate(Destination.QuizPage.route) },
navControllerQuizEndPage = { navController.navigate(Destination.QuizEndPage.route) }
) }
composable(Destination.QuizPage.route) { QuizPage(
navControllerQuiz = {navController.navigate(Destination.QuizAccueil.route)},
navControllerQuizEndPage = {navController.navigate(Destination.QuizEndPage.route)}
) }
composable(Destination.QuizEndPage.route) { QuizEndPage(
points = 5,
idQuiz = 1
) }
}
}

@ -1,11 +1,38 @@
package com.example.what_the_fantasy.ui.screens
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Text
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.unit.sp
import com.example.what_the_fantasy.ui.components.NavBar
import com.example.what_the_fantasy.ui.theme.colorBackground
@Composable
fun AccueilPage() {
NavBar {
fun AccueilPage(
navFavorite: () -> Unit,
navQuiz: () -> Unit
) {
NavBar(onAccueil = true,
navControllerFavorite = navFavorite,
navControllerAccueil = { },
navControllerProfil = {},
navControllerQuiz = navQuiz
){
Box(
modifier = Modifier
.fillMaxSize()
.background(colorBackground),
contentAlignment = Alignment.Center
){
Column {
Text("Accueil", color = Color.White, fontSize = 20.sp)
}
}
}
}

@ -1,11 +1,38 @@
package com.example.what_the_fantasy.ui.screens
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Text
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.unit.sp
import com.example.what_the_fantasy.ui.components.NavBar
import com.example.what_the_fantasy.ui.theme.colorBackground
@Composable
fun FavoritePage() {
NavBar {
fun FavoritePage(
navAccueil: () -> Unit,
navQuiz: () -> Unit
) {
NavBar(onFavorite = true,
navControllerFavorite = { },
navControllerAccueil = navAccueil,
navControllerProfil = {},
navControllerQuiz = navQuiz
) {
Box(
modifier = Modifier
.fillMaxSize()
.background(colorBackground),
contentAlignment = Alignment.Center
){
Column {
Text("Favorite", color = Color.White, fontSize = 20.sp)
}
}
}
}

@ -70,50 +70,56 @@ import com.example.what_the_fantasy.ui.theme.gradienBox
@Composable
fun ProfilPage(index: Int, navController: NavController) {
val userList = UserStub.allUsers
val user = userList[index]
Box(
modifier = Modifier
.fillMaxSize()
.background(Color(0xFF100C1B)),
contentAlignment = Alignment.Center
NavBar(onProfile = true,
navControllerFavorite = {},
navControllerAccueil = {},
navControllerProfil = {},
navControllerQuiz = {}
) {
Column(
val userList = UserStub.allUsers
val user = userList[index]
Box(
modifier = Modifier
.fillMaxWidth(0.9f)
.padding(20.dp)
.clip(RoundedCornerShape(16.dp))
.background(gradienBox)
.padding(20.dp),
horizontalAlignment = Alignment.CenterHorizontally
.fillMaxSize()
.background(Color(0xFF100C1B)),
contentAlignment = Alignment.Center
) {
Column(
modifier = Modifier
.fillMaxWidth(0.9f)
.padding(20.dp)
.clip(RoundedCornerShape(16.dp))
.background(gradienBox)
.padding(20.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
// Titre
TitlePageComponent(R.string.titleProfile, 20, Color.White)
SpaceHeightComponent(16)
// Image de profil
ImageProfil(user.imgUrl, 120)
SpaceHeightComponent(16)
EditUsername(user.username)// Édition du Username
SpaceHeightComponent(16)
EditEmail(user.email)// Édition du Email
Spacer(modifier = Modifier.height(8.dp))
EditPasswd()
SpaceHeightComponent(16)
// Bouton
ButtonProfile(R.string.ButtonAddQuoteprofile, 18, Color.Black, Color.White)
SpaceHeightComponent(16)
ButtonProfile(R.string.ButtonLanguageprofile, 18, Color.Black, Color.White)
SpaceHeightComponent(16)
ButtonProfile(R.string.ButtonUnlogprofile, 18, Color.Black, Color.White)
// Titre
TitlePageComponent(R.string.titleProfile, 20, Color.White)
SpaceHeightComponent(16)
// Image de profil
ImageProfil(user.imgUrl, 120)
SpaceHeightComponent(16)
EditUsername(user.username)// Édition du Username
SpaceHeightComponent(16)
EditEmail(user.email)// Édition du Email
Spacer(modifier = Modifier.height(8.dp))
EditPasswd()
SpaceHeightComponent(16)
// Bouton
ButtonProfile(R.string.ButtonAddQuoteprofile,18, Color.Black, Color.White)
SpaceHeightComponent(16)
ButtonProfile(R.string.ButtonLanguageprofile,18, Color.Black, Color.White)
SpaceHeightComponent(16)
ButtonProfile(R.string.ButtonUnlogprofile, 18, Color.Black, Color.White)
}
}
}
}

@ -24,116 +24,112 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.example.what_the_fantasy.R
import com.example.what_the_fantasy.ui.components.NavBar
@Composable
fun QuizAccueil(navController: NavController) {
Row(
modifier = Modifier
.fillMaxSize()
.background(Color(0xFF100C1B))
.padding(top = 100.dp)
fun QuizAccueil(
navFavorite: () -> Unit,
navAccueil: () -> Unit,
navControllerQuizPage: () -> Unit,
navControllerQuizEndPage: () -> Unit
) {
NavBar(onQuiz = true,
navControllerFavorite = navFavorite,
navControllerAccueil = navAccueil,
navControllerProfil = {},
navControllerQuiz = { }
) {
Spacer(modifier = Modifier.weight(0.1f))
Column(
Row(
modifier = Modifier
.weight(0.9f)
.fillMaxHeight(),
horizontalAlignment = Alignment.CenterHorizontally
.fillMaxSize()
.background(Color(0xFF100C1B))
.padding(top = 100.dp)
) {
Box(
modifier = Modifier
.size(width = 150.dp, height = 100.dp)
.padding(8.dp)
.clickable {
navController.navigate("quizPage")
}
) {
Image(
painter = painterResource(id = R.drawable.quiz),
contentDescription = "Quiz 1",
modifier = Modifier.fillMaxSize(),
contentScale = ContentScale.Crop
)
}
Spacer(modifier = Modifier.weight(0.1f))
Box(
Column(
modifier = Modifier
.size(width = 150.dp, height = 100.dp)
.padding(8.dp)
.clickable {
navController.navigate("quizPage")
}
.weight(0.9f)
.fillMaxHeight(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Image(
painter = painterResource(id = R.drawable.quiz),
contentDescription = "Quiz 2",
modifier = Modifier.fillMaxSize(),
contentScale = ContentScale.Crop
)
Box(
modifier = Modifier
.size(width = 150.dp, height = 100.dp)
.padding(8.dp)
.clickable {
navControllerQuizPage()
}
) {
Image(
painter = painterResource(id = R.drawable.quiz),
contentDescription = "Quiz 1",
modifier = Modifier.fillMaxSize(),
contentScale = ContentScale.Crop
)
}
Box(
modifier = Modifier
.size(width = 150.dp, height = 100.dp)
.padding(8.dp)
.clickable {
navControllerQuizPage()
}
) {
Image(
painter = painterResource(id = R.drawable.quiz),
contentDescription = "Quiz 2",
modifier = Modifier.fillMaxSize(),
contentScale = ContentScale.Crop
)
}
}
}
Spacer(modifier = Modifier.width(10.dp))
Spacer(modifier = Modifier.width(10.dp))
Column(
modifier = Modifier
.weight(0.9f)
.fillMaxHeight(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Box(
Column(
modifier = Modifier
.size(width = 150.dp, height = 100.dp)
.padding(8.dp)
.clickable {
navController.navigate("quizPage")
}
.weight(0.9f)
.fillMaxHeight(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Image(
painter = painterResource(id = R.drawable.quiz),
contentDescription = "Quiz 3",
modifier = Modifier.fillMaxSize(),
contentScale = ContentScale.Crop
)
}
Box(
modifier = Modifier
.size(width = 150.dp, height = 100.dp)
.padding(8.dp)
.clickable {
navControllerQuizPage()
}
) {
Image(
painter = painterResource(id = R.drawable.quiz),
contentDescription = "Quiz 3",
modifier = Modifier.fillMaxSize(),
contentScale = ContentScale.Crop
)
}
Box(
modifier = Modifier
.size(width = 150.dp, height = 100.dp)
.padding(8.dp)
.clickable {
navController.navigate("quizPage")
}
) {
Image(
painter = painterResource(id = R.drawable.quiz),
contentDescription = "Quiz 4",
modifier = Modifier.fillMaxSize(),
contentScale = ContentScale.Crop
)
Box(
modifier = Modifier
.size(width = 150.dp, height = 100.dp)
.padding(8.dp)
.clickable {
navControllerQuizPage()
}
) {
Image(
painter = painterResource(id = R.drawable.quiz),
contentDescription = "Quiz 4",
modifier = Modifier.fillMaxSize(),
contentScale = ContentScale.Crop
)
}
}
}
Spacer(modifier = Modifier.weight(0.1f))
}
}
@Composable
fun QuizApp() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "quizEndPage") {
composable("quizAccueil") {
QuizAccueil(navController = navController)
}
composable("quizPage") {
QuizPage(navController = navController)
}
composable("quizEndPage") {
QuizEndPage(5, 1)
Spacer(modifier = Modifier.weight(0.1f))
}
}
}
}

@ -24,7 +24,10 @@ import com.example.what_the_fantasy.data.model.Question
import com.example.what_the_fantasy.ui.components.NavBar
@Composable
fun QuizPage(navController: NavController) {
fun QuizPage(
navControllerQuiz: () -> Unit,
navControllerQuizEndPage: () -> Unit
) {
val questions = QuestionStub.allQuestions
var idCurrentQuestion by remember { mutableIntStateOf(0) }
var pts by remember { mutableIntStateOf(0) }
@ -46,7 +49,7 @@ fun QuizPage(navController: NavController) {
if (answer == correctAnswer) pts++
if (idCurrentQuestion < questions.size - 1) idCurrentQuestion++
else navController.popBackStack() // Retour menu
else navControllerQuiz() // Retour menu
}
Box(
@ -69,7 +72,7 @@ fun QuizPage(navController: NavController) {
modifier = Modifier.fillMaxWidth()
) {
IconButton(
onClick = { navController.popBackStack() },
onClick = { navControllerQuiz() },
modifier = Modifier.align(Alignment.TopStart)
) {
Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Retour", tint = Color.White)

@ -5,7 +5,4 @@ import com.example.what_the_fantasy.ui.components.NavBar
@Composable
fun QuotePage() {
NavBar {
}
}

@ -5,7 +5,4 @@ import com.example.what_the_fantasy.ui.components.NavBar
@Composable
fun SearchPage() {
NavBar {
}
}

@ -5,7 +5,4 @@ import com.example.what_the_fantasy.ui.components.NavBar
@Composable
fun SubmitQuotePage() {
NavBar {
}
}

@ -18,4 +18,6 @@ val gradienBox = Brush.linearGradient(
)
val colorBackground = Color(0xFF100C1B)
val colorNavBar = Color(0xFF2F0E62)
val colorNavBar = Color(0xFF2F0E62)
val colorButtonNav = Color.Cyan
Loading…
Cancel
Save