From ce06ac8435889125f30b2c682857a9457806f4e5 Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 14 Nov 2024 09:06:55 +0100 Subject: [PATCH 001/121] run app with the jetpack compose runner --- .gitignore | 1 + .idea/compiler.xml | 13 ++++ .idea/jarRepositories.xml | 25 +++++++ .idea/kotlinc.xml | 6 ++ .idea/modules.xml | 14 ++-- .idea/modules/app/processing.app.iml | 12 ++++ .idea/modules/app/processing.app.main.iml | 63 +++++++++++++++++ .idea/modules/app/processing.app.test.iml | 57 ++++++++++++++++ .../different/processing.core.different.iml | 12 ++++ .idea/modules/core/processing.core.iml | 12 ++++ .idea/modules/core/processing.core.main.iml | 16 +++++ .idea/modules/core/processing.core.test.iml | 17 +++++ .idea/modules/processing.iml | 12 ++++ .idea/vcs.xml | 2 +- app/build.gradle.kts | 41 +++++++++++ app/processing4-app.iml | 68 ------------------- app/src/processing/app/Platform.java | 48 +++++++++++-- build.gradle.kts | 1 + core/processing4-core.iml | 12 ---- settings.gradle.kts | 12 +++- 20 files changed, 354 insertions(+), 90 deletions(-) create mode 100644 .idea/compiler.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/kotlinc.xml create mode 100644 .idea/modules/app/processing.app.iml create mode 100644 .idea/modules/app/processing.app.main.iml create mode 100644 .idea/modules/app/processing.app.test.iml create mode 100644 .idea/modules/core/different/processing.core.different.iml create mode 100644 .idea/modules/core/processing.core.iml create mode 100644 .idea/modules/core/processing.core.main.iml create mode 100644 .idea/modules/core/processing.core.test.iml create mode 100644 .idea/modules/processing.iml create mode 100644 app/build.gradle.kts delete mode 100644 app/processing4-app.iml create mode 100644 build.gradle.kts delete mode 100644 core/processing4-core.iml diff --git a/.gitignore b/.gitignore index d5f761a048..346a60bead 100644 --- a/.gitignore +++ b/.gitignore @@ -101,3 +101,4 @@ processing-examples .gradle core/build/ build/publish/ +app/build diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000000..06b36e2a9e --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000000..f850df2542 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000000..fe63bb677d --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 335d8c4b3e..a50571debb 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,8 +2,15 @@ - - + + + + + + + + + @@ -12,8 +19,7 @@ - - + \ No newline at end of file diff --git a/.idea/modules/app/processing.app.iml b/.idea/modules/app/processing.app.iml new file mode 100644 index 0000000000..45dbd6cb35 --- /dev/null +++ b/.idea/modules/app/processing.app.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/app/processing.app.main.iml b/.idea/modules/app/processing.app.main.iml new file mode 100644 index 0000000000..d12ab6f0a0 --- /dev/null +++ b/.idea/modules/app/processing.app.main.iml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.compiler/compiler/1.5.13.5/225cf6f6f3fcbd55fd532ec100452c4c07093bb/compiler-1.5.13.5.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-scripting-jvm/1.9.23/12296ecbca7fc45d259e04cf8080bae89ca18a45/kotlin-scripting-jvm-1.9.23.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-scripting-common/1.9.23/962df7abf28182fc9af5cddfa721766d9c3fe828/kotlin-scripting-common-1.9.23.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.9.23/dbaadea1f5e68f790d242a91a38355a83ec38747/kotlin-stdlib-1.9.23.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-script-runtime/1.9.23/1375a7343d05891119fac57f8b50a7578420ac27/kotlin-script-runtime-1.9.23.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/app/processing.app.test.iml b/.idea/modules/app/processing.app.test.iml new file mode 100644 index 0000000000..4681c8ad4f --- /dev/null +++ b/.idea/modules/app/processing.app.test.iml @@ -0,0 +1,57 @@ + + + + + + :app:main + + + + + + + + + + + + + + + + + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.compiler/compiler/1.5.13.5/225cf6f6f3fcbd55fd532ec100452c4c07093bb/compiler-1.5.13.5.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-scripting-jvm/1.9.23/12296ecbca7fc45d259e04cf8080bae89ca18a45/kotlin-scripting-jvm-1.9.23.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-scripting-common/1.9.23/962df7abf28182fc9af5cddfa721766d9c3fe828/kotlin-scripting-common-1.9.23.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.9.23/dbaadea1f5e68f790d242a91a38355a83ec38747/kotlin-stdlib-1.9.23.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-script-runtime/1.9.23/1375a7343d05891119fac57f8b50a7578420ac27/kotlin-script-runtime-1.9.23.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/core/different/processing.core.different.iml b/.idea/modules/core/different/processing.core.different.iml new file mode 100644 index 0000000000..a4d906fc0d --- /dev/null +++ b/.idea/modules/core/different/processing.core.different.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/core/processing.core.iml b/.idea/modules/core/processing.core.iml new file mode 100644 index 0000000000..ee196c1d1d --- /dev/null +++ b/.idea/modules/core/processing.core.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/core/processing.core.main.iml b/.idea/modules/core/processing.core.main.iml new file mode 100644 index 0000000000..1ad505bed6 --- /dev/null +++ b/.idea/modules/core/processing.core.main.iml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/core/processing.core.test.iml b/.idea/modules/core/processing.core.test.iml new file mode 100644 index 0000000000..1be6160484 --- /dev/null +++ b/.idea/modules/core/processing.core.test.iml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/processing.iml b/.idea/modules/processing.iml new file mode 100644 index 0000000000..08476d6fd8 --- /dev/null +++ b/.idea/modules/processing.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 94a25f7f4c..35eb1ddfbb 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000000..c08e91f26d --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,41 @@ +plugins{ + id("java") + kotlin("jvm") version "1.9.23" + id("org.jetbrains.compose") version "1.6.11" +} + +group = rootProject.group + +repositories{ + mavenCentral() + maven { url = uri("https://jogamp.org/deployment/maven") } +} + +sourceSets{ + main{ + java{ + srcDirs("src/processing/app") + } + resources{ + srcDirs("../build/shared/") + } + } +} + + +compose.desktop { + application { + mainClass = "processing.app.ui.Splash" + } +} + +dependencies { + implementation("com.formdev:flatlaf:3.4.1") + + implementation("net.java.dev.jna:jna:5.12.1") + implementation("net.java.dev.jna:jna-platform:5.12.1") + + + implementation(project(":core")) +// runtimeOnly(project(":java")) +} \ No newline at end of file diff --git a/app/processing4-app.iml b/app/processing4-app.iml deleted file mode 100644 index 62e9a8c3a8..0000000000 --- a/app/processing4-app.iml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/processing/app/Platform.java b/app/src/processing/app/Platform.java index d6f472abe5..9352f0c799 100644 --- a/app/src/processing/app/Platform.java +++ b/app/src/processing/app/Platform.java @@ -28,10 +28,9 @@ import java.lang.management.ManagementFactory; import java.net.URISyntaxException; import java.net.URL; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.*; import com.sun.jna.platform.FileUtils; @@ -331,9 +330,21 @@ static public boolean isLinux() { * Get reference to a file adjacent to the executable on Windows and Linux, * or inside Contents/Resources/Java on Mac OS X. This will return the local * JRE location, *whether or not it is the active JRE*. + * @deprecated start using the build in JAR Resources system instead. */ + @Deprecated static public File getContentFile(String name) { if (processingRoot == null) { + var url = Platform.class.getClassLoader().getResource("lib/defaults.txt"); + if(url != null){ + try { + processingRoot = Files.createTempDirectory("processing").toFile(); + copyFromJar("/", processingRoot.toPath()); + return new File(processingRoot, name); + } catch (IOException | URISyntaxException e) { + e.printStackTrace(); + } + } // Get the path to the .jar file that contains Base.class URL pathURL = Base.class.getProtectionDomain().getCodeSource().getLocation(); @@ -382,6 +393,35 @@ static public File getContentFile(String name) { return new File(processingRoot, name); } + public static void copyFromJar(String source, final Path target) throws URISyntaxException, IOException { + var resource = Platform.class.getResource("").toURI(); + var fileSystem = FileSystems.newFileSystem( + resource, + Collections.emptyMap() + ); + + + final Path jarPath = fileSystem.getPath(source); + + Files.walkFileTree(jarPath, new SimpleFileVisitor() { + + private Path currentTarget; + + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + currentTarget = target.resolve(jarPath.relativize(dir).toString()); + Files.createDirectories(currentTarget); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Files.copy(file, target.resolve(jarPath.relativize(file).toString()), StandardCopyOption.REPLACE_EXISTING); + return FileVisitResult.CONTINUE; + } + + }); + } static public File getJavaHome() { if (Platform.isMacOS()) { diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000000..7817d7f36f --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1 @@ +group = "org.processing" \ No newline at end of file diff --git a/core/processing4-core.iml b/core/processing4-core.iml deleted file mode 100644 index 129c875258..0000000000 --- a/core/processing4-core.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 4f5525784b..0f4d3ce9f4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,15 @@ rootProject.name = "processing" -include("core", "core:different") +include( + "core", + "core:different", + "app" +) + +pluginManagement { + plugins { + kotlin("jvm") version "1.9.23" + } +} buildscript { repositories { From e082481594195335d708b493a8e2fe56f527de5c Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 14 Nov 2024 10:30:56 +0100 Subject: [PATCH 002/121] Run app with Java Mode --- .gitignore | 1 + .idea/compiler.xml | 3 + .idea/modules.xml | 4 +- .idea/modules/app/processing.app.main.iml | 42 +- .idea/modules/app/processing.app.test.iml | 36 ++ .idea/modules/core/processing.core.main.iml | 3 +- .idea/modules/java/processing.java.iml | 12 + .idea/modules/java/processing.java.main.iml | 60 ++ .idea/modules/java/processing.java.test.iml | 58 ++ app/build.gradle.kts | 7 +- build/reports/problems/problems-report.html | 663 ++++++++++++++++++++ core/build.gradle.kts | 2 +- java/build.gradle.kts | 43 ++ java/processing4-java.iml | 201 ------ java/src/processing/mode/java/JavaMode.java | 54 ++ settings.gradle.kts | 3 +- 16 files changed, 978 insertions(+), 214 deletions(-) create mode 100644 .idea/modules/java/processing.java.iml create mode 100644 .idea/modules/java/processing.java.main.iml create mode 100644 .idea/modules/java/processing.java.test.iml create mode 100644 build/reports/problems/problems-report.html create mode 100644 java/build.gradle.kts delete mode 100644 java/processing4-java.iml diff --git a/.gitignore b/.gitignore index 346a60bead..2853501d5e 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,4 @@ processing-examples core/build/ build/publish/ app/build +java/build/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 06b36e2a9e..4794b23381 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -8,6 +8,9 @@ + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index a50571debb..fc9f8b84ed 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -10,10 +10,12 @@ + + + - diff --git a/.idea/modules/app/processing.app.main.iml b/.idea/modules/app/processing.app.main.iml index d12ab6f0a0..e6ee4fe11b 100644 --- a/.idea/modules/app/processing.app.main.iml +++ b/.idea/modules/app/processing.app.main.iml @@ -41,11 +41,10 @@ - - - + + - + @@ -56,8 +55,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/app/processing.app.test.iml b/.idea/modules/app/processing.app.test.iml index 4681c8ad4f..fca4f944b7 100644 --- a/.idea/modules/app/processing.app.test.iml +++ b/.idea/modules/app/processing.app.test.iml @@ -49,9 +49,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/core/processing.core.main.iml b/.idea/modules/core/processing.core.main.iml index 1ad505bed6..307326303d 100644 --- a/.idea/modules/core/processing.core.main.iml +++ b/.idea/modules/core/processing.core.main.iml @@ -4,8 +4,7 @@ - - + diff --git a/.idea/modules/java/processing.java.iml b/.idea/modules/java/processing.java.iml new file mode 100644 index 0000000000..80774819bd --- /dev/null +++ b/.idea/modules/java/processing.java.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/java/processing.java.main.iml b/.idea/modules/java/processing.java.main.iml new file mode 100644 index 0000000000..d497c49c73 --- /dev/null +++ b/.idea/modules/java/processing.java.main.iml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/java/processing.java.test.iml b/.idea/modules/java/processing.java.test.iml new file mode 100644 index 0000000000..232833025b --- /dev/null +++ b/.idea/modules/java/processing.java.test.iml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c08e91f26d..49d055ba02 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -14,10 +14,10 @@ repositories{ sourceSets{ main{ java{ - srcDirs("src/processing/app") + srcDirs("src") } resources{ - srcDirs("../build/shared/") + srcDirs("src","../build/shared/") } } } @@ -35,7 +35,6 @@ dependencies { implementation("net.java.dev.jna:jna:5.12.1") implementation("net.java.dev.jna:jna-platform:5.12.1") - implementation(project(":core")) -// runtimeOnly(project(":java")) + runtimeOnly(project(":java")) } \ No newline at end of file diff --git a/build/reports/problems/problems-report.html b/build/reports/problems/problems-report.html new file mode 100644 index 0000000000..e80394809d --- /dev/null +++ b/build/reports/problems/problems-report.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + Gradle Configuration Cache + + + +
+ +
+ Loading... +
+ + + + + + diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 64f7396ba7..dbccb36292 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -15,7 +15,7 @@ repositories { sourceSets{ main{ java{ - srcDirs("src/processing") + srcDirs("src") } resources{ srcDirs("src") diff --git a/java/build.gradle.kts b/java/build.gradle.kts new file mode 100644 index 0000000000..65c01817d4 --- /dev/null +++ b/java/build.gradle.kts @@ -0,0 +1,43 @@ +plugins { + id("java") + id("antlr") +} + +repositories{ + mavenCentral() + maven { url = uri("https://jogamp.org/deployment/maven") } +} + +sourceSets{ + main{ + java{ + srcDirs("src", "generated") + } + resources{ + srcDirs("../build/shared/", "src/main/resources/") + } + } +} + +dependencies{ + implementation(project(":app")) + implementation(project(":core")) + + antlr("org.antlr:antlr4:4.13.1") + + implementation("org.eclipse.jdt:org.eclipse.jdt.core:3.37.0") + implementation("com.google.classpath-explorer:classpath-explorer:1.0") + implementation("org.netbeans.api:org-netbeans-swing-outline:RELEASE210") + implementation("org.apache.ant:ant:1.10.14") + implementation("org.eclipse.lsp4j:org.eclipse.lsp4j:0.22.0") + implementation("org.jsoup:jsoup:1.17.2") +} + + +tasks.register("extraResources"){ + from(".") + include("keywords.txt") + into("build/resources/main") +} +tasks.jar { dependsOn("extraResources") } +tasks.processResources{ finalizedBy("extraResources") } diff --git a/java/processing4-java.iml b/java/processing4-java.iml deleted file mode 100644 index 953c28d4d5..0000000000 --- a/java/processing4-java.iml +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/java/src/processing/mode/java/JavaMode.java b/java/src/processing/mode/java/JavaMode.java index 4f9613c993..5d0e3740a9 100644 --- a/java/src/processing/mode/java/JavaMode.java +++ b/java/src/processing/mode/java/JavaMode.java @@ -25,6 +25,9 @@ import java.awt.*; import java.io.File; import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -56,7 +59,58 @@ public JavaMode(Base base, File folder) { public String getTitle() { return "Java"; } + + File resourcesFolder; + + @Override + public File[] getKeywordFiles() { + var url = JavaMode.class.getClassLoader().getResource("keywords.txt"); + if(url != null) { + if(resourcesFolder == null){ + try { + resourcesFolder = Files.createTempDirectory("processing").toFile(); + copyFromJar("/", resourcesFolder.toPath()); + return new File[] { new File(resourcesFolder, "keywords.txt") }; + } catch (IOException | URISyntaxException e) { + e.printStackTrace(); + } + }else{ + return new File[] { new File(resourcesFolder, "keywords.txt") }; + } + + return new File[] { new File(url.getFile()) }; + } + return new File[] { new File(folder, "keywords.txt") }; + } + public static void copyFromJar(String source, final Path target) throws URISyntaxException, IOException { + var resource = JavaMode.class.getResource("").toURI(); + var fileSystem = FileSystems.newFileSystem( + resource, + Collections.emptyMap() + ); + + + final Path jarPath = fileSystem.getPath(source); + Files.walkFileTree(jarPath, new SimpleFileVisitor() { + + private Path currentTarget; + + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + currentTarget = target.resolve(jarPath.relativize(dir).toString()); + Files.createDirectories(currentTarget); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Files.copy(file, target.resolve(jarPath.relativize(file).toString()), StandardCopyOption.REPLACE_EXISTING); + return FileVisitResult.CONTINUE; + } + + }); + } // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . diff --git a/settings.gradle.kts b/settings.gradle.kts index 0f4d3ce9f4..e5ab178524 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,7 +2,8 @@ rootProject.name = "processing" include( "core", "core:different", - "app" + "app", + "java" ) pluginManagement { From 07f05f39c6595b44aaa4d533816957943f10af3f Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 14 Nov 2024 10:39:08 +0100 Subject: [PATCH 003/121] Deprecation indicators and removed unused resources --- java/build.gradle.kts | 5 +---- java/src/processing/mode/java/JavaMode.java | 2 ++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/java/build.gradle.kts b/java/build.gradle.kts index 65c01817d4..0ba1117c7f 100644 --- a/java/build.gradle.kts +++ b/java/build.gradle.kts @@ -13,9 +13,6 @@ sourceSets{ java{ srcDirs("src", "generated") } - resources{ - srcDirs("../build/shared/", "src/main/resources/") - } } } @@ -33,7 +30,7 @@ dependencies{ implementation("org.jsoup:jsoup:1.17.2") } - +// TODO: This is a temporary workaround until the resources are properly handled tasks.register("extraResources"){ from(".") include("keywords.txt") diff --git a/java/src/processing/mode/java/JavaMode.java b/java/src/processing/mode/java/JavaMode.java index 5d0e3740a9..79c790c122 100644 --- a/java/src/processing/mode/java/JavaMode.java +++ b/java/src/processing/mode/java/JavaMode.java @@ -62,6 +62,7 @@ public String getTitle() { File resourcesFolder; + @Deprecated @Override public File[] getKeywordFiles() { var url = JavaMode.class.getClassLoader().getResource("keywords.txt"); @@ -82,6 +83,7 @@ public File[] getKeywordFiles() { } return new File[] { new File(folder, "keywords.txt") }; } + @Deprecated public static void copyFromJar(String source, final Path target) throws URISyntaxException, IOException { var resource = JavaMode.class.getResource("").toURI(); var fileSystem = FileSystems.newFileSystem( From 70208d35617a5125db7e3c142e6eb90fad694780 Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 14 Nov 2024 12:44:09 +0100 Subject: [PATCH 004/121] Build sketches with new app bundler --- app/build.gradle.kts | 12 +++++++++++- app/src/processing/app/Platform.java | 4 ++++ java/build.gradle.kts | 4 ++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 49d055ba02..f68e8f8f95 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -37,4 +37,14 @@ dependencies { implementation(project(":core")) runtimeOnly(project(":java")) -} \ No newline at end of file +} + +tasks.register("addCore"){ + dependsOn(project(":core").tasks.jar) + from("../core/build/libs/") + include("*.jar") + into("build/resources/main/core/library") +} +tasks.jar { dependsOn("addCore") } +tasks.processResources{ finalizedBy("addCore") } + diff --git a/app/src/processing/app/Platform.java b/app/src/processing/app/Platform.java index 9352f0c799..bf0d13438d 100644 --- a/app/src/processing/app/Platform.java +++ b/app/src/processing/app/Platform.java @@ -424,6 +424,10 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO } static public File getJavaHome() { + var home = System.getProperty("java.home"); + if(home != null){ + return new File(home); + } if (Platform.isMacOS()) { //return "Contents/PlugIns/jdk1.7.0_40.jdk/Contents/Home/jre/bin/java"; File[] plugins = getContentFile("../PlugIns").listFiles((dir, name) -> dir.isDirectory() && diff --git a/java/build.gradle.kts b/java/build.gradle.kts index 0ba1117c7f..3c22e39f86 100644 --- a/java/build.gradle.kts +++ b/java/build.gradle.kts @@ -1,6 +1,5 @@ plugins { id("java") - id("antlr") } repositories{ @@ -20,7 +19,7 @@ dependencies{ implementation(project(":app")) implementation(project(":core")) - antlr("org.antlr:antlr4:4.13.1") + implementation("org.eclipse.jdt:org.eclipse.jdt.core:3.37.0") implementation("com.google.classpath-explorer:classpath-explorer:1.0") @@ -28,6 +27,7 @@ dependencies{ implementation("org.apache.ant:ant:1.10.14") implementation("org.eclipse.lsp4j:org.eclipse.lsp4j:0.22.0") implementation("org.jsoup:jsoup:1.17.2") + implementation("org.antlr:antlr4:4.7.2") } // TODO: This is a temporary workaround until the resources are properly handled From 78da74d6c284310601fb4d647cd7f857b225161b Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 14 Nov 2024 13:05:20 +0100 Subject: [PATCH 005/121] Added all modules for JAR filesystem --- app/build.gradle.kts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f68e8f8f95..a52164d620 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -26,6 +26,9 @@ sourceSets{ compose.desktop { application { mainClass = "processing.app.ui.Splash" + nativeDistributions{ + includeAllModules = true + } } } From b1e40666cca1a31093dbb349e9d0901180147c31 Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 14 Nov 2024 13:18:45 +0100 Subject: [PATCH 006/121] Work with external JDK --- app/build.gradle.kts | 5 +++++ app/src/processing/app/Platform.java | 7 ++++++- build.gradle.kts | 3 ++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a52164d620..116dd181d2 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.compose.desktop.application.dsl.TargetFormat + plugins{ id("java") kotlin("jvm") version "1.9.23" @@ -28,6 +30,9 @@ compose.desktop { mainClass = "processing.app.ui.Splash" nativeDistributions{ includeAllModules = true + targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) + packageName = "Processing" + packageVersion = rootProject.version as String } } } diff --git a/app/src/processing/app/Platform.java b/app/src/processing/app/Platform.java index bf0d13438d..459c466651 100644 --- a/app/src/processing/app/Platform.java +++ b/app/src/processing/app/Platform.java @@ -426,7 +426,12 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO static public File getJavaHome() { var home = System.getProperty("java.home"); if(home != null){ - return new File(home); + if(new File(home, "bin/java").exists()){ + return new File(home); + }else{ + // TODO make platform independent + return new File("/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home"); + } } if (Platform.isMacOS()) { //return "Contents/PlugIns/jdk1.7.0_40.jdk/Contents/Home/jre/bin/java"; diff --git a/build.gradle.kts b/build.gradle.kts index 7817d7f36f..97b5ab2141 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1 +1,2 @@ -group = "org.processing" \ No newline at end of file +group = "org.processing" +version = "4.4.0" \ No newline at end of file From d98cab9f853bf5479666a53b09567bf42ce97f65 Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 14 Nov 2024 15:11:35 +0100 Subject: [PATCH 007/121] Distribution icons --- app/build.gradle.kts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 116dd181d2..2e1f1ab2b7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -28,11 +28,26 @@ sourceSets{ compose.desktop { application { mainClass = "processing.app.ui.Splash" + nativeDistributions{ includeAllModules = true targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) packageName = "Processing" packageVersion = rootProject.version as String + + macOS{ + bundleID = "org.processingfoundation.processing.app" + iconFile = project.file("../build/macos/processing.icns") + } + windows{ + iconFile = project.file("../build/windows/processing.ico") + } + linux { + iconFile = project.file("../build/linux/processing.png") + } + buildTypes.release.proguard{ + optimize = false + } } } } From 9405e4ac1279366455c7191129293e1a30d7f708 Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 14 Nov 2024 16:32:28 +0100 Subject: [PATCH 008/121] First functional Composable --- app/build.gradle.kts | 21 ++++++- app/src/processing/app/Platform.java | 3 + app/src/processing/app/ui/Editor.java | 4 ++ app/src/processing/app/ui/JVMManager.kt | 84 +++++++++++++++++++++++++ 4 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 app/src/processing/app/ui/JVMManager.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2e1f1ab2b7..435b37af4d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -10,6 +10,7 @@ group = rootProject.group repositories{ mavenCentral() + google() maven { url = uri("https://jogamp.org/deployment/maven") } } @@ -18,6 +19,9 @@ sourceSets{ java{ srcDirs("src") } + kotlin{ + srcDirs("src") + } resources{ srcDirs("src","../build/shared/") } @@ -45,9 +49,11 @@ compose.desktop { linux { iconFile = project.file("../build/linux/processing.png") } - buildTypes.release.proguard{ - optimize = false - } + + // Allow swing to use the system look and feel + jvmArgs( + "-Dapple.awt.application.appearance=system" + ) } } } @@ -60,6 +66,15 @@ dependencies { implementation(project(":core")) runtimeOnly(project(":java")) + + implementation(compose.runtime) + implementation(compose.foundation) + implementation(compose.material) + implementation(compose.ui) + implementation(compose.components.resources) + implementation(compose.components.uiToolingPreview) + + implementation(compose.desktop.currentOs) } tasks.register("addCore"){ diff --git a/app/src/processing/app/Platform.java b/app/src/processing/app/Platform.java index 459c466651..f391ad2627 100644 --- a/app/src/processing/app/Platform.java +++ b/app/src/processing/app/Platform.java @@ -430,6 +430,9 @@ static public File getJavaHome() { return new File(home); }else{ // TODO make platform independent + // Windows: C:\Program Files\Eclipse Adoptium\jdk-17* + // macOS/Linux: /usr/lib/jvm/, /opt/, /Library/Java/JavaVirtualMachines/ + return new File("/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home"); } } diff --git a/app/src/processing/app/ui/Editor.java b/app/src/processing/app/ui/Editor.java index 3babbb6dfb..9ae03e3b6c 100644 --- a/app/src/processing/app/ui/Editor.java +++ b/app/src/processing/app/ui/Editor.java @@ -71,6 +71,8 @@ import processing.app.syntax.*; import processing.core.*; +import static processing.app.ui.JVMManagerKt.addJDKManger; + /** * Main editor panel for the Processing Development Environment. @@ -218,6 +220,8 @@ public void windowDeactivated(WindowEvent e) { header = createHeader(); upper.add(header); + addJDKManger(upper); + textarea = createTextArea(); textarea.setRightClickPopup(new TextAreaPopup()); textarea.setHorizontalOffset(JEditTextArea.leftHandGutter); diff --git a/app/src/processing/app/ui/JVMManager.kt b/app/src/processing/app/ui/JVMManager.kt new file mode 100644 index 0000000000..24ce0cc5d5 --- /dev/null +++ b/app/src/processing/app/ui/JVMManager.kt @@ -0,0 +1,84 @@ +package processing.app.ui + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material.Button +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.awt.ComposePanel +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import processing.app.Language +import processing.app.Platform +import java.awt.BorderLayout +import java.awt.Desktop +import java.io.File +import java.net.URI +import javax.swing.Box +import javax.swing.SwingUtilities + + +fun addJDKManger(parent: Box){ + SwingUtilities.invokeLater { + val composePanel = ComposePanel().apply { + setContent { + JDKManager() + } + } + parent.apply { + add(composePanel, BorderLayout.EAST) + } + } +} + + +// If the user does not have a valid JDK installed on their system, this function will display a message and a button to download the JDK +// Temporary workaround until we ship Processing with a JDK again +@Composable +fun JDKManager(){ + val home = Platform.getJavaHome() + val valid = File(home, "bin/java").exists() + if(valid) return + + val color = Theme.getColor("editor.gradient.bottom") + + val os = System.getProperty("os.name") + val arch = System.getProperty("os.arch") + val platform = when { + os.contains("Windows") -> "windows" + os.contains("Mac") -> "mac" + else -> "linux" + } + + Row(modifier = Modifier + .background(color = Color(color.rgb)) + .padding(8.dp) + .fillMaxWidth() + ) { + Text(Language.text("editor.status.missing.jvm")) + Spacer(modifier = Modifier.weight(1f)) + Button(onClick = { openWebpage(URI("https://api.adoptium.net/v3/installer/latest/17/ga/${platform}/${arch}/jre/hotspot/normal/eclipse?project=jdk")) }) { + Text( + text = "Open a link", + color = Color.Black + ) + } + } +} + +fun openWebpage(uri: URI?): Boolean { + val desktop = Desktop.getDesktop() ?: return false + if (desktop.isSupported(Desktop.Action.BROWSE)) { + try { + desktop.browse(uri) + return true + } catch (e: Exception) { + e.printStackTrace() + } + } + return false +} From 27313b24f388743b7acc5e57f15045316f8e61c4 Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 14 Nov 2024 19:08:17 +0100 Subject: [PATCH 009/121] Proper styling --- app/src/processing/app/ui/JVMManager.kt | 83 +++++++++++++++++++------ 1 file changed, 65 insertions(+), 18 deletions(-) diff --git a/app/src/processing/app/ui/JVMManager.kt b/app/src/processing/app/ui/JVMManager.kt index 24ce0cc5d5..40003c226a 100644 --- a/app/src/processing/app/ui/JVMManager.kt +++ b/app/src/processing/app/ui/JVMManager.kt @@ -1,16 +1,28 @@ package processing.app.ui -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.material.Button +import androidx.compose.foundation.* +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsHoveredAsState +import androidx.compose.foundation.interaction.collectIsPressedAsState +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.awt.ComposePanel +import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.input.pointer.PointerEventType +import androidx.compose.ui.input.pointer.onPointerEvent +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.platform.Font import androidx.compose.ui.unit.dp import processing.app.Language import processing.app.Platform @@ -18,11 +30,10 @@ import java.awt.BorderLayout import java.awt.Desktop import java.io.File import java.net.URI -import javax.swing.Box import javax.swing.SwingUtilities -fun addJDKManger(parent: Box){ +fun addJDKManger(parent: javax.swing.Box){ SwingUtilities.invokeLater { val composePanel = ComposePanel().apply { setContent { @@ -38,13 +49,25 @@ fun addJDKManger(parent: Box){ // If the user does not have a valid JDK installed on their system, this function will display a message and a button to download the JDK // Temporary workaround until we ship Processing with a JDK again +@OptIn(ExperimentalFoundationApi::class, ExperimentalComposeUiApi::class) @Composable fun JDKManager(){ val home = Platform.getJavaHome() val valid = File(home, "bin/java").exists() if(valid) return - val color = Theme.getColor("editor.gradient.bottom") + val color = Theme.getColor("status.notice.bgcolor") + val colorText = Theme.getColor("status.notice.fgcolor") + val buttonColor = Theme.getColor("toolbar.button.enabled.field") + val buttonTextColor = Theme.getColor("toolbar.button.enabled.glyph") + + val fontFamily = FontFamily( + Font( + resource = "font/ProcessingSansPro-Regular.ttf", + weight = FontWeight.W400, + style = FontStyle.Normal + ) + ) val os = System.getProperty("os.name") val arch = System.getProperty("os.arch") @@ -54,18 +77,42 @@ fun JDKManager(){ else -> "linux" } - Row(modifier = Modifier - .background(color = Color(color.rgb)) - .padding(8.dp) - .fillMaxWidth() + Box( + modifier = Modifier + .fillMaxWidth() + .background(color = Color(color.rgb)), + contentAlignment = Alignment.Center ) { - Text(Language.text("editor.status.missing.jvm")) - Spacer(modifier = Modifier.weight(1f)) - Button(onClick = { openWebpage(URI("https://api.adoptium.net/v3/installer/latest/17/ga/${platform}/${arch}/jre/hotspot/normal/eclipse?project=jdk")) }) { + Row( + modifier = Modifier + .padding(16.dp, 8.dp) + .fillMaxWidth() + ) { Text( - text = "Open a link", - color = Color.Black + "JDK not found. Please download the JDK to run Processing.", + fontFamily = fontFamily, + modifier = Modifier.align(Alignment.CenterVertically), + color = Color(colorText.rgb) ) + Spacer(modifier = Modifier.weight(1f)) + Row( + + modifier = Modifier + .clip(RoundedCornerShape(16.dp)) + .clickable{ + openWebpage(URI("https://api.adoptium.net/v3/installer/latest/17/ga/${platform}/${arch}/jre/hotspot/normal/eclipse?project=jdk")) + } + .background(color = Color(buttonColor.rgb)) + .padding(16.dp, 8.dp) + + , + ) { + Text( + text = "Download JDK", + color = Color(buttonTextColor.rgb), + fontFamily = fontFamily + ) + } } } } From 28ab38a11caec011f7caf62735f2fac156f8f7e9 Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 14 Nov 2024 19:57:23 +0100 Subject: [PATCH 010/121] Lottie animations --- app/build.gradle.kts | 6 +++- app/src/processing/app/ui/JVMManager.kt | 39 +++++++++++++++++++++---- java/build.gradle.kts | 1 + 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 435b37af4d..3c3a2e2ba4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -3,7 +3,7 @@ import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins{ id("java") kotlin("jvm") version "1.9.23" - id("org.jetbrains.compose") version "1.6.11" + id("org.jetbrains.compose") version "1.7.1" } group = rootProject.group @@ -58,6 +58,8 @@ compose.desktop { } } +val compottieVersion = "2.0.0-rc02" + dependencies { implementation("com.formdev:flatlaf:3.4.1") @@ -75,6 +77,8 @@ dependencies { implementation(compose.components.uiToolingPreview) implementation(compose.desktop.currentOs) + + implementation("io.github.alexzhirkevich:compottie:${compottieVersion}") } tasks.register("addCore"){ diff --git a/app/src/processing/app/ui/JVMManager.kt b/app/src/processing/app/ui/JVMManager.kt index 40003c226a..103de7492f 100644 --- a/app/src/processing/app/ui/JVMManager.kt +++ b/app/src/processing/app/ui/JVMManager.kt @@ -7,10 +7,7 @@ import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.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.* import androidx.compose.ui.Alignment import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier @@ -24,12 +21,19 @@ import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.platform.Font import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Window +import androidx.compose.ui.window.application +import io.github.alexzhirkevich.compottie.* +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.processing.app.generated.resources.Res +import processing.app.Base import processing.app.Language import processing.app.Platform import java.awt.BorderLayout import java.awt.Desktop import java.io.File import java.net.URI +import java.nio.charset.Charset import javax.swing.SwingUtilities @@ -44,17 +48,23 @@ fun addJDKManger(parent: javax.swing.Box){ add(composePanel, BorderLayout.EAST) } } + } +fun main() = application { + Window(onCloseRequest = ::exitApplication) { +// JDKManager() + } +} // If the user does not have a valid JDK installed on their system, this function will display a message and a button to download the JDK // Temporary workaround until we ship Processing with a JDK again -@OptIn(ExperimentalFoundationApi::class, ExperimentalComposeUiApi::class) +@OptIn(ExperimentalResourceApi::class) @Composable fun JDKManager(){ val home = Platform.getJavaHome() val valid = File(home, "bin/java").exists() - if(valid) return +// if(valid) return val color = Theme.getColor("status.notice.bgcolor") val colorText = Theme.getColor("status.notice.fgcolor") @@ -77,6 +87,16 @@ fun JDKManager(){ else -> "linux" } + val composition by rememberLottieComposition { + LottieCompositionSpec.JsonString( +"{\"v\":\"5.3.4\",\"fr\":24,\"ip\":0,\"op\":55,\"w\":1000,\"h\":1000,\"nm\":\"Comp 1\",\"ddd\":0,\"assets\":[{\"id\":\"comp_0\",\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":0,\"nm\":\"roj\",\"refId\":\"comp_1\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833],\"y\":[0.833]},\"o\":{\"x\":[0.167],\"y\":[0.167]},\"n\":[\"0p833_0p833_0p167_0p167\"],\"t\":6,\"s\":[0],\"e\":[84]},{\"t\":23}],\"ix\":10},\"p\":{\"a\":0,\"k\":[500,500,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[500,500,0],\"ix\":1},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833,0.833,0.833],\"y\":[0.833,0.833,0.833]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0.167,0.167,0.167]},\"n\":[\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\"],\"t\":6,\"s\":[100,100,100],\"e\":[157,157,100]},{\"t\":10}],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":6,\"op\":36,\"st\":6,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":0,\"nm\":\"Ama\",\"refId\":\"comp_3\",\"sr\":1,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833],\"y\":[0.833]},\"o\":{\"x\":[0.167],\"y\":[0.167]},\"n\":[\"0p833_0p833_0p167_0p167\"],\"t\":20,\"s\":[100],\"e\":[1]},{\"t\":29}],\"ix\":11},\"r\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833],\"y\":[0.833]},\"o\":{\"x\":[0.167],\"y\":[0.167]},\"n\":[\"0p833_0p833_0p167_0p167\"],\"t\":4,\"s\":[0],\"e\":[85]},{\"t\":29}],\"ix\":10},\"p\":{\"a\":0,\"k\":[497.25,498.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[496.75,500.5,0],\"ix\":1},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833,0.833,0.833],\"y\":[0.833,0.833,0.833]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0.167,0.167,0.167]},\"n\":[\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\"],\"t\":4,\"s\":[54,54,100],\"e\":[100,100,100]},{\"i\":{\"x\":[0.833,0.833,0.833],\"y\":[0.833,0.833,0.833]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0.167,0.167,0.167]},\"n\":[\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\"],\"t\":8,\"s\":[100,100,100],\"e\":[134,134,100]},{\"i\":{\"x\":[0.833,0.833,0.833],\"y\":[0.833,0.833,0.833]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0.167,0.167,0.167]},\"n\":[\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\"],\"t\":17,\"s\":[134,134,100],\"e\":[96,96,100]},{\"t\":19}],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":4,\"op\":34,\"st\":4,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":0,\"nm\":\"nar\",\"refId\":\"comp_5\",\"sr\":1,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833],\"y\":[0.833]},\"o\":{\"x\":[0.167],\"y\":[0.167]},\"n\":[\"0p833_0p833_0p167_0p167\"],\"t\":15,\"s\":[100],\"e\":[0]},{\"t\":20}],\"ix\":11},\"r\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833],\"y\":[0.833]},\"o\":{\"x\":[0.167],\"y\":[0.167]},\"n\":[\"0p833_0p833_0p167_0p167\"],\"t\":5,\"s\":[0],\"e\":[46]},{\"t\":21}],\"ix\":10},\"p\":{\"a\":0,\"k\":[497.5,499.25,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[497.5,499.25,0],\"ix\":1},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833,0.833,0.833],\"y\":[0.833,0.833,0.833]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0.167,0.167,0.167]},\"n\":[\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\"],\"t\":1,\"s\":[30,30,100],\"e\":[100,100,100]},{\"i\":{\"x\":[0.833,0.833,0.833],\"y\":[0.833,0.833,0.833]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0.167,0.167,0.167]},\"n\":[\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\"],\"t\":5,\"s\":[100,100,100],\"e\":[123,123,100]},{\"i\":{\"x\":[0.833,0.833,0.833],\"y\":[0.833,0.833,0.833]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0.167,0.167,0.167]},\"n\":[\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\"],\"t\":8,\"s\":[123,123,100],\"e\":[273.393,273.393,100]},{\"t\":14}],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0}]},{\"id\":\"comp_1\",\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":0,\"nm\":\"ROJO\",\"refId\":\"comp_2\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-301.855,\"ix\":10},\"p\":{\"a\":0,\"k\":[497.875,499.375,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[496.944,499.56,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":0,\"nm\":\"ROJO\",\"refId\":\"comp_2\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-252.88,\"ix\":10},\"p\":{\"a\":0,\"k\":[497.875,499.375,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[496.944,499.56,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":0,\"nm\":\"ROJO\",\"refId\":\"comp_2\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-198.233,\"ix\":10},\"p\":{\"a\":0,\"k\":[497.875,499.375,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[496.944,499.56,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":0,\"nm\":\"ROJO\",\"refId\":\"comp_2\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-149.663,\"ix\":10},\"p\":{\"a\":0,\"k\":[497.875,499.375,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[496.944,499.56,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":5,\"ty\":0,\"nm\":\"ROJO\",\"refId\":\"comp_2\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-99.267,\"ix\":10},\"p\":{\"a\":0,\"k\":[497.875,499.375,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[496.944,499.56,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":6,\"ty\":0,\"nm\":\"ROJO\",\"refId\":\"comp_2\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-45.613,\"ix\":10},\"p\":{\"a\":0,\"k\":[497.875,499.375,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[496.944,499.56,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":7,\"ty\":0,\"nm\":\"ROJO\",\"refId\":\"comp_2\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":10.106,\"ix\":10},\"p\":{\"a\":0,\"k\":[497.875,499.375,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[496.944,499.56,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0}]},{\"id\":\"comp_2\",\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"Shape Layer 1\",\"sr\":1,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833],\"y\":[0.833]},\"o\":{\"x\":[0.167],\"y\":[0.167]},\"n\":[\"0p833_0p833_0p167_0p167\"],\"t\":11,\"s\":[100],\"e\":[0]},{\"t\":14}],\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[500,500,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":1,\"s\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[0.75,-5.625],[-3.625,0],[3.375,-0.75]],\"c\":true}],\"e\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[5.125,-10.125],[-3.625,0],[9.875,-1.75]],\"c\":true}]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":3,\"s\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[5.125,-10.125],[-3.625,0],[9.875,-1.75]],\"c\":true}],\"e\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[19.625,-19.625],[5.875,-4.5],[25.375,-7.75]],\"c\":true}]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":5.412,\"s\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[19.625,-19.625],[5.875,-4.5],[25.375,-7.75]],\"c\":true}],\"e\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[67.125,-43.625],[30.875,-18.5],[71.375,-36.25]],\"c\":true}]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":7.529,\"s\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[67.125,-43.625],[30.875,-18.5],[71.375,-36.25]],\"c\":true}],\"e\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[135.625,-79.625],[73.875,-42],[136.375,-77.25]],\"c\":true}]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":11,\"s\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[135.625,-79.625],[73.875,-42],[136.375,-77.25]],\"c\":true}],\"e\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[219.125,-134.125],[194.125,-119.75],[219.375,-133.5]],\"c\":true}]},{\"t\":14}],\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0,0,0,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":0,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":4,\"ml2\":{\"a\":0,\"k\":4,\"ix\":8},\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.125670728496,0.339342573577,0.65306372549,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformar\"}],\"nm\":\"Shape 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":30,\"st\":0,\"bm\":0}]},{\"id\":\"comp_3\",\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":0,\"nm\":\"AMARILLO\",\"refId\":\"comp_4\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":298.463,\"ix\":10},\"p\":{\"a\":0,\"k\":[497.75,500.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[497.731,499.593,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":0,\"nm\":\"AMARILLO\",\"refId\":\"comp_4\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":257.603,\"ix\":10},\"p\":{\"a\":0,\"k\":[497.75,500.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[497.731,499.593,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":0,\"nm\":\"AMARILLO\",\"refId\":\"comp_4\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":211.954,\"ix\":10},\"p\":{\"a\":0,\"k\":[497.75,500.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[497.731,499.593,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":0,\"nm\":\"AMARILLO\",\"refId\":\"comp_4\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":166.163,\"ix\":10},\"p\":{\"a\":0,\"k\":[497.75,500.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[497.731,499.593,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":5,\"ty\":0,\"nm\":\"AMARILLO\",\"refId\":\"comp_4\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":119.533,\"ix\":10},\"p\":{\"a\":0,\"k\":[497.75,500.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[497.731,499.593,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":6,\"ty\":0,\"nm\":\"AMARILLO\",\"refId\":\"comp_4\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":69.838,\"ix\":10},\"p\":{\"a\":0,\"k\":[497.75,500.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[497.731,499.593,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":7,\"ty\":0,\"nm\":\"AMARILLO\",\"refId\":\"comp_4\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":24.35,\"ix\":10},\"p\":{\"a\":0,\"k\":[497.75,500.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[497.731,499.593,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":8,\"ty\":0,\"nm\":\"AMARILLO\",\"refId\":\"comp_4\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-22.692,\"ix\":10},\"p\":{\"a\":0,\"k\":[497.75,500.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[497.731,499.593,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0}]},{\"id\":\"comp_4\",\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"Shape Layer 1\",\"sr\":1,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833],\"y\":[0.833]},\"o\":{\"x\":[0.167],\"y\":[0.167]},\"n\":[\"0p833_0p833_0p167_0p167\"],\"t\":13,\"s\":[100],\"e\":[0]},{\"t\":16}],\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[496.25,499.875,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[-3.75,-0.125,0],\"ix\":1},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833,0.833,0.833],\"y\":[0.833,0.833,0.833]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0.167,0.167,0.167]},\"n\":[\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\"],\"t\":2,\"s\":[229,229,100],\"e\":[176,176,100]},{\"t\":15}],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":3,\"s\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[0.75,-5.625],[-3.625,0],[3.375,-0.75]],\"c\":true}],\"e\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[5.125,-10.125],[-3.625,0],[9.875,-1.75]],\"c\":true}]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":5,\"s\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[5.125,-10.125],[-3.625,0],[9.875,-1.75]],\"c\":true}],\"e\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[19.625,-19.625],[5.875,-4.5],[25.375,-7.75]],\"c\":true}]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":7.412,\"s\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[19.625,-19.625],[5.875,-4.5],[25.375,-7.75]],\"c\":true}],\"e\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[67.125,-43.625],[30.875,-18.5],[71.375,-36.25]],\"c\":true}]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":9.529,\"s\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[67.125,-43.625],[30.875,-18.5],[71.375,-36.25]],\"c\":true}],\"e\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[135.625,-79.625],[73.875,-42],[136.375,-77.25]],\"c\":true}]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":13,\"s\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[135.625,-79.625],[73.875,-42],[136.375,-77.25]],\"c\":true}],\"e\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[219.125,-134.125],[194.125,-119.75],[219.375,-133.5]],\"c\":true}]},{\"t\":16}],\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0,0,0,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":0,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":4,\"ml2\":{\"a\":0,\"k\":4,\"ix\":8},\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.985922181373,0.777212404737,0.310502085966,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformar\"}],\"nm\":\"Shape 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":30,\"st\":0,\"bm\":0}]},{\"id\":\"comp_5\",\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":0,\"nm\":\"NARANJA\",\"refId\":\"comp_6\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-329.986,\"ix\":10},\"p\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":0,\"nm\":\"NARANJA\",\"refId\":\"comp_6\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-296.86,\"ix\":10},\"p\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":0,\"nm\":\"NARANJA\",\"refId\":\"comp_6\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-266.081,\"ix\":10},\"p\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":0,\"nm\":\"NARANJA\",\"refId\":\"comp_6\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-236.454,\"ix\":10},\"p\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":5,\"ty\":0,\"nm\":\"NARANJA\",\"refId\":\"comp_6\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-208.651,\"ix\":10},\"p\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":6,\"ty\":0,\"nm\":\"NARANJA\",\"refId\":\"comp_6\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-180.777,\"ix\":10},\"p\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":7,\"ty\":0,\"nm\":\"NARANJA\",\"refId\":\"comp_6\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-153.807,\"ix\":10},\"p\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":8,\"ty\":0,\"nm\":\"NARANJA\",\"refId\":\"comp_6\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-124.081,\"ix\":10},\"p\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":9,\"ty\":0,\"nm\":\"NARANJA\",\"refId\":\"comp_6\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-95.258,\"ix\":10},\"p\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":10,\"ty\":0,\"nm\":\"NARANJA\",\"refId\":\"comp_6\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-64.449,\"ix\":10},\"p\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":11,\"ty\":0,\"nm\":\"NARANJA\",\"refId\":\"comp_6\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-31.972,\"ix\":10},\"p\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":12,\"ty\":0,\"nm\":\"NARANJA\",\"refId\":\"comp_6\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[498.25,499.75,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":30,\"st\":0,\"bm\":0}]},{\"id\":\"comp_6\",\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"Shape Layer 1\",\"sr\":1,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833],\"y\":[0.833]},\"o\":{\"x\":[0.167],\"y\":[0.167]},\"n\":[\"0p833_0p833_0p167_0p167\"],\"t\":19,\"s\":[100],\"e\":[0]},{\"t\":24}],\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[500,500,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":2,\"s\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[5.125,-10.125],[-3.625,0],[9.875,-1.75]],\"c\":true}],\"e\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[19.625,-19.625],[5.875,-4.5],[25.375,-7.75]],\"c\":true}]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":7,\"s\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[19.625,-19.625],[5.875,-4.5],[25.375,-7.75]],\"c\":true}],\"e\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[67.125,-43.625],[30.875,-18.5],[71.375,-36.25]],\"c\":true}]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":12,\"s\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[67.125,-43.625],[30.875,-18.5],[71.375,-36.25]],\"c\":true}],\"e\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[135.625,-79.625],[73.875,-42],[136.375,-77.25]],\"c\":true}]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":19,\"s\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[135.625,-79.625],[73.875,-42],[136.375,-77.25]],\"c\":true}],\"e\":[{\"i\":[[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0]],\"v\":[[219.125,-134.125],[194.125,-119.75],[219.375,-133.5]],\"c\":true}]},{\"t\":25}],\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0,0,0,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":0,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":4,\"ml2\":{\"a\":0,\"k\":4,\"ix\":8},\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.151382551006,0.753048406863,0.606834680894,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformar\"}],\"nm\":\"Shape 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":30,\"st\":0,\"bm\":0}]}],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":0,\"nm\":\"1\",\"refId\":\"comp_0\",\"sr\":1.15,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[672,664,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[500,500,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[76,76,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":25,\"op\":66.4,\"st\":25,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":0,\"nm\":\"1\",\"refId\":\"comp_0\",\"sr\":1.15,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[332,676,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[500,500,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[76,76,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":13,\"op\":54.4,\"st\":13,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":0,\"nm\":\"1\",\"refId\":\"comp_0\",\"sr\":1.15,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[280,288,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[500,500,0],\"ix\":1},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833,0.833,0.833],\"y\":[0.833,0.833,0.833]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0.167,0.167,0.167]},\"n\":[\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\"],\"t\":28.2,\"s\":[132.4,132.4,100],\"e\":[61.4,61.4,100]},{\"t\":39.7004882881608}],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":19,\"op\":60.4,\"st\":19,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":0,\"nm\":\"1\",\"refId\":\"comp_0\",\"sr\":1.15,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[668,304,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[500,500,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[72.4,72.4,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":5,\"op\":46.4,\"st\":5,\"bm\":0},{\"ddd\":0,\"ind\":5,\"ty\":0,\"nm\":\"1\",\"refId\":\"comp_0\",\"sr\":1.15,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[497.438,499.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[497.438,499.5,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":11,\"op\":52.4,\"st\":11,\"bm\":0},{\"ddd\":0,\"ind\":6,\"ty\":0,\"nm\":\"1\",\"refId\":\"comp_0\",\"sr\":1.15,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[497.438,499.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[497.438,499.5,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":31,\"op\":72.4,\"st\":31,\"bm\":0},{\"ddd\":0,\"ind\":7,\"ty\":0,\"nm\":\"1\",\"refId\":\"comp_0\",\"sr\":1.15,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[497.438,499.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[497.438,499.5,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"w\":1000,\"h\":1000,\"ip\":0,\"op\":41.4,\"st\":0,\"bm\":0}],\"markers\":[]}" + ) + } + val progress by animateLottieCompositionAsState( + composition, + iterations = Compottie.IterateForever, + ) + Box( modifier = Modifier .fillMaxWidth() @@ -88,6 +108,13 @@ fun JDKManager(){ .padding(16.dp, 8.dp) .fillMaxWidth() ) { + Image( + painter = rememberLottiePainter( + composition = composition, + progress = { progress }, + ), + contentDescription = "Lottie animation" + ) Text( "JDK not found. Please download the JDK to run Processing.", fontFamily = fontFamily, diff --git a/java/build.gradle.kts b/java/build.gradle.kts index 3c22e39f86..63492afb7c 100644 --- a/java/build.gradle.kts +++ b/java/build.gradle.kts @@ -4,6 +4,7 @@ plugins { repositories{ mavenCentral() + google() maven { url = uri("https://jogamp.org/deployment/maven") } } From a82ac33f83468377110fe93ed5ddfbe13f7d2249 Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Sun, 17 Nov 2024 09:39:08 +0100 Subject: [PATCH 011/121] Contribution Manager UI Test --- app/build.gradle.kts | 10 +- .../app/contrib/ui/ContributionManager.kt | 188 ++++++++++++++++++ app/src/processing/app/ui/JVMManager.kt | 4 +- build.gradle.kts | 11 +- gradle/libs.versions.toml | 11 + settings.gradle.kts | 6 - 6 files changed, 218 insertions(+), 12 deletions(-) create mode 100644 app/src/processing/app/contrib/ui/ContributionManager.kt create mode 100644 gradle/libs.versions.toml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3c3a2e2ba4..599b675c4c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -2,8 +2,11 @@ import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins{ id("java") - kotlin("jvm") version "1.9.23" - id("org.jetbrains.compose") version "1.7.1" + + kotlin("jvm") version libs.versions.kotlin + alias(libs.plugins.compose.compiler) + alias(libs.plugins.jetbrainsCompose) + alias(libs.plugins.serialization) } group = rootProject.group @@ -28,7 +31,6 @@ sourceSets{ } } - compose.desktop { application { mainClass = "processing.app.ui.Splash" @@ -79,6 +81,8 @@ dependencies { implementation(compose.desktop.currentOs) implementation("io.github.alexzhirkevich:compottie:${compottieVersion}") + + implementation("com.charleskorn.kaml:kaml:0.65.0") } tasks.register("addCore"){ diff --git a/app/src/processing/app/contrib/ui/ContributionManager.kt b/app/src/processing/app/contrib/ui/ContributionManager.kt new file mode 100644 index 0000000000..8f91401eec --- /dev/null +++ b/app/src/processing/app/contrib/ui/ContributionManager.kt @@ -0,0 +1,188 @@ +package processing.app.contrib.ui + +import androidx.compose.foundation.* +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.input.pointer.PointerIcon +import androidx.compose.ui.input.pointer.pointerHoverIcon +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.LineHeightStyle +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Window +import androidx.compose.ui.window.application +import com.charleskorn.kaml.Yaml +import com.charleskorn.kaml.YamlConfiguration +import kotlinx.serialization.Serializable +import java.net.URL + + +fun main() = application { + Window(onCloseRequest = ::exitApplication) { + ContributionsManager() + } +} + +enum class Status { + VALID, + BROKEN, + DEPRECATED +} +enum class Type { + library, + mode, + tool, + examples, +} + +@Serializable +data class Author( + val name: String, + val url: String? = null, +) + +@Serializable +data class Contribution( + val id: Int, + val status: Status, + val source: String, + val type: Type, + val name: String? = null, + val categories: List? = emptyList(), + val authors: String? = null, + val authorList: List? = emptyList(), + val url: String? = null, + val sentence: String? = null, + val paragraph: String? = null, + val version: String? = null, + val prettyVersion: String? = null, + val minRevision: Int? = null, + val maxRevision: Int? = null, + val download: String? = null, +) + +@Serializable +data class Contributions( + val contributions: List +) + +@Composable +fun ContributionsManager(){ + val contributions = remember { mutableStateOf(arrayOf()) } + val error = remember { mutableStateOf(null) } + + LaunchedEffect(Unit){ + try { + val url = URL("https://github.com/mingness/processing-contributions-new/raw/refs/heads/main/contributions.yaml") + val connection = url.openConnection() + val inputStream = connection.getInputStream() + val yaml = inputStream.readAllBytes().decodeToString() + // TODO cache in processing folder + + val parser = Yaml( + configuration = YamlConfiguration( + strictMode = false + ) + ) + val result = parser.decodeFromString(Contributions.serializer(), yaml) + + contributions.value = result.contributions + .filter { it.status == Status.VALID } + .map { + // TODO Parse better + val authorList = it.authors?.split(",")?.map { author -> + val parts = author.split("](") + val name = parts[0].removePrefix("[") + val url = parts.getOrNull(1)?.removeSuffix(")") + Author(name, url) + } ?: emptyList() + it.copy(authorList = authorList) + } + .toTypedArray() + } catch (e: Exception){ + error.value = e + } + } + if(error.value != null){ + Text("Error loading contributions: ${error.value}") + return + } + if(contributions.value.isEmpty()){ + Text("Loading contributions...") + return + } + + val contributionsByType = contributions.value.groupBy { it.type } + val types = Type.entries + val selectedType = remember { mutableStateOf(types.first()) } + val contributionsForType = (contributionsByType[selectedType.value] ?: emptyList()) + .sortedBy { it.name } + + val selectedContribution = remember { mutableStateOf(null) } + + Box{ + Column { + Row{ + for(type in types){ + Text(type.name, modifier = Modifier + .background(if(selectedType.value == type) Color.Gray else Color.Transparent) + .clickable { + selectedType.value = type + selectedContribution.value = null + } + .padding(8.dp) + ) + } + Spacer(modifier = Modifier.weight(1f)) + Text("Updates") + } + Box{ + val state = rememberLazyListState() + LazyColumn(state = state) { + item{ + // Table Header + } + items(contributionsForType){ contribution -> + Row(modifier = Modifier + .pointerHoverIcon(PointerIcon.Hand) + .clickable { selectedContribution.value = contribution } + .padding(8.dp) + ) { + Row(modifier = Modifier.weight(1f)){ + Text("status") + } + Row(horizontalArrangement = Arrangement.spacedBy(4.dp), modifier = Modifier.weight(8f)){ + Text(contribution.name ?: "Unnamed", fontWeight = FontWeight.Bold) + Text(contribution.sentence ?: "No description", maxLines = 1, overflow = TextOverflow.Ellipsis) + } + Row(modifier = Modifier.weight(4f)){ + Text(contribution.authorList?.joinToString { it.name } ?: "Unknown") + } + } + } + } + VerticalScrollbar( + modifier = Modifier + .align(Alignment.CenterEnd) + .background(Color.LightGray) + .fillMaxHeight(), + adapter = rememberScrollbarAdapter( + scrollState = state + ) + ) + } + } + + } + +} \ No newline at end of file diff --git a/app/src/processing/app/ui/JVMManager.kt b/app/src/processing/app/ui/JVMManager.kt index 103de7492f..eda5b3e5ef 100644 --- a/app/src/processing/app/ui/JVMManager.kt +++ b/app/src/processing/app/ui/JVMManager.kt @@ -64,11 +64,11 @@ fun main() = application { fun JDKManager(){ val home = Platform.getJavaHome() val valid = File(home, "bin/java").exists() -// if(valid) return + if(valid) return val color = Theme.getColor("status.notice.bgcolor") val colorText = Theme.getColor("status.notice.fgcolor") - val buttonColor = Theme.getColor("toolbar.button.enabled.field") + val buttonColor = Theme.getColor("toolbar.button.enabled.field") val buttonTextColor = Theme.getColor("toolbar.button.enabled.glyph") val fontFamily = FontFamily( diff --git a/build.gradle.kts b/build.gradle.kts index 97b5ab2141..ec5bc3f2f5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,2 +1,11 @@ group = "org.processing" -version = "4.4.0" \ No newline at end of file +version = "4.4.0" + +plugins { + kotlin("jvm") version libs.versions.kotlin apply false + alias(libs.plugins.kotlinMultiplatform) apply false + + alias(libs.plugins.compose.compiler) apply false + alias(libs.plugins.jetbrainsCompose) apply false + +} \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000000..9b6e36d78e --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,11 @@ +[versions] +kotlin = "2.0.20" +compose-plugin = "1.7.1" + +[libraries] + +[plugins] +jetbrainsCompose = { id = "org.jetbrains.compose", version.ref = "compose-plugin" } +kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index e5ab178524..31f11a68b2 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,12 +6,6 @@ include( "java" ) -pluginManagement { - plugins { - kotlin("jvm") version "1.9.23" - } -} - buildscript { repositories { mavenCentral() From 66cdcba956587e2d35ff520f52ae226a2cb0d92c Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Sun, 17 Nov 2024 09:39:44 +0100 Subject: [PATCH 012/121] .idea meta files --- .gitignore | 1 + .idea/.name | 1 + .idea/artifacts/app_desktop.xml | 6 ++ .idea/artifacts/app_jvm.xml | 6 ++ .idea/compiler.xml | 12 +-- .idea/jarRepositories.xml | 5 + .idea/kotlinc.xml | 2 +- .idea/misc.xml | 2 +- .idea/modules.xml | 4 + .idea/modules/app/processing.app.iml | 1 + .idea/modules/app/processing.app.main.iml | 95 +++++++++++++++---- .idea/modules/app/processing.app.test.iml | 83 ++++++++++++---- .../different/processing.core.different.iml | 1 + .idea/modules/core/processing.core.iml | 3 +- .idea/modules/core/processing.core.main.iml | 5 +- .idea/modules/core/processing.core.test.iml | 3 +- .idea/modules/java/processing.java.iml | 1 + .idea/modules/java/processing.java.main.iml | 65 +++++++++++-- .idea/modules/java/processing.java.test.iml | 60 ++++++++++-- .idea/modules/processing.iml | 3 +- 20 files changed, 289 insertions(+), 70 deletions(-) create mode 100644 .idea/.name create mode 100644 .idea/artifacts/app_desktop.xml create mode 100644 .idea/artifacts/app_jvm.xml diff --git a/.gitignore b/.gitignore index 2853501d5e..a0ed7c50f0 100644 --- a/.gitignore +++ b/.gitignore @@ -103,3 +103,4 @@ core/build/ build/publish/ app/build java/build/ +/build/reports diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000000..e93403586b --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +processing \ No newline at end of file diff --git a/.idea/artifacts/app_desktop.xml b/.idea/artifacts/app_desktop.xml new file mode 100644 index 0000000000..0e28344dcb --- /dev/null +++ b/.idea/artifacts/app_desktop.xml @@ -0,0 +1,6 @@ + + + $PROJECT_DIR$/app/build/libs + + + \ No newline at end of file diff --git a/.idea/artifacts/app_jvm.xml b/.idea/artifacts/app_jvm.xml new file mode 100644 index 0000000000..1f0afe2f97 --- /dev/null +++ b/.idea/artifacts/app_jvm.xml @@ -0,0 +1,6 @@ + + + $PROJECT_DIR$/app/build/libs + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 4794b23381..b589d56e9f 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,16 +1,6 @@ - - - - - - - - - - - + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml index f850df2542..e9be690395 100644 --- a/.idea/jarRepositories.xml +++ b/.idea/jarRepositories.xml @@ -21,5 +21,10 @@