fix some eros bugs

This commit is contained in:
Bixilon 2021-12-05 19:53:54 +01:00
parent 4214b37176
commit 3fa1d16ebc
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
8 changed files with 82 additions and 60 deletions

View File

@ -20,7 +20,7 @@ import javafx.scene.layout.HBox
import java.net.URL import java.net.URL
import java.util.* import java.util.*
abstract class AbstractCard<T> : ListCell<T>(), Initializable { abstract class AbstractCardController<T> : ListCell<T>(), Initializable {
@FXML lateinit var root: HBox @FXML lateinit var root: HBox
override fun initialize(url: URL?, resourceBundle: ResourceBundle?) { override fun initialize(url: URL?, resourceBundle: ResourceBundle?) {

View File

@ -16,14 +16,14 @@ package de.bixilon.minosoft.gui.eros.main.account
import de.bixilon.minosoft.data.accounts.Account import de.bixilon.minosoft.data.accounts.Account
import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.data.text.TranslatableComponents import de.bixilon.minosoft.data.text.TranslatableComponents
import de.bixilon.minosoft.gui.eros.card.AbstractCard import de.bixilon.minosoft.gui.eros.card.AbstractCardController
import de.bixilon.minosoft.gui.eros.card.CardFactory import de.bixilon.minosoft.gui.eros.card.CardFactory
import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.text import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.text
import de.bixilon.minosoft.util.KUtil.toResourceLocation import de.bixilon.minosoft.util.KUtil.toResourceLocation
import javafx.fxml.FXML import javafx.fxml.FXML
import javafx.scene.text.TextFlow import javafx.scene.text.TextFlow
class AccountCardController : AbstractCard<Account>() { class AccountCardController : AbstractCardController<Account>() {
@FXML private lateinit var connectionCountFX: TextFlow @FXML private lateinit var connectionCountFX: TextFlow
@FXML private lateinit var stateFX: TextFlow @FXML private lateinit var stateFX: TextFlow
@FXML private lateinit var accountNameFX: TextFlow @FXML private lateinit var accountNameFX: TextFlow

View File

@ -144,10 +144,10 @@ class AccountController : EmbeddedJavaFXController<Pane>() {
setOnAction { setOnAction {
SimpleErosConfirmationDialog( SimpleErosConfirmationDialog(
onConfirm = { onConfirm = {
profile.entries -= account.id
if (profile.selected == account) { if (profile.selected == account) {
profile.selected = null profile.selected = null
} }
profile.entries -= account.id
JavaFXUtil.runLater { refreshList() } JavaFXUtil.runLater { refreshList() }
} }
).show() ).show()

View File

@ -16,7 +16,7 @@ package de.bixilon.minosoft.gui.eros.main.account
import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.config.profile.delegate.watcher.entry.MapProfileDelegateWatcher.Companion.profileWatchMapFX import de.bixilon.minosoft.config.profile.delegate.watcher.entry.MapProfileDelegateWatcher.Companion.profileWatchMapFX
import de.bixilon.minosoft.config.profile.profiles.eros.ErosProfileManager import de.bixilon.minosoft.config.profile.profiles.eros.ErosProfileManager
import de.bixilon.minosoft.gui.eros.card.AbstractCard import de.bixilon.minosoft.gui.eros.card.AbstractCardController
import de.bixilon.minosoft.gui.eros.card.CardFactory import de.bixilon.minosoft.gui.eros.card.CardFactory
import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.text import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.text
import de.bixilon.minosoft.util.KUtil.toResourceLocation import de.bixilon.minosoft.util.KUtil.toResourceLocation
@ -24,7 +24,7 @@ import javafx.fxml.FXML
import javafx.scene.text.TextFlow import javafx.scene.text.TextFlow
import org.kordamp.ikonli.javafx.FontIcon import org.kordamp.ikonli.javafx.FontIcon
class AccountTypeCardController : AbstractCard<ErosAccountType<*>>() { class AccountTypeCardController : AbstractCardController<ErosAccountType<*>>() {
@FXML private lateinit var iconFX: FontIcon @FXML private lateinit var iconFX: FontIcon
@FXML private lateinit var headerFX: TextFlow @FXML private lateinit var headerFX: TextFlow
@FXML private lateinit var textFX: TextFlow @FXML private lateinit var textFX: TextFlow

View File

@ -37,6 +37,7 @@ import de.bixilon.minosoft.modding.event.events.connection.status.StatusConnecti
import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnectionStates.Companion.disconnected import de.bixilon.minosoft.protocol.network.connection.play.PlayConnectionStates.Companion.disconnected
import de.bixilon.minosoft.protocol.network.connection.status.StatusConnection
import de.bixilon.minosoft.protocol.network.connection.status.StatusConnectionStates import de.bixilon.minosoft.protocol.network.connection.status.StatusConnectionStates
import de.bixilon.minosoft.util.DNSUtil import de.bixilon.minosoft.util.DNSUtil
import de.bixilon.minosoft.util.KUtil.decide import de.bixilon.minosoft.util.KUtil.decide
@ -73,9 +74,9 @@ class ServerListController : EmbeddedJavaFXController<Pane>(), Refreshable {
override fun init() { override fun init() {
val erosProfile = ErosProfileManager.selected val erosProfile = ErosProfileManager.selected
val serverConfig = erosProfile.server.list val serverConfig = erosProfile.server.list
serverConfig::hideOffline.profileWatchFX(this, true) { hideOfflineFX.isSelected = it } serverConfig::hideOffline.profileWatchFX(this, true) { hideOfflineFX.isSelected = it;refreshList() }
serverConfig::hideFull.profileWatchFX(this, true) { hideFullFX.isSelected = it } serverConfig::hideFull.profileWatchFX(this, true) { hideFullFX.isSelected = it;refreshList() }
serverConfig::hideEmpty.profileWatchFX(this, true) { hideEmptyFX.isSelected = it } serverConfig::hideEmpty.profileWatchFX(this, true) { hideEmptyFX.isSelected = it;refreshList() }
hideOfflineFX.setOnAction { ErosProfileManager.selected.server.list.hideOffline = hideOfflineFX.isSelected } hideOfflineFX.setOnAction { ErosProfileManager.selected.server.list.hideOffline = hideOfflineFX.isSelected }
hideFullFX.setOnAction { ErosProfileManager.selected.server.list.hideFull = hideFullFX.isSelected } hideFullFX.setOnAction { ErosProfileManager.selected.server.list.hideFull = hideFullFX.isSelected }
@ -85,12 +86,13 @@ class ServerListController : EmbeddedJavaFXController<Pane>(), Refreshable {
val accountProfile = erosProfile.general.accountProfile val accountProfile = erosProfile.general.accountProfile
serverListViewFX.setCellFactory { serverListViewFX.setCellFactory {
val controller = ServerCardController.build() val controller = ServerCardController.build()
controller.serverList = this
controller.root.setOnMouseClicked { controller.root.setOnMouseClicked {
if (it.clickCount != 2) { if (it.clickCount != 2) {
return@setOnMouseClicked return@setOnMouseClicked
} }
val card = controller.lastServerCard ?: return@setOnMouseClicked val card = controller.serverCard ?: return@setOnMouseClicked
if (!card.canConnect(accountProfile.selected ?: return@setOnMouseClicked)) { if (!card.canConnect(accountProfile.selected ?: return@setOnMouseClicked)) {
return@setOnMouseClicked return@setOnMouseClicked
} }
@ -168,6 +170,9 @@ class ServerListController : EmbeddedJavaFXController<Pane>(), Refreshable {
@FXML @FXML
fun refreshList() { fun refreshList() {
if (!this::serverType.isInitialized) {
return
}
val selected = serverListViewFX.selectionModel.selectedItem val selected = serverListViewFX.selectionModel.selectedItem
serverListViewFX.items.clear() serverListViewFX.items.clear()
@ -183,30 +188,16 @@ class ServerListController : EmbeddedJavaFXController<Pane>(), Refreshable {
} }
private fun updateServer(server: Server) { private fun updateServer(server: Server) {
val card = ServerCard.CARDS[server] ?: let { val card = ServerCard.CARDS[server] ?: ServerCard(server).apply {
val card = ServerCard(server) serverListStatusInvoker = JavaFXEventInvoker.of<StatusConnectionStateChangeEvent>(instantFire = false) { updateServer(server) }
card.serverListStatusInvoker = JavaFXEventInvoker.of<StatusConnectionStateChangeEvent>(instantFire = false) { updateServer(server) }
card
} }
val wasSelected = serverListViewFX.selectionModel.selectedItem === card val wasSelected = serverListViewFX.selectionModel.selectedItem === card
// Platform.runLater {serverListViewFX.items.remove(card)} // Platform.runLater {serverListViewFX.items.remove(card)}
card.ping?.let { card.ping?.let {
if (hideOfflineFX.isSelected && it.error != null) { if (it.hide) {
return return
} }
it.lastServerStatus?.let { status ->
val usedSlots = status.usedSlots ?: 0
val slots = status.slots ?: 0
if (hideFullFX.isSelected && usedSlots >= slots && slots > 0) {
return
}
if (hideEmptyFX.isSelected && usedSlots == 0 && slots > 0) {
return
}
}
} }
if (!serverListViewFX.items.contains(card)) { if (!serverListViewFX.items.contains(card)) {
@ -229,8 +220,6 @@ class ServerListController : EmbeddedJavaFXController<Pane>(), Refreshable {
val serverType = serverType val serverType = serverType
val account = ErosProfileManager.selected.general.accountProfile val account = ErosProfileManager.selected.general.accountProfile
val ping = serverCard.ping
val pane = GridPane() val pane = GridPane()
AnchorPane.setLeftAnchor(pane, 10.0) AnchorPane.setLeftAnchor(pane, 10.0)
@ -320,6 +309,36 @@ class ServerListController : EmbeddedJavaFXController<Pane>(), Refreshable {
serverInfoFX.children.setAll(pane) serverInfoFX.children.setAll(pane)
} }
val StatusConnection.hide: Boolean
get() {
if (hideOfflineFX.isSelected && error != null) {
return true
}
lastServerStatus?.let { status ->
val usedSlots = status.usedSlots ?: 0
val slots = status.slots ?: 0
if (hideFullFX.isSelected && usedSlots >= slots && slots > 0) {
return true
}
if (hideEmptyFX.isSelected && usedSlots == 0 && slots > 0) {
return true
}
}
return false
}
fun onPingUpdate(card: ServerCard) {
val ping = card.ping ?: return
if (ping.hide) {
if (serverListViewFX.selectionModel.selectedItem == card) {
serverListViewFX.selectionModel.select(null)
}
serverListViewFX.items.remove(card)
}
}
@FXML @FXML
fun addServer() { fun addServer() {
UpdateServerDialog(onUpdate = { name, address, forcedVersion -> UpdateServerDialog(onUpdate = { name, address, forcedVersion ->

View File

@ -76,14 +76,12 @@ class ServerCard(
@Synchronized @Synchronized
fun ping(): StatusConnection { fun ping(): StatusConnection {
var ping = ping this.ping?.let { return it }
if (ping == null) {
ping = StatusConnection(server.address)
this.ping = ping
serverListStatusInvoker?.let { ping.registerEvent(it) }
ping.ping()
}
val ping = StatusConnection(server.address)
serverListStatusInvoker?.let { ping.registerEvent(it) }
ping.ping()
this.ping = ping
return ping return ping
} }

View File

@ -16,8 +16,9 @@ package de.bixilon.minosoft.gui.eros.main.play.server.card
import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.data.text.ChatComponent
import de.bixilon.minosoft.gui.eros.card.AbstractCard import de.bixilon.minosoft.gui.eros.card.AbstractCardController
import de.bixilon.minosoft.gui.eros.card.CardFactory import de.bixilon.minosoft.gui.eros.card.CardFactory
import de.bixilon.minosoft.gui.eros.main.play.server.ServerListController
import de.bixilon.minosoft.gui.eros.modding.invoker.JavaFXEventInvoker import de.bixilon.minosoft.gui.eros.modding.invoker.JavaFXEventInvoker
import de.bixilon.minosoft.gui.eros.util.JavaFXUtil import de.bixilon.minosoft.gui.eros.util.JavaFXUtil
import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.ctext import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.ctext
@ -36,7 +37,7 @@ import javafx.scene.image.ImageView
import javafx.scene.text.TextFlow import javafx.scene.text.TextFlow
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
class ServerCardController : AbstractCard<ServerCard>() { class ServerCardController : AbstractCardController<ServerCard>() {
@FXML private lateinit var faviconFX: ImageView @FXML private lateinit var faviconFX: ImageView
@FXML private lateinit var serverNameFX: TextFlow @FXML private lateinit var serverNameFX: TextFlow
@FXML private lateinit var motdFX: TextFlow @FXML private lateinit var motdFX: TextFlow
@ -44,8 +45,9 @@ class ServerCardController : AbstractCard<ServerCard>() {
@FXML private lateinit var playerCountFX: Label @FXML private lateinit var playerCountFX: Label
@FXML private lateinit var serverVersionFX: Label @FXML private lateinit var serverVersionFX: Label
var serverList: ServerListController? = null
var lastServerCard: ServerCard? = null var serverCard: ServerCard? = null
private set private set
override fun clear() { override fun clear() {
@ -58,23 +60,22 @@ class ServerCardController : AbstractCard<ServerCard>() {
serverVersionFX.ctext = "" serverVersionFX.ctext = ""
} }
override fun updateItem(card: ServerCard?, empty: Boolean) { override fun updateItem(item: ServerCard?, empty: Boolean) {
super.updateItem(card, empty) super.updateItem(item, empty)
root.isVisible = card != null root.isVisible = item != null
this.lastServerCard = card this.serverCard = item
card ?: return item ?: return
serverNameFX.text = card.server.name serverNameFX.text = item.server.name
card.ping() item.unregister()
item.ping()
card.unregister() item.favicon?.let { faviconFX.image = it }
card.favicon?.let { faviconFX.image = it } item.statusReceiveInvoker = JavaFXEventInvoker.of<ServerStatusReceiveEvent> {
if (serverCard != item || it.connection.error != null) {
card.statusReceiveInvoker = JavaFXEventInvoker.of<ServerStatusReceiveEvent> {
if (lastServerCard != card || it.connection.error != null) {
// error already occurred, not setting any data // error already occurred, not setting any data
return@of return@of
} }
@ -84,30 +85,34 @@ class ServerCardController : AbstractCard<ServerCard>() {
faviconFX.image = it.status.favicon?.let { favicon -> Image(ByteArrayInputStream(favicon)) } ?: JavaFXUtil.MINOSOFT_LOGO faviconFX.image = it.status.favicon?.let { favicon -> Image(ByteArrayInputStream(favicon)) } ?: JavaFXUtil.MINOSOFT_LOGO
it.status.favicon?.let { favicon -> card.rawFavicon = favicon } it.status.favicon?.let { favicon -> item.rawFavicon = favicon }
serverList?.onPingUpdate(item)
} }
card.statusUpdateInvoker = JavaFXEventInvoker.of<StatusConnectionStateChangeEvent> { item.statusUpdateInvoker = JavaFXEventInvoker.of<StatusConnectionStateChangeEvent> {
if (lastServerCard != card || it.connection.error != null || it.connection.lastServerStatus != null) { if (serverCard != item || it.connection.error != null || it.connection.lastServerStatus != null) {
// error or motd is already displayed // error or motd is already displayed
return@of return@of
} }
motdFX.text = ChatComponent.of(Minosoft.LANGUAGE_MANAGER.translate(it.state)) motdFX.text = ChatComponent.of(Minosoft.LANGUAGE_MANAGER.translate(it.state))
serverList?.onPingUpdate(item)
} }
card.statusErrorInvoker = JavaFXEventInvoker.of<ConnectionErrorEvent> { item.statusErrorInvoker = JavaFXEventInvoker.of<ConnectionErrorEvent> {
if (lastServerCard != card) { if (serverCard != item) {
return@of return@of
} }
motdFX.text = it.exception.text motdFX.text = it.exception.text
serverList?.onPingUpdate(item)
} }
card.pongInvoker = JavaFXEventInvoker.of<StatusPongReceiveEvent> { item.pongInvoker = JavaFXEventInvoker.of<StatusPongReceiveEvent> {
if (lastServerCard != card || it.connection.error != null) { if (serverCard != item || it.connection.error != null) {
// error already occurred, not setting any data // error already occurred, not setting any data
return@of return@of
} }
pingFX.text = "${it.latency} ms" pingFX.text = "${it.latency} ms"
serverList?.onPingUpdate(item)
} }
} }

View File

@ -14,7 +14,7 @@
package de.bixilon.minosoft.gui.eros.main.play.server.type package de.bixilon.minosoft.gui.eros.main.play.server.type
import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.gui.eros.card.AbstractCard import de.bixilon.minosoft.gui.eros.card.AbstractCardController
import de.bixilon.minosoft.gui.eros.card.CardFactory import de.bixilon.minosoft.gui.eros.card.CardFactory
import de.bixilon.minosoft.gui.eros.main.play.server.type.types.ServerType import de.bixilon.minosoft.gui.eros.main.play.server.type.types.ServerType
import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.text import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.text
@ -24,7 +24,7 @@ import javafx.fxml.FXML
import javafx.scene.text.TextFlow import javafx.scene.text.TextFlow
import org.kordamp.ikonli.javafx.FontIcon import org.kordamp.ikonli.javafx.FontIcon
class ServerTypeCardController : AbstractCard<ServerType>() { class ServerTypeCardController : AbstractCardController<ServerType>() {
@FXML private lateinit var iconFX: FontIcon @FXML private lateinit var iconFX: FontIcon
@FXML private lateinit var headerFX: TextFlow @FXML private lateinit var headerFX: TextFlow
@FXML private lateinit var textFX: TextFlow @FXML private lateinit var textFX: TextFlow