From 8a09f25fe825d8e5fce5399794d33bf36609526c Mon Sep 17 00:00:00 2001 From: Bixilon Date: Wed, 21 Jul 2021 21:24:46 +0200 Subject: [PATCH] wip eros main gui --- pom.xml | 10 ++ src/main/java/de/bixilon/minosoft/Minosoft.kt | 3 + .../java/de/bixilon/minosoft/gui/eros/Eros.kt | 37 ++++++++ .../eros/{ => controller}/JavaFXController.kt | 13 ++- .../eros/controller/JavaFXWindowController.kt | 21 +++++ .../gui/eros/crash/ErosCrashReport.kt | 5 +- .../gui/eros/main/MainErosController.kt | 76 ++++++++++++++++ .../gui/eros/util/JavaFXInitializer.kt | 4 + .../minosoft/gui/eros/util/JavaFXUtil.kt | 27 +++++- .../assets/minosoft/eros/main/main.fxml | 91 +++++++++++++++++++ .../assets/minosoft/language/en_us.lang | 1 + 11 files changed, 282 insertions(+), 6 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/gui/eros/Eros.kt rename src/main/java/de/bixilon/minosoft/gui/eros/{ => controller}/JavaFXController.kt (80%) create mode 100644 src/main/java/de/bixilon/minosoft/gui/eros/controller/JavaFXWindowController.kt create mode 100644 src/main/java/de/bixilon/minosoft/gui/eros/main/MainErosController.kt create mode 100644 src/main/resources/assets/minosoft/eros/main/main.fxml diff --git a/pom.xml b/pom.xml index 428996b25..c77380b79 100644 --- a/pom.xml +++ b/pom.xml @@ -350,5 +350,15 @@ slf4j-simple 1.7.31 + + org.kordamp.ikonli + ikonli-javafx + 12.2.0 + + + org.kordamp.ikonli + ikonli-fontawesome5-pack + 12.2.0 + diff --git a/src/main/java/de/bixilon/minosoft/Minosoft.kt b/src/main/java/de/bixilon/minosoft/Minosoft.kt index 351100b38..eadd00541 100644 --- a/src/main/java/de/bixilon/minosoft/Minosoft.kt +++ b/src/main/java/de/bixilon/minosoft/Minosoft.kt @@ -21,6 +21,7 @@ import de.bixilon.minosoft.data.language.MultiLanguageManager import de.bixilon.minosoft.data.registries.DefaultRegistries import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.versions.Versions +import de.bixilon.minosoft.gui.eros.Eros import de.bixilon.minosoft.gui.eros.crash.ErosCrashReport.Companion.crash import de.bixilon.minosoft.gui.eros.util.JavaFXInitializer import de.bixilon.minosoft.modding.event.events.FinishInitializingEvent @@ -109,6 +110,8 @@ object Minosoft { taskWorker += Task(identifier = StartupTasks.INITIALIZE_JAVAFX, executor = { JavaFXInitializer.start() }) // ToDo: Show start up progress window + + Eros // Init class } diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/Eros.kt b/src/main/java/de/bixilon/minosoft/gui/eros/Eros.kt new file mode 100644 index 000000000..1495556a6 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/eros/Eros.kt @@ -0,0 +1,37 @@ +/* + * Minosoft + * Copyright (C) 2021 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.gui.eros + +import de.bixilon.minosoft.Minosoft +import de.bixilon.minosoft.gui.eros.main.MainErosController +import de.bixilon.minosoft.gui.eros.util.JavaFXUtil +import de.bixilon.minosoft.modding.event.CallbackEventInvoker +import de.bixilon.minosoft.modding.event.events.FinishInitializingEvent +import de.bixilon.minosoft.util.KUtil.asResourceLocation +import javafx.application.Platform + +object Eros { + private val TITLE = "minosoft:eros_window_title".asResourceLocation() + private val LAYOUT = "minosoft:eros/main/main.fxml".asResourceLocation() + + + init { + Minosoft.GLOBAL_EVENT_MASTER.registerEvent(CallbackEventInvoker.of { + Platform.runLater { + val mainErosController = JavaFXUtil.openModal(TITLE, LAYOUT) + mainErosController.stage.show() + } + }) + } +} diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/JavaFXController.kt b/src/main/java/de/bixilon/minosoft/gui/eros/controller/JavaFXController.kt similarity index 80% rename from src/main/java/de/bixilon/minosoft/gui/eros/JavaFXController.kt rename to src/main/java/de/bixilon/minosoft/gui/eros/controller/JavaFXController.kt index 059529ebb..af70e3c89 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/JavaFXController.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/controller/JavaFXController.kt @@ -11,19 +11,28 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.eros +package de.bixilon.minosoft.gui.eros.controller import de.bixilon.minosoft.gui.eros.util.JavaFXUtil import de.bixilon.minosoft.util.KUtil.nullCast import javafx.event.ActionEvent +import javafx.fxml.Initializable import javafx.scene.control.Labeled +import java.net.URL +import java.util.* -abstract class JavaFXController { +abstract class JavaFXController : Initializable { fun openURL(actionEvent: ActionEvent) { actionEvent.target?.nullCast()?.text?.let { JavaFXUtil.HOST_SERVICES.showDocument(it) } } + + override fun initialize(p0: URL?, p1: ResourceBundle?) { + init() + } + + open fun init() {} } diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/controller/JavaFXWindowController.kt b/src/main/java/de/bixilon/minosoft/gui/eros/controller/JavaFXWindowController.kt new file mode 100644 index 000000000..b3210371d --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/eros/controller/JavaFXWindowController.kt @@ -0,0 +1,21 @@ +/* + * Minosoft + * Copyright (C) 2021 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.gui.eros.controller + +import javafx.stage.Stage + +abstract class JavaFXWindowController : JavaFXController() { + lateinit var stage: Stage + +} diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/crash/ErosCrashReport.kt b/src/main/java/de/bixilon/minosoft/gui/eros/crash/ErosCrashReport.kt index 8b3e7f0c4..8ecf013ae 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/crash/ErosCrashReport.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/crash/ErosCrashReport.kt @@ -14,7 +14,7 @@ package de.bixilon.minosoft.gui.eros.crash import de.bixilon.minosoft.ShutdownReasons -import de.bixilon.minosoft.gui.eros.JavaFXController +import de.bixilon.minosoft.gui.eros.controller.JavaFXWindowController import de.bixilon.minosoft.gui.eros.util.JavaFXInitializer import de.bixilon.minosoft.terminal.CommandLineArguments import de.bixilon.minosoft.terminal.RunConfiguration @@ -42,7 +42,7 @@ import java.nio.charset.StandardCharsets import java.text.SimpleDateFormat -class ErosCrashReport : JavaFXController() { +class ErosCrashReport : JavaFXWindowController() { @FXML private lateinit var crashReportPathDescriptionFX: TextFlow @@ -160,6 +160,7 @@ class ErosCrashReport : JavaFXController() { crashReport.exception = this crashReport.details = details crashReport.crashReportPath = crashReportPath + crashReport.stage = stage stage.setOnCloseRequest { ShutdownManager.shutdown(this?.message, ShutdownReasons.CRITICAL_EXCEPTION) } stage.show() diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/main/MainErosController.kt b/src/main/java/de/bixilon/minosoft/gui/eros/main/MainErosController.kt new file mode 100644 index 000000000..0cd8d8789 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/eros/main/MainErosController.kt @@ -0,0 +1,76 @@ +/* + * Minosoft + * Copyright (C) 2021 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.gui.eros.main + +import de.bixilon.minosoft.gui.eros.controller.JavaFXWindowController +import de.bixilon.minosoft.gui.eros.util.JavaFXUtil +import de.bixilon.minosoft.util.GitInfo +import de.bixilon.minosoft.util.KUtil.decide +import javafx.fxml.FXML +import javafx.scene.image.ImageView +import javafx.scene.layout.HBox +import javafx.scene.paint.Color +import javafx.scene.text.Text +import org.kordamp.ikonli.javafx.FontIcon + + +class MainErosController : JavaFXWindowController() { + @FXML + private lateinit var logoFX: ImageView + + @FXML + private lateinit var versionTextFX: Text + + @FXML + private lateinit var playIconFX: FontIcon + + @FXML + private lateinit var settingsIconFX: FontIcon + + @FXML + private lateinit var helpIconFX: FontIcon + + @FXML + private lateinit var aboutIconFX: FontIcon + + @FXML + private lateinit var exitIconFX: FontIcon + + @FXML + private lateinit var contentFX: HBox + + + private lateinit var icons: List + + + fun select(iconToSelect: FontIcon) { + for (icon in icons) { + if (icon === iconToSelect) { + continue + } + icon.isDisable = true + icon.iconColor = Color.GRAY + } + iconToSelect.isDisable = false + iconToSelect.iconColor = Color.BLACK + } + + override fun init() { + logoFX.image = JavaFXUtil.MINOSOFT_LOGO + versionTextFX.text = "Minosoft " + GitInfo.IS_INITIALIZED.decide(GitInfo.GIT_COMMIT_ID, "v?") + icons = listOf(playIconFX, settingsIconFX, helpIconFX, aboutIconFX, exitIconFX) + + select(playIconFX) + } +} diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/util/JavaFXInitializer.kt b/src/main/java/de/bixilon/minosoft/gui/eros/util/JavaFXInitializer.kt index 677cac7b0..2c1e9b905 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/util/JavaFXInitializer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/util/JavaFXInitializer.kt @@ -13,12 +13,15 @@ package de.bixilon.minosoft.gui.eros.util +import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.util.CountUpAndDownLatch +import de.bixilon.minosoft.util.KUtil.asResourceLocation import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogMessageType import javafx.application.Application import javafx.application.Platform +import javafx.scene.image.Image import javafx.stage.Stage class JavaFXInitializer internal constructor() : Application() { @@ -27,6 +30,7 @@ class JavaFXInitializer internal constructor() : Application() { Platform.setImplicitExit(false) JavaFXUtil.HOST_SERVICES = hostServices + JavaFXUtil.MINOSOFT_LOGO = Image(Minosoft.MINOSOFT_ASSETS_MANAGER.readAssetAsStream("minosoft:textures/icons/window_icon.png".asResourceLocation())) Log.log(LogMessageType.JAVAFX, LogLevels.VERBOSE) { "Initialized JavaFX Toolkit!" } LATCH.dec() diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/util/JavaFXUtil.kt b/src/main/java/de/bixilon/minosoft/gui/eros/util/JavaFXUtil.kt index f976f54aa..620040850 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/util/JavaFXUtil.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/util/JavaFXUtil.kt @@ -13,13 +13,36 @@ package de.bixilon.minosoft.gui.eros.util +import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.gui.eros.controller.JavaFXController +import de.bixilon.minosoft.gui.eros.controller.JavaFXWindowController import javafx.application.HostServices +import javafx.fxml.FXMLLoader +import javafx.scene.Parent +import javafx.scene.Scene +import javafx.scene.image.Image +import javafx.stage.Modality +import javafx.stage.Stage object JavaFXUtil { + lateinit var MINOSOFT_LOGO: Image lateinit var HOST_SERVICES: HostServices - fun openModal(layout: ResourceLocation) { - TODO() + fun openModal(title: ResourceLocation, layout: ResourceLocation, modality: Modality = Modality.WINDOW_MODAL): T { + val fxmlLoader = FXMLLoader() + val parent = fxmlLoader.load(Minosoft.MINOSOFT_ASSETS_MANAGER.readAssetAsStream(layout)) + val stage = Stage() + stage.initModality(modality) + stage.title = Minosoft.LANGUAGE_MANAGER.translate(title).message + stage.scene = Scene(parent) + + val controller = fxmlLoader.getController() + + if (controller is JavaFXWindowController) { + controller.stage = stage + } + + return controller } } diff --git a/src/main/resources/assets/minosoft/eros/main/main.fxml b/src/main/resources/assets/minosoft/eros/main/main.fxml new file mode 100644 index 000000000..30fdfed26 --- /dev/null +++ b/src/main/resources/assets/minosoft/eros/main/main.fxml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/assets/minosoft/language/en_us.lang b/src/main/resources/assets/minosoft/language/en_us.lang index 51ff3798b..55efc4c6b 100644 --- a/src/main/resources/assets/minosoft/language/en_us.lang +++ b/src/main/resources/assets/minosoft/language/en_us.lang @@ -1 +1,2 @@ minosoft:hello.world=§aHi, my name is §e%1$s§a. I am §e%2$s §ayears old and I want to say the following: §cHello world! +minosoft:eros_window_title=Minosoft