This commit is contained in:
dotmg 2025-07-07 15:11:51 +02:00
parent 2657b64f35
commit 82f0624095
89 changed files with 406 additions and 111 deletions

View file

@ -9,6 +9,7 @@ plugins {
alias(libs.plugins.composeMultiplatform) alias(libs.plugins.composeMultiplatform)
alias(libs.plugins.composeCompiler) alias(libs.plugins.composeCompiler)
alias(libs.plugins.composeHotReload) alias(libs.plugins.composeHotReload)
alias(libs.plugins.kotlinSerialization)
} }
kotlin { kotlin {
@ -31,6 +32,7 @@ kotlin {
} }
commonMain.dependencies { commonMain.dependencies {
implementation(compose.components.resources)
implementation(compose.runtime) implementation(compose.runtime)
implementation(compose.foundation) implementation(compose.foundation)
implementation(compose.material3) implementation(compose.material3)
@ -45,6 +47,7 @@ kotlin {
implementation(libs.core) // Dépendance sous-jacente pour XML implementation(libs.core) // Dépendance sous-jacente pour XML
implementation(libs.serialization) implementation(libs.serialization)
api(libs.kmp.observableviewmodel.core) api(libs.kmp.observableviewmodel.core)
implementation(libs.kotlinx.serialization.json)
} }
commonTest.dependencies { commonTest.dependencies {
implementation(libs.kotlin.test) implementation(libs.kotlin.test)

View file

@ -24,4 +24,5 @@ class AndroidApp: Application {
// val fileRepository = org.koin.core.context.GlobalContext.get().get<FileRepository>() // val fileRepository = org.koin.core.context.GlobalContext.get().get<FileRepository>()
// println("Koin et FileRepository initialisés dans AndroidApp: $fileRepository") // println("Koin et FileRepository initialisés dans AndroidApp: $fileRepository")
} }
} }

View file

@ -2,13 +2,26 @@ package mg.dot.feufaro.di
import android.content.Context import android.content.Context
import mg.dot.feufaro.AndroidFileRepository // Import the actual Android implementation import mg.dot.feufaro.AndroidFileRepository // Import the actual Android implementation
import mg.dot.feufaro.config.AppConfig
import org.koin.core.module.dsl.singleOf // Import for Koin DSL import org.koin.core.module.dsl.singleOf // Import for Koin DSL
import org.koin.core.module.dsl.bind // Import for Koin DSL import org.koin.core.module.dsl.bind // Import for Koin DSL
import org.koin.dsl.module import org.koin.dsl.module
import mg.dot.feufaro.FileRepository
import org.koin.android.ext.koin.androidContext // Import for androidContext() import org.koin.android.ext.koin.androidContext // Import for androidContext()
val androidModule = module { val androidModule = module {
// Koin will automatically provide the Android Context because you called androidContext() in AndroidApp. // Koin will automatically provide the Android Context because you called androidContext() in AndroidApp.
// It then uses this Context to construct AndroidFileRepository. // It then uses this Context to construct AndroidFileRepository.
singleOf(::AndroidFileRepository) { bind<FileRepository>() } singleOf(::AndroidFileRepository) { bind<FileRepository>() }
single<AppConfig> {
AppConfig(
transposeto = "C",
transposeasif = "C",
buttonContainerColorHex = "#ff00f0",
buttonContentColorHex = "#ffffff",
buttonDisabledContainerColorHex = "#999999",
buttonDisabledContentColorHex = "#ffffff",
)
}
} }

View file

@ -0,0 +1,19 @@
{
"themeMode": "DARK",
"fontSize": 18.5,
"playlist": [
"assets://ews-456.txt",
"assets://ews-1.txt",
"assets://ews-2.txt",
"assets://ews-3.txt",
"assets://ews-4.txt",
"assets://ews-5.txt",
"assets://ews-6.txt",
"assets://ews-7.txt",
"assets://ews-8.txt"
],
"buttonContainerColorHex": "#FFFF8855",
"buttonContentColorHex": "#FF000055",
"buttonDisabledContainerColorHex": "#FF888888",
"buttonDisabledContentColorHex": "#FF5555AA"
}

View file

@ -2,8 +2,8 @@ M0:|c:G|m:3/4|r:11.11.11.11.12.12.11.11|t:456 - To God Be The Glory|n:15|l:10|a:
T0:{:D|(D:D):D.D|D:D:D|D:D:D|D:-/D|D:D:D|D:D:D|D:D:(D.D)|D:-/D|(D:D):D.D|D:D:D|D:D:D|D:-/D|D:D:D|D:D:D|D:D:D|D:-/D.,D|D:-:D.,D|D:-:D.,D|D:D:D|D:-/D.,D|D:-:D.,D|D:-:D.D|D:D:D|D:-/D|(D:D):D.D|D:D:D|D:D:D|D:-/D|D:D:D|D:D:D|D:D:D|D:-} T0:{:D|(D:D):D.D|D:D:D|D:D:D|D:-/D|D:D:D|D:D:D|D:D:(D.D)|D:-/D|(D:D):D.D|D:D:D|D:D:D|D:-/D|D:D:D|D:D:D|D:D:D|D:-/D.,D|D:-:D.,D|D:-:D.,D|D:D:D|D:-/D.,D|D:-:D.,D|D:-:D.D|D:D:D|D:-/D|(D:D):D.D|D:D:D|D:D:D|D:-/D|D:D:D|D:D:D|D:D:D|D:-}
N1:s,s,-l,t,ds,drs,rm/mfl,fmdmmrl,-r/s,s,-l,t,ds,drs,rm/msfrdt,dmmrd/mfsmfssmdrmr/rmfrmffrssfm/s,s,-l,t,ds,drs,rm/msfrdt,dmmrd N1:s,s,-l,t,ds,drs,rm/mfl,fmdmmrl,-r/s,s,-l,t,ds,drs,rm/msfrdt,dmmrd/mfsmfssmdrmr/rmfrmffrssfm/s,s,-l,t,ds,drs,rm/msfrdt,dmmrd
N2:m,m,s,f,f,m,m,s,s,s,s,s,/s,l,f,l,s,s,s,F,F,l,-s,/f,m,s,f,f,m,m,s,s,s,s,s,/T,l,l,l,s,s,s,s,s,f,m,/s,s,ds,s,ds,s,s,s,s,s,/s,dt,t,dt,s,s,s,s,s,s,/m,m,s,f,f,m,m,s,s,s,s,s,/T,l,l,l,s,s,s,s,s,f,m, N2:m,m,s,f,f,m,m,s,s,s,s,s,/s,l,f,l,s,s,s,F,F,l,-s,/f,m,s,f,f,m,m,s,s,s,s,s,/T,l,l,l,s,s,s,s,s,f,m,/s,s,ds,s,ds,s,s,s,s,s,/s,dt,t,dt,s,s,s,s,s,s,/m,m,s,f,f,m,m,s,s,s,s,s,/T,l,l,l,s,s,s,s,s,f,m,
N3:ss-frrssfffs/s7mmlsf/fs-frrssfffs/ssld'tltssfs/sltslttssfsf/fsllsllfssfs/ss-frrssfffs/ssld'tltssfs N3:dd-t,s,s,ddt,t,t,d/d7l,l,rdt,/t,d-t,s,s,ddt,t,t,d/ddrfmrmddt,d/drmdrmmddt,dt,/t,drrdrrt,ddt,d/dd-t,s,s,ddt,t,t,d/ddrfmrmddt,d
N4:s,s,t,rrs,s,t,rrrs/sddds,t,s,l,l,D-r/rs,t,rrs,s,t,rrrs/sdddr6s,/s7s,t,l,s,r/r7dt,t,l,s,/s,s,t,rrs,s,t,rrrs/sdddrrrrrrs, N4:d,d,m,s,s,d,d,m,s,s,s,d/dfffd,m,d,r,r,F-s,/s,d,m,s,s,d,d,m,s,s,s,d/dfffs,6d,/d7d,m,r,d,s,/s,7fm,m,r,d,/d,d,m,s,s,d,d,m,s,s,s,d/dfffs,s,s,s,s,s,d,
E1:To God be the glo_ry, great things He has done,/so loved He the world that He gave us His Son,/who yield_ed His life an a_tone_ment for sin,/and o_pened the life gate that all may go in./Praise the Lord, praise the Lord, let the earth hear His voice!/Praise the Lord, praise the Lord, let the peo_ple re_joice!/O come to the Fa_ther through Je_sus the Son, and give Him the glo_ry, great things He has done. E1:To God be the glo_ry, great things He has done,/so loved He the world that He gave us His Son,/who yield_ed His life an a_tone_ment for sin,/and o_pened the life gate that all may go in./Praise the Lord, praise the Lord, let the earth hear His voice!/Praise the Lord, praise the Lord, let the peo_ple re_joice!/O come to the Fa_ther through Je_sus the Son, and give Him the glo_ry, great things He has done.
E2:O per_fect re_demp_tion, the pur_chase of blood,/to ev'_ry be_lie_ver the pro_mise of God;/the vi_lest of_fen_der who tru_ly be_lieves,/that mo_ment from Je_sus a par_don re_ceives. E2:O per_fect re_demp_tion, the pur_chase of blood,/to ev'_ry be_lie_ver the pro_mise of God;/the vi_lest of_fen_der who tru_ly be_lieves,/that mo_ment from Je_sus a par_don re_ceives.
E3:Great things He has taught us, great things He has done,/and great our re_joi_cing through Je_sus the Son;/but pu_rer, and high_er, and great_er will be/our won_der, our rap_ture, when Je_sus we see. E3:Great things He has taught us, great things He has done,/and great our re_joi_cing through Je_sus the Son;/but pu_rer, and high_er, and great_er will be/our won_der, our rap_ture, when Je_sus we see.

View file

@ -5,7 +5,7 @@ N2:ddt,ddt,t,ddd/dddddrdt,/rmmrddt,ss/FssmsssFs/rrddddddd/rmmmrsf-m
N3:m(ssd)rffsfm/sffmdsss/ttd'ssFsst/lr'td'r'd'd'-t/sssssfffm/sld'd'sslts N3:m(ssd)rffsfm/sffmdsss/ttd'ssFsst/lr'td'r'd'd'-t/sssssfffm/sld'd'sslts
N4:dds,l,s,rrmfd/df,s,s,l,t,ds,/smdt,l,rs,mr/dt,mdt,l,r-s,/t,ddT,l,s,f,l,d/t,l,lsfmfsd N4:dds,l,s,rrmfd/df,s,s,l,t,ds,/smdt,l,rs,mr/dt,mdt,l,r-s,/t,ddT,l,s,f,l,d/t,l,lsfmfsd
Y1:Ny andron'ny fahaso_avana/Miposaka ho antsika/Manerana\ izao tontolo\ izao/Ny tarany efa hita/Ka ravo ny olombelona,/Fa lasa ny alintsika Y1:Ny andron'ny fahaso_avana/Miposaka ho antsika/Manerana\ izao tontolo\ izao/Ny tarany efa hita/Ka ravo ny olombelona,/Fa lasa ny alintsika
Y2:Niova tery ny alina/Fa teraka ny Mpamonjy,/Mamiratra be ny lanitra/Miseho izao re ny vonjy,/Ka lasa tokoa ny aizina,/Mihoby ny vo_avonjy Y2:Ni_o_va tery ny _alina/Fa teraka ny Mpamonjy,/Mamiratra be ny lanitra/Miseho\ izao re ny vonjy,/Ka lasa tokoa ny aizina,/Mihoby ny vo_avonjy
Y3:Na dia ho nahay nihira re/Ny hazo an'ala rehetra,/Ka afa-mikalo ny ravina/Hidera ny Avo Indrindra,/Tsy ampy ho fanandratana/Ny Tompon'ny ain-drehetra. Y3:Na dia ho nahay ni_2hira re/Ny hazo an'ala re\hetra,/Ka afa-mikalo\ ny ravina/Hidera ny Avo\ Indrindra,/Tsy ampy ho fanandratana/Ny Tompon'ny ain-drehetra.
Y4:Ny fe_on'ny olonao izao/Misandratra, ry Jehovah/Hidera ny fiti_avanao/Sy ny indrafonao so_a/Ni_aro ny fi_angonanao/Hatramin'ny fahagola. Y4:Ny fe_on'ny olo_2nao izao/Misandratra, ry Jehova\h/Hidera ny fiti_avanao/Sy ny indrafonao so_a/Ni_aro ny fi_angonanao/Hatramin'ny fahagola.
Y5:Ho any an-tanindrazanay/I\zahay re, ry Ray Tsitoha,/Ka hiditra ao an-tranon-dRay/Nomanin'Ilay Mpialoha;/Ny olonao dia ho tafaray/Hidera Anao tokoa! Y5:Ho any an-tani_2ndrazanay/I\zahay re, ry Ray Tsitoha,/Ka hiditra ao an-tranon-dRay/Nomanin'Ilay Mpialoha;/Ny olonao dia ho tafaray/Hidera Anao toko_a!

View file

@ -2,55 +2,204 @@ package mg.dot.feufaro
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeContentPadding import androidx.compose.foundation.layout.safeContentPadding
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.ui.tooling.preview.Preview import org.jetbrains.compose.ui.tooling.preview.Preview
import mg.dot.feufaro.musicXML.MusicXML
import feufaro.composeapp.generated.resources.Res import feufaro.composeapp.generated.resources.Res
import feufaro.composeapp.generated.resources.compose_multiplatform import feufaro.composeapp.generated.resources.compose_multiplatform
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import mg.dot.feufaro.solfa.LazyVerticalGridTUO
import mg.dot.feufaro.solfa.Solfa
import org.koin.compose.koinInject import org.koin.compose.koinInject
@Composable @Composable
@Preview @Preview
fun App() { fun App(sharedViewModel: SharedViewModel = SharedViewModel()
) {
val fileRepository = koinInject<FileRepository>() val fileRepository = koinInject<FileRepository>()
var fileContent by remember { mutableStateOf("Chargement asset ....") }
val displayConfigManager = koinInject<DisplayConfigManager>()
val currentDisplayConfig by displayConfigManager.displayConfig.collectAsState()
// Load Configurations
val configScope = CoroutineScope(Dispatchers.Default)
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
try { configScope.launch {
fileContent = "xxx"+ fileRepository.readFileContent("assets://ews-1.txt") try {
}catch (e: Exception) { displayConfigManager.loadConfigFromFile("assets://config.json")
fileContent = "Erreur : ${e.message}" } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
}
} }
} }
MaterialTheme { val solfa = Solfa(sharedViewModel, fileRepository)
var showContent by remember { mutableStateOf(false) } LaunchedEffect(currentDisplayConfig) {
Column( if (currentDisplayConfig.playlist.isNotEmpty()) {
modifier = Modifier try {
.safeContentPadding() sharedViewModel.setPlaylist(currentDisplayConfig.playlist)
.fillMaxSize(), solfa.loadNextInPlaylist()
horizontalAlignment = Alignment.CenterHorizontally, } catch (e: Exception) {
) { println("Error loading playlist : ${e.message}")
Text(text = fileContent)
Button(onClick = { showContent = !showContent }) {
Text("Click me!")
} }
AnimatedVisibility(showContent) { }
val greeting = remember { Greeting().greet() } }
Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {
Image(painterResource(Res.drawable.compose_multiplatform), null) val musicXML = MusicXML(fileRepository)
Text("Compose: $greeting") // Start App
//solfa.parse()
MaterialTheme {
MaterialTheme {
var showContent by remember { mutableStateOf(false) }
var gridWidthPx by remember { mutableStateOf(0) }
Column(Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally) {
Column(
modifier = Modifier
.fillMaxWidth()
.weight(1f)
.verticalScroll(rememberScrollState())
) {
val stanza: Int by sharedViewModel.stanza.collectAsState()
FlowRow(
modifier = Modifier.fillMaxWidth()
.windowInsetsPadding(WindowInsets.safeDrawing)
.padding(start = 8.dp, end = 8.dp, top = 8.dp),
horizontalArrangement = Arrangement.spacedBy(16.dp),
verticalArrangement = Arrangement.spacedBy(4.dp)
) {
val measureString: String by sharedViewModel.measure.collectAsState()
val songTitle: String by sharedViewModel.songTitle.collectAsState()
val songKey: String by sharedViewModel.songKey.collectAsState()
Text(text = songTitle, fontWeight = FontWeight.Bold)
Text(
text = songKey,
modifier = Modifier.background(Color(0xff, 0xea, 0xe7))
.padding(horizontal = 4.dp)
)
Text(text = measureString)
Text(text = "Stanza: $stanza")
val songAuthor: String by sharedViewModel.songAuthor.collectAsState()
val songComposer: String by sharedViewModel.songComposer.collectAsState()
val songRhythm: String by sharedViewModel.songRhythm.collectAsState()
val nbStanzas: Int by sharedViewModel.nbStanzas.collectAsState()
Text(text = songAuthor, fontStyle = FontStyle.Italic)
Text(text = songRhythm)
Text(text = songComposer)
Row() {
for (i in 1..nbStanzas) {
MGButton(
enabled = (i != stanza.toInt()),
onClick = {
sharedViewModel.setStanza(i.toString())
},
modifier = Modifier.padding(horizontal = 4.dp)
) {
Text("$i")
}
}
}
}
LazyVerticalGridTUO(
sharedViewModel,
gridWidthPx = gridWidthPx,
onGridWidthMeasured = { width -> gridWidthPx = width }
)
MGButton(onClick = {
//showContent = !showContent
solfa.loadNextInPlaylist()
}, modifier = Modifier.height(40.dp)) {
val debugData: String by sharedViewModel.data.collectAsState()
Text(debugData)
}
AnimatedVisibility(showContent) {
val greeting = remember { Greeting().greet() }
Column(
Modifier.fillMaxWidth().height(180.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Image(painterResource(Res.drawable.compose_multiplatform), null)
Text("Compose: $greeting")
}
}
} }
} }
} }
} }
}
fun String?.toColor(foreGround: Boolean = false): Color {
val defaultColor = if (foreGround) {
"00FFFFFF"
} else {
"00008800"
}
var hex = this?.removePrefix("#") ?: defaultColor
if (hex.length == 6) {
hex = "00" + hex
}
val red = hex.substring(2, 4).toInt(16)
val green = hex.substring(4, 6).toInt(16)
val blue = hex.substring(6, 8).toInt(16)
return try {
Color(red, green, blue)
} catch (e: NumberFormatException) {
if (foreGround) Color.White else Color.Black
}
}
@Composable
fun MGButton(
onClick: () -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
content: @Composable RowScope.() -> Unit
) {
val displayConfigManager = koinInject<DisplayConfigManager>()
val currentDisplayConfig by displayConfigManager.displayConfig.collectAsState()
val buttonColors = ButtonDefaults.buttonColors(
containerColor = currentDisplayConfig.buttonContainerColorHex.toColor(),
disabledContainerColor = currentDisplayConfig.buttonDisabledContainerColorHex.toColor(),
contentColor = currentDisplayConfig.buttonDisabledContentColorHex.toColor(),
disabledContentColor = currentDisplayConfig.buttonDisabledContentColorHex.toColor()
)
Button(
onClick = onClick,
modifier = modifier,
enabled = enabled,
colors = buttonColors,
content = content
)
} }

View file

@ -0,0 +1,65 @@
package mg.dot.feufaro
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import mg.dot.feufaro.config.AppConfigJson
import mg.dot.feufaro.config.DisplayConfig
import kotlinx.serialization.json.Json
import kotlin.String
import kotlinx.serialization.Serializable
@Serializable
data class AppConfigJson(
val themeMode: String? = null,
val fontSize: Float? = null,
val playlist: List<String>? = null,
val buttonContainerColorHex: String? = null,
val buttonContentColorHex: String? = null,
val buttonDisabledContainerColorHex: String? = null,
val buttonDisabledContentColorHex: String? = null
)
fun AppConfigJson.toDisplayConfig(defaultConfig: DisplayConfig): DisplayConfig {
return DisplayConfig(
themeMode = this.themeMode,
fontSize = this.fontSize,
playlist = this.playlist,
buttonContainerColorHex = this.buttonContainerColorHex,
buttonContentColorHex = this.buttonContentColorHex,
buttonDisabledContainerColorHex = this.buttonDisabledContainerColorHex,
buttonDisabledContentColorHex = this.buttonDisabledContentColorHex
)
}
class DisplayConfigManager(
private val fileRepository: FileRepository
)
{
private val _displayConfig = MutableStateFlow(
DisplayConfig(
themeMode = "SYSTEM",
fontSize = 16f,
playlist = listOf(),
buttonContainerColorHex = "#FF000000",
buttonContentColorHex = "#FFFFFFFF",
buttonDisabledContainerColorHex = "#FF888888",
buttonDisabledContentColorHex = "#FFAA6666"
),
)
val displayConfig: StateFlow<DisplayConfig> = _displayConfig.asStateFlow()
suspend fun loadConfigFromFile(filePath: String) {
try {
val jsonString = fileRepository.readFileContent(filePath)
val appConfigJson = Json.decodeFromString<AppConfigJson>(jsonString)
_displayConfig.value = appConfigJson.toDisplayConfig(_displayConfig.value)
} catch (e: Exception) {
println("DisplayConfigManager Error 22: ${e.message}")
e.printStackTrace()
}
}
// NOUVELLE MÉTHODE : Pour basculer le mode débogage
}

View file

@ -0,0 +1,9 @@
package mg.dot.feufaro.config
import kotlinx.serialization.Serializable
@Serializable
data class AppConfig (
val transposeto: String ,
val transposeasif: String,
)

View file

@ -0,0 +1,31 @@
package mg.dot.feufaro.config
import kotlinx.serialization.Serializable
// Cette classe représente la structure de votre fichier JSON de configuration.
// Elle doit être @Serializable pour être désérialisée.
@Serializable
data class AppConfigJson(
val themeMode: String = "SYSTEM", // Utilisez String pour la sérialisation de l'enum
val fontSize: Float = 16f,
val playlist: List<String>,
val buttonContainerColorHex: String,
val buttonContentColorHex: String ,
val buttonDisabledContainerColorHex: String,
val buttonDisabledContentColorHex: String ,
)
// Vous pouvez ajouter une fonction d'extension pour convertir AppConfigJson en DisplayConfig
fun AppConfigJson.toDisplayConfig(): DisplayConfig {
return DisplayConfig(
themeMode = this.themeMode.uppercase(), // Convertir String en Enum
fontSize = this.fontSize,
playlist = this.playlist,
buttonDisabledContainerColorHex = this.buttonDisabledContainerColorHex,
buttonDisabledContentColorHex = this.buttonDisabledContentColorHex,
buttonContainerColorHex = this.buttonContainerColorHex,
buttonContentColorHex = this.buttonContentColorHex
)
}

View file

@ -0,0 +1,15 @@
package mg.dot.feufaro.config
import kotlinx.serialization.Serializable
@Serializable
data class DisplayConfig (
val themeMode: String,
val fontSize: Float,
val playlist: List<String>,
val buttonContainerColorHex: String,
val buttonContentColorHex: String ,
val buttonDisabledContainerColorHex: String,
val buttonDisabledContentColorHex: String ,
)

View file

@ -1,13 +1,18 @@
package mg.dot.feufaro.di package mg.dot.feufaro.di
import mg.dot.feufaroo.musicXML.MusicXML import mg.dot.feufaro.FileRepository
import mg.dot.feufaro.DisplayConfigManager // Importez DisplayConfigManager
import mg.dot.feufaro.config.AppConfig
import mg.dot.feufaro.musicXML.MusicXML
import org.koin.dsl.module import org.koin.dsl.module
import org.koin.core.module.dsl.singleOf import org.koin.core.module.dsl.singleOf
import org.koin.core.module.Module
val commonModule = module { val commonModule = module {
// Déclarez FileRepository comme un singleton. // Déclarez FileRepository comme un singleton.
// L'implémentation concrète (actual) sera résolue par Koin en fonction de la plateforme. // L'implémentation concrète (actual) sera résolue par Koin en fonction de la plateforme.
// Pour Android, Koin injectera le Context que vous avez fourni via androidContext(). // Pour Android, Koin injectera le Context que vous avez fourni via androidContext().
singleOf(::MusicXML) singleOf(::MusicXML)
single { DisplayConfigManager(fileRepository = get())}
} }

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XML import nl.adaptivity.xmlutil.serialization.XML

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlSerialName import nl.adaptivity.xmlutil.serialization.XmlSerialName

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlElement

View file

@ -1,4 +1,4 @@
package mg.dot.feufaroo.musicXML package mg.dot.feufaro.musicXML
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers

View file

@ -1,11 +1,12 @@
package mg.dot.feufaro package mg.dot.feufaro
import feufaro.composeapp.generated.resources.Res
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import mg.dot.feufaro.FileRepository
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
// This is just a regular class that implements the common 'FileRepository' interface. // This is just a regular class that implements the common 'FileRepository' interface.
// It is NOT an 'actual' declaration of 'FileRepository'. // It is NOT an 'actual' declaration of 'FileRepository'.
class DesktopFileRepository : FileRepository { // IMPORTS AND IMPLEMENTS THE commonMain 'FileRepository' interface class DesktopFileRepository : FileRepository { // IMPORTS AND IMPLEMENTS THE commonMain 'FileRepository' interface
@ -28,22 +29,13 @@ class DesktopFileRepository : FileRepository { // IMPORTS AND IMPLEMENTS THE com
val lines = readFileLines(filePath) val lines = readFileLines(filePath)
lines.joinToString("\n") { it } lines.joinToString("\n") { it }
} }
private fun readAssetFileLines(assetFileName: String): List<String> { private suspend fun readAssetFileLines(assetFileName: String): List<String> {
return try { return try {
//myApplicationContext.assets.open(filename.removePrefix("assets://")).bufferedReader().use { Res.readBytes("files/"+assetFileName.removePrefix("assets://")).decodeToString().split("\n")
object {}.javaClass.getResource("/"+assetFileName.removePrefix("assets://")).readText().split("\n")
} catch (e: IOException) { } catch (e: IOException) {
println("Could not read /"+assetFileName.removePrefix("assets://"))
throw IOException("Could not read asset file: $assetFileName", e) throw IOException("Could not read asset file: $assetFileName", e)
} }
} }
private fun readAssetFileContent(assetFileName: String): String {
return try {
//myApplicationContext.assets.open(filename.removePrefix("assets://")).bufferedReader().use {
object {}.javaClass.getResource("/"+assetFileName.removePrefix("assets://")).readText()
} catch (e: IOException) {
throw IOException("Could not read asset file: $assetFileName", e)
}
}
} }

View file

@ -5,9 +5,16 @@ import org.koin.core.module.dsl.singleOf // Import for Koin DSL
import org.koin.core.module.dsl.bind // Import for Koin DSL import org.koin.core.module.dsl.bind // Import for Koin DSL
import org.koin.dsl.module import org.koin.dsl.module
import mg.dot.feufaro.FileRepository import mg.dot.feufaro.FileRepository
import mg.dot.feufaro.config.AppConfig
val desktopModule = module { val desktopModule = module {
// When Koin is initialized on Desktop, it will use DesktopFileRepository // When Koin is initialized on Desktop, it will use DesktopFileRepository
// as the implementation for the FileRepository interface. // as the implementation for the FileRepository interface.
singleOf(::DesktopFileRepository) { bind<FileRepository>() } singleOf(::DesktopFileRepository) { bind<FileRepository>() }
single<AppConfig> {
AppConfig(
transposeto = "C",
transposeasif = "C"
)
}
} }

View file

@ -19,7 +19,7 @@ kotlinx-coroutines = "1.10.2"
koin = "4.0.4" koin = "4.0.4"
core = "0.91.1" core = "0.91.1"
kmpObservableviewmodelCore = "1.0.0-BETA-3" kmpObservableviewmodelCore = "1.0.0-BETA-3"
kotlinxSerializationJson = "1.8.1"
[libraries] [libraries]
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
@ -45,6 +45,7 @@ core = { module = "io.github.pdvrieze.xmlutil:core", version.ref = "core" }
#core-jdk = { module = "io.github.pdvrieze.xmlutil:core-jdk", version.ref = "core" } #core-jdk = { module = "io.github.pdvrieze.xmlutil:core-jdk", version.ref = "core" }
serialization = { module = "io.github.pdvrieze.xmlutil:serialization", version.ref = "core" } serialization = { module = "io.github.pdvrieze.xmlutil:serialization", version.ref = "core" }
kmp-observableviewmodel-core = { module = "com.rickclephas.kmp:kmp-observableviewmodel-core", version.ref = "kmpObservableviewmodelCore" } kmp-observableviewmodel-core = { module = "com.rickclephas.kmp:kmp-observableviewmodel-core", version.ref = "kmpObservableviewmodelCore" }
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" }
[plugins] [plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" } androidApplication = { id = "com.android.application", version.ref = "agp" }
@ -53,3 +54,4 @@ composeHotReload = { id = "org.jetbrains.compose.hot-reload", version.ref = "com
composeMultiplatform = { id = "org.jetbrains.compose", version.ref = "composeMultiplatform" } composeMultiplatform = { id = "org.jetbrains.compose", version.ref = "composeMultiplatform" }
composeCompiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } composeCompiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin"}

View file

@ -3,13 +3,7 @@ enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
pluginManagement { pluginManagement {
repositories { repositories {
google { google()
mavenContent {
includeGroupAndSubgroups("androidx")
includeGroupAndSubgroups("com.android")
includeGroupAndSubgroups("com.google")
}
}
mavenCentral() mavenCentral()
gradlePluginPortal() gradlePluginPortal()
} }
@ -17,19 +11,9 @@ pluginManagement {
dependencyResolutionManagement { dependencyResolutionManagement {
repositories { repositories {
google { google()
mavenContent {
includeGroupAndSubgroups("androidx")
includeGroupAndSubgroups("com.android")
includeGroupAndSubgroups("com.google")
}
}
mavenCentral() mavenCentral()
} }
} }
plugins {
id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
}
include(":composeApp") include(":composeApp")