diff --git a/app-desktop/build.gradle.kts b/app-desktop/build.gradle.kts new file mode 100644 index 000000000..23e29b17d --- /dev/null +++ b/app-desktop/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + id("droidkaigi.primitive.kmp.desktop") +} + +kotlin { + sourceSets { + commonMain { + dependencies { + implementation(libs.kotlinxCoroutinesCore) + } + } + desktopMain { + dependencies { + implementation(libs.kotlinxCoroutinesSwing) + } + } + } +} diff --git a/app-desktop/iconFiles/desktop-icon.png b/app-desktop/iconFiles/desktop-icon.png new file mode 100644 index 000000000..0ddb3f458 Binary files /dev/null and b/app-desktop/iconFiles/desktop-icon.png differ diff --git a/app-desktop/src/commonMain/kotlin/io/github/droidkaigi/confsched/DesktopKaigiApp.kt b/app-desktop/src/commonMain/kotlin/io/github/droidkaigi/confsched/DesktopKaigiApp.kt new file mode 100644 index 000000000..0ebcebfd5 --- /dev/null +++ b/app-desktop/src/commonMain/kotlin/io/github/droidkaigi/confsched/DesktopKaigiApp.kt @@ -0,0 +1,25 @@ +package io.github.droidkaigi.confsched + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.window.Window +import androidx.compose.ui.window.application + +fun main() { + application { + Window( + onCloseRequest = ::exitApplication, + title = "KaigiApp", + ) { + MaterialTheme { + Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) { + Text("Hello KaigiApp!") + } + } + } + } +} diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts index 5e3769751..66c353ed4 100644 --- a/build-logic/build.gradle.kts +++ b/build-logic/build.gradle.kts @@ -79,6 +79,10 @@ gradlePlugin { id = "droidkaigi.primitive.kmp.compose" implementationClass = "io.github.droidkaigi.confsched.primitive.KmpComposePlugin" } + register("kotlinMppDesktop") { + id = "droidkaigi.primitive.kmp.desktop" + implementationClass = "io.github.droidkaigi.confsched.primitive.KmpDesktopPlugin" + } register("kotlinMppRoborazzi") { id = "droidkaigi.primitive.kmp.roborazzi" implementationClass = "io.github.droidkaigi.confsched.primitive.KmpRoborazziPlugin" diff --git a/build-logic/src/main/kotlin/io/github/droidkaigi/confsched/primitive/KmpDesktopPlugin.kt b/build-logic/src/main/kotlin/io/github/droidkaigi/confsched/primitive/KmpDesktopPlugin.kt new file mode 100644 index 000000000..006fd9aa2 --- /dev/null +++ b/build-logic/src/main/kotlin/io/github/droidkaigi/confsched/primitive/KmpDesktopPlugin.kt @@ -0,0 +1,62 @@ +package io.github.droidkaigi.confsched.primitive + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.get +import org.jetbrains.compose.desktop.application.dsl.TargetFormat + +@Suppress("unused") +class KmpDesktopPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + + with(pluginManager) { + apply("droidkaigi.primitive.kmp") + apply("droidkaigi.primitive.kmp.compose") + } + + kotlin { + jvm("desktop") + + with(sourceSets) { + getByName("desktopMain").apply { + dependencies { + implementation(compose.dependencies.desktop.currentOs) + } + } + } + } + + val compose = extensions["compose"] as org.jetbrains.compose.ComposeExtension + compose.extensions.configure { + application { + mainClass = "io.github.droidkaigi.confsched.DesktopKaigiAppKt" + + nativeDistributions { + // TODO: set output formats of each platform + targetFormats(TargetFormat.Dmg, /*TargetFormat.Msi, TargetFormat.Deb*/) + packageName = "io.github.droidkaigi.confsched" + packageVersion = "1.0.0" + + val iconsRoot = project.file("iconFiles") + macOS { + // TODO: set an icon file ( set a temporal icon currently. ) + iconFile.set(iconsRoot.resolve("desktop-icon.png")) + } + // Setup Windows and Linux configuration if needed. +// windows { +// iconFile.set(iconsRoot.resolve("icon-windows.ico")) +// menuGroup = "Compose Examples" +// // see https://wixtoolset.org/documentation/manual/v3/howtos/general/generate_guids.html +// upgradeUuid = "18159995-d967-4CD2-8885-77BFA97CFA9F" +// } +// linux { +// iconFile.set(iconsRoot.resolve("icon-linux.png")) +// } + } + } + } + } + } +} diff --git a/core/designsystem/src/desktopMain/kotlin/io/github/droidkaigi/confsched/designsystem/theme/Type.desktop.kt b/core/designsystem/src/desktopMain/kotlin/io/github/droidkaigi/confsched/designsystem/theme/Type.desktop.kt new file mode 100644 index 000000000..5e8c95ef3 --- /dev/null +++ b/core/designsystem/src/desktopMain/kotlin/io/github/droidkaigi/confsched/designsystem/theme/Type.desktop.kt @@ -0,0 +1,12 @@ +package io.github.droidkaigi.confsched.designsystem.theme + +import androidx.compose.runtime.Composable +import androidx.compose.ui.text.font.FontFamily +import conference_app_2024.core.designsystem.generated.resources.dot_gothic16_regular +import io.github.droidkaigi.confsched.designsystem.DesignSystemRes +import org.jetbrains.compose.resources.Font + +@Composable +actual fun dotGothic16FontFamily(): FontFamily = FontFamily( + Font(DesignSystemRes.font.dot_gothic16_regular), +) diff --git a/gradle.properties b/gradle.properties index 68297c869..486b811c9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,6 +24,10 @@ kotlin.incremental.native=true # kotlin debug #kotlin.compiler.execution.strategy=in-process +# desktop +# https://github.com/JetBrains/compose-multiplatform/issues/3107 +compose.desktop.packaging.checkJdkVendor=false + # roborazzi roborazzi.test.record=true roborazzi.record.namingStrategy=testClassAndMethod diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9376511aa..b83223d04 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,7 +8,7 @@ kotlin = "2.0.10" androidxCore = "1.13.1" androidDesugarJdkLibs = "2.0.4" compose = "2024.09.00" -composeMultiplatform = "1.7.0-alpha02" +composeMultiplatform = "1.7.0-alpha03" rin = "0.1.0" composeInvestigator = "1.5.10-0.2.1" composeMaterial3 = "1.3.0" @@ -90,6 +90,9 @@ kotlinxCollectionsImmutable = { module = "org.jetbrains.kotlinx:kotlinx-collecti kotlinxDatetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version = "0.6.0" } kotlinxAtomicfu = { module = "org.jetbrains.kotlinx:atomicfu", version = "0.23.2" } +# for Desktop +kotlinxCoroutinesSwing = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-swing", version.ref = "kotlinxCoroutines" } + # UI composeBom = { module = "androidx.compose:compose-bom", version.ref = "compose" } @@ -194,6 +197,7 @@ composeInvestigatorGradlePlugin = { id = "land.sungbin.composeinvestigator:compi kotlinxKover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" } detektGradlePlugin = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } ossLicensesPlugin = { id = "com.google.android.gms.oss-licenses-plugin", version.ref = "ossLicensesPlugin" } +jetbrainsCompose = { id = "org.jetbrains.compose", version.ref = "composeMultiplatform" } [bundles] plugins = [ diff --git a/settings.gradle.kts b/settings.gradle.kts index b2d914368..d1b9c7cad 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -22,6 +22,7 @@ rootProject.name = "conference-app-2024" include( ":app-android", ":app-ios-shared", + ":app-desktop", ":feature:main", ":feature:sessions", ":feature:contributors",