From cc55f617589a1944b669bf0d05a06639c1ffe12e Mon Sep 17 00:00:00 2001 From: Bixilon Date: Wed, 1 Dec 2021 23:28:54 +0100 Subject: [PATCH] profiles: improvements, eros: save server list filters to profile --- src/main/java/de/bixilon/minosoft/Minosoft.kt | 4 +-- .../minosoft/config/profile/ProfileManager.kt | 4 +-- .../profile/change/ProfilesChangeManager.kt | 2 +- .../change/listener/ProfileChangeListener.kt | 2 +- .../listener/SimpleProfileChangeListener.kt | 24 +++++++++++---- .../profile/profiles/eros/server/ServerC.kt | 2 ++ .../profiles/eros/server/list/ListC.kt | 9 ++++++ .../config/profile/util/ProfileDelegate.kt | 2 +- .../main/play/server/ServerListController.kt | 30 +++++++++++-------- .../minosoft/util/logging/LogMessageType.kt | 2 +- 10 files changed, 55 insertions(+), 26 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/list/ListC.kt diff --git a/src/main/java/de/bixilon/minosoft/Minosoft.kt b/src/main/java/de/bixilon/minosoft/Minosoft.kt index 4e4185f1c..bb889cdc3 100644 --- a/src/main/java/de/bixilon/minosoft/Minosoft.kt +++ b/src/main/java/de/bixilon/minosoft/Minosoft.kt @@ -100,9 +100,9 @@ object Minosoft { }) taskWorker += Task(identifier = StartupTasks.LOAD_PROFILES, priority = ThreadPool.HIGH, dependencies = arrayOf(StartupTasks.LOAD_VERSIONS), executor = { - Log.log(LogMessageType.LOAD_PROFILES, LogLevels.VERBOSE) { "Loading profiles..." } + Log.log(LogMessageType.PROFILES, LogLevels.VERBOSE) { "Loading profiles..." } GlobalProfileManager.initialize() - Log.log(LogMessageType.LOAD_PROFILES, LogLevels.INFO) { "Profiles loaded!" } + Log.log(LogMessageType.PROFILES, LogLevels.INFO) { "Profiles loaded!" } }) taskWorker += Task(identifier = StartupTasks.LOAD_LANGUAGE_FILES, dependencies = arrayOf(StartupTasks.LOAD_CONFIG), executor = { diff --git a/src/main/java/de/bixilon/minosoft/config/profile/ProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/ProfileManager.kt index a4bbffd8c..8b9593297 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/ProfileManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/ProfileManager.kt @@ -109,7 +109,7 @@ interface ProfileManager { for (toMigrate in version until latestVersion) { migrate(toMigrate, json) } - Log.log(LogMessageType.LOAD_PROFILES, LogLevels.INFO) { "Migrated profile ($path) from version $version to $latestVersion" } + Log.log(LogMessageType.PROFILES, LogLevels.INFO) { "Migrated profile ($path) from version $version to $latestVersion" } json["version"] = latestVersion saveFile = true } @@ -129,7 +129,7 @@ interface ProfileManager { profiles[selected]?.let { this.selected = it } ?: selectDefault() } - Log.log(LogMessageType.LOAD_PROFILES, LogLevels.VERBOSE) { "Loaded ${profiles.size} $namespace profiles!" } + Log.log(LogMessageType.PROFILES, LogLevels.VERBOSE) { "Loaded ${profiles.size} $namespace profiles!" } } companion object { diff --git a/src/main/java/de/bixilon/minosoft/config/profile/change/ProfilesChangeManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/change/ProfilesChangeManager.kt index cf3befdd1..cbf63cdac 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/change/ProfilesChangeManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/change/ProfilesChangeManager.kt @@ -28,7 +28,7 @@ object ProfilesChangeManager { if (reference.get() == null) { toRemove += pair } - listener.invoke(previous.unsafeCast(), value.unsafeCast()) + listener.invoke(previous, value) } if (toRemove.isNotEmpty()) { if (queue.size == toRemove.size) { diff --git a/src/main/java/de/bixilon/minosoft/config/profile/change/listener/ProfileChangeListener.kt b/src/main/java/de/bixilon/minosoft/config/profile/change/listener/ProfileChangeListener.kt index b83bab2f7..74ec160ba 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/change/listener/ProfileChangeListener.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/change/listener/ProfileChangeListener.kt @@ -10,5 +10,5 @@ interface ProfileChangeListener { val profile: Profile? - fun invoke(previous: T, value: T) + fun invoke(previous: Any?, value: Any?) } diff --git a/src/main/java/de/bixilon/minosoft/config/profile/change/listener/SimpleProfileChangeListener.kt b/src/main/java/de/bixilon/minosoft/config/profile/change/listener/SimpleProfileChangeListener.kt index a5a36ffcf..639de4940 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/change/listener/SimpleProfileChangeListener.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/change/listener/SimpleProfileChangeListener.kt @@ -3,29 +3,41 @@ package de.bixilon.minosoft.config.profile.change.listener import de.bixilon.minosoft.config.profile.change.ProfilesChangeManager import de.bixilon.minosoft.config.profile.profiles.Profile import de.bixilon.minosoft.gui.eros.util.JavaFXUtil +import de.bixilon.minosoft.util.KUtil.unsafeCast import java.lang.reflect.Field import kotlin.reflect.KProperty +import kotlin.reflect.KProperty0 import kotlin.reflect.jvm.javaField class SimpleProfileChangeListener( override val property: KProperty, override val field: Field, override val profile: Profile?, + instant: Boolean, private val callback: (T) -> Unit, ) : ProfileChangeListener { - override fun invoke(previous: T, value: T) { - callback(value) + init { + if (instant) { + when (property) { + is KProperty0<*> -> invoke(property.get(), property.get()) + else -> TODO("Instant fire is not supported for ${property::class.java}") + } + } + } + + override fun invoke(previous: Any?, value: Any?) { + callback(value.unsafeCast()) } companion object { - fun KProperty.listen(reference: Any, profile: Profile? = null, callback: ((T) -> Unit)) { - ProfilesChangeManager.register(reference, SimpleProfileChangeListener(this, javaField!!, profile, callback)) + fun KProperty.listen(reference: Any, instant: Boolean = false, profile: Profile? = null, callback: ((T) -> Unit)) { + ProfilesChangeManager.register(reference, SimpleProfileChangeListener(this, javaField!!, profile, instant, callback)) } - fun KProperty.listenFX(reference: Any, profile: Profile? = null, callback: ((T) -> Unit)) { - ProfilesChangeManager.register(reference, SimpleProfileChangeListener(this, javaField!!, profile) { JavaFXUtil.runLater { callback(it) } }) + fun KProperty.listenFX(reference: Any, instant: Boolean = false, profile: Profile? = null, callback: ((T) -> Unit)) { + ProfilesChangeManager.register(reference, SimpleProfileChangeListener(this, javaField!!, profile, instant) { JavaFXUtil.runLater { callback(it) } }) } } } diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/ServerC.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/ServerC.kt index e7ff37a22..72ec0366e 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/ServerC.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/ServerC.kt @@ -1,7 +1,9 @@ package de.bixilon.minosoft.config.profile.profiles.eros.server +import de.bixilon.minosoft.config.profile.profiles.eros.server.list.ListC import de.bixilon.minosoft.config.profile.profiles.eros.server.modify.ModifyC class ServerC { val modify = ModifyC() + val list = ListC() } diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/list/ListC.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/list/ListC.kt new file mode 100644 index 000000000..7a545656b --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/list/ListC.kt @@ -0,0 +1,9 @@ +package de.bixilon.minosoft.config.profile.profiles.eros.server.list + +import de.bixilon.minosoft.config.profile.profiles.eros.ErosProfileManager.delegate + +class ListC { + var hideOffline by delegate(false) + var hideFull by delegate(false) + var hideEmpty by delegate(false) +} diff --git a/src/main/java/de/bixilon/minosoft/config/profile/util/ProfileDelegate.kt b/src/main/java/de/bixilon/minosoft/config/profile/util/ProfileDelegate.kt index 34205dc54..fa267920b 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/util/ProfileDelegate.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/util/ProfileDelegate.kt @@ -39,7 +39,7 @@ open class ProfileDelegate( return } - Log.log(LogMessageType.OTHER, LogLevels.VERBOSE) { "Changed option $property in profile $profileName from ${this.value} to $value" } + Log.log(LogMessageType.PROFILES, LogLevels.VERBOSE) { "Changed option $property in profile $profileName from ${this.value} to $value" } profileManager.profiles[profileName]?.saved = false val previous = this.value this.value = value 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 db2ba5a45..71b0340c5 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 @@ -14,6 +14,8 @@ package de.bixilon.minosoft.gui.eros.main.play.server import de.bixilon.minosoft.Minosoft +import de.bixilon.minosoft.config.profile.change.listener.SimpleProfileChangeListener.Companion.listenFX +import de.bixilon.minosoft.config.profile.profiles.eros.ErosProfileManager import de.bixilon.minosoft.config.server.Server import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.text.ChatComponent @@ -52,9 +54,7 @@ import javafx.scene.layout.* class ServerListController : EmbeddedJavaFXController(), Refreshable { @FXML private lateinit var hideOfflineFX: CheckBox - @FXML private lateinit var hideFullFX: CheckBox - @FXML private lateinit var hideEmptyFX: CheckBox @@ -75,6 +75,16 @@ class ServerListController : EmbeddedJavaFXController(), Refreshable { } override fun init() { + val serverConfig = ErosProfileManager.selected.server.list + serverConfig::hideOffline.listenFX(this, true) { hideOfflineFX.isSelected = it } + serverConfig::hideFull.listenFX(this, true) { hideFullFX.isSelected = it } + serverConfig::hideEmpty.listenFX(this, true) { hideEmptyFX.isSelected = it } + + hideOfflineFX.setOnAction { ErosProfileManager.selected.server.list.hideOffline = hideOfflineFX.isSelected } + hideFullFX.setOnAction { ErosProfileManager.selected.server.list.hideFull = hideFullFX.isSelected } + hideEmptyFX.setOnAction { ErosProfileManager.selected.server.list.hideEmpty = hideEmptyFX.isSelected } + + serverListViewFX.setCellFactory { val controller = ServerCardController.build() @@ -94,7 +104,7 @@ class ServerListController : EmbeddedJavaFXController(), Refreshable { refreshList() - serverListViewFX.selectionModel.selectedItemProperty().addListener { _, old, new -> + serverListViewFX.selectionModel.selectedItemProperty().addListener { _, _, new -> setServerInfo(new) } } @@ -239,15 +249,11 @@ class ServerListController : EmbeddedJavaFXController(), Refreshable { if (!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 = { - Minosoft.config.config.server.entries.remove(serverCard.server.id) - Minosoft.config.saveToFile() - JavaFXUtil.runLater { refreshList() } - } - ).show() + SimpleErosConfirmationDialog(confirmButtonText = "minosoft:general.delete".toResourceLocation(), description = TranslatableComponents.EROS_DELETE_SERVER_CONFIRM_DESCRIPTION(serverCard.server.name, serverCard.server.address), onConfirm = { + Minosoft.config.config.server.entries.remove(serverCard.server.id) + Minosoft.config.saveToFile() + JavaFXUtil.runLater { refreshList() } + }).show() } }, 1, 0) it.add(Button("Edit").apply { diff --git a/src/main/java/de/bixilon/minosoft/util/logging/LogMessageType.kt b/src/main/java/de/bixilon/minosoft/util/logging/LogMessageType.kt index 834193003..575e94197 100644 --- a/src/main/java/de/bixilon/minosoft/util/logging/LogMessageType.kt +++ b/src/main/java/de/bixilon/minosoft/util/logging/LogMessageType.kt @@ -57,7 +57,7 @@ enum class LogMessageType( LogLevels.VERBOSE to ChatColors.YELLOW, )), - LOAD_PROFILES(ChatColors.AQUA), + PROFILES(ChatColors.AQUA), ; companion object : ValuesEnum {