diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/light/LightC.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/light/LightC.kt index d76f7bcc8..851eb2875 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/light/LightC.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/light/LightC.kt @@ -22,5 +22,5 @@ class LightC { * In original minecraft this setting is called brightness * Must be non-negative and may not exceed 1 */ - var gamma by delegate(0.0f) { check(it in 0.0f..1.0f) { "Gama must be non negative and < 1" } } + var gamma by delegate(0.0f) { check(it in 0.0f..1.0f) { "Gamma must be non negative and < 1" } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/main/ErosMainActivities.kt b/src/main/java/de/bixilon/minosoft/gui/eros/main/ErosMainActivities.kt index 6ce3b7967..9414aefae 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/main/ErosMainActivities.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/main/ErosMainActivities.kt @@ -23,7 +23,7 @@ import de.bixilon.minosoft.util.enum.ValuesEnum enum class ErosMainActivities( val layout: ResourceLocation, ) { - PlAY(PlayController.LAYOUT), + PLAY(PlayController.LAYOUT), SETTINGS("".toResourceLocation()), HELP("".toResourceLocation()), ABOUT("".toResourceLocation()), 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 index fa308416c..623836285 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/main/MainErosController.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/main/MainErosController.kt @@ -24,8 +24,10 @@ import de.bixilon.minosoft.gui.eros.util.JavaFXUtil import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.clickable import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.ctext import de.bixilon.minosoft.terminal.RunConfiguration +import de.bixilon.minosoft.util.KUtil.synchronizedMapOf import de.bixilon.minosoft.util.KUtil.toResourceLocation import de.bixilon.minosoft.util.ShutdownManager +import de.bixilon.minosoft.util.collections.SynchronizedMap import de.bixilon.minosoft.util.task.pool.DefaultThreadPool import javafx.application.Platform import javafx.fxml.FXML @@ -52,11 +54,12 @@ class MainErosController : JavaFXWindowController() { private lateinit var iconMap: Map + private val controllers: SynchronizedMap> = synchronizedMapOf() private var activity: ErosMainActivities = ErosMainActivities.ABOUT // other value (just not the default) set(value) { field = value - contentFX.children.setAll(JavaFXUtil.loadEmbeddedController>(field.layout).root) + contentFX.children.setAll(controllers.getOrPut(value) { JavaFXUtil.loadEmbeddedController(field.layout) }.root) highlightIcon(iconMap[value]) } @@ -76,7 +79,7 @@ class MainErosController : JavaFXWindowController() { logoFX.image = JavaFXUtil.MINOSOFT_LOGO versionTextFX.text = RunConfiguration.VERSION_STRING iconMap = mapOf( - ErosMainActivities.PlAY to playIconFX, + ErosMainActivities.PLAY to playIconFX, ErosMainActivities.SETTINGS to settingsIconFX, ErosMainActivities.HELP to helpIconFX, ErosMainActivities.ABOUT to aboutIconFX, @@ -89,7 +92,7 @@ class MainErosController : JavaFXWindowController() { highlightIcon(playIconFX) playIconFX.setOnMouseClicked { - activity = ErosMainActivities.PlAY + activity = ErosMainActivities.PLAY } settingsIconFX.setOnMouseClicked { // ToDo: activity = ErosMainActivities.SETTINGS @@ -118,7 +121,7 @@ class MainErosController : JavaFXWindowController() { accountImageFX.clickable() accountNameFX.clickable() - activity = ErosMainActivities.PlAY + activity = ErosMainActivities.PLAY } override fun postInit() { diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/PlayController.kt b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/PlayController.kt index 15da2ffd9..3f71089db 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/PlayController.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/PlayController.kt @@ -53,16 +53,22 @@ class PlayController : EmbeddedJavaFXController() { playTypeListViewFX.selectionModel.selectedItemProperty().addListener { _, _, new -> - if (this::currentController.isInitialized) { - currentController.terminate() - } new ?: return@addListener // Should not happen + if (this::currentController.isInitialized) { + val currentController = this.currentController + if (currentController is ServerListController) { + currentController.serverType = new + currentController.initWatch() + currentController.refreshList() + } + return@addListener + } currentController = JavaFXUtil.loadEmbeddedController(ServerListController.LAYOUT).apply { serverType = new initWatch() refreshList() + playTypeContentFX.children.setAll(this.root) } - playTypeContentFX.children.setAll(currentController.root) } playTypeListViewFX.selectionModel.select(0) @@ -81,8 +87,6 @@ class PlayController : EmbeddedJavaFXController() { companion object { val LAYOUT = "minosoft:eros/main/play/play.fxml".toResourceLocation() - private val CUSTOM_SERVER_TYPE = "minosoft:server_type.custom".toResourceLocation() - private val LAN_SERVER_TYPE = "minosoft:server_type.lan".toResourceLocation() private val REFRESH_HEADER = "minosoft:server_list.refresh.header".toResourceLocation() private val REFRESH_TEXT1 = "minosoft:server_list.refresh.text1".toResourceLocation() private val REFRESH_TEXT2 = "minosoft:server_list.refresh.text2".toResourceLocation() diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/ServerListController.kt b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/ServerListController.kt index ee81e3075..df6b8ca82 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/ServerListController.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/ServerListController.kt @@ -64,12 +64,12 @@ class ServerListController : EmbeddedJavaFXController(), Refreshable { @FXML private lateinit var serverListViewFX: ListView @FXML private lateinit var serverInfoFX: AnchorPane - lateinit var serverType: ServerType - - var readOnly: Boolean = false + var serverType: ServerType? = null set(value) { + check(value != null) field = value - addServerButtonFX.isVisible = !value + + addServerButtonFX.isVisible = !value.readOnly } override fun init() { @@ -157,7 +157,7 @@ class ServerListController : EmbeddedJavaFXController(), Refreshable { } fun initWatch() { - serverType::servers.watchListFX(this) { + serverType!!::servers.watchListFX(this) { while (it.next()) { for (removed in it.removed) { serverListViewFX.items -= ServerCard.CARDS.remove(removed) @@ -165,6 +165,7 @@ class ServerListController : EmbeddedJavaFXController(), Refreshable { } for (added in it.addedSubList) { updateServer(added) + serverListViewFX.refresh() } } } @@ -172,13 +173,13 @@ class ServerListController : EmbeddedJavaFXController(), Refreshable { @FXML fun refreshList() { - if (!this::serverType.isInitialized) { + if (serverType == null) { return } val selected = serverListViewFX.selectionModel.selectedItem serverListViewFX.items.clear() - for (server in serverType.servers) { + for (server in serverType!!.servers) { updateServer(server) } @@ -251,7 +252,7 @@ class ServerListController : EmbeddedJavaFXController(), Refreshable { it.columnConstraints += ColumnConstraints() it.columnConstraints += ColumnConstraints(0.0, -1.0, Double.POSITIVE_INFINITY, Priority.ALWAYS, HPos.LEFT, true) - if (!readOnly) { + if (!serverType!!.readOnly) { it.add(Button("Delete").apply { setOnAction { SimpleErosConfirmationDialog(confirmButtonText = "minosoft:general.delete".toResourceLocation(), description = TranslatableComponents.EROS_DELETE_SERVER_CONFIRM_DESCRIPTION(serverCard.server.name, serverCard.server.address), onConfirm = { @@ -344,12 +345,12 @@ class ServerListController : EmbeddedJavaFXController(), Refreshable { @FXML fun addServer() { UpdateServerDialog(onUpdate = { name, address, forcedVersion -> - serverType.servers += Server(name = ChatComponent.of(name), address = address, forcedVersion = forcedVersion) + serverType!!.servers += Server(name = ChatComponent.of(name), address = address, forcedVersion = forcedVersion) }).show() } override fun refresh() { - serverType.refresh(serverListViewFX.items) + serverType!!.refresh(serverListViewFX.items) } diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/type/types/CustomServerType.kt b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/type/types/CustomServerType.kt index c8b7129f5..17945c2d2 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/type/types/CustomServerType.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/type/types/CustomServerType.kt @@ -7,25 +7,16 @@ import de.bixilon.minosoft.gui.eros.main.play.server.card.ServerCard import de.bixilon.minosoft.protocol.network.connection.status.StatusConnectionStates import de.bixilon.minosoft.util.KUtil.toResourceLocation import de.bixilon.minosoft.util.delegate.DelegateManager.listDelegate -import de.bixilon.minosoft.util.delegate.watcher.entry.ListDelegateWatcher.Companion.watchListFX import org.kordamp.ikonli.Ikon import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid object CustomServerType : ServerType { override val icon: Ikon = FontAwesomeSolid.SERVER override val hidden: Boolean = false + override var readOnly: Boolean = false override val servers: MutableList by listDelegate(ErosProfileManager.selected.server.entries) override val translationKey: ResourceLocation = "minosoft:server_type.custom".toResourceLocation() - init { - ErosProfileManager.selected.server::entries.watchListFX(this) { - while (it.next()) { - this.servers += it.addedSubList - this.servers -= it.removed - } - } - } - override fun refresh(cards: List) { for (serverCard in cards) { serverCard.ping?.let { diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/type/types/LANServerType.kt b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/type/types/LANServerType.kt index f68b4243c..4d72411a6 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/type/types/LANServerType.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/type/types/LANServerType.kt @@ -13,6 +13,7 @@ object LANServerType : ServerType { override val icon: Ikon = FontAwesomeSolid.NETWORK_WIRED override val hidden: Boolean get() = !LANServerListener.listening + override var readOnly: Boolean = true override val servers: MutableList by listDelegate() override val translationKey: ResourceLocation = "minosoft:server_type.lan".toResourceLocation() diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/type/types/ServerType.kt b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/type/types/ServerType.kt index bb9948123..728b56427 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/type/types/ServerType.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/type/types/ServerType.kt @@ -21,6 +21,7 @@ import org.kordamp.ikonli.Ikon interface ServerType : Translatable { val icon: Ikon val hidden: Boolean + var readOnly: Boolean val servers: MutableList