diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6df826fdb..3188acc31 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -527,7 +527,7 @@ afterEvaluate { tasks.named("prepareAppResources").configure { dependsOn("includeProcessingResources") // Make sure all libraries are bundled in the maven repository distributed with the app - dependsOn(listOf("core","java:preprocessor", "java:gradle").map { project(":$it").tasks.named("publishAllPublicationsToAppRepository") }) + dependsOn(listOf("core","java:preprocessor", "java:gradle", "java:gradle:hotreload").map { project(":$it").tasks.named("publishAllPublicationsToAppRepository") }) } tasks.named("createDistributable").configure { finalizedBy("setExecutablePermissions") diff --git a/app/src/processing/app/gradle/GradleJob.kt b/app/src/processing/app/gradle/GradleJob.kt index 28b6b6433..080b58f8c 100644 --- a/app/src/processing/app/gradle/GradleJob.kt +++ b/app/src/processing/app/gradle/GradleJob.kt @@ -25,6 +25,7 @@ import processing.app.Messages import processing.app.Platform import processing.app.Platform.getContentFile import processing.app.Platform.getSettingsFolder +import processing.app.Settings import processing.app.Sketch import processing.app.gradle.Log.Companion.startLogServer import processing.app.ui.Editor @@ -32,6 +33,7 @@ import processing.app.ui.EditorStatus import java.nio.file.Path import kotlin.io.path.deleteIfExists import kotlin.io.path.writeText +import kotlin.text.split /* * The gradle job runs the gradle tasks and manages the gradle connection @@ -166,11 +168,44 @@ class GradleJob( .split("\n") .joinToString("\n") { "// $it" } + val enabledPlugins = mutableListOf(GradlePlugin( + "Processing Java", + "The Processing Java mode for Gradle", + null, + "org.processing.java", + getVersionName() + )) + val propertiesFile = sketchFolder.resolve(Sketch.PROPERTIES_NAME) + if(propertiesFile.exists()){ + val sketchSettings = Settings(propertiesFile) + + // Grab the installed plugins + val plugins = GradlePlugin.plugins + + // Grab the enabled plugins + val pluginSetting = (sketchSettings.get(GradlePlugin.PROPERTIES_KEY) ?: "") + .split(",") + .map { it.trim() } + .filter{ it.isNotEmpty() } + + // Link plugins in the settings to their installed counterparts + enabledPlugins.addAll( + pluginSetting + .mapNotNull { id -> + plugins.find { plugin -> plugin.id == id + } + } + ) + } + + val pluginList = enabledPlugins + .joinToString("\n ") { "id(\"${it.id}\") version \"${it.version}\"" } + val configuration = """ plugins{ - id("org.processing.java") version "${getVersionName()}" + #plugins } - """.trimIndent() + """.trimIndent().replace("#plugins", pluginList) val content = "${header}\n${instructions}\n\n${configuration}" buildGradle.writeText(content) } diff --git a/app/src/processing/app/gradle/GradlePlugin.kt b/app/src/processing/app/gradle/GradlePlugin.kt index 0ebbdc36c..798dd9793 100644 --- a/app/src/processing/app/gradle/GradlePlugin.kt +++ b/app/src/processing/app/gradle/GradlePlugin.kt @@ -13,7 +13,7 @@ data class GradlePlugin( companion object{ const val PROPERTIES_KEY = "sketch.plugins" val plugins = mutableStateListOf( - GradlePlugin("Hot Reload (experimental)", "Automatically apply changes in your sketch upon saving", null, "org.processing.java.hotreload", Base.getVersionName()), + GradlePlugin("Hot Reload", "Automatically apply changes in your sketch upon saving", null, "org.processing.java.hotreload", Base.getVersionName()), GradlePlugin("Android","Run your sketch on an Android device", null, "org.processing.android", Base.getVersionName()), ) } diff --git a/build/shared/lib/languages/PDE.properties b/build/shared/lib/languages/PDE.properties index 7d9b19c52..5210bd347 100644 --- a/build/shared/lib/languages/PDE.properties +++ b/build/shared/lib/languages/PDE.properties @@ -325,7 +325,7 @@ gradle.instructions = About this file: \nProcessing creates this file when you r gradle.using_gradle = Building sketch using the new build system. (See settings to switch to the legacy build system.) gradle.using_eclipse = Building sketch using the legacy build system. (See settings to switch to the new build system.) gradle.settings = Settings -gradle.settings.plugins = Plugins +gradle.settings.plugins = Plugins (experimental) # --------------------------------------- # Toolbars diff --git a/java/gradle/build.gradle.kts b/java/gradle/build.gradle.kts index 6c446b13c..0171384f4 100644 --- a/java/gradle/build.gradle.kts +++ b/java/gradle/build.gradle.kts @@ -24,7 +24,7 @@ dependencies{ // TODO: CI/CD for publishing the plugin to the Gradle Plugin Portal gradlePlugin{ plugins{ - create("processing"){ + create("processing.java"){ id = "org.processing.java" implementationClass = "org.processing.java.gradle.ProcessingPlugin" } diff --git a/java/gradle/hotreload/build.gradle.kts b/java/gradle/hotreload/build.gradle.kts new file mode 100644 index 000000000..e4873a8c3 --- /dev/null +++ b/java/gradle/hotreload/build.gradle.kts @@ -0,0 +1,33 @@ +plugins { + `java-gradle-plugin` + kotlin("jvm") version libs.versions.kotlin + alias(libs.plugins.gradlePublish) + +} + + +repositories { + mavenCentral() +} + +dependencies{ + implementation("org.jetbrains.compose.hot-reload:hot-reload-gradle-plugin:1.0.0-beta03") +} + +gradlePlugin{ + plugins{ + create("processing.java.hotreload"){ + id = "org.processing.java.hotreload" + implementationClass = "org.processing.java.gradle.ProcessingHotReloadPlugin" + } + } +} +publishing{ + repositories{ + mavenLocal() + maven { + name = "App" + url = uri(project(":app").layout.buildDirectory.dir("resources-bundled/common/repository").get().asFile.absolutePath) + } + } +} \ No newline at end of file diff --git a/java/gradle/hotreload/src/main/kotlin/org/processing/java/gradle/ProcessingHotReloadPlugin.kt b/java/gradle/hotreload/src/main/kotlin/org/processing/java/gradle/ProcessingHotReloadPlugin.kt new file mode 100644 index 000000000..8eaecc35f --- /dev/null +++ b/java/gradle/hotreload/src/main/kotlin/org/processing/java/gradle/ProcessingHotReloadPlugin.kt @@ -0,0 +1,24 @@ +package org.processing.java.gradle + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.tasks.GradleBuild +import org.jetbrains.compose.reload.gradle.ComposeHotReloadPlugin +import org.jetbrains.compose.reload.gradle.ComposeHotRun + +class ProcessingHotReloadPlugin: Plugin { + override fun apply(project: Project) { + project.plugins.apply(ComposeHotReloadPlugin::class.java) + + project.repositories.google() + + project.afterEvaluate { + project.tasks.named("hotRun", ComposeHotRun::class.java){ task -> + task.isAutoReloadEnabled.set(true) + } + project.tasks.named("run").configure { task -> + task.dependsOn("hotRun") + } + } + } +} \ No newline at end of file diff --git a/java/gradle/src/main/kotlin/ProcessingPlugin.kt b/java/gradle/src/main/kotlin/ProcessingPlugin.kt index fd7d1b5bf..a45f2ff84 100644 --- a/java/gradle/src/main/kotlin/ProcessingPlugin.kt +++ b/java/gradle/src/main/kotlin/ProcessingPlugin.kt @@ -59,25 +59,6 @@ class ProcessingPlugin @Inject constructor(private val objectFactory: ObjectFact // Add the compose plugin to wrap the sketch in an executable project.plugins.apply("org.jetbrains.compose") - val propertiesFile = project.layout.projectDirectory.file("sketch.properties") - if (propertiesFile.asFile.exists()) { - val properties = Properties() - properties.load(propertiesFile.asFile.inputStream()) - - val pluginsSetting = properties.getProperty("sketch.plugins") - if (pluginsSetting != null && pluginsSetting.isNotEmpty()) { - val plugins = pluginsSetting.split(",").map { it.trim() } - - plugins.forEach { pluginId -> - // Apply the plugin to the project, equivalent of - // plugins { - // id("org.processing.java.hotreload") - // } - project.plugins.apply(pluginId) - } - } - } - // Add the Processing core library (within Processing from the internal maven repo and outside from the internet), equivalent of // dependencies { // implementation("org.processing:core:4.3.4") diff --git a/settings.gradle.kts b/settings.gradle.kts index 5809665d7..b9615e1ca 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,6 +6,7 @@ include( "java", "java:preprocessor", "java:gradle", + "java:gradle:hotreload", "java:libraries:dxf", "java:libraries:io", "java:libraries:net",