From 4f0debfdf27bf3ea94d29da55e3bc0faf7c32212 Mon Sep 17 00:00:00 2001 From: TuukkaAro <59646565+TuukkaAro@users.noreply.github.com> Date: Sun, 16 Feb 2020 17:51:55 +0200 Subject: [PATCH] ver_f --- README.md | 42 +- bin/.gitignore | 20 + bin/.gitlab-ci.yml | 13 + bin/README.md | 41 ++ bin/build.sbt | 236 +++++++++ bin/pom.xml | 452 ++++++++++++++++++ bin/project/build.properties | 1 + bin/project/plugins.sbt | 7 + .../java/fi/utu/tech/gui/javafx/Dialogs.class | Bin 0 -> 1402 bytes .../java/fi/utu/tech/gui/javafx/Main.class | Bin 0 -> 1516 bytes .../java/fi/utu/tech/gui/javafx/MainApp.class | Bin 0 -> 1813 bytes .../utu/tech/gui/javafx/ResourceLoader.class | Bin 0 -> 1831 bytes .../javafx/gimmick/GimmickController.class | Bin 0 -> 1593 bytes .../tech/gui/javafx/gimmick/MainApp2.class | Bin 0 -> 1598 bytes .../fi/utu/tech/gui/javafx/gimmick/View.class | Bin 0 -> 857 bytes .../utu/tech/gui/javafx/gimmick/View1.class | Bin 0 -> 2865 bytes .../utu/tech/gui/javafx/gimmick/View2.class | Bin 0 -> 3153 bytes .../utu/tech/gui/javafx/zipper/MainApp1.class | Bin 0 -> 1594 bytes .../utu/tech/gui/javafx/zipper/Zipper.class | Bin 0 -> 4076 bytes .../gui/javafx/zipper/ZipperController.class | Bin 0 -> 8420 bytes .../fi/utu/tech/gui/javafx/alien.png | Bin .../fi/utu/tech/gui/javafx/gimmick.fxml | 0 .../resources/fi/utu/tech/gui/javafx/hmm.png | Bin .../fi/utu/tech/gui/javafx/package.png | Bin 0 -> 8960 bytes .../fi/utu/tech/gui/javafx/styles.css | 7 + .../fi/utu/tech/gui/javafx/zipper.fxml | 70 +++ .../java/fi/utu/tech/gui/javafx/Main.java | 16 +- .../gui/javafx/gimmick/GimmickController.java | 41 -- .../utu/tech/gui/javafx/gimmick/MainApp2.java | 20 - .../fi/utu/tech/gui/javafx/gimmick/View.java | 18 - .../fi/utu/tech/gui/javafx/gimmick/View1.java | 69 --- .../fi/utu/tech/gui/javafx/gimmick/View2.java | 56 --- .../utu/tech/gui/javafx/zipper/MainApp1.java | 2 +- .../fi/utu/tech/gui/javafx/zipper.fxml | 2 +- 34 files changed, 852 insertions(+), 261 deletions(-) create mode 100644 bin/.gitignore create mode 100644 bin/.gitlab-ci.yml create mode 100644 bin/README.md create mode 100644 bin/build.sbt create mode 100644 bin/pom.xml create mode 100644 bin/project/build.properties create mode 100644 bin/project/plugins.sbt create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/Dialogs.class create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/Main.class create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/MainApp.class create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/ResourceLoader.class create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/GimmickController.class create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/MainApp2.class create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/View.class create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/View1.class create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/View2.class create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/zipper/MainApp1.class create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/zipper/Zipper.class create mode 100644 bin/src/main/java/fi/utu/tech/gui/javafx/zipper/ZipperController.class rename {src => bin/src}/main/resources/fi/utu/tech/gui/javafx/alien.png (100%) rename {src => bin/src}/main/resources/fi/utu/tech/gui/javafx/gimmick.fxml (100%) rename {src => bin/src}/main/resources/fi/utu/tech/gui/javafx/hmm.png (100%) create mode 100644 bin/src/main/resources/fi/utu/tech/gui/javafx/package.png create mode 100644 bin/src/main/resources/fi/utu/tech/gui/javafx/styles.css create mode 100644 bin/src/main/resources/fi/utu/tech/gui/javafx/zipper.fxml delete mode 100644 src/main/java/fi/utu/tech/gui/javafx/gimmick/GimmickController.java delete mode 100644 src/main/java/fi/utu/tech/gui/javafx/gimmick/MainApp2.java delete mode 100644 src/main/java/fi/utu/tech/gui/javafx/gimmick/View.java delete mode 100644 src/main/java/fi/utu/tech/gui/javafx/gimmick/View1.java delete mode 100644 src/main/java/fi/utu/tech/gui/javafx/gimmick/View2.java diff --git a/README.md b/README.md index 1fb7c19..8acde39 100644 --- a/README.md +++ b/README.md @@ -1,41 +1 @@ -palauttaja: Tuukka Aro - -# Project description - -Simple template for projects that make use of JavaFX and FXML (Scene Builder). -Requires Java 11 or later. Compatible with -Eclipse and IntelliJ IDEA. Minor issues with Netbeans. Automatically -integrates with Gitlab CI. - -## Installation - -Maven: - -```bash -$ git clone https://gitlab.utu.fi/tech/education/gui/template-javafx - -$ cd template-javafx - -$ mvn compile exec:java -``` - -SBT: - -```bash -$ git clone https://gitlab.utu.fi/tech/education/gui/template-javafx - -$ cd template-javafx - -$ sbt compile run -``` - -## Further instructions - - * Java platform: https://gitlab.utu.fi/soft/ftdev/wikis/tutorials/jvm-platform - * Maven: https://gitlab.utu.fi/soft/ftdev/wikis/tutorials/maven-misc - * SBT: https://gitlab.utu.fi/soft/ftdev/wikis/tutorials/sbt-misc - -External sources: - - * JavaFX: https://openjfx.io/javadoc/11/ - * Scene Builder: https://docs.gluonhq.com/scenebuilder/ +# Revitty Jari-Matti Mäkelän projektista. Tuukan koodinäyte ZIP-pakkaaja. \ No newline at end of file diff --git a/bin/.gitignore b/bin/.gitignore new file mode 100644 index 0000000..5bfb48e --- /dev/null +++ b/bin/.gitignore @@ -0,0 +1,20 @@ +contracts/ +.classpath +.project +.history/ +.idea +.jqwik-database +.lib/ +.worksheet +.settings/ +*.iml +*.ipr +*.iws +*.log +project/boot/ +project/plugins/project/ +project/project/ +project/*-shim.sbt +project/target/ +target/ +openjfx/ diff --git a/bin/.gitlab-ci.yml b/bin/.gitlab-ci.yml new file mode 100644 index 0000000..4b3553b --- /dev/null +++ b/bin/.gitlab-ci.yml @@ -0,0 +1,13 @@ +image: maven:latest + +stages: + - build + - test + +build: + script: + - mvn compile + +test: + script: + - mvn test \ No newline at end of file diff --git a/bin/README.md b/bin/README.md new file mode 100644 index 0000000..1fb7c19 --- /dev/null +++ b/bin/README.md @@ -0,0 +1,41 @@ +palauttaja: Tuukka Aro + +# Project description + +Simple template for projects that make use of JavaFX and FXML (Scene Builder). +Requires Java 11 or later. Compatible with +Eclipse and IntelliJ IDEA. Minor issues with Netbeans. Automatically +integrates with Gitlab CI. + +## Installation + +Maven: + +```bash +$ git clone https://gitlab.utu.fi/tech/education/gui/template-javafx + +$ cd template-javafx + +$ mvn compile exec:java +``` + +SBT: + +```bash +$ git clone https://gitlab.utu.fi/tech/education/gui/template-javafx + +$ cd template-javafx + +$ sbt compile run +``` + +## Further instructions + + * Java platform: https://gitlab.utu.fi/soft/ftdev/wikis/tutorials/jvm-platform + * Maven: https://gitlab.utu.fi/soft/ftdev/wikis/tutorials/maven-misc + * SBT: https://gitlab.utu.fi/soft/ftdev/wikis/tutorials/sbt-misc + +External sources: + + * JavaFX: https://openjfx.io/javadoc/11/ + * Scene Builder: https://docs.gluonhq.com/scenebuilder/ diff --git a/bin/build.sbt b/bin/build.sbt new file mode 100644 index 0000000..e703e90 --- /dev/null +++ b/bin/build.sbt @@ -0,0 +1,236 @@ +// Project template + +// Supported operating systems: Windows, Mac, Linux +// Supported JDKs: 8, 10+ + +// Project name +name := "template-javafx" + +// organization name +organization := "fi.utu.tech" + +version := "1.0" + +// project description +description := "JavaFX project template" + +// main class +Compile/mainClass := Some("fi.utu.tech.gui.javafx.Main") + +// force the java version by typing it here (remove the comment) +val force_javaVersion = None // Some(13) + +// force the javafx version by typing it here (remove the comment) +val force_javaFxVersion = None // Some(13) + +val useJavaFX = true + +val useScalaOrScalaFX = true + +// END_OF_SIMPLE_CONFIGURATION +// you can copy the rest for each new project +// --- --- --- + +def fail(msg: String) = { + println("Error :-/") + println + println(msg) + System.exit(1) + null +} + +val detectedJDK = System.getProperty("java.version").replace("-ea","").split('.').dropWhile(_.toInt<8).head.toInt + +val javaVersionNum = force_javaVersion.getOrElse(detectedJDK) + +val javaVersionString = javaVersionNum match { + case 7 => "1.7" + case 8 => "1.8" + case x if x > 8 => x.toString +} + +val lts = 11 +val dev = 13 + +val supported = javaVersionNum match { + case x if x < 8 => fail("Your Java installation is obsolete. Please upgrade to Java " + lts + "LTS") + case 9 => fail("Your Java installation is unsupported and has known issues. Please upgrade to Java " + lts + "LTS") + case x if x < lts => println("Consider upgrading to Java " + lts + " LTS"); true + case x if x > lts && x < dev => println("Consider upgrading to Java " + dev); true + case x if x > dev => println("Unsupported early access version. Consider switching back to Java " + dev); true + case _ => true +} + +javacOptions ++= Seq("-source", javaVersionString, "-target", javaVersionString, "-encoding", "utf8", "-Xlint:unchecked", "-Xlint:deprecation") +javacOptions in doc := Seq("-source", javaVersionString) + +enablePlugins(JShellPlugin) + +compileOrder := CompileOrder.JavaThenScala + +// Enables publishing to maven repo +publishMavenStyle := true + +// Do not append Scala versions to the generated artifacts +crossPaths := false + +// This forbids including Scala related libraries into the dependency +autoScalaLibrary := false + +assemblyMergeStrategy in assembly := { + case PathList("META-INF", xs @ _*) => MergeStrategy.discard + case _ => MergeStrategy.first +} + +// contains libraries provided by utu/ft dep +resolvers += "ftdev" at "https://ftdev.utu.fi/maven2" + +fork in Global := true + +val javaVersion = taskKey[Unit]("Prints the Java version.") + +javaVersion := { println("SBT uses Java SDK located at "+System.getProperty("java.home")) } + +publishTo := Some(Resolver.file("file", new File("/tmp/repository"))) + +val oomkit = "fi.utu.tech" % "oomkit" % "1.15" + +libraryDependencies ++= Seq() + +//// +//// JQWIK / JUNIT configuration +//// + +resolvers in ThisBuild += Resolver.jcenterRepo + +val junit_version = "5.5.2" + +// library dependencies. (orginization name) % (project name) % (version) +libraryDependencies ++= Seq( + "net.aichler" % "jupiter-interface" % JupiterKeys.jupiterVersion.value % Test, + "org.junit.platform" % "junit-platform-commons" % ("1"+junit_version.tail) % Test, + "org.junit.platform" % "junit-platform-runner" % ("1"+junit_version.tail) % Test, + "org.junit.jupiter" % "junit-jupiter-engine" % junit_version % Test, + "org.junit.jupiter" % "junit-jupiter-api" % junit_version % Test, + "org.junit.jupiter" % "junit-jupiter-migrationsupport" % junit_version % Test, + "org.junit.jupiter" % "junit-jupiter-params" % junit_version % Test, + "net.jqwik" % "jqwik" % "1.2.0" % Test, + "org.scalatest" %% "scalatest" % "3.0.8" % Test, +) + +testOptions += Tests.Argument(TestFrameworks.JUnit, "-q", "-c") + +//// +//// JAVAFX configuration +//// + +val javafx_versions = if (!useJavaFX) (0,"-","-") else (force_javaFxVersion getOrElse javaVersionNum) match { + case 7 => (7, "7", "8.0.181-R13") + case 8 => (8, "8", "8.0.181-R13") + case 10 => (11, "11.0.2", "11-R16") + case x if x>10 => (13, "13", "12.0.2-R18") + case _ => fail("Unsupported Java version for JavaFX") +} + +// JAVA_HOME location +val javaHomeDir = { + val path = try { + if (scala.sys.env("JAVA_HOME").trim.isEmpty) throw new Exception("Empty JAVA_HOME") else scala.sys.env("JAVA_HOME") + } catch { + case _: Throwable => System.getProperty("java.home") // not set -> ask from current JVM + } + + val f = file(path) + if (!f.exists()) fail("The environment variable JAVA_HOME points to a non-existent directory!\nSolution: Edit your system settings (Windows control panel / *nix .bashrc) and fix the JAVA_HOME location.") + f +} + +val osName: SettingKey[String] = SettingKey[String]("osName") + +osName := (System.getProperty("os.name") match { + case n if n.startsWith("Linux") => "linux" + case n if n.startsWith("Mac") => "mac" + case n if n.startsWith("Windows") => "win" + case _ => throw new Exception("Unknown platform!") +}) + +def legacyJavaFX() = { + val searchDirs = Seq( + "/jre/lib/jfxrt.jar", // OpenJDK 7 + "/jre/lib/ext/jfxrt.jar", // OpenJDK 8 + "/lib/ext/jfxrt.jar" // Windows & Oracle Java 8 + ) + + if (detectedJDK > 8) fail(s"Trying to use legacy non-modular JavaFX with a modern JDK [$detectedJDK].\nSolution: Check the line 'val force_javaFxVersion =' in build.sbt.") + + val javaFxJAR = searchDirs.map{ searchDir => file(javaHomeDir + searchDir) }.find{ _.exists() } + + javaFxJAR.getOrElse { + fail(s"Java FX runtime not installed in [${javaHomeDir.toString}]!\nSolution: Install JavaFX or consider upgrading your JDK so that JavaFX can be installed automatically.") + } +} + +val jfx_sdk_version = javafx_versions._2 +val jfx_scalafx_version = javafx_versions._3 + +val javaFxPath = Def.taskKey[File]("OpenJFX fetcher") +javaFxPath := { + val javaFxHome = + try { + val envHome = file(scala.sys.env("JAVAFX_HOME")) + if (envHome.toString.trim.isEmpty) throw new Exception("Empty JAVAFX_HOME") + println("Using OpenJFX from " + envHome) + envHome + } + catch { case _: Throwable => + println("Using local OpenJFX") + baseDirectory.value / "openjfx" + } + + if (!javaFxHome.exists()) java.nio.file.Files.createDirectory(javaFxHome.toPath) + + val jfx_os = osName.value match { + case "linux" => "linux" + case "mac" => "osx" + case "win" => "windows" + } + + val sdkURL = "http://download2.gluonhq.com/openjfx/" + jfx_sdk_version + "/openjfx-" + jfx_sdk_version + "_" + jfx_os + "-x64_bin-sdk.zip" + + try { + val testDir = javaFxHome / "all.ok" + if (!testDir.exists()) { + println("Fetching OpenJFX from "+sdkURL+"..") + IO.unzipURL(new URL(sdkURL), javaFxHome) + java.nio.file.Files.createDirectory(testDir.toPath) + println("Fetching OpenJFX done.") + } else { + println("Using OpenJFX from "+javaFxHome) + } + + javaFxHome + } + catch { + case t: Throwable => fail("Could not load OpenJFX! Reason:" + t.getMessage) + } +} + +val jfxModules = Seq("base","controls","fxml","graphics","media","swing","web") + + +if (!useJavaFX) Seq() else javafx_versions._1 match { + case 7 => + // TODO libraryDependencies + Seq(unmanagedJars in Compile += Attributed.blank(legacyJavaFX())) + case 8 => + (if (useScalaOrScalaFX) Seq(libraryDependencies += "org.scalafx" %% "scalafx" % jfx_scalafx_version) else Seq()) ++ + Seq(unmanagedJars in Compile += Attributed.blank(legacyJavaFX())) + case _ => + Seq( + javaOptions in run ++= Seq( + "--module-path", (javaFxPath.value / ("javafx-sdk-" + jfx_sdk_version) / "lib").toString, + "--add-modules=" + jfxModules.map("javafx."+_).mkString(",")) + ) ++ + (if (useScalaOrScalaFX) Seq(libraryDependencies += "org.scalafx" % "scalafx_2.13" % jfx_scalafx_version) else Seq()) ++ + jfxModules.map(module => libraryDependencies += "org.openjfx" % ("javafx-"+module) % jfx_sdk_version classifier osName.value) +} diff --git a/bin/pom.xml b/bin/pom.xml new file mode 100644 index 0000000..d5e6482 --- /dev/null +++ b/bin/pom.xml @@ -0,0 +1,452 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <!-- + + Welcome! + This pom.xml is *THE* file that defines your Maven style Java project. + + Eclipse, IDEA and other development environments with Maven support + or plugins can *import* this project by reading this file. + + It usually contains tons of barely readable configuration. Luckily + this basic pom.xml is somewhat readable. All necessary configuration + for customizing your project if located here on top before the + 'END OF SIMPLE CONFIGURATION' line below. + + Some basics: + + - Maven is a build system for Java/JVM + - the Maven projects define an artifact that has a three part id: + groupId - artifactId - version + + - For example, this project is called: + fi.utu.tech - oomkit - 1.15 + + - The group id is usually a web domain in reverse order. + + - You can use these id parts to search for projects at + https://search.maven.org/ + + - If your version is not final and you have plans to modify the + source code at some point, please use a version id that ends with + -SNAPSHOT, e.g 1.0-SNAPSHOT. Maven may cache the project jar + and refuse to overwrite old cached versions with new ones unless + you remember this convention. + + - This file supports + compiling the project with 'mvn compile' (see target/) + cleaning the class files with 'mvn clean' + executing the main routine with 'mvn exec:java' + executing the unit tests with 'mvn test' + packaging the application with 'mvn package' (see target/) + + - the Maven project structure is as follows: + https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html + + --> + + <!-- ==== START OF SIMPLE CONFIGURATION ==== --> + + <!-- the three parts of the artifact name --> + <groupId>fi.utu.tech</groupId> + <artifactId>template-javafx</artifactId> + <version>1.0</version> + + <!-- additional information about the project --> + <name>JavaFX project template</name> + <url>https://gitlab.utu.fi/tech/education/gui/template-javafx</url> + + <packaging>jar</packaging> + + <!-- HINT: More configuration here! --> + <properties> + <!-- Configures this project to use 'fi.utu.tech.AppMain' as its main class --> + <project.mainclass>fi.utu.tech.gui.javafx.Main</project.mainclass> + + + <!-- Don't touch these unless you know what you're doing! + + For example, the source encoding should always be utf-8. + You're probably doing something stupid if you think it + should be a 8-bit code page in 2019. --> + <jdk.version>11</jdk.version> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <jqwik.version>1.2.0</jqwik.version> + <junit.version>5.5.2</junit.version> + <junitplatform.version>1.5.2</junitplatform.version> + <javafx.version>13.0.2</javafx.version> + </properties> + + <!-- ==== END OF SIMPLE CONFIGURATION ==== --> + + <repositories> + <repository> + <snapshots> + <enabled>false</enabled> + </snapshots> + <id>central</id> + <name>Central Repository</name> + <url>https://repo.maven.apache.org/maven2</url> + </repository> + <repository> + <id>jcenter</id> + <name>jcenter</name> + <url>https://jcenter.bintray.com/</url> + </repository> + <!-- UTU repository --> + <repository> + <id>ftdev</id> + <name>ftdev</name> + <url>https://ftdev.utu.fi/maven2</url> + </repository> + </repositories> + + <dependencies> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-api</artifactId> + <version>${junit.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-engine</artifactId> + <version>${junit.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-params</artifactId> + <version>${junit.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.junit.platform</groupId> + <artifactId>junit-platform-commons</artifactId> + <version>${junitplatform.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>net.jqwik</groupId> + <artifactId>jqwik</artifactId> + <version>${jqwik.version}</version> + <scope>test</scope> + </dependency><!-- + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-migrationsupport</artifactId> + <version>${junit.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.junit.platform</groupId> + <artifactId>junit-platform-runner</artifactId> + <version>${junitplatform.version}</version> + <scope>test</scope> + </dependency> --> + + <!-- JavaFX (remove if not needed to speed up dep downloads)--> + <dependency> + <groupId>org.openjfx</groupId> + <artifactId>javafx-base</artifactId> + <version>${javafx.version}</version> + </dependency> + <dependency> + <groupId>org.openjfx</groupId> + <artifactId>javafx-controls</artifactId> + <version>${javafx.version}</version> + </dependency> + <dependency> + <groupId>org.openjfx</groupId> + <artifactId>javafx-fxml</artifactId> + <version>${javafx.version}</version> + </dependency> + <dependency> + <groupId>org.openjfx</groupId> + <artifactId>javafx-graphics</artifactId> + <version>${javafx.version}</version> + </dependency> + <dependency> + <groupId>org.openjfx</groupId> + <artifactId>javafx-media</artifactId> + <version>${javafx.version}</version> + </dependency> + <dependency> + <groupId>org.openjfx</groupId> + <artifactId>javafx-swing</artifactId> + <version>${javafx.version}</version> + </dependency> + <dependency> + <groupId>org.openjfx</groupId> + <artifactId>javafx-web</artifactId> + <version>${javafx.version}</version> + </dependency> + </dependencies> + + <build> + <plugins> + <!-- Make a 'fat' jar, that is, jar that contains all its dependencies and runs as is. + See: https://stackoverflow.com/a/57691362 --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-shade-plugin</artifactId> + <version>2.3</version> + <executions> + <execution> + <phase>package</phase> + <goals> + <goal>shade</goal> + </goals> + <configuration> + <filters> + <filter> + <artifact>*:*</artifact> + <excludes> + <exclude>module-info.class</exclude> + <exclude>META-INF/*.SF</exclude> + <exclude>META-INF/*.DSA</exclude> + <exclude>META-INF/*.RSA</exclude> + </excludes> + </filter> + </filters> + <transformers> + <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> + <mainClass>${project.mainclass}</mainClass> + </transformer> + </transformers> + </configuration> + </execution> + </executions> + </plugin> + + <!-- Run this app with exec:java --> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <version>1.6.0</version> + <executions> + <execution> + <goals> + <goal>java</goal> + </goals> + </execution> + </executions> + <configuration> + <mainClass>${project.mainclass}</mainClass> + <arguments> + <argument>arg1</argument> + <argument>arg2</argument> + </arguments> + </configuration> + </plugin> + + <!-- Make the packaged jar executable --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>3.1.2</version> + <configuration> + <!-- DO NOT include log4j.properties file in your Jar --> + <excludes> + <exclude>**/log4j.properties</exclude> + </excludes> + <archive> + <manifest> + <!-- Jar file entry point --> + <mainClass>${project.mainclass}</mainClass> + </manifest> + </archive> + </configuration> + </plugin> + + <!-- download source code in Eclipse, best practice --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-eclipse-plugin</artifactId> + <version>2.10</version> + <configuration> + <downloadSources>true</downloadSources> + <downloadJavadocs>false</downloadJavadocs> + </configuration> + </plugin> + + <!-- JDK source/target versions --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.8.1</version> + <configuration> + <source>${jdk.version}</source> + <target>${jdk.version}</target> + </configuration> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-source-plugin</artifactId> + <version>3.1.0</version> + <executions> + <execution> + <id>attach-sources</id> + <goals> + <goal>jar</goal> + </goals> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <version>3.1.1</version> + <executions> + <execution> + <id>attach-javadocs</id> + <goals> + <goal>jar</goal> + </goals> + </execution> + </executions> + <configuration> + <tags> + <tag> + <name>toDo</name> + <placement>a</placement> + <head>To do:</head> + </tag> + <tag> + <name>classInvariant</name> + <placement>t</placement> + <head>Class invariant:</head> + </tag> + <tag> + <name>classInvariantProtected</name> + <placement>t</placement> + <head>Protected class invariant:</head> + </tag> + <tag> + <name>classInvariantPrivate</name> + <placement>t</placement> + <head>Private class invariant:</head> + </tag> + <tag> + <name>abstractionFunction</name> + <placement>t</placement> + <head>Abstraction function:</head> + </tag> + <tag> + <name>pre</name> + <placement>cm</placement> + <head>Precondition:</head> + </tag> + <tag> + <name>post</name> + <placement>cm</placement> + <head>Postcondition:</head> + </tag> + <tag> + <name>postProtected</name> + <placement>cm</placement> + <head>Protected postcondition:</head> + </tag> + <tag> + <name>postPrivate</name> + <placement>cm</placement> + <head>Private postcondition:</head> + </tag> + <tag> + <name>time</name> + <placement>cmf</placement> + <head>Time complexity:</head> + </tag> + <tag> + <name>space</name> + <placement>cmf</placement> + <head>Space complexity:</head> + </tag> + <tag> + <name>correspondence</name> + <placement>a</placement> + <head>Correspondence:</head> + </tag> + <tag> + <name>download</name> + <placement>a</placement> + <head>Download:</head> + </tag> + </tags> + <show>protected</show> + <failOnError>false</failOnError> + <sourceFileExcludes> + <sourceFileExclude>**/module-info.java</sourceFileExclude> + </sourceFileExcludes> + </configuration> + </plugin> + + <!-- JUnit & JQwik test integration --> + + <!-- junit-platform-maven-plugin: supports modular tests + maven-surefire-plugin: non-modular tests + + Modular testing works via command line mvn, but is + still broken in Eclipse due to this + https://bugs.eclipse.org/bugs/show_bug.cgi?id=520667 + --> + <plugin> + <groupId>de.sormuras.junit</groupId> + <artifactId>junit-platform-maven-plugin</artifactId> + <version>1.0.0-M5</version> + <extensions>true</extensions> + <configuration> + <executor>JAVA</executor> + </configuration> + </plugin> + + <!-- + <plugin> + <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M3</version> + </plugin> + <plugin> + <artifactId>maven-failsafe-plugin</artifactId> + <version>3.0.0-M3</version> + </plugin> --> + + <!-- javafx:jlink: + https://github.com/openjfx/javafx-maven-plugin + Use 'mvn package' instead if you don't need jlink. + + <plugin> + <groupId>org.openjfx</groupId> + <artifactId>javafx-maven-plugin</artifactId> + <version>0.0.3</version> + <configuration> + <mainClass>${project.mainclass}</mainClass> + </configuration> + </plugin> --> + + </plugins> + <extensions> + <!-- Enables the use of SSH for deployments --> + <extension> + <groupId>org.apache.maven.wagon</groupId> + <artifactId>wagon-ssh-external</artifactId> + <version>3.3.3</version> + </extension> + <extension> + <groupId>org.apache.maven.wagon</groupId> + <artifactId>wagon-ssh</artifactId> + <version>3.3.3</version> + </extension> + </extensions> + </build> + <distributionManagement> + <repository> + <id>ftdev</id> + <name>UTU tech ftdev repository</name> + <url>scp://localhost:2222/var/www/maven2</url> + </repository> + </distributionManagement> +</project> diff --git a/bin/project/build.properties b/bin/project/build.properties new file mode 100644 index 0000000..6adcdc7 --- /dev/null +++ b/bin/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.3.3 diff --git a/bin/project/plugins.sbt b/bin/project/plugins.sbt new file mode 100644 index 0000000..37ca261 --- /dev/null +++ b/bin/project/plugins.sbt @@ -0,0 +1,7 @@ +resolvers += Resolver.jcenterRepo + +addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.9") +addSbtPlugin("net.aichler" % "sbt-jupiter-interface" % "0.8.3") +addSbtPlugin("com.github.xuwei-k" % "sbt-jshell" % "0.1.2") +//addSbtPlugin("org.xerial.sbt" % "sbt-sql-sqlite" % "0.8") +addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.4.0") diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/Dialogs.class b/bin/src/main/java/fi/utu/tech/gui/javafx/Dialogs.class new file mode 100644 index 0000000000000000000000000000000000000000..1562f84c0b6d6736eeac85bee405050ceddfcf05 GIT binary patch literal 1402 zcmX^0Z`VEs1_o0G8FmIHMh2bYqGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+ zzDs6ePJVhZI|B<Ng8*1zPGVlVzJF3yYH|r91Dj1|US^3MBLlOBW*8#_i*tTTDmw!w zBLhD|t!q(Heh~))HzQM7XkJljaehu&YKlT~er`c#PGU)Bex5=>QGQZRYHqQW0vBgU zMyf(dWkIR}$N)W%WqJ_H6p|D3^72a*l2R35hUh7HmMCNvD`e)SWEQ0+m*i9`6s4x6 z7NzDTr=}>R73JqD6r~oHW)`KUDCi~UBo-Gdq-Ex$7DH@FNlng41W6SnCTAz6rz$9= zW$Kldl<I-PKrg*CQxD{Xv<fAKl>F3U1(4mji6zMy3MCn-3aJ$ZsmUd&DGG4S#YM?_ zpx^}S(!*gC#OBQ0g8ZTqun*HJu=tCM(=)dqCo?&-M4`B}Ahk##IX|zsq^LBxB)>=j z5*iwsAdi>krKF~1=7Bt$U!;(dnwD6aQ-Z8oPr<jexCA7VnU|`Nm<Mt<#9$;Nxj2JM ziZb)kvA9H`BwryB93RwF<d~CMR6@Wu%GH!57G)+T<)m_PF>o;O@-VP6@G&xoYWRR+ zRUeeF^da812BlnnpUk{eztY^K)S?iOCPoG!pZw&+oG_>%P(hZGjLc$220b5AGLJPQ z1ABR5QC?<VIwOO$h7Z(QbXqfvgF%duk&%c@0x^L=2vScG<#7SZ(OjJP&4I@kBLi1( zerZv1s#|7GDkB3Av<w1gEOrJdMg}&B*BBXid^3xSGxO3zDhpDJ859{98JHPBfQf;T zft7)cfsuiofq}t<fti7kfq{W*Hv>nc5Z87Fp8X6A3``9C3=Cj33=E760t^fcJP=h3 wf($|o3=EtM!VDr%6SNqZ!6rjY5XE8w8`uOUu({%3Qi4I6fq{XAfssKH0I%4sD*ylh literal 0 HcmV?d00001 diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/Main.class b/bin/src/main/java/fi/utu/tech/gui/javafx/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..831b20e24b1ade98fa60338102f17021707ebb4d GIT binary patch literal 1516 zcmX^0Z`VEs1_o0G8FmIHMh4B|qGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+ zzHee?9y<dIBZB}~RZe1Fy1su>R%&tyBLkaFW?p8A9U}v?hGrNe1B-KhN-8@8CnEzt zLal32QGO8z12-enztFs*)Z+Y{veXoX<ow)%%$&rM%=|osf};GSoYdT6D+Mmjkc?D? zlFEWq1&{%HAj|ZEONuh{(iM^u^YZdb6p~UEV20=^c$O$+7As`trDPVRCYR(?Dio!r zr52^;C8wq+q!s1oDioy_mSz^ErYPto=Oh*vE2L%Sq!wef#ThJ5ZA(&8lXDV5_7@~3 zXD6noDk!C8>Xnw1>VZO8FTFHV59H6Z3MGY<{M2FvkOy-UOOi7bN-|OvQY#8llS@)l z6yTbRi<0#~5eC+!hr=j{_cC(}@{39o(lW6G95E_9a|?1ZlQT;cic1SpixiUc^NLG~ zN|Q_SixeQSub~MF`_jCW)U?bzP<ZDTDWs&PC6?xtAgk6>@GUJa0m)?Mr79%mfqVrq z7|BR3PMndfP?E2Z2u>1QoWYgFC8@bsJ>;2Jl9~>3Cq^pa;sm8&$ASVwtQzr1B3lhr zW`xfSY?4T3a4~Q&@bWOQGVn1nh-&zNB3>Vq!1W=1w+7`PexJ;|RKL>Pq|~C2#H5^5 zMg}3D{N%)(u*9NF5FaYYQj(Eb%*deaLv#+dW@KOir5r{E9*t-pxQ!ePVvLMzMC40| z4lKS$^577UA4UeQ;QZ2}<W#pzP{4ze4LGB*Ge|Kqut7qAk%7lIv$!}jFFmBPAhno5 zk%5tcnE?ct7#JB?8Q2&Y8Q2*Z7)%(L85kKD7`S#ba6}4mZD-)w&%nUI#K6zM09M1m zz{nuLz`(!*QN<w0AjH7Hz{w!YAObZ(3&jLcEGF=SO<)3>D-I?l7^E2(7+4q>86*L| Cq0}}2 literal 0 HcmV?d00001 diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/MainApp.class b/bin/src/main/java/fi/utu/tech/gui/javafx/MainApp.class new file mode 100644 index 0000000000000000000000000000000000000000..45a02d6c9bfd8442c8fe716d05e5559d56256463 GIT binary patch literal 1813 zcmX^0Z`VEs1_o0GRdxm@Mh2bYqGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+ zzHee?o?}4)I|B<Ng8*1zPGVlVzJF3yYH|r91Dj1|US^3MBLlOBW*8#_i*tTTDmw!w zBLhD|t!q(Heh~))HzU)w(7dA5;{2Sl)D(r}{M>@foWzpM{5*w%qWq+s)ZAh#1uo8z zj8uh`)a0DRqSO?Hg2d$P#Pn1JrL;`F(vng=kn8l)OEdLArl(aXDWv457AxfCmnh^W zmLz8=lw_nTq*fH9CYK;<E-p&e19=pzOAm)p5Sue|3-XIf6d=YcBq!#9%uY&GfH`~c zs&XtS$jMBGgeRuE6-x3I5*11+3sSi_{mW8|iZWADv3QSm%7RNk@rd7H!O5w4gj_|8 z8mIiCl+>btM1qC|r6!jo=B4Klu#}5|gMpWaft7)ekwH|$2b4JU!MPx~q$o2l-5Qkg z`F%3;QvFJElTwR95|eUL85x9p@{<#D!V-%zL42qnOG!p%F(ZSX4=I_?nvsD8l+73! zq=QQHN-}d(J@d*ki!+mQQXN4F6ddWrj0{{pu&A}>U=U|y@W7wlK)DU30e@OxWMC;S z$uD4JU@b05EGl7S;L`8`N2s-C7zcw4BO@Dro4^^HIIB3p=Hhn_CozeD7&X*RD2xnT z!TF^{$*FFcpcKFZEj+>H4kLr8XI^rCUU6n|Norn+M`mhKVo`ENB|C#6BLg>5?qz3C zW@KOm2LmGmk8fsiab{k6NM%84F@qulBLg!72(U0PGO#kRF)%W)GcYiiFfcPPGB7Z3 z?PlPJ6yn;>z_Xu$fq{vEpMe3ahJk^RL4bjQfd`_BL6AX+0VF2Oz{bGDAOck-%D{ld zG%+luNnkZif=tt7u$m^xAceziOmLq{V{w}T7Sos+WWnJf#~=?1JO&l8kC_-07?c2B CBmUh0 literal 0 HcmV?d00001 diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/ResourceLoader.class b/bin/src/main/java/fi/utu/tech/gui/javafx/ResourceLoader.class new file mode 100644 index 0000000000000000000000000000000000000000..4bc43658c164eb9c8be11b69451575124bd21120 GIT binary patch literal 1831 zcmX^0Z`VEs1_o0GHFgFjMh4^JqGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+ zeo$(0erZv1s!x7mN@@{10}CUA09buaVqUtwe^ORzatR{?OHqD)2_plCPe5W(YF>#o zBLin}W_n&?Noi3kBLj1YpEV-`S8{${Nl|`IPHGV&gOCrpA=V&u&en_!Y&MyBnI(3N z45AuHih@guGV{`{HNzMgSe)}yQrQ^<7#a8xhPW0L<ri@<2r)9-hUOKe7U$=brKTt( z=jRq=<|LM6=I1FC6y+!7q~;b|DR6OyWTYyjq$cMi7Nw>r6eK2RC#I(=D5YiUm6nw1 zfr3CUy);t~WO`bKl0r&;YOz9Ieu+YEVo7p_LP<udLTW`pYH|s(=HjAcJy2+Zb?M<S z3Sx6+Zb5!gi2}rUh2+FMkl9J83NU9As|pg>SPW1o$yZ2JD5)$+<>K_rEy&4C&MZ+V zE-gqcQb^9vD=sN2O)kkVQh>yshNePhu|jEHN@`kWUTTV-f^TVY3CM$BZ8?<+nR#XT z*{KSNdHE$7s3vf6LZXF$6P$Ari;D@U0mVpeYDq?Zib8s730Mc3!xYl;i@;$I@|Qvo zO1iZ1({Z-r;&hAf^?@W*0=5yYFu1a~BsCX{X<VGH70Iau;FN_KgUAtp#|WZAkG_hy z82A}Pco=vXco`Y^eKPY>{YrC_Qj0<olX6l)*)~5pF()jsC=<ko3bK@BWEL|rnEH@W zpjb09i20zHSy_+@HP@CL18qY5tV5iw?W`FYSTl1I(^DB4)UcH!m_-W*gB&A64iSY1 z)gpwEfvdQrGAFe-BQ>>zk%221T++H_f<jstHGzXm6-EXl8$T;p8S89?<OfJrwzk6* zVrNi6DY7B1XJp{<%`7g?%u5fcEJ!V8P-I|aU}j)oU}6wtU}a!qU}Rti^Eem;88{iZ z;CyZdW(G!3>R@1G;A3E5aARO*U}9ik;M&c=A1Nfbok4g%0|NsygD3+7*c1i^Mg}nk z1_mAmMvy87aRvzn1_ntK5h(@+22KWP1{tWCT3|b1X39d%WI{4i32Y|FUQPyi67;FV Z^)WLjfc>Wk^`{bpDgy%p3j-sAG5}W@9Etz{ literal 0 HcmV?d00001 diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/GimmickController.class b/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/GimmickController.class new file mode 100644 index 0000000000000000000000000000000000000000..1b6faaa7b30110a945cff64d6871593b9d1bb153 GIT binary patch literal 1593 zcmX^0Z`VEs1_o0Gd3FXSMh3g$qGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+ zetKqZZf0_}zB`0=&d)0;%FoG3En;V2VPp^hYt2c_OV{^L%1TWxVPxPa$;?R&NX$!R zWZ?1%fwHX`8Ki?s^GY&vQ$6#_GK({la#9`h^72a(OEUBGiWwQ$eB2^@eXJQ7*laTM zGE3|j8JIOR!x$M@obyvs*%^2l8Tb)axfT`W7jZD~Gcrqu<`tzD=jW8ArYI!m=N4q< zfDKeAD9TUDNzE;`QsCkY$w*a5Nlng4EJ{sLC`e4sPE1c#P)f_xD=jJ219?|3y);t~ zWO`bK9@M)^3Mu)i#R_@(B?`HTCCM2IB^jv-sTBpO$tB2!6c;7yfkF_hTaSQ|5SL`; z7UUO|D1fZfD=o>)QAkb%g@Zy;sshX>C<@au38?@Xl~yqfRe9zX<YXpimM9dL7Niy_ zB<JT9mlTyIm*f{IKoXmVrb1@1LTO$~YFcJqYKlTyevv{-YFc7xP6@JVJq6#=;u4Td zW?rg7Vjd_WAqFEE$;AmufLKCNp(I}+QK6)=AeD;~mYk`iETbqjF$IfRT%4{I$*BdP ztbs)q*+Bt0i6v?IMY&j%ad9#5FbMK6a54xnGKgyUfRc$mIHv}e6lLb6TZ6I}zfWdf zs$XetQfg61Vp2{jBZH7nesW??SYlBohz}KHDaptzW@K>ip{&TTW@O+3<?hVHoXo0J z4hBg^hLyx*U}zzN#goWk5klMGWMtq9&Mz%WPIb!!g_9UYfe0=H*coIQ88~3+gpq;A zH?z1nGcP@)vLLmXL6L!xfti7UfsuiUft7)cfsuiofdNc&FfcGMF)%W4GH@|4GH^36 zFqkkfGcYnRFmUZ=;E5FC+s+`cAFM_gssm(-2m=EH4@4D%D1#W-WN{oONMJERhyl|C UCI%_6J<<$v3=9k`42%pi0D5le!~g&Q literal 0 HcmV?d00001 diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/MainApp2.class b/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/MainApp2.class new file mode 100644 index 0000000000000000000000000000000000000000..1eb992795b9b9ea385074f67dec92f997a2352d1 GIT binary patch literal 1598 zcmX^0Z`VEs1_o0GMRo=zMh4U3qGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+ zetKqZZf0_}zHee?o?}6Q5jz75BZB}~M^0j1y1su>R%&tyBLkaFW?p8A9U}v?hGrNe z1B-KhN-8@8CnEztLal32QGO8z12-entkAro)Z+Y{veXoX<ow)%%$&rM%=|osf};GS zoYdT6D+Mmjkc?D?l+@&$#G=#`g@VN7?8Nj`1*No1z0#6WJ&-f?(n~Y-K&Gcv=s}&S zq>z%ITC9+lU!stkSdyHfP?C|VkXliYnp}cxNO4iJ9?0il-FgI!gt#O#w;;c$L?JCx zAvrM*WPVbr0?Z2}s(?6|kU12qg2osYdlX9Y6%rLnDhpD%IQ`2~i;6N+QVA#vE&+u; zrq_{;3Q8@`FD*(=^~q06Ni8B^U_fF~YF-HeMI@ORoSd3R&>Mu+a4~Q&@bWOQGVn1n zh-&zNqCp>=(t}HiGV{`{L8+VHCo?bAuQWF)wJ0PpDJPYYLC7aRIWZ?Ju_zP7hYGTk zWMmdIGMM|2mD8*l8CZ);5{pV08Mrijz!3npTso*UuOu@!)ibXwvp6#;C)E*@9>Mvi zn2~|Y2Nt8&91IeSj3z|nG?)$ou>p1h0W~DW*q}`Vj0{}C;H2!935r}^XjU=;mluo- zqMmul`FX{e#U-hEB_5fnMTtep8I|k|vWyJuP^Ih)@{A0u;1FYE;PK5YF3!wL52-9j zEoM+;U}Rus00AZjMg~>}HU>rpb_NCp69#4mMg|53uH6hAkwRSC8F=<HFfcGN@G~%g z)i5wHG6*m*Fz`TBF$gjUF@VH`8AKSE7(}6}#26UhrZK@y6USm27Z%f)86?4WN-;=- P9LS&mHkFA%hCvPhtp((# literal 0 HcmV?d00001 diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/View.class b/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/View.class new file mode 100644 index 0000000000000000000000000000000000000000..0fad06d169934e1a46b9adcd09346509f3a646c8 GIT binary patch literal 857 zcmX^0Z`VEs1_o0GS#|~{Mh3&;qGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+ zetKqZZf0_}epqH|IXeRjBZB}~bxvYly1su>R%&tyBLiDva!F=cDkB496e9zhO=ezZ zi5(*YtA>k<W*8#_i*tTTDmw!=BLhD|t7}nFeh~))FC$|?XkJljaehu&YKlT~er`c# zPGU)Bex5=>QGQZRYHqQW0vBgUMyf(eYI06uQEG}pL1J=tVtT5AQd*{7X-TOb$i;f; zrI~sl)6**Spe|NYNXbtvR>;dQQOHd!NzPCx$w*a5ttd!ME<rY=xF}f<6bNA5dIXGw zxFj>TAit<Y0b-p(a$+9Hj-*rtm^ZjMofGrQ5{t1&DU{?ZBr23t7Nl}<29@UJB_`#h z5>N*6dv0n;Mt+JyacYTwo^O6>ajJ7pW^#6FiiU<wUOw13JB3tD1zkIZ>RL^O%wmPo zyp+_m%)HbTg|z%4u+KquDu5!9i;IDafuDzgok4(+K~%#B<PCjrbOx6cW#*+@gW`<e zCo?bAuQWF)wI~GSMn(o9pZw&+oUp{AOb{O`$WoG#S<J{_>_c)=vSwu93eGPrN=|jl z%t>Wr-~>4h90!aHqMmul`FX{e#U-hEB_5fnMTtep8I|k|l8g*&kdS3(kY;4yfCV5U z1CMWJadBo|dPrqKYB7rf10w@70|Nsi0}BHy0~?sd$iU9P!NADC$-uy1!obYH%D}+D zwVQz}Qix|e1K)lI1_mYuK?Vi}HU>tpdLae|1|Be*i$Rz{gn@y9nL!k+N{m6A0R&{g Ks+kxh7^DEMrS&-g literal 0 HcmV?d00001 diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/View1.class b/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/View1.class new file mode 100644 index 0000000000000000000000000000000000000000..ebf979a26c208689c29533625d6c7fa0e31fe23a GIT binary patch literal 2865 zcmX^0Z`VEs1_o0GZFUAGMh2teqGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+ zetKqZZf0_}epqH|xgk3P3nPOe$@&->Sj#h0N-`K37(E#o*fLTx(=$pK8Q79a)6!Cl z7#a9|!izFX5|eULJ#!P&Q>_^pSW*&85*ZnoqCFWISjrPKL8@&s^D;~97#Y|!JUu-% z!x$M@obyvs*%<^G8Ti3I$Vtpg*LN){$}i$z5N2d~6q;9*TAZI#mYSlFoS$2enUh$O znV+XnP?VpPlbTy>rNG4*l98&AlA4^8Sd^NgP>`6MotU1gpp=%WS6Wi42MP+k^wLZ{ zkm+d^deERyQb@^9Emp|OFHy)%EJ@B#D9K1wNUbPHO)fz;q_`+q4-~p!-FgI!gt#O# zw;;c$L;+%*LULjr$d05`1(-Kzs!Ff4Br}H?OR1zVBQv!qu_!sCQXxML9E2s61*r<) zWTuc=tdN<PoS#>mSzMBuSHi`Kl0L9FQlTVYAyENj0`1fW<Rq4)<rn2*v7U<)ob0g3 zAUiB5F)t+_n|6{FkrEsMnH8xyZuv#Ii6vOv2T4-7sU;ctDGKSSCGJIu1sR#i#m@P8 zC8-r9MlKqfpx7wQOG!=3%u7vCNXsumi!G`cL5hz;GKx|YQ?PgjIUFfd#Kq~ESCU#( zR9aAyn&MiKoLT@bIxw>&ij|qUsYQgG1yU1|Se#8joqt(sQBh_}Dt={L3<3<IJPf=H zVvG!;8a|+cLmylU2A33N=A~PMN=bg7%)C^;(%hufq7YCK%g7+)lb@WJ6P8$%3F1Qq zSxPc8iy0YAd`K?c4Xqg&n2SpD7#Wx~G{ZO;<QN$g@fW>T3S5i~Y(=SgDXB#q42q15 ztMRJ`7uBQLZ*XKkMh5Pj#L~Rvj1W*#=3r1^WYi@h`Y6kfDA^2G_8%gdmXU!gIKQ+g zIn^yQCzX+b3tZ)aTM3K|qMk_Ao(HUkWM|N1WZ*?9A{iNYd^3xSGxO3zDhpDJ859^8 z8JHOu7+4uZ7+4wD7#J8t7}&wI5CaDTCj$e65CazjHv<UpfW=uD7#MgN_!t-&_!$@& zOc<CMKq6eb83ZDQgtjw?>}OzLU}6wwU|?WlU}RumU}TVBU|`?@v$+@~8Kl5s(hM?4 zCV<pIOpwK5f;1Kr7#QSnn4o~g1Qo0%DB&<c8H)*KSWIAMPzC!{jX@n0JPcY43=Av` Hj0_q82-|Vm literal 0 HcmV?d00001 diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/View2.class b/bin/src/main/java/fi/utu/tech/gui/javafx/gimmick/View2.class new file mode 100644 index 0000000000000000000000000000000000000000..8a1363ccc12de13b0b77d8a27103650eec902288 GIT binary patch literal 3153 zcmX^0Z`VEs1_o0GC3XfTMh2teqGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+ zetKqZZf0_}epqH|xe+@93nPOe$@&->Sj#h0N-`K37(E#o*fLTx(=$pK8Cc2_GfNm5 z*mDw#vrCII85!7YGV?M^>=+r?G(0^$HNzMgSe)}yQrQ{!7#aA%j?78SOV@WTD#|b7 zU=UzrjR?&vN-fUMDN9XJNY2kK$jnJB$;{7FC@9KL%1O;Fwo>5Y49Q4UNJ&l3Ni0fD zQ7A}E&Q45ERZvRH)GIA1)dTrfFTFHV4`g~;g&x$mN(w3Ysl^I;`6UXui6zMy3MCn- z3aJ$ZsmUeCh7=bi>wy9gtXq$Okr0<;<`(1^l_)^0Q%FwC1KE+3ssQr_nX2?kOEPnC z8kdooT9jCnoKdNep9c0yNo7H*0yst$GK&>5^OE!PiZhE#Qu9hc_7|llreHP8Gp{7I zsHn7{BsImgB004H9M+hAP$<b)NK^pX!NnPnlUS0LUzCg0ypRl>Rs|*IrQ~DNg={!g z905*ESe%D!5hxAirj}&nrzoVSmbe!s7Gz{57dz+Ym84db7`bR@f`YL$FC{fCGcPqo zAuYcMEto;UnyNsd5zhHJ`9-5Hg(Y1s&d~tLNCoFJNM7dRBr4Ysqlk-vmqCb!fr~+y zkwH|$2UJ|?gUjCFlA_GKbZb!A%<q$#m+DuVo0M7<l9-f}%E%z(lb@WJ6P8$%3F1Qq zSxPc8iy0YAd`PY~jI0?Mn2SpD7#Wx~G{ZO;q!}5$5>?>iELDbR0mjI{R+O5Tl3K*U zAjilYN<<joEp|ssJhW^>h2ot~MG>8>89D(%OkqY;vB=246`WsMl$`382`b9Cz^x;2 z!;X<b)Dx+N<N<3;F(@!FGB7hRFt9L)Ft9SPF)%QQFtCGZ1_ll&%?YMKs<;@q85kLO z7#J8#7?>GY7#JA1b~Ers3h{4e5Zuqez`(>H!oa}5#=ywHz`)2L%D}+D17>qEh%tzR u#UvOckxT%ogP0(N#RM@dCNMC_;4ncJiwWvjOkiS=2fI{(L6L!hfdK%Dh4Ekj literal 0 HcmV?d00001 diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/zipper/MainApp1.class b/bin/src/main/java/fi/utu/tech/gui/javafx/zipper/MainApp1.class new file mode 100644 index 0000000000000000000000000000000000000000..7558d140e19f2b3d3a43b4ae01774ddcec654b22 GIT binary patch literal 1594 zcmX^0Z`VEs1_o0GMRo=zMh27OqGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+ zepO~cL28k{Z(?SiV?lu-I|B<Ng8*1VPGVlVzJF3yYH|r91Dj1|US^3MBLlOBW*8#_ zi*tTTDmw!wBLhD|t!q(Heh~))HzU)G(7dA5;{2Sl)D(r}{M>@foWzpM{5*w%qWq+s z)ZAh#1uo8zj8uh`)a0DRqSO?Hg2d$P#Pn1JrL;`F(vng=kSq1lOEdLArl(ctL0qY% zkdmKTtdN&qqL7<dlANJXl98&AT2YXiT!L&yaZ$1!$lqYidiYI*xFa*SAit<YAuUrO zIWZ4pd{U|c%mXB<fH;_tITWjc#upZQ6iV_H5*11+3sSi_{mW8|iZWAD2`CFL0fjxL z*O841N-fSWElN)H$xlp4Eh1oGKw?p9UI_t3B$*hToSH|_8-&$xF>o;O@-VP6@G&xo zYWRSnK_8sXgG-7s^U|$BX`A0CGcVPzG&d==C?qi{CzX*w$R|HJF()jsC=<ko3bK@B zWEL|rnE8;C&8!(2Sc^*%i%J+7xHNpg;SaW3I;b?SBr`YFGp{VOI5R0H)e)2&!I`I+ zk%7wx7NOQ03=)itCPZX2m<|Gw0d@ibH6%sYpiKgd3|ztBl<bxXid$Z2PBH|S7K{v{ zo_WdndBvH<C8>EO9+{~{iABj7mFx_%j125hrR)syj0~*c5MyNE@y#qQ&df^>sVqn> zW>92cWMF0h0VW1U237_(21W*U1_lNb24)6E1_lPM-3%O&LR{M!c=j_eFfcLjGcbVF zFfcGO2rw`(@IX{C2r>vUfW(9uL>QPDM4_t07#QHDF~Lm}$6^{67Sos+B*At{F-U_P O$e;i=m5D)yK@I><{^NuI literal 0 HcmV?d00001 diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/zipper/Zipper.class b/bin/src/main/java/fi/utu/tech/gui/javafx/zipper/Zipper.class new file mode 100644 index 0000000000000000000000000000000000000000..2189885295bb2fca045e3f9d11486833561dc7e2 GIT binary patch literal 4076 zcmX^0Z`VEs1_o0GQ+5U>Mh2teqGbKt#LPVXti-ZJ{j^N|(vnjBlGNl3{q)jIuwYt+ zepO~cL28kH6qsUXU}0ns04vW)%uCnzPs&P7E@5QgF3vA4N=|jlOwCDQWZ?D*Nv$XW zbF3K|I8#!KAsj{qHk-`6%o00B21yMhHAqa&Fh&Lz=lqmZb_O0s27ZK1u0=)pMH~!# zjO^8+c}1zk`8j2&DGJH?xdoXyi6xo&c?tzZ`AIpcxy4orT$~{psR|{P1*r-k1N1;n z)eFfe$}dk$%1Kp7PRz^8FHuNJRe+hJr{GzlkXfvdnU|7Tl$u<UQ>jptnwDCWnwOlK zqL5aUpQ})mT3DJ{l$xTTmz<MWT&$3mnUh)!u_z@qIVTY$RgjpRotU1gpp=%WS6Wi4 z2MS8P^wLZ{kSo$E^dLd0q>z%ITC4zaLT+M7a)v@lMyf(;ML}wENotA$+>GL)WIa&i zfHmvkHxc5F%-n+fq7sOgGxM={bC4)2Ey>Iw%5}slOsgQqI0{u2r6#6eu|}aJUm+2k z*0?y~seXj03oa?j%u6TWS)vqq`ny&nrxt+oF=qBe4r8~>oK*kPl7iBb;F6-$#9RWl zlc+o@vw#G{NmC7S3K6cQTnSMjPMX_^kDsW_0@u8fqDlhZAW|9i!pt*|lq5sEY9c*C zq%!}q)S{xy6l`@Aawed5K|^%(axri-2=Fj)FbFa-h-&zN>NR~(?Wzw+bJn2ho8Koh zFV(L!Hz~C!1XSNLG6?zPCnx5FB^G6Z_)tNXl8nq^Mg|if(pw?cj10_GnFWjt>R6nB z-BDcd@}-!aL5h)q8_CNY3^I(2(}-wQKs-qxWfP?c$#w$9fpP!|MG}e1Nh<|NQw?$o z5uU@Zgpq;0DzgA&6eEL<h7X8gjTyr}XfCtX4C7!>U}Rz-B2qy{;&%flQBjKK1Oi49 zp8$v~Ifzt7gl~ydLVOVkGLU%HM0$icWsD5WMWuO+49ps!l1VzKG_NExH`Oz*EVDQ> zDJRtt)DZyp9*P+mxO`xxuQdmQ8Y9DDA`%Zw2Z7igu=1Lbfh!o=Gs{V3WZ;JM;=o-B zMg~#OyyX16;>_Zb)Vvap%+#X9qU4N9b_Q)m1{P49u`}p0G9VhY><s#h3~V78poTCz zgCQdWKU$J!XD~+T973`UBLk0bW^r+5UV2DnL25CBA_F4>GXnzy69W?iD+3#t#SW%f z7#JBi7&sXi8Mqi27)%(L!RoknGjK-=@os0}-w#$R#K6G7#=ywHz`)2L%)r3F17>qE zh%ktP#l#rI8JHL(7#J8p=1F2POB#z=vRKSwV31{y!)g`_0|NuZUGiAWQpaKzBZDG? z5(5*1GSu}dAQPaz1o;JGnkp94oUxe3%%Bbq3k?QM1`se|U|`^5U}Ml?kYvzd&|@%Q GFaiMMz!i`H literal 0 HcmV?d00001 diff --git a/bin/src/main/java/fi/utu/tech/gui/javafx/zipper/ZipperController.class b/bin/src/main/java/fi/utu/tech/gui/javafx/zipper/ZipperController.class new file mode 100644 index 0000000000000000000000000000000000000000..63ad565cecd936258732f24b0a3e45a802190fb8 GIT binary patch literal 8420 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/fi/utu/tech/gui/javafx/alien.png b/bin/src/main/resources/fi/utu/tech/gui/javafx/alien.png similarity index 100% rename from src/main/resources/fi/utu/tech/gui/javafx/alien.png rename to bin/src/main/resources/fi/utu/tech/gui/javafx/alien.png diff --git a/src/main/resources/fi/utu/tech/gui/javafx/gimmick.fxml b/bin/src/main/resources/fi/utu/tech/gui/javafx/gimmick.fxml similarity index 100% rename from src/main/resources/fi/utu/tech/gui/javafx/gimmick.fxml rename to bin/src/main/resources/fi/utu/tech/gui/javafx/gimmick.fxml diff --git a/src/main/resources/fi/utu/tech/gui/javafx/hmm.png b/bin/src/main/resources/fi/utu/tech/gui/javafx/hmm.png similarity index 100% rename from src/main/resources/fi/utu/tech/gui/javafx/hmm.png rename to bin/src/main/resources/fi/utu/tech/gui/javafx/hmm.png diff --git a/bin/src/main/resources/fi/utu/tech/gui/javafx/package.png b/bin/src/main/resources/fi/utu/tech/gui/javafx/package.png new file mode 100644 index 0000000000000000000000000000000000000000..643eff6d60113e5e16ab4426c1f3a47ac4878c01 GIT binary patch literal 8960 zcmeAS@N?(olHy`uVBq!ia0y~yV9a1(VASJaW?*2LVpTDXfq{V~-O<;Pfnj4m_n$;o z1_lPk;vjb?hIQv;UNSH+a29w(7BevLUI$@DCym(^3=GT+0X`wF?gc(fj7(y}BGTgG z%HopDOiV)j{2(3d><kPH%#2J*vQi8T4D2kdtjr+Wm>3x)L_}2OW!YGm<)oxcbhUL< z<itgU`MJ3n7#R4tL2k^6@G{p`6%`T^<>h5zW>%IIXJBC9U}s}uVq#%p)>W3578lo5 z*Ho635aAav)i>nf;$&xK<>uhvWMgAsU=ZUMP?D8n00S)*RUvL3Re4zsHa1Ud!x(RS zRu&ckULHPfE@?qQA%0$N4h~yWb1fBBRRu*pP7YZK5kW3)9xhH*aWP&_PF-1Pc2-se z85su?9d=e$0}W*_dn-qCBN+(^Mn(o%Q86`nsSsC7D`S%ce<wpNO*1`hGc^TS5kWg+ zT>)+$c`4BlS1Un29#0#i)L>T;0p2Vh2R(IFdu>%GZQT?HGkZ;4TXh{DV?$qKLw`pz zdrdtDut<ulH3I{KotjRLw?j)orn9y|Y*6U(&LS^e{pyUwVt?mM7pu}hmy!VIELZCy zKc_-p#|&r70&j-`ABS8|yF5?39Cw?tAlGa+n{+3O91q(pH|zM|uskpOd@uW458G^a zn-YKL#L)0UAIIeIh%`rwd~f?AU&r!bw^Rr7q_FU~;IO#h&<q!=Vn3%$SF1Ef^VEpQ zgpjawXUph-U>PCdgplwQdou@3J#|TGZE0CoE$vKKYcnM^S6h1z2PbnSrAWU(9aYtY z&~O_y?TXZR134uhXIFnW4|Q1?M|I6bt@-jIqRTo8!+rc6Ev+R41%o`ityR=@)ip%< z_)T?nI}2i!#Kg4~WUY-1^<`zlJY78PtZdE9r`M!=XzQ9A8Wtx;hj{rKX=}UbYq(gN z8p|u@#fC@wdL#sT*QABcYs}VEQnXT647V~g)KE(f@r$uBE=!5cj0kqnR;kNQ@prPF zP@d##s1@Yu(3qEAmKc~59hw#vSe2e&s4U-<6<H7;nc`{{Xr>!tuJ5U<AM5W~7~`8@ zXKHU^=xwZ>=wuP=U}mYW({cKJ00RR<SxJyzFoXElZ~wSnFtV`AfAiIpw&XkWHS_D2 z3wyRXPZ9ci=kVqDS9(QJCSTva-}~-IQ||l_yRUzgJ-*(!Uj6b*%I4*dXZ8Jk`DEYn zQ*%D9`B8TJQTvylU#<rHJ@)hWuV1gf-~0Mt<GZ$RKfC@u{x#|Mg`JIVZ@)ZWy3--| zsfGIiHwFfIc25__kcwMxVsHBk-<Eq;bVGM~P?W=x7}lNf{SVl7p73R5$=6^vl}gR7 zxub7A)93d8M)gC&pPDj#`qb8zwqIuRyR9%$#=I-)F{^>4OS4O0zuk^r{@-VOyuEMl zTr)G$I5uYA_1p`8e}4X5yFdT$wOJh<x}2%66RLua@Ts^vUi;4c_vuyZn9a&TCXP>M zR{i~RYvaF9b9be=tf>kJ*87xx<n65M!Ub#6gkr*vznLJ_HS5?itIfOh{qOi^=3J<D zEWEq8?`~q5a?+~OSs}kq{MfNNRPot!m8oZ5{Z-hhck=$jDp{^j*ITBaZ&-9*+{I*Q zul2COS)Sqeo2hGL*J-9)3H!$D)8A8__%5XDhqm>e75oQ9PL>wUD~jH{MrXzOyzO@+ zz9%o)9@Vpb_NB{>PkseG{`S;r<Eq`)pUUyKERFoJ|MNi~Tj4!1+S}w$8(v*IE9rLc z#EA-vj^EC9t+IAox8Ecs_SD*&VKLfSMVG5$mkIJSb#61|+`7Lm-<^Arzn)->{Jq_| zJI<|m`$l^+e}CT(frv|?276?MIo6d6#^g8un?8O1-MnM&niqm{{ZBVMek-vvZjVoa z?DnI-<BQ)P`10Yy2MzAaM|U>;V|%$rR{FXw=fr5UGaA=LqK~!NCM>%(SGR>xE&uqj zt$Er-veR#0x&3Tk<>&AB+jp+;TifvZ?F@tcWeKYb=T2F7dC9F~c>*^azG^UE_2aE) zeEOj*Cno-`*2Gm#Q|I4(Sj0DR!Hj21susv?+n)Tq%KOOmiJVhgX6~;0`|E;$z*Uut zYQ0`U`NvOu{eHGCWPy&tulYBv%*yVb{}QmE?t)k8?ZSD^tQ)o`&q}j#XPs^Gto!!u zySL4Hg(V()nx6a2(lC8{^1~`)w^b=KCT1BvjAIEpds8&lDo*w6_1n3U>qJ*Qxw}_S zeIH};o)vPhL%rX;jY!%z=}*&H!IhH|>t>#9VON}zHEmtSx+fq1YhAd#v9R}FAfxEB z-D@ml_k{4X2Kj1VHMhESu>SlLHrtp5^&t*zKbgzs2tJ6tc!^hM>Z3if%GY^M$cY{a ziB~-{hclg3<LcqJoJEz^+ZHpiJbt|+X3_thg?<fXuF=8|SQroAE<AFbtL0aGdi<)h zEzFE-wEM)~PrZ6Ow`nnx(U}Z>lVXDvY_^OI&)-J$bFC6OESnZ$`hD8X!g&l6UtMwg zxmR|TJ8Q^{{B4hz4)|`hmR{1apxT<HpX<cG=bXj`FG42!On=&b^0uMu;`XO24hTP+ zT_E_tNWqV{oPW}(+Z$y?PgJaSShz~za7~Pk#jZyT&kt>xa!>D%JL^0H`F5sj8}HmY zUdps!+O^xQpI0<+eU1&2k-D*DS8sOWudHQuHVgW=UM=ko`I~5`$9{F$J|>nubKiV4 z6@50_*P_Ir+%>#gh%^8A8PhMm<^D6?A6v>89DXEHeA&~_WjZm3ZM7Dd3FoTCSQ!N5 zrbW+~cKf!W+p6@<UQ&+}zU-GfW)PpWa-Ze3!0svAlY2tyJ;mgonQw0UDHNRhvd{6% z?Tf~9Ro}ge%lWEMK0{ygs`K0B6F--kMA+!KEp=^^ELd{un8@_DtG8JnU%!0laL+BV zjfreBt7eKVJN)*oS<+T}=M^&_OFuijyeiiI%@^*=8Wq;^>#lGwvfQ*vGHM2+<Eoe9 z%LG4`-3yCQIC6%Q@3ZQns#$r7Qi}QND@224|GZrBV`Jc|(^VI~mF<aE{CcM0Xv<<o z`>TGlS~I8YxtnFbKY04(fI~H!E94}2{%yXt;K^H~%58^Q_=Ni;_V`#ki!BTMRJJEN zF=sOC@rz4#>1HHKY36UQ=*-u4*|219NOUt;!LRtr`>XmKH!iUaddn3t!|l}Vv)@0* zJ2-4!;<?I~k^8bo<!&FwV8unMzCp4DObwH^3!8|#&B-%YJY{lkV#BiSzl%IQ9J=y6 zAB+7zWa4$tuRihyv+|2+TTX5_=$*2C_IvSd=er9$fBP{^_*6F2>Hbfbh^5`q7eAK; zM`ks;D92nXJAcR|=$>DM_L6|sJkRCN7C(FYW%_rnr;<-6%~KO!Ht|#0=iM$bxhu2W zr)KO~BV(99-BKfMx;^jBNoC(xPWV)IC|dEAs_lg;Db@V%PbaN#4QlbeRq42ShiQ~z z>)sX9ww#oyeI~!TPxm61t!l3G<h0x?GY=JiTz+lYHV5r5Q%Vf0Orm2y1{$AZUwPy5 zb4_(4!3`CB#|^heEV`(jxmsKG)jrYV@^cRu<UHNG?ZcZlY5A=h)3$8ZRsF?jx?$J1 zWD&7*ne~x#ZrxccuyazGedo7JJ&)6LpB=p}|8eF0>4$D{CGP3%>H9cCue-1AN&o*^ zm*gAI+iwY{haYzP@_lu{x+>+MOW!uFsD0MEu;dTB{pB0&;jOm{ZrUE-n5FT3!-Rm$ z+y7S7HXfdATgS?M;C8`HTZy#-6DO%<^8Iu6SuU|r!N;bbzx{6ZiPn;>24_@rH)Sk- z*Y=LzI#_LkK+S?T^OA+PIjvf<`EbOgCju7E<-XTN{)#L<yy;FEzn}J!3DVmpedB5T z@?ZCtwi|!tTe&r19<knh!JgK8ofVib>Km%9vFXvDa{ArbX%2fb<)=;h#^3nG<7dZ4 z2eaMmYem~uE?M5G_<`~DdXLKPjgKD37u~Qu5GJwQVe=B^b_cda_K7k-beiu*Uv9j! zX#M*$9UW_Zoz^aC21!jf^qWxTAH-TH^Sk%=KbJ%APR;7*nDKb({=(~}i)&P6tynH8 z*D*3TZYj&(*78}pv~sHb_8{$?Q^&SklX^F4+i7>>8~IZ|sk5~$7rM2VZQXSn<=4e^ zesT8`gO+DbnjD~!S;SGpTh&=|Uz<ln`~8xQ)qP82O=VUUzIg9$X7ggwiq{_A;VrwD ztW*^EQ}uYCWe@w3jn(&WMkhKxJ!tI97#@&3`L$JvX`*iCr;e<)^SYO=zc-AVaOj<E z@^1#m6#sK;7fpNc+xgX&;?kcv{=P0=QJ3C0E7)FqZ!oVR@B59Yg+>npuFvJRUASK% zFubNI)Lum=bDiP@v2y>UJs%VOxPu)dq7vht9<(kmTJ_?G%9F>(P3L<3n>0`E!92eV zgJLe>CjSp_<chUbLLSHW_rFWqwREYUb?GEm`z4y06BH+ioo^BBP0UZYx!1Jqy|-pI zf2r@icdJtF#d%$s8*edn+JY(TmmF+!h`O`CgY)PqYh9Mz&l56QSDkAv=b6lY`lgJr zqWpR>iLc6*p>4`q2{xWbT@o5MRL9FGMJviql@ztqmy>??<Vn$;Edk5t*8H01X#Zf^ zmXl02ESDY~<n$4Vv+LNeaq8XNrInikXYSjbed)v77mDv>H(K2NIbB}z3v-g^XDO!4 zj~*%)CDLj%j=j6M)oE&90Po?)>(VBi-#Xz_V$6<fizaPYvi47#L(~o~!;1pR->*eA zMJKv_5_B@<nOq&kcz>VrljKLdYwJQBG(j<`_DfT7vsiQEcBi*-1==CY%mr5^8r=EZ z?s4bS#iD;pC;Hh7nLhHKHN)=*U*nbyENiqn8w_@f-{G=dm1wZXBIxw<wemrBFTOaJ zc<yfHY5X!xwIbBhBJAF0|L;uEiVLOc1y&_i)NGmkynVjsPlL8s?I$LQ+04BV`QbvS zs$toC8T;Maw|I-Ll4`r{YIU#wLcpiQ8p$>CNnW?yF1%?n4_a1pETL&rwYO8$La*}1 zAl}1!xow%s_>;6feky!b=J)b!mJ4LeuKgm-qgQdm_Bi8wA@$18!wCr-6B(W=N7%Pa zH8Gug!1h7vEl%N9%LAVo<F!N9tY$M@`bMuqfTO>L<(2!Qw*NC6=goc7EH}mAT}$Vo z<-b2Nl)Yc`{qB7!C)0g_Hk;c#6h3`aKe(l^vbpYqUgm0V>C*6~^PL;kYjtj@K5zN< z-jwB{LaPd|ES8E<6f$3>`P0Df%+;?c99o&rl_f5BP5}9{U-|ChsD+EFVoiA%6oppQ zNbLXhMR|YE^xQV1xg61<lTN)0Tx+ndG}e@dZGr%2gk8-qLH3wSExCPFN;h9?DXjKV z`Y`q8yS3lak39Jm!ffKgG>zZOUg@CsEk8eXA-kl>n;Ja3McH;g-!W<ZyL+40NwuA{ zJw93KK|-t@$KMlbUzk@c$^Gped}hZKhPY56##^NmmhL(yGe7GC*Te%)5AUei7koDM zQcLc%S!pu;^{pox`W4IaU&g+?c>A?U{bO;Z#?$O8<-fANQOz~Y_TGBw{i~1Bp+bF~ z47;EI`1Cmc`?X9l0f?HjsX5zrt|)QqTW@f}b<6in(~rMfyYKgT?)h006ocGYa(+BL z{NrWK%5KA4wT!aIMGf!$W@zXHm*s1H-e3PC#5tqm2xqImot^)gz5CuTyW6U%RjYPA zT_SG&ktZyP-?{#mpI$Ge<fJ0^De=#*KY1Oco2QFTwVU{!*|Pkps#Nvo$M>Z}oI^TT zl;pYNmi3;lKg+UY-nQbUOZ%VH{4RVpWsb@EGkf=Kbu@Kp^SJYA;yyk3CI4r9eA#|- z&;R90)A#u2*zML(K0kln-{Qqt5^DU{j=Okt?eLpl6Ywi>>9oA>e?q?0e>!(;d8bML z<K#80wyCwfyJuM+3BLKD>XqWL?$>i)&y*;i{8`Vt=w^nG*-n?oS!G}2)Ha@Y-4te` zaAbiq&#q3B3rZ2QoN_NG9GvtijiHgtGt+TGhoE$&VMm2=F8i~Yez#}7JY#eA*Kc9F z+E0J$>i0kY?z4Kyze$;orCx?CKJF39dtN}3OK_)H;FH6P<-h*#nY_N`!?tb7yed}{ zws)$msd@10;SEjyrcW(9e|DJ6Y2VebM)83_=VXw01<%v{KjhRsFN<FaVV<6Tu+8Jn zlf(M;9wGeUUHv~(S1)D_;EkDA{=U~uW%Y{KZ1*_rXI~Fr{ozt{A@otR+^+<d(8qf` zw-vK1Wvaf*lMd1lar`B|(R;((4GpU<UULcVE!*uS+U*hZ`|i7mQZs%fM*NKlx%%Sj z#n8nE(^g-RnIiRNdwl=*a^5qO*S#z?_4;*v<)L>iKkdCkvK`NeN=;oRV=6aI>dT}b zXQptLN2{-p7kbvO?lXVA(2BV2lF_#q&jd$p_UT`=;@5;L3l=9I4-P)w9y{g7LW#*i z_OFgagerwPI|uVlKAYp-Iq9!&)`b&x=~-D(U6=pn*#&FId9RRP`e==o;HtzWE8VKO z7fQ|B^md}mmwWF*=9EPFZQngLscUZTq?hg!&WCfZl6t;1ZMNLk&`(+?9sgH%vzJ8O zTC@A7sH=V3EY(Z>t?QQr@@`!vHdp&<*-1zBf0l>2cYQeKBW(K8bE&-2n-;?rZLv%B z=0A_wS3Ld60&(HI7pikV?b~1Iqqwz>W1sM`1ya0b#j0IFj`?m2b}ZyC@p|SGeA_s{ zew7Qmt-_A188a3cZ~bB|yp(<Ks@v?d6y_S;<5#gw`lq<5j$^m*w=FZ*Nu`vqIqFZB z`;y)wJ;~il_35*g-OGc${t6VS`xri2E~Pe8-zs>uk)l`Ch0a3FkPF-M#d&r|$9pfA zU(I@(v)b~(a;YgVcp9d8pTGIMP2`fKWOKr$!=K%!XZ$M6-WsslEB{YObH_Pe4d+m~ zc7|K8+ZbN-%z3x$qEvwWtfQCu?fbZvNcon{$_in)I5X;7gv5gIvrB^BelT<V^=yrp zN0rj6c7@em`s^`vs~X+YZH?2nd{f}Lu)A;BFWHwpvn!1gE(!bEw=kStAob-1Pm>)F z^B1Fj=}V6H&m5V2FS_-|FTsDSCM9j@oM);v!*_ztSw)Ej;+1y=RC=4wotc-xG-;l@ zy_YhtNpqHgYx;sKzXdh&EKV$uomp{L`WmCBKhIx|V)Zv?t?jQGtUS9l<3iB;My9IU zJiI2AON`gYmp6I(v;5`AR_}2%z16(Bt^D17-p0pmrySgWRh2R7zI^y=p>T-3l^uWb z#ykF|Om67{U)Wgsq?au<x}{jSWb@|qy9t+sBkX_F@9PTa)!cSba>bLS95UuQ9;qFd zR9?K1iMkYQBOGM^<6VpG_we483Ku0;%$@JR*ef%Scadzx-#>D5UUJT|uXxvDxWeti z3!bKX9PD4-r%!2oJAvVEv7GHo&0o8AwNy%nA59NkIoZ)PV#WiR7cLeHrvJJ#;i1QG zhx<DW?cTg&^(gP-*lb@m|M#j(pTp{}E{NOPw(3)hgvA2$V@uht@lE>D>skIeIKX~a z%a13Gjh|Otnz28trSIH<JMsJE_+C8S7_PB^d*&8q_PO=_^S)T!=lme?k@5KX@X~KT zR=QcUU;WTvw@-pE<H_mBR1WJSp3k2@=f5;5&Ud!nn{+1sF#E?#r0Q0mdoF#$B|SlA zuQiv@i+r^ij+gsN>h4X=i@KD3we@%AwpUl@Caz>V{eq{Vul2~x0%tYrFYI%to3CY^ zd~b&Knf_%GVw?8O{aPJ%RMCog0skSUy@q}(Qxe<dE?v*?eE+h&V4ksb-wEMI*Lya4 zRqXZsx9Xsk6|=a`{6kE8?abUIwY(-T(2tXOUmlQNb-qgOqtBJ4-|eTL-hS<>?1c4_ z9G$<Oa{O&%Iedt1_o}<>+*^+GHs4yvUt-7jE9qQ{u<6Uaau+{FUjDr2^4E1nHXYV= z3-m3rT>B>`)-7@W8S>UDW5IVHjmTSyj#lc+QzSg9^5qNP#jffs-}U+Y!qtzSvR5^i z=$*IAxOKSm+ymCrav2Nu+d8t&4U>qmF1U1k&bwoZS?>?MZRRMAe>mfPaQ&R<wyBN* z{4b-H9qKx#@FMhrL%!M_gOVxx9JAcdZO#7Pu;lp4^2$%5kBc*$C;f5IPM-ba+CpAq zt7dVX*#Z@LGnPL|Xt!i}sok7+ouU8U(z@(DHl39V{wjF>3$MST@1ALPLfNXh`2W%i z4$9fj?-<-j$-Ku`c;Wgwkv#@MljL^adwOtI#n19ae*4BMkvAvje_!F7=$^iyE{2Ey zi@31Yx4>B}wNEcqXI+vmFm2!D!aVP}Rnzfzzf>yk+|Oo^UbDdV$4ZyOtLHx`blWzc z!BKqE1-_;)OF6wRabMg$<(~hf(~)bIU8`?jtoHlUa=iqlD8W9?NnfKo7VOPCk+sR? zBA?8crAl6x4p&dFnpUZ|BRWqtkl*4>jF{PttC}4P#4GMh@SdXfW`aU&fP-fhW3~9B z&t}>;@7LX3_1dH3_wm{Pw=$VYxRtOy`)BXKBD?k5-k_6Jn^<ICHZ@JkdmM8q`Asa- zlbsJ_&p!U~<9<NyhFFfPA4GgEocKQ3>m0~mKaJ*n`Ni~2&+$`C!P;pzwJh{<Hmu&v zQDXi?YUy*2<>%G+nxA!e|0yB+f{nNehm}U`cFi*{c&>P|?2|5<p~L9@>(kYjJD0e> zjg5G+(_#DLV`5>u&)Jy#GV!^<-IuCu>Go1a>&5Bt%j!KTmp*^hJ0f8+?|$&&OYKIw zA6j`s4*cTxxe&;Hzj?vs2=~nU6Zg%Evzh+o*N1yct$NOjhMAx8dFVHn`Fh!m1rzIi zlWG>5a9Y{kz4^quYQ3Gsqn%GIqr57Yteeq&PHU!|=(ckXtb1R&BwWaO^TCMGYH!Ak z>0hkwtA5_MZRw2#47}Uxb(^_<O}5~AAuxIAo(A_{_hgM;Uj4AUT(N9=&yx?46<0r8 z5n8bzxi2-zD{iu?){8IJ;+sw^`5t!s_4yyqasyUxdKoB~#TarSaKH5N3YSc)m)7Na zF*B}NRdp^gzjpMm^OdEtOL%9cFuA2K5OZYheN=$5&@Eat%LR`Zv8Gv7VBvFgf1 zvkvn+uZjvS76)?Vm_NyFPnq&9gFQ|)^{<=K%d1-oqg_{&uee=X9{P-JqQPSOLr;5Z zHnsB2x}3skaY<D*a`L?;$1~H<JlK4YYwJ=m(Y19=JXX&l*xFi+BWG=PZYl{2+i3ps z>&}SvN;Xq&?kx`$n<@AAYm?d?0q*QgPc}QtzgVM_-o38>MXc288#fo6HLfw689H^v zj8ZP6j6=LP-CzEhaH}yqaJ!U$)!g?t{*?0NHLLlTY|A)xG2Z-z?_G(uR_jQnzAtz0 zIGWG<a^s8MS1YBw2fW)O`@3T753ub`?zVs7G%xU0^^*6`o;|CY6qm2zZ6aYB>~c7F zt*h($%^Mu`EvGeY?6{<;?)`m*yOnwQERU+>bqn@(FPF~A-+1fP(dRtn@BBl)bQSUl zCv9SBI;T6!q>T6BUT+6)om{nlUB0U~g)9oXl6hmn#8N+<4YHp)E)_31{b9*<$%5Wp zySU%)^37T;<!Uc<L7Kx{ByAIm+{;Bu>66#xhlGosV7vWRtUFHWT!DVXp1cYbfsD8^ z57xilh1=IGpPDIp@IgjqzCm>Kl0!Xyx$S&b6APRls(CBCjQ_CY`m_HmTTW%H4~Rbd zbVW%iTPKgXNZuxvCOy5ng?S~7d%a&K&%U;9lG0^Yk&Gw$e)Sh}uKjPmv5?)wvnndP z#FFQL?3%l3zRMP0N&B(j`?-XLZzo(%;k3DQ^r&!Fd*Qo#Pdm@)Z1$M)Qt8>L3&E%V zwS3%iI3REqORUXZedAZFYRflhO%09JGfg*PvwN|k*o#NFYLkm{tl3IKHEA2OjIfm| z_U9^e`x!1QH{=nn1361udRwH`D*02BbOrj1<1T)1R8E(06z39N`rOkxdd;+y=uNV0 zX)nwp?=>u+!>;=R<dz=`w?*{^^cnx*7F%ET$GoMiWy|3Uw;rngJ=Em1Dp-*5myGNd zhRI8J`?yy<Qf7Z!>|Chk9df}>Tjgm({XwTvXGb+}@unMzHy^n3-Fn{E<U7raN%m#t zYB`}7n>|!^D%xA8$S*y8Y7OrMhxt7m7fx8ZUC69iRMK#AQva5vpB}T-3MHqu=csuf zT)gF#GW*}ZJwn2@n_MQCU3WSdv+kdfm6F488LL_Cg|l>?e%$OVEpp*kOR3?+!bKC0 z-tIf=CAjpe6vv$G^85}rrDbJnW_XI$Z(1@@u4Lz%%e@{dS0~vEd^(u6sigUT%1T#V z)90sJ^sgyT4DH^h_{4dOcNBl-TA!qIv+jB?p5U>1#rd!^8b{~qe4V|t^kD06p@|-A zj?}t;{&)Z0&CSauu_pZRS=8s%6Bo3`t>dHePK9GGJW59@bdUUCG}{@gvLUqY=-s4) zX`ZQ@xwqe9l{Dg$+|e4bRDhFXWvVr6BG+#2i%#njpR3J&ANc&SOyQi*e_EzLoU8uc zQc_UvQr+GMD`s9hwlbXmnQ-)#TK3Ps{@=cynB8Wrd3K3RLZ0IH%HIy<9=CVTOU#v7 z+f;dM($7fw4!%rw<J+Fu%h}Zo?%!Z~C%7tgrS;;uQ`V_$KXAu+-Hu=T7g{daJHz+F z8vFMwSqFrzwVn3<`+r5&SaQkppn0u@&$j0;jQd~jQ^nR?Qfev8wyN<?DQ|#|_lxE< zUQ62m!6nDfU1vY@`u}&&VACs~-V{x62%T__C0;&Y{r}I7%5nczpFSA6z^Z58A%<_8 zuB2Qz^?4TOiivCE&vg~7|Gzlq-&Mu)hXh{V-X1VrwWYb_@O*`aEW^A{Ul|J{f8BE_ zPk3s~WSV@}Li<qkw0(+FOIGii!MZ}`(dBQdTT)m0Do%R7LT-iJ<*0>=W0uNKdiE+} zp8D0}?bqHHOj~-*RH)Ldnf0K|lh@40HeG49_qfhut+v5nM%f)%iPM)DzWI5D2Sq0= zyz%>jmR9_<1pWWK|E(Cscs@Tox%AQN|A({1-rc{WH9g(&OI&&Q%S|PW#u-uR+Z$Y4 zN|yZi6|ha`>chXz>aY2497u9%GgenkJuS55eg7pbs|}MHbzi;Hikh}UI^xrsWz5=^ z{9pIIb`NayiZ_gy=bF?xH|A9Qv{|ASpK@5c`*k1eo4rq`_hlbf%K~X{ca{rGPq^ac zjrcS3X9;8_U*<4rI$9SrX}iwd7|m(Vm#}BBr`y%4doSG|==IbxpE;_@M(@uL?_*#8 zZ`<TJt5asOLvqEWx0Al4cCNnc^~6$)?bhL$9{novm$r$poc&c?wZOG!pHuuQukR`E zmy{fR$`F;ReR8h1^%B_=dw1N9;1Y7!EiiwZ`=oXM%TwMhF+JQUm?8N%ZI8a|(%qYy zuFbIFPQLr#+);gRXG?3%-BSvfcnYV;cG@l3J3-K-c$fF18THqWJMPgBTl#;c_g&A` zR@D;ee<I{H*QpdmPLeWt-T$iafd35s&B}%A53lYrsqB06xFkO5(=PT!(^NfA*C+oh z5KaHxwpXNFFDY`B$<h;>ueUUduIYcd-g%j3+`Qn3d9AONzi%`yjTGAZXY;~Ro%6{G zvU=}oy1cq$|4A}Wd+zyl;>mk{ano)sD!cURxyrQXoi`S}Ja@!>mhflilr{DZPb;%( zU80t9YTcbBXL2^7Qmk2Z+TY?oo35<(mtL}ZA<wk*!ml5*cUf<<{&m@|AmH=!4L03t z`yV^4HgQ|ZKDl{Wsh&1pfK%;_+o=yzR~i?p=e9IO%u{{nvt)PE`oo=$#!|c9vaYo& z<6dje60*y>PW|cAn@!D=`_ymh?XQ>RJI;1i@99RH)2sWxmVCea`h#|;r1JUY+CTF1 zc7A=>{r#S<_o37EUpL?FVGa(Emwx+c_PdN%EKe=Fo<<5D3EcMkSE<H^KbLo%kn8hO zJl0(CeyW#oIMXMe2MeYo`))n0AM&fMsytz9+fzxuT9(aspTGOzcX9pt+y~6s6<;?B zzqhr$l)LKJuLGyrn46;I|Jz@>)4iaw((c$No~c(4zxkl};@W5Z$%&P24VvFKmfx2> z?|9vbQRlqItHVd9{#;OfWq<#tHwP9f9Gr8K@BhC`)juBPDT^Hb)U(EJ(aVF=|NWh= zl2xZaExlyIZ^1kV!#y^;w-rcvaNeGo-Nwth(Pr_nY32cJ^3$G6UOB$*l-;Gz^2@Yp WQ&z6tsL8;<z~JfX=d#Wzp$PyhVUijE literal 0 HcmV?d00001 diff --git a/bin/src/main/resources/fi/utu/tech/gui/javafx/styles.css b/bin/src/main/resources/fi/utu/tech/gui/javafx/styles.css new file mode 100644 index 0000000..d1e250b --- /dev/null +++ b/bin/src/main/resources/fi/utu/tech/gui/javafx/styles.css @@ -0,0 +1,7 @@ +.scroll-pane { + -fx-background-color:transparent; +} + +.scroll-pane > .viewport { + -fx-background-color: transparent; +} diff --git a/bin/src/main/resources/fi/utu/tech/gui/javafx/zipper.fxml b/bin/src/main/resources/fi/utu/tech/gui/javafx/zipper.fxml new file mode 100644 index 0000000..9a011d1 --- /dev/null +++ b/bin/src/main/resources/fi/utu/tech/gui/javafx/zipper.fxml @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.geometry.Insets?> +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.Label?> +<?import javafx.scene.control.TextField?> +<?import javafx.scene.image.Image?> +<?import javafx.scene.image.ImageView?> +<?import javafx.scene.layout.BorderPane?> +<?import javafx.scene.layout.HBox?> +<?import javafx.scene.layout.VBox?> +<?import javafx.scene.text.Font?> + +<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="300.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.0" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fi.utu.tech.gui.javafx.zipper.ZipperController"> + <left> + <ImageView fitHeight="368.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" BorderPane.alignment="CENTER"> + <image> + <Image url="@package.png" /> + </image> + <BorderPane.margin> + <Insets bottom="16.0" left="16.0" right="16.0" top="16.0" /> + </BorderPane.margin> + </ImageView> + </left> + <center> + <BorderPane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER"> + <padding> + <Insets bottom="16.0" left="16.0" right="16.0" top="16.0" /> + </padding> + <center> + <VBox alignment="CENTER" prefHeight="200.0" prefWidth="100.0" spacing="16.0" BorderPane.alignment="CENTER"> + <padding> + <Insets bottom="16.0" left="16.0" right="16.0" top="16.0" /> + </padding> + <children> + <HBox alignment="CENTER_LEFT" prefHeight="30.0" prefWidth="200.0"> + <children> + <Label prefHeight="30.0" text="Source: " /> + <TextField fx:id="sourceField" prefHeight="30.0" HBox.hgrow="ALWAYS"> + <HBox.margin> + <Insets left="8.0" right="8.0" /> + </HBox.margin> + </TextField> + <Button maxHeight="30.0" maxWidth="30.0" mnemonicParsing="false" onAction="#chooseSource" prefHeight="30.0" prefWidth="30.0" text="..." /> + </children> + </HBox> + <HBox alignment="CENTER_LEFT" prefHeight="30.0" prefWidth="200.0"> + <children> + <Label prefHeight="30.0" text="Destination:" /> + <TextField fx:id="destField" prefHeight="30.0" HBox.hgrow="ALWAYS"> + <HBox.margin> + <Insets left="8.0" right="8.0" /> + </HBox.margin> + </TextField> + <Button maxHeight="30.0" maxWidth="30.0" mnemonicParsing="false" onAction="#chooseDest" prefHeight="30.0" prefWidth="30.0" text="..." /> + </children> + </HBox> + <Button fx:id="zipItButton" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#zipIt" text="Zip it!" /> + <Label fx:id="statusLabel" text="Loading..." /> + </children></VBox> + </center> + <top> + <Label text="Zip Master 2020" BorderPane.alignment="CENTER"> + <font> + <Font size="26.0" /> + </font></Label> + </top> + </BorderPane> + </center> +</BorderPane> diff --git a/src/main/java/fi/utu/tech/gui/javafx/Main.java b/src/main/java/fi/utu/tech/gui/javafx/Main.java index aebe6ec..a1398bb 100644 --- a/src/main/java/fi/utu/tech/gui/javafx/Main.java +++ b/src/main/java/fi/utu/tech/gui/javafx/Main.java @@ -1,6 +1,5 @@ package fi.utu.tech.gui.javafx; -import fi.utu.tech.gui.javafx.gimmick.MainApp2; import fi.utu.tech.gui.javafx.zipper.MainApp1; public class Main { @@ -15,17 +14,6 @@ public class Main { public static void main(String[] args) { System.out.println("Launching.."); if (args.length == 1 && args[0].equals("--test")) return; - - int exercise = 1; - if (args.length == 1) exercise = Integer.parseInt(args[0]); - switch (exercise) { - case 1: - MainApp1.launch(MainApp1.class, args); - break; - default: - MainApp2.launch(MainApp2.class, args); - break; - } + MainApp1.launch(MainApp1.class, args); } - -} +} \ No newline at end of file diff --git a/src/main/java/fi/utu/tech/gui/javafx/gimmick/GimmickController.java b/src/main/java/fi/utu/tech/gui/javafx/gimmick/GimmickController.java deleted file mode 100644 index a84cc8c..0000000 --- a/src/main/java/fi/utu/tech/gui/javafx/gimmick/GimmickController.java +++ /dev/null @@ -1,41 +0,0 @@ -package fi.utu.tech.gui.javafx.gimmick; - -import java.util.ArrayList; - -import fi.utu.tech.gui.javafx.zipper.Zipper; -import javafx.animation.FadeTransition; -import javafx.application.Platform; -import javafx.concurrent.Task; -import javafx.fxml.FXML; -import javafx.scene.layout.TilePane; -import javafx.util.Duration; - -public class GimmickController { - @FXML - private TilePane tilePane; - - public void initialize() { - tilePane.getChildren().clear(); - for (int i = 0; i < 20; i++) { - final int j = i; - - try { Thread.sleep(100); } - catch(Exception e) { - } - /*new Thread(() -> { - View c = j % 2 == 0 ? new View1(150, 150) : new View2(150, 150); - Platform.runLater(() -> tilePane.getChildren().add(c)); - new Thread(c).run(); - }).start();*/ - - - - Platform.runLater(() -> { - View c = j % 2 == 0 ? new View1(150, 150, j) : new View2(150, 150, j); - tilePane.getChildren().add(c); - new Thread(c).start(); - }); - - } - } -} diff --git a/src/main/java/fi/utu/tech/gui/javafx/gimmick/MainApp2.java b/src/main/java/fi/utu/tech/gui/javafx/gimmick/MainApp2.java deleted file mode 100644 index 353ad8d..0000000 --- a/src/main/java/fi/utu/tech/gui/javafx/gimmick/MainApp2.java +++ /dev/null @@ -1,20 +0,0 @@ -package fi.utu.tech.gui.javafx.gimmick; - -import fi.utu.tech.gui.javafx.MainApp; -import fi.utu.tech.gui.javafx.ResourceLoader; -import javafx.scene.Parent; -import javafx.scene.Scene; -import javafx.stage.Stage; - -public class MainApp2 extends MainApp { - @Override - public void start(Stage stage) { - ResourceLoader<Parent, GimmickController> loader = new ResourceLoader<>("gimmick.fxml"); - - Scene scene = new Scene(loader.root); - - stage.setTitle("The Gimmick Show"); - stage.setScene(scene); - stage.show(); - } -} \ No newline at end of file diff --git a/src/main/java/fi/utu/tech/gui/javafx/gimmick/View.java b/src/main/java/fi/utu/tech/gui/javafx/gimmick/View.java deleted file mode 100644 index 3dce0c7..0000000 --- a/src/main/java/fi/utu/tech/gui/javafx/gimmick/View.java +++ /dev/null @@ -1,18 +0,0 @@ -package fi.utu.tech.gui.javafx.gimmick; - -import javafx.scene.canvas.Canvas; - -abstract class View extends Canvas implements Runnable { - protected boolean active = true; - - public View(double width, double height) { - super(width, height); - - setOnMouseClicked(e -> { - active = false; - setVisible(false); - setManaged(false); - Thread.currentThread().interrupt(); - }); - } -} \ No newline at end of file diff --git a/src/main/java/fi/utu/tech/gui/javafx/gimmick/View1.java b/src/main/java/fi/utu/tech/gui/javafx/gimmick/View1.java deleted file mode 100644 index 0e256bb..0000000 --- a/src/main/java/fi/utu/tech/gui/javafx/gimmick/View1.java +++ /dev/null @@ -1,69 +0,0 @@ -package fi.utu.tech.gui.javafx.gimmick; - -import javafx.application.Platform; -import javafx.scene.image.PixelFormat; -import javafx.scene.image.WritableImage; - -import java.util.Random; -import java.util.Timer; -import java.util.TimerTask; - - -class View1 extends View { - protected final int width, height; - private final WritableImage buffer; - private final int[] data; - int wait; - - View1(int width, int height, int wait) { - super(width, height); - this.width = width; - this.height = height; - this.wait = wait; - buffer = new WritableImage(width, height); - data = new int[width * height]; - } - - public void run() { - launchTimer(); - // uncomment to test if it fails (java.lang.InternalError). - // it should work if you managed to program this correctly! - } - - void render() { - // uncomment to test if it fails - // it should work if you managed to program this correctly! - if (!Platform.isFxApplicationThread()) throw new Error("Wrong thread!"); - - for (int pixelIdx = 0; pixelIdx < data.length; pixelIdx++) { - final int idx = pixelIdx; - data[idx] = new Random().nextInt(200) | ((new Random().nextInt(16) * 16) << 24); - - } - - buffer.getPixelWriter().setPixels( - 0, 0, - width, height, - PixelFormat.getIntArgbPreInstance(), data, 0, width); - - getGraphicsContext2D().clearRect(0.0, 0.0, width, height); - getGraphicsContext2D().drawImage(buffer, 0.0, 0.0); - } - - void launchTimer() { - final Thread t = new Thread(() -> { - Platform.runLater(() -> render()); - }); - try { - Thread.sleep(wait*500); - } catch (InterruptedException e) { - e.printStackTrace(); - } - new Timer().schedule(new TimerTask() { - @Override - public void run() { - t.run(); - } - }, 0l, 1000l); - } -} \ No newline at end of file diff --git a/src/main/java/fi/utu/tech/gui/javafx/gimmick/View2.java b/src/main/java/fi/utu/tech/gui/javafx/gimmick/View2.java deleted file mode 100644 index 3c0a9d8..0000000 --- a/src/main/java/fi/utu/tech/gui/javafx/gimmick/View2.java +++ /dev/null @@ -1,56 +0,0 @@ -package fi.utu.tech.gui.javafx.gimmick; - -import javafx.application.Platform; -import javafx.scene.paint.Color; - -import java.util.Random; - -class View2 extends View { - protected final int width, height; - int wait; - int laskuri; - - View2(int width, int height, int wait) { - super(width, height); - this.width = width; - this.height = height; - this.wait = wait; - } - - public void run() { - try { - Thread.sleep(wait*500); - } catch (InterruptedException e1) { - e1.printStackTrace(); - } - - while (true) { - Platform.runLater(() -> render()); - try { - Thread.sleep(200 + new Random().nextInt(10) * 100); - } catch (Exception e) { - } - } - } - - void render() { - // uncomment to test if it fails - // it should work if you managed to program this correctly! - if (!Platform.isFxApplicationThread()) throw new Error("Wrong thread!"); - - - if(laskuri == 7) { - laskuri = 0; - getGraphicsContext2D().clearRect(0.0, 0.0, width, height); - getGraphicsContext2D().setFill(new Color(0.5,0,0,0.5)); - getGraphicsContext2D().fillRect(0.0, 0.0, width, height); - getGraphicsContext2D().setFill(new Color(0,0,1,0.9)); - } else { - laskuri++; - getGraphicsContext2D().setFill(new Color(0.5,0,0,0.5)); - getGraphicsContext2D().fillRect(0.0, 0.0, width, height); - getGraphicsContext2D().setFill(new Color(0,0,1,0.9)); - getGraphicsContext2D().fillOval(new Random().nextDouble() * width, new Random().nextDouble() * height, 20, 20); - } - } -} \ No newline at end of file diff --git a/src/main/java/fi/utu/tech/gui/javafx/zipper/MainApp1.java b/src/main/java/fi/utu/tech/gui/javafx/zipper/MainApp1.java index 798b180..359de41 100644 --- a/src/main/java/fi/utu/tech/gui/javafx/zipper/MainApp1.java +++ b/src/main/java/fi/utu/tech/gui/javafx/zipper/MainApp1.java @@ -16,7 +16,7 @@ public class MainApp1 extends MainApp { Scene scene = new Scene(loader.root); - stage.setTitle("Zip Master 2020"); + stage.setTitle("ZIP-pakkaaja"); stage.setScene(scene); stage.show(); } diff --git a/src/main/resources/fi/utu/tech/gui/javafx/zipper.fxml b/src/main/resources/fi/utu/tech/gui/javafx/zipper.fxml index 9a011d1..0b6a2b4 100644 --- a/src/main/resources/fi/utu/tech/gui/javafx/zipper.fxml +++ b/src/main/resources/fi/utu/tech/gui/javafx/zipper.fxml @@ -60,7 +60,7 @@ </children></VBox> </center> <top> - <Label text="Zip Master 2020" BorderPane.alignment="CENTER"> + <Label text="Näyte INIDIUM:lle" BorderPane.alignment="CENTER"> <font> <Font size="26.0" /> </font></Label> -- GitLab