Compare commits
17 Commits
2d231a4402
...
5cfc57e864
Author | SHA1 | Date |
---|---|---|
![]() |
5cfc57e864 | 1 year ago |
![]() |
b69f2bf3ea | 1 year ago |
|
2818828c3c | 1 year ago |
|
c2abb90896 | 1 year ago |
|
2c6f66eabd | 1 year ago |
|
f874d363aa | 1 year ago |
|
3dbe1afa25 | 1 year ago |
|
8d589d9146 | 1 year ago |
|
8a30b2e6cb | 1 year ago |
|
6a414e3796 | 1 year ago |
![]() |
3b089e35f6 | 1 year ago |
![]() |
90bd1b0e5b | 1 year ago |
![]() |
ce485f5bec | 1 year ago |
![]() |
c26affc745 | 1 year ago |
![]() |
b2a9da1992 | 1 year ago |
|
f0ebbb91fb | 1 year ago |
|
5f5c8ee1f2 | 1 year ago |
@ -1,189 +1,49 @@
|
|||||||
package com.example.veraxapplication
|
package com.example.veraxapplication
|
||||||
|
|
||||||
import android.graphics.Paint.Align
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.Layout
|
|
||||||
import android.view.Menu
|
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
import androidx.compose.foundation.background
|
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
|
||||||
import androidx.compose.runtime.Composable
|
|
||||||
import androidx.compose.ui.Modifier
|
|
||||||
import androidx.compose.foundation.layout.Box
|
|
||||||
import androidx.compose.foundation.layout.Column
|
|
||||||
import androidx.compose.foundation.layout.Row
|
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
|
||||||
import androidx.compose.material3.MenuDefaults
|
|
||||||
import androidx.compose.material3.Scaffold
|
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.material3.Text
|
import com.example.veraxapplication.articles.IArticlesDataManager
|
||||||
import androidx.compose.material3.TopAppBar
|
import com.example.veraxapplication.articles.StubArticles
|
||||||
import androidx.compose.ui.res.colorResource
|
import com.example.veraxapplication.modele.ApiClient
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import com.example.veraxapplication.modele.articles.Article
|
||||||
|
import com.example.veraxapplication.navigation.VeraxNavHost
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import com.example.veraxapplication.ui.article.AfficherArticle
|
||||||
import androidx.compose.foundation.layout.padding
|
import com.example.veraxapplication.ui.topBar.TopBarVerax
|
||||||
import androidx.compose.foundation.layout.size
|
|
||||||
import androidx.compose.foundation.layout.width
|
|
||||||
import androidx.compose.foundation.lazy.LazyColumn
|
|
||||||
import androidx.compose.material.icons.Icons
|
|
||||||
import androidx.compose.material.icons.filled.ArrowBack
|
|
||||||
import androidx.compose.material.icons.filled.Favorite
|
|
||||||
import androidx.compose.material.icons.filled.Home
|
|
||||||
import androidx.compose.material.icons.filled.Menu
|
|
||||||
import androidx.compose.material.icons.filled.Person
|
|
||||||
import androidx.compose.material3.BottomAppBar
|
|
||||||
import androidx.compose.material3.CenterAlignedTopAppBar
|
|
||||||
import androidx.compose.material3.DropdownMenu
|
|
||||||
import androidx.compose.material3.DropdownMenuItem
|
|
||||||
import androidx.compose.material3.Icon
|
|
||||||
import androidx.compose.material3.IconButton
|
|
||||||
import androidx.compose.material3.MaterialTheme
|
|
||||||
import androidx.compose.material3.NavigationBarDefaults.containerColor
|
|
||||||
import androidx.compose.material3.Scaffold
|
|
||||||
import androidx.compose.material3.ScaffoldDefaults
|
|
||||||
import androidx.compose.material3.TopAppBarDefaults.topAppBarColors
|
|
||||||
import androidx.compose.material3.darkColorScheme
|
|
||||||
import androidx.compose.runtime.getValue
|
|
||||||
import androidx.compose.runtime.mutableStateOf
|
|
||||||
import androidx.compose.runtime.remember
|
|
||||||
import androidx.compose.runtime.setValue
|
|
||||||
import androidx.compose.ui.Alignment
|
|
||||||
import androidx.compose.ui.text.TextStyle
|
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
|
||||||
import androidx.compose.ui.unit.dp
|
|
||||||
import androidx.compose.ui.unit.sp
|
|
||||||
import com.example.veraxapplication.data.Article
|
|
||||||
|
|
||||||
// doc navBar: https://developer.android.com/reference/kotlin/androidx/compose/material3/package-summary#TopAppBar(kotlin.Function0,androidx.compose.ui.Modifier,kotlin.Function0,kotlin.Function1,androidx.compose.foundation.layout.WindowInsets,androidx.compose.material3.TopAppBarColors,androidx.compose.material3.TopAppBarScrollBehavior)
|
// doc navBar: https://developer.android.com/reference/kotlin/androidx/compose/material3/package-summary#TopAppBar(kotlin.Function0,androidx.compose.ui.Modifier,kotlin.Function0,kotlin.Function1,androidx.compose.foundation.layout.WindowInsets,androidx.compose.material3.TopAppBarColors,androidx.compose.material3.TopAppBarScrollBehavior)
|
||||||
// doc compose, pleins de trucs: https://developer.android.com/jetpack/compose/text?hl=fr
|
// doc compose, pleins de trucs: https://developer.android.com/jetpack/compose/text?hl=fr
|
||||||
//doc couleur background pas finie: https://developer.android.com/jetpack/compose/components/scaffold
|
//doc couleur background pas finie: https://developer.android.com/jetpack/compose/components/scaffold
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : ComponentActivity() {
|
||||||
|
|
||||||
// un truc vite fait pour avoir un visi
|
// un truc vite fait pour avoir un visi
|
||||||
var article = listOf("Thinkerview", "thinkerview.jgp", "Thinkerview est une chaîne youtube d'interview-débat")
|
// var article = listOf("Thinkerview", "thinkerview.jgp", "Thinkerview est une chaîne youtube d'interview-débat")
|
||||||
|
//var articles = listOf( Article("Thinkerview", "This is a descrition", Author = "IAmAGreatAuthor", Image = "https://www.gstatic.com/webp/gallery/1.jpg", LectureTime = "12", Content = listOf(Paragraph("This is a paragraph"), Paragraph("This is another paragraph"), Paragraph("This is a third paragraph"))), Article("Thinkerview", "This is a descrition", Author = "IAmAGreatAuthor", Image = "https://www.gstatic.com/webp/gallery/1.jpg", LectureTime = "12", Content = listOf(Paragraph("This is a paragraph"), Paragraph("This is another paragraph"), Paragraph("This is a third paragraph"))))
|
||||||
|
|
||||||
|
var dataManager: IArticlesDataManager = StubArticles()
|
||||||
|
var articles = dataManager.getDerniersArticles(4)
|
||||||
|
val articlesApi = ApiClient.apiService.getArticles()
|
||||||
|
|
||||||
|
|
||||||
var theme = listOf("Economique", "Culture", "Politique", "Faits divers")
|
var theme = listOf("Economique", "Culture", "Politique", "Faits divers")
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
setContent {
|
setContent {
|
||||||
TopBarVerax(theme = theme, article = article)
|
|
||||||
// allez sur la doc de Scaffold sur Android Dev et si vous comprenez comment on doit faire bien ouej
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Il faudrait mettre ca dans un fichier appart mais je connais plus les conventions ...
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
|
||||||
@Composable
|
|
||||||
fun TopBarVerax(theme : List<String>, article : List<String>) {
|
|
||||||
var leMenu by remember {
|
|
||||||
mutableStateOf(false)
|
|
||||||
}
|
|
||||||
Row(
|
|
||||||
Modifier.background(Color.Cyan)
|
|
||||||
) {
|
|
||||||
Scaffold(
|
|
||||||
topBar = {
|
|
||||||
CenterAlignedTopAppBar(
|
|
||||||
title = {
|
|
||||||
Text(
|
|
||||||
text = "Verax",
|
|
||||||
style = TextStyle(fontSize = 35.sp),
|
|
||||||
color = colorResource(R.color.red),
|
|
||||||
textAlign = TextAlign.Center,
|
|
||||||
/*backcolor = topAppBarColors(
|
|
||||||
containerColor = MaterialTheme.colorScheme.primaryContainer),*/ //version recommandée par le prof
|
|
||||||
modifier = Modifier.fillMaxWidth()
|
|
||||||
)
|
|
||||||
},
|
|
||||||
navigationIcon = {
|
|
||||||
IconButton(onClick = { /* action() */ }) {
|
|
||||||
Icon(
|
|
||||||
imageVector = Icons.Filled.ArrowBack,
|
|
||||||
contentDescription = "Retour",
|
|
||||||
Modifier.size(30.dp)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
actions = {
|
|
||||||
IconButton(onClick = { leMenu = !leMenu }) {
|
|
||||||
Icon(
|
|
||||||
imageVector = Icons.Filled.Menu,
|
|
||||||
contentDescription = "Menu",
|
|
||||||
Modifier.size(35.dp)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
DropdownMenu(
|
|
||||||
expanded = leMenu, onDismissRequest = { leMenu = false },
|
|
||||||
modifier = Modifier
|
|
||||||
.background(Color.hsl(0.08F, 1F, 0.96F))
|
|
||||||
) {
|
|
||||||
theme.sorted().forEach {
|
|
||||||
DropdownMenuItem(
|
|
||||||
text = {
|
|
||||||
Text(
|
|
||||||
it,
|
|
||||||
style = TextStyle(fontSize = 25.sp),
|
|
||||||
modifier = Modifier
|
|
||||||
.padding(10.dp)
|
|
||||||
)
|
|
||||||
},
|
|
||||||
onClick = { /* faut un moyen d'appeler une methode diff pour chaque, ca doit etre faisable facilement */ }
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
)
|
|
||||||
},
|
|
||||||
bottomBar = {
|
|
||||||
// Faudrait pouvoir faire un flex sur les boutons parce que là ils sont juste côte à côte
|
|
||||||
BottomAppBar(containerColor = Color.Black, contentColor = Color.White) {
|
|
||||||
IconButton(onClick = { /*TODO*/ }) {
|
|
||||||
Icon(
|
|
||||||
imageVector = Icons.Filled.Home,
|
|
||||||
contentDescription = "Home",
|
|
||||||
Modifier.size(35.dp)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
IconButton(onClick = { /*TODO*/ }) {
|
|
||||||
Icon(
|
|
||||||
imageVector = Icons.Filled.Person,
|
|
||||||
contentDescription = "Account",
|
|
||||||
Modifier.size(35.dp)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
) { innerPadding ->
|
|
||||||
Column(
|
|
||||||
modifier = Modifier
|
|
||||||
.padding(innerPadding),
|
|
||||||
verticalArrangement = Arrangement.spacedBy(16.dp),
|
|
||||||
) {
|
|
||||||
AffichageUnArticle(article = article)
|
|
||||||
|
|
||||||
}
|
//TopBarVerax(theme = theme, articles = articlesApi)
|
||||||
}
|
//TopBarVerax(theme = theme, articles = articles)
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
VeraxNavHost()
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun AffichageUnArticle(article : List<String>){
|
|
||||||
Column {
|
|
||||||
for(e in article){
|
|
||||||
Text(text = e)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun HomeScreen(
|
|
||||||
goToArticle: (Article) -> Unit
|
|
||||||
) {
|
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
package com.example.veraxapplication.data
|
||||||
|
/*
|
||||||
|
data class Paragraph(
|
||||||
|
var Content : String,
|
||||||
|
)
|
||||||
|
*/
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.example.veraxapplication.modele
|
||||||
|
|
||||||
|
import retrofit2.Retrofit
|
||||||
|
import retrofit2.converter.gson.GsonConverterFactory
|
||||||
|
|
||||||
|
object RetrofitClient {
|
||||||
|
|
||||||
|
private const val BASE_URL = "http://181.214.189.133:9092/"
|
||||||
|
|
||||||
|
val retrofit: Retrofit by lazy {
|
||||||
|
Retrofit.Builder()
|
||||||
|
.baseUrl(BASE_URL)
|
||||||
|
.addConverterFactory(GsonConverterFactory.create())
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object ApiClient {
|
||||||
|
val apiService: ApiService by lazy {
|
||||||
|
RetrofitClient.retrofit.create(ApiService::class.java)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.example.veraxapplication.modele
|
||||||
|
|
||||||
|
import com.example.veraxapplication.modele.articles.Article
|
||||||
|
import retrofit2.Call
|
||||||
|
import retrofit2.http.GET
|
||||||
|
|
||||||
|
interface ApiService {
|
||||||
|
@GET("articles/")
|
||||||
|
fun getArticles(): Call<List<Article>>
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package com.example.veraxapplication.articles
|
||||||
|
|
||||||
|
import com.example.veraxapplication.modele.articles.Article
|
||||||
|
|
||||||
|
|
||||||
|
interface IArticlesDataManager {
|
||||||
|
val allArticles: List<Any?>?
|
||||||
|
|
||||||
|
fun getArticle(id: Int): Article?
|
||||||
|
fun getDerniersArticles(nbArticles: Int): List<Article>
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package com.example.veraxapplication.modele.articles
|
||||||
|
|
||||||
|
import com.example.veraxapplication.modele.articles.contenus.Contenu
|
||||||
|
|
||||||
|
class Article(
|
||||||
|
val id: Int,
|
||||||
|
val titre: String,
|
||||||
|
val description: String,
|
||||||
|
val temps: String,
|
||||||
|
val date: String,
|
||||||
|
val auteur: String,
|
||||||
|
val imagePrincipale: String
|
||||||
|
) {
|
||||||
|
val note = 1.0
|
||||||
|
private val lContenus: MutableList<Contenu> = java.util.ArrayList()
|
||||||
|
|
||||||
|
init {
|
||||||
|
// Initialisation des contenus si nécessaire
|
||||||
|
}
|
||||||
|
|
||||||
|
fun remplirArticle(lContenus: List<Contenu>?) {
|
||||||
|
if (lContenus != null) {
|
||||||
|
this.lContenus.addAll(lContenus)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val contenus: List<Any>
|
||||||
|
get() = lContenus
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return "Article(id=$id, titre='$titre', description='$description', temps='$temps', date='$date', auteur='$auteur', imagePrincipale='$imagePrincipale', note=$note, contenus=${lContenus.size} contenus)"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.example.veraxapplication.modele.articles.contenus
|
||||||
|
|
||||||
|
|
||||||
|
abstract class Contenu(var id: Int) {
|
||||||
|
var typeContenu: String? = null
|
||||||
|
protected set
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package com.example.veraxapplication.modele.articles.contenus
|
||||||
|
|
||||||
|
class ContenuMedia(id: Int, var titre: String, var lien: String) : Contenu(id) {
|
||||||
|
|
||||||
|
init {
|
||||||
|
this.typeContenu = "image"
|
||||||
|
}
|
||||||
|
|
||||||
|
val contenu: Map<String, String>
|
||||||
|
get() {
|
||||||
|
val contenu: MutableMap<String, String> = HashMap()
|
||||||
|
contenu["titre"] = titre
|
||||||
|
contenu["contenu"] = lien
|
||||||
|
return contenu
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
fun newVideo(id: Int, titre: String, lien: String): ContenuMedia {
|
||||||
|
val temp = ContenuMedia(id, titre, lien)
|
||||||
|
|
||||||
|
temp.typeContenu = "video"
|
||||||
|
return temp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return "$lien\n\n"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.example.veraxapplication.modele.articles.contenus
|
||||||
|
|
||||||
|
class ContenuParagraphe(id: Int, var titre: String, var texte: String) : Contenu(id) {
|
||||||
|
|
||||||
|
init {
|
||||||
|
this.typeContenu = "paragraphe"
|
||||||
|
}
|
||||||
|
|
||||||
|
val contenu: Map<String, String>
|
||||||
|
get() {
|
||||||
|
val contenu: MutableMap<String, String> = HashMap()
|
||||||
|
contenu["titre"] = titre
|
||||||
|
contenu["contenu"] = texte
|
||||||
|
return contenu
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return "$texte \n\n"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package com.example.veraxapplication.navigation
|
||||||
|
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.navigation.compose.NavHost
|
||||||
|
import androidx.navigation.compose.composable
|
||||||
|
import androidx.navigation.compose.rememberNavController
|
||||||
|
import com.example.veraxapplication.MainActivity
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun VeraxNavHost() {
|
||||||
|
|
||||||
|
val navController = rememberNavController()
|
||||||
|
|
||||||
|
NavHost(
|
||||||
|
navController = navController,
|
||||||
|
startDestination = "accueil"
|
||||||
|
){
|
||||||
|
composable(route="accueil"){
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,229 @@
|
|||||||
|
package com.example.veraxapplication.ui.article
|
||||||
|
|
||||||
|
import androidx.compose.foundation.BorderStroke
|
||||||
|
import androidx.compose.foundation.Image
|
||||||
|
import androidx.compose.foundation.background
|
||||||
|
import androidx.compose.foundation.border
|
||||||
|
import androidx.compose.foundation.clickable
|
||||||
|
import androidx.compose.foundation.layout.Box
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.foundation.layout.size
|
||||||
|
import androidx.compose.foundation.rememberScrollState
|
||||||
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
|
import androidx.compose.foundation.verticalScroll
|
||||||
|
import androidx.compose.material3.Button
|
||||||
|
import androidx.compose.material3.ButtonDefaults
|
||||||
|
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.ContentScale
|
||||||
|
import androidx.compose.ui.text.font.FontFamily
|
||||||
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.unit.sp
|
||||||
|
import coil.compose.rememberImagePainter
|
||||||
|
import com.example.veraxapplication.modele.articles.Article
|
||||||
|
import com.example.veraxapplication.modele.articles.contenus.ContenuMedia
|
||||||
|
import com.example.veraxapplication.modele.articles.contenus.ContenuParagraphe
|
||||||
|
import com.example.veraxapplication.ui.theme.Salmon
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun AffichageLesArticles(articles : List<Article>){
|
||||||
|
Column(modifier = Modifier.verticalScroll(rememberScrollState())){
|
||||||
|
for(article in articles){
|
||||||
|
Box (Modifier.clickable { /*faut je regarde la doc*/ }){
|
||||||
|
AffichageUnArticleInfo(e = article)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun AffichageUnArticleInfo(e : Article){
|
||||||
|
Column(modifier = Modifier
|
||||||
|
.padding(7.dp)
|
||||||
|
.border(width = 1.dp, color = Color.Black, shape = RoundedCornerShape(10.dp))
|
||||||
|
.padding(5.dp)) {
|
||||||
|
/*DisplayTitle(title = e.Title)
|
||||||
|
DisplayHeader(author = e.Author, description = e.Description, lectureTime = e.LectureTime)
|
||||||
|
DisplayImage(image = e.Image)
|
||||||
|
DisplayContentArticle(content = e.Content)*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Text(text = e.titre, fontFamily = FontFamily.Serif, fontSize = 30.sp)
|
||||||
|
|
||||||
|
Box(modifier = Modifier
|
||||||
|
.padding(15.dp)
|
||||||
|
.border(width = 1.dp, color = Color.Black, shape = RoundedCornerShape(10.dp))
|
||||||
|
.clip(RoundedCornerShape(10.dp))
|
||||||
|
.background(Salmon)
|
||||||
|
) {
|
||||||
|
Column (modifier = Modifier.padding(15.dp)) {
|
||||||
|
Text(text = "Auteur : "+e.auteur, fontSize = 17.sp)
|
||||||
|
Text(text = "Description : "+e.description, fontSize = 17.sp)
|
||||||
|
Text(text = "Temps de lecture : "+e.temps+" minutes", fontSize = 17.sp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Image(
|
||||||
|
painter = rememberImagePainter(
|
||||||
|
data = e.imagePrincipale
|
||||||
|
),
|
||||||
|
contentScale = ContentScale.Crop,
|
||||||
|
contentDescription = null,
|
||||||
|
modifier = Modifier
|
||||||
|
.size(350.dp)
|
||||||
|
.align(Alignment.CenterHorizontally)
|
||||||
|
.padding(5.dp, 35.dp)
|
||||||
|
)
|
||||||
|
|
||||||
|
Button(onClick = { /*TODO*/ },
|
||||||
|
colors = ButtonDefaults.buttonColors(
|
||||||
|
containerColor = Salmon,
|
||||||
|
contentColor = Color.Black
|
||||||
|
),
|
||||||
|
border = BorderStroke(1.dp, Color.Black),
|
||||||
|
modifier = Modifier
|
||||||
|
.align(Alignment.CenterHorizontally)
|
||||||
|
) {
|
||||||
|
Text(text = "Voir plus")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun AfficherArticle(e : Article){
|
||||||
|
Column(modifier = Modifier
|
||||||
|
.verticalScroll(rememberScrollState())
|
||||||
|
.padding(7.dp)
|
||||||
|
.padding(5.dp)) {
|
||||||
|
|
||||||
|
Text(text = e.titre, fontFamily = FontFamily.Serif, fontSize = 30.sp)
|
||||||
|
|
||||||
|
Box(
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(15.dp)
|
||||||
|
.border(width = 1.dp, color = Color.Black, shape = RoundedCornerShape(10.dp))
|
||||||
|
.clip(RoundedCornerShape(10.dp))
|
||||||
|
.background(Salmon)
|
||||||
|
) {
|
||||||
|
Column(modifier = Modifier.padding(15.dp)) {
|
||||||
|
Text(text = "Auteur : "+e.auteur, fontSize = 17.sp)
|
||||||
|
Text(text = "Description : "+e.description, fontSize = 17.sp)
|
||||||
|
Text(text = "Temps de lecture : " + e.temps + " minutes", fontSize = 17.sp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Image(
|
||||||
|
painter = rememberImagePainter(
|
||||||
|
data = e.imagePrincipale
|
||||||
|
),
|
||||||
|
contentScale = ContentScale.Crop,
|
||||||
|
contentDescription = null,
|
||||||
|
modifier = Modifier
|
||||||
|
.size(350.dp)
|
||||||
|
.align(Alignment.CenterHorizontally)
|
||||||
|
.padding(5.dp, 35.dp)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
Column (modifier = Modifier.align(Alignment.Start)){
|
||||||
|
for (text in e.contenus){
|
||||||
|
when(text){
|
||||||
|
is ContenuMedia -> {
|
||||||
|
Text(text = text.titre, fontSize = 20.sp, fontWeight = FontWeight.Bold)
|
||||||
|
when(text.typeContenu){
|
||||||
|
"image" -> {
|
||||||
|
Image(
|
||||||
|
painter = rememberImagePainter(
|
||||||
|
data = text.lien
|
||||||
|
),
|
||||||
|
contentScale = ContentScale.FillHeight ,
|
||||||
|
contentDescription = null,
|
||||||
|
modifier = Modifier
|
||||||
|
.size(350.dp)
|
||||||
|
.align(Alignment.CenterHorizontally)
|
||||||
|
.padding(5.dp, 35.dp)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
"video" -> {
|
||||||
|
Text(text = "Ici une video ..."+ text.toString(), fontSize = 15.sp, textAlign = TextAlign.Start)
|
||||||
|
//faut je vois comment on fait pour inclure une video ...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
is ContenuParagraphe ->{
|
||||||
|
Text(text = text.titre, fontSize = 20.sp, fontWeight = FontWeight.Bold)
|
||||||
|
Text(text = text.toString(), fontSize = 16.sp, textAlign = TextAlign.Start)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@Composable
|
||||||
|
fun DisplayImage(image: String) {
|
||||||
|
Log.d("DisplayImage", "Chargement de l'image à partir de l'URL : $image")
|
||||||
|
|
||||||
|
Log.d("DisplayImage", "Painter créé avec succès")
|
||||||
|
|
||||||
|
Box(
|
||||||
|
modifier = Modifier.fillMaxSize(),
|
||||||
|
contentAlignment = Alignment.Center
|
||||||
|
) {
|
||||||
|
Image(
|
||||||
|
painter = rememberImagePainter(
|
||||||
|
data = image,
|
||||||
|
builder = {
|
||||||
|
scale(Scale.FILL)
|
||||||
|
}
|
||||||
|
),
|
||||||
|
contentDescription = null,
|
||||||
|
modifier = Modifier.fillMaxSize(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun DisplayHeader(author: String, description: String, lectureTime: String) {
|
||||||
|
Box(modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.border(width = 1.dp, color = Color.Black, shape = RoundedCornerShape(10.dp))
|
||||||
|
.clip(RoundedCornerShape(10.dp))
|
||||||
|
.background(Salmon)
|
||||||
|
.padding(10.dp)) {
|
||||||
|
Column () {
|
||||||
|
Text(text = author)
|
||||||
|
Text(text = description)
|
||||||
|
Text(text = "Lecture Time: " + lectureTime + " minutes")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun DisplayTitle(title: String) {
|
||||||
|
Column(modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally){
|
||||||
|
Text(text = title, fontFamily = FontFamily.Serif, fontSize = 30.sp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun DisplayContentArticle(content: List<Contenu>) {
|
||||||
|
Column {
|
||||||
|
for(e in content){
|
||||||
|
Text(text = e.Content, fontSize = 15.sp, fontFamily = FontFamily.Serif, textAlign = TextAlign.Justify, modifier = Modifier.padding(10.dp))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}*/
|
@ -0,0 +1,136 @@
|
|||||||
|
package com.example.veraxapplication.ui.topBar
|
||||||
|
|
||||||
|
import androidx.compose.foundation.background
|
||||||
|
import androidx.compose.foundation.border
|
||||||
|
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.foundation.layout.size
|
||||||
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.filled.ArrowBack
|
||||||
|
import androidx.compose.material.icons.filled.Menu
|
||||||
|
import androidx.compose.material3.CenterAlignedTopAppBar
|
||||||
|
import androidx.compose.material3.DropdownMenu
|
||||||
|
import androidx.compose.material3.DropdownMenuItem
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
|
import androidx.compose.material3.Icon
|
||||||
|
import androidx.compose.material3.IconButton
|
||||||
|
import androidx.compose.material3.Scaffold
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.runtime.setValue
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
|
import androidx.compose.ui.res.colorResource
|
||||||
|
import androidx.compose.ui.text.TextStyle
|
||||||
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.unit.sp
|
||||||
|
import com.example.veraxapplication.R
|
||||||
|
import com.example.veraxapplication.modele.articles.Article
|
||||||
|
import com.example.veraxapplication.ui.article.AffichageLesArticles
|
||||||
|
import com.example.veraxapplication.ui.article.AfficherArticle
|
||||||
|
import com.example.veraxapplication.ui.theme.Orange
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
|
@Composable
|
||||||
|
fun TopBarVerax(theme: List<String>, articles: List<Article>) {
|
||||||
|
var leMenu by remember {
|
||||||
|
mutableStateOf(false)
|
||||||
|
}
|
||||||
|
Row() {
|
||||||
|
Scaffold(
|
||||||
|
topBar = {
|
||||||
|
CenterAlignedTopAppBar(
|
||||||
|
title = {
|
||||||
|
Text(
|
||||||
|
text = "Verax",
|
||||||
|
style = TextStyle(fontSize = 35.sp),
|
||||||
|
color = colorResource(R.color.red),
|
||||||
|
textAlign = TextAlign.Center,
|
||||||
|
/*backcolor = topAppBarColors(
|
||||||
|
containerColor = MaterialTheme.colorScheme.primaryContainer),*/ //version recommandée par le prof
|
||||||
|
modifier = Modifier.fillMaxWidth()
|
||||||
|
)
|
||||||
|
},
|
||||||
|
navigationIcon = {
|
||||||
|
IconButton(onClick = { /* action() */ }) {
|
||||||
|
Icon(
|
||||||
|
imageVector = Icons.Filled.ArrowBack,
|
||||||
|
contentDescription = "Retour",
|
||||||
|
Modifier.size(30.dp)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
actions = {
|
||||||
|
IconButton(onClick = { leMenu = !leMenu }) {
|
||||||
|
Icon(
|
||||||
|
imageVector = Icons.Filled.Menu,
|
||||||
|
contentDescription = "Menu",
|
||||||
|
Modifier.size(35.dp)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
DropdownMenu(
|
||||||
|
expanded = leMenu, onDismissRequest = { leMenu = false },
|
||||||
|
modifier = Modifier
|
||||||
|
.border(width = 1.dp, color = Color.Black, shape = RoundedCornerShape(10.dp))
|
||||||
|
.background(Orange)
|
||||||
|
) {
|
||||||
|
theme.sorted().forEach {
|
||||||
|
DropdownMenuItem(
|
||||||
|
text = {
|
||||||
|
Text(
|
||||||
|
it,
|
||||||
|
style = TextStyle(fontSize = 25.sp),
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(10.dp)
|
||||||
|
)
|
||||||
|
},
|
||||||
|
onClick = { /* faut un moyen d'appeler une methode diff pour chaque, ca doit etre faisable facilement */ }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
)
|
||||||
|
}/*,
|
||||||
|
bottomBar = {
|
||||||
|
// Faudrait pouvoir faire un flex sur les boutons parce que là ils sont juste côte à côte
|
||||||
|
BottomAppBar(containerColor = Color.Black, contentColor = Color.White) {
|
||||||
|
IconButton(onClick = { /*TODO*/ }) {
|
||||||
|
Icon(
|
||||||
|
imageVector = Icons.Filled.Home,
|
||||||
|
contentDescription = "Home",
|
||||||
|
Modifier.size(35.dp)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
IconButton(onClick = { /*TODO*/ }) {
|
||||||
|
Icon(
|
||||||
|
imageVector = Icons.Filled.Person,
|
||||||
|
contentDescription = "Account",
|
||||||
|
Modifier.size(35.dp)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
) { innerPadding ->
|
||||||
|
Column(
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(innerPadding),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(16.dp),
|
||||||
|
) {
|
||||||
|
|
||||||
|
AffichageLesArticles(articles = articles)
|
||||||
|
// AfficherArticle(articles.get(0));
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue