eros: unregister LAN server event

This commit is contained in:
Bixilon 2021-07-26 23:00:16 +02:00
parent 68deecfa16
commit ce4b5e0352
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
8 changed files with 37 additions and 8 deletions

View File

@ -37,4 +37,6 @@ abstract class JavaFXController : Initializable {
open fun init() {}
open fun postInit() {}
open fun terminate() {}
}

View File

@ -54,18 +54,27 @@ class PlayMainController : EmbeddedJavaFXController<Pane>() {
}
playTypeListViewFX.items += ServerType(FontAwesomeSolid.NETWORK_WIRED, "LAN", "12 Servers", "") {
return@ServerType JavaFXUtil.loadEmbeddedController<ServerListController>(ServerListController.LAYOUT).apply {
val invoker = Minosoft.GLOBAL_EVENT_MASTER.registerEvent(JavaFXEventInvoker.of<LANServerDiscoverEvent> { refreshList() })
readOnly = true
customRefresh = {
LANServerListener.SERVERS.clear()
LANServerListener.clear()
refreshList()
}
customTerminate = {
Minosoft.GLOBAL_EVENT_MASTER.unregisterEvent(invoker)
LANServerListener.clear()
}
LANServerListener.clear()
servers = LANServerListener.SERVERS.values
Minosoft.GLOBAL_EVENT_MASTER.registerEvent(JavaFXEventInvoker.of<LANServerDiscoverEvent> { refreshList() }) // ToDo: Unregister event when hiding pane
Minosoft.GLOBAL_EVENT_MASTER.registerEvent(JavaFXEventInvoker.of<LANServerDiscoverEvent> { refreshList() })
refreshList()
}
}
playTypeListViewFX.selectionModel.selectedItemProperty().addListener { _, _, new ->
if (this::currentController.isInitialized) {
currentController.terminate()
}
currentController = new.content()
playTypeContentFX.children.setAll(currentController.root)
}

View File

@ -68,6 +68,8 @@ class ServerListController : EmbeddedJavaFXController<Pane>(), Refreshable {
var customRefresh: (() -> Unit)? = null
var customTerminate: (() -> Unit)? = null
var servers: MutableCollection<Server> = mutableListOf()
var readOnly: Boolean = false
@ -292,6 +294,11 @@ class ServerListController : EmbeddedJavaFXController<Pane>(), Refreshable {
}
}
override fun terminate() {
super.terminate()
customTerminate?.invoke()
}
companion object {
val LAYOUT = "minosoft:eros/main/play/server/server_list.fxml".asResourceLocation()

View File

@ -21,6 +21,6 @@ interface AbstractEventMaster : Iterable<EventInvoker> {
fun fireEvent(event: Event): Boolean
fun registerEvent(invoker: EventInvoker)
fun <T : EventInvoker> registerEvent(invoker: T): T
fun registerEvents(vararg invoker: EventInvoker)
}

View File

@ -63,16 +63,17 @@ open class EventMaster(vararg parents: AbstractEventMaster) : AbstractEventMaste
eventInvokers -= method ?: return
}
override fun registerEvent(invoker: EventInvoker) {
override fun <T : EventInvoker> registerEvent(invoker: T): T {
eventInvokers += invoker
if (invoker is EventInstantFireable && invoker.instantFire) {
val companion = invoker.kEventType?.companionObjectInstance ?: return
val companion = invoker.kEventType?.companionObjectInstance ?: return invoker
if (companion is EventInstantFire<*>) {
invoker.invoke(companion.fire())
}
}
return invoker
}
override fun registerEvents(vararg invokers: EventInvoker) {

View File

@ -77,8 +77,8 @@ abstract class Connection : AbstractEventMaster {
eventMaster.unregisterEvent(invoker)
}
override fun registerEvent(invoker: EventInvoker) {
eventMaster.registerEvent(invoker)
override fun <T : EventInvoker> registerEvent(invoker: T): T {
return eventMaster.registerEvent(invoker)
}
override fun registerEvents(vararg invokers: EventInvoker) {

View File

@ -178,7 +178,7 @@ class StatusConnection(
}
}
override fun registerEvent(invoker: EventInvoker) {
override fun <T : EventInvoker> registerEvent(invoker: T): T {
if (invoker is EventInstantFireable && !invoker.instantFire) {
return super.registerEvent(invoker)
}
@ -204,5 +204,6 @@ class StatusConnection(
}
else -> TODO()
}
return invoker
}
}

View File

@ -18,6 +18,7 @@ import de.bixilon.minosoft.config.server.Server
import de.bixilon.minosoft.data.text.BaseComponent
import de.bixilon.minosoft.data.text.ChatComponent
import de.bixilon.minosoft.modding.event.events.LANServerDiscoverEvent
import de.bixilon.minosoft.util.KUtil.toSynchronizedMap
import de.bixilon.minosoft.util.Util
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
@ -94,4 +95,12 @@ object LANServerListener {
val motd = Util.getStringBetween(broadcast, MOTD_START_STRING, MOTD_END_STRING)
return Server(address = address.hostAddress + ":" + rawAddress, name = BaseComponent("LAN: #${SERVERS.size}: ", ChatComponent.of(motd)))
}
fun clear() {
for (server in SERVERS.toSynchronizedMap().values) {
server.favicon = null
}
SERVERS.clear()
}
}