diff --git a/plugin/rei/src/main/kotlin/net/shadowfacts/phycon/plugin/rei/PhyConPluginClient.kt b/plugin/rei/src/main/kotlin/net/shadowfacts/phycon/plugin/rei/PhyConPluginClient.kt index 956951b..e727f99 100644 --- a/plugin/rei/src/main/kotlin/net/shadowfacts/phycon/plugin/rei/PhyConPluginClient.kt +++ b/plugin/rei/src/main/kotlin/net/shadowfacts/phycon/plugin/rei/PhyConPluginClient.kt @@ -1,5 +1,7 @@ package net.shadowfacts.phycon.plugin.rei +import dev.architectury.event.EventResult +import dev.architectury.event.events.client.ClientScreenInputEvent import me.shedaniel.math.Rectangle import me.shedaniel.rei.api.client.REIRuntime import me.shedaniel.rei.api.client.plugins.REIClientPlugin @@ -15,15 +17,17 @@ object PhyConPluginClient: ClientModInitializer, REIClientPlugin { const val MODID = "phycon_rei" override fun onInitializeClient() { - AbstractTerminalScreen.registerClickHandler { mouseX, mouseY, button -> - REIRuntime.getInstance().searchTextField?.also { - if (it.isFocused) { - this.terminalVC.searchField.resignFirstResponder() - } else { - this.terminalVC.searchField.becomeFirstResponder() + ClientScreenInputEvent.MOUSE_RELEASED_PRE.register { client, screen, mouseX, mouseY, button -> + if (screen is AbstractTerminalScreen<*, *>) { + REIRuntime.getInstance().searchTextField?.also { + if (it.isFocused) { + screen.terminalVC.searchField.resignFirstResponder() + } else { + screen.terminalVC.searchField.becomeFirstResponder() + } } } - null + EventResult.pass() } } diff --git a/src/main/java/net/shadowfacts/phycon/mixin/client/MixinMinecraftClient.java b/src/main/java/net/shadowfacts/phycon/mixin/client/MixinMinecraftClient.java new file mode 100644 index 0000000..3212411 --- /dev/null +++ b/src/main/java/net/shadowfacts/phycon/mixin/client/MixinMinecraftClient.java @@ -0,0 +1,28 @@ +package net.shadowfacts.phycon.mixin.client; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; +import net.shadowfacts.cacao.AbstractCacaoScreen; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * @author shadowfacts + */ +@Mixin(MinecraftClient.class) +public class MixinMinecraftClient { + + @Inject( + method = "setScreen(Lnet/minecraft/client/gui/screen/Screen;)V", + at = @At(value = "FIELD", target = "Lnet/minecraft/client/MinecraftClient;currentScreen:Lnet/minecraft/client/gui/screen/Screen;", opcode = Opcodes.PUTFIELD, shift = At.Shift.AFTER) + ) + private void setScreen(Screen screen, CallbackInfo ci) { + if (screen instanceof AbstractCacaoScreen) { + ((AbstractCacaoScreen)screen).screenWillAppear(); + } + } + +} diff --git a/src/main/kotlin/net/shadowfacts/cacao/AbstractCacaoScreen.kt b/src/main/kotlin/net/shadowfacts/cacao/AbstractCacaoScreen.kt index 9ec46a0..2a36d90 100644 --- a/src/main/kotlin/net/shadowfacts/cacao/AbstractCacaoScreen.kt +++ b/src/main/kotlin/net/shadowfacts/cacao/AbstractCacaoScreen.kt @@ -14,4 +14,6 @@ interface AbstractCacaoScreen { fun removeWindow(window: Window) -} \ No newline at end of file + fun screenWillAppear() + +} diff --git a/src/main/kotlin/net/shadowfacts/cacao/CacaoHandledScreen.kt b/src/main/kotlin/net/shadowfacts/cacao/CacaoHandledScreen.kt index 8d70210..ba5f18d 100644 --- a/src/main/kotlin/net/shadowfacts/cacao/CacaoHandledScreen.kt +++ b/src/main/kotlin/net/shadowfacts/cacao/CacaoHandledScreen.kt @@ -1,5 +1,6 @@ package net.shadowfacts.cacao +import net.minecraft.client.MinecraftClient import net.minecraft.client.gui.screen.ingame.HandledScreen import net.minecraft.client.util.math.MatrixStack import net.minecraft.entity.player.PlayerInventory @@ -29,10 +30,16 @@ open class CacaoHandledScreen( override val windows: List = _windows + private var hasAppeared = false + + override fun addWindow(window: T, index: Int): T { if (window is ScreenHandlerWindow && window.screenHandler != handler) { throw RuntimeException("Adding ScreenHandlerWindow to CacaoHandledScreen with different screen handler is not supported") } + if (hasAppeared) { + window.viewController.viewWillAppear() + } _windows.add(index, window) @@ -54,6 +61,12 @@ open class CacaoHandledScreen( } } + override fun screenWillAppear() { + windows.forEach { + it.viewController.viewWillAppear() + } + } + override fun init() { super.init() @@ -66,7 +79,8 @@ open class CacaoHandledScreen( super.onClose() windows.forEach { - // todo: VC callbacks + it.viewController.viewWillDisappear() + it.viewController.viewDidDisappear() it.firstResponder = null } diff --git a/src/main/kotlin/net/shadowfacts/cacao/CacaoScreen.kt b/src/main/kotlin/net/shadowfacts/cacao/CacaoScreen.kt index a802159..2a95d38 100644 --- a/src/main/kotlin/net/shadowfacts/cacao/CacaoScreen.kt +++ b/src/main/kotlin/net/shadowfacts/cacao/CacaoScreen.kt @@ -1,5 +1,6 @@ package net.shadowfacts.cacao +import net.minecraft.client.MinecraftClient import net.minecraft.client.gui.screen.Screen import net.minecraft.client.util.math.MatrixStack import net.minecraft.sound.SoundEvents @@ -32,6 +33,8 @@ open class CacaoScreen(title: Text = LiteralText("CacaoScreen")): Screen(title), */ override val windows: List = _windows + private var hasAppeared = false + /** * Adds the given window to this screen's window list at the given position. * @@ -40,6 +43,10 @@ open class CacaoScreen(title: Text = LiteralText("CacaoScreen")): Screen(title), * @return The window that was added, as a convenience. */ override fun addWindow(window: T, index: Int): T { + if (hasAppeared) { + window.viewController.viewWillAppear() + } + _windows.add(index, window) window.screen = this @@ -66,8 +73,14 @@ open class CacaoScreen(title: Text = LiteralText("CacaoScreen")): Screen(title), } } - override fun init() { - super.init() + override fun screenWillAppear() { + windows.forEach { + it.viewController.viewWillAppear() + } + } + + override fun resize(client: MinecraftClient, width: Int, height: Int) { + super.resize(client, width, height) windows.forEach { it.resize(width, height) @@ -78,7 +91,8 @@ open class CacaoScreen(title: Text = LiteralText("CacaoScreen")): Screen(title), super.onClose() windows.forEach { - // todo: VC callbacks + it.viewController.viewWillDisappear() + it.viewController.viewDidDisappear() // resign the current first responder (if any) it.firstResponder = null diff --git a/src/main/kotlin/net/shadowfacts/cacao/viewcontroller/TabViewController.kt b/src/main/kotlin/net/shadowfacts/cacao/viewcontroller/TabViewController.kt index 4019b30..ca8e3c4 100644 --- a/src/main/kotlin/net/shadowfacts/cacao/viewcontroller/TabViewController.kt +++ b/src/main/kotlin/net/shadowfacts/cacao/viewcontroller/TabViewController.kt @@ -147,11 +147,6 @@ class TabViewController( currentTabController.viewWillAppear() } - override fun viewDidAppear() { - super.viewDidAppear() - currentTabController.viewDidAppear() - } - override fun viewWillDisappear() { super.viewWillDisappear() currentTabController.viewWillDisappear() @@ -225,7 +220,6 @@ class TabViewController( embedChild(currentTabController, tabVCContainer) currentTabController.didMoveTo(this) currentTabController.viewWillAppear() - currentTabController.viewDidAppear() onTabChange?.invoke(currentTab) diff --git a/src/main/kotlin/net/shadowfacts/cacao/viewcontroller/ViewController.kt b/src/main/kotlin/net/shadowfacts/cacao/viewcontroller/ViewController.kt index ef28553..8926c09 100644 --- a/src/main/kotlin/net/shadowfacts/cacao/viewcontroller/ViewController.kt +++ b/src/main/kotlin/net/shadowfacts/cacao/viewcontroller/ViewController.kt @@ -122,12 +122,12 @@ abstract class ViewController { children.forEach(ViewController::viewWillAppear) } - /** - * Called immediately after the VC's view has first been displayed on screen. - */ - open fun viewDidAppear() { - children.forEach(ViewController::viewDidAppear) - } +// /** +// * Called immediately after the VC's view has first been displayed on screen. +// */ +// open fun viewDidAppear() { +// children.forEach(ViewController::viewDidAppear) +// } /** * Called before the view will disappear from the screen, either because the VC has been removed from it's parent/screen diff --git a/src/main/kotlin/net/shadowfacts/phycon/block/terminal/AbstractTerminalScreen.kt b/src/main/kotlin/net/shadowfacts/phycon/block/terminal/AbstractTerminalScreen.kt index 948eff3..38c3beb 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/block/terminal/AbstractTerminalScreen.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/block/terminal/AbstractTerminalScreen.kt @@ -4,7 +4,6 @@ import com.mojang.blaze3d.systems.RenderSystem import net.minecraft.client.MinecraftClient import net.minecraft.client.gui.DrawableHelper import net.minecraft.client.gui.Element -import net.minecraft.client.gui.widget.TextFieldWidget import net.minecraft.client.render.GameRenderer import net.minecraft.client.render.Tessellator import net.minecraft.client.render.VertexConsumerProvider @@ -13,7 +12,6 @@ import net.minecraft.entity.player.PlayerInventory import net.minecraft.item.ItemStack import net.minecraft.screen.slot.Slot import net.minecraft.screen.slot.SlotActionType -import net.minecraft.text.LiteralText import net.minecraft.text.Text import net.minecraft.util.Identifier import net.shadowfacts.cacao.CacaoHandledScreen @@ -23,7 +21,6 @@ import net.shadowfacts.phycon.networking.C2STerminalRequestItem import net.shadowfacts.phycon.networking.C2STerminalUpdateDisplayedItems import java.math.RoundingMode import java.text.DecimalFormat -import java.util.LinkedList import kotlin.math.ceil import kotlin.math.min @@ -38,14 +35,6 @@ abstract class AbstractTerminalScreen(handler, playerInv, title) { - companion object { - private val clickHandlers = LinkedList.(Double, Double, Int) -> Boolean?>() - - fun registerClickHandler(handler: AbstractTerminalScreen<*, *>.(Double, Double, Int) -> Boolean?) { - clickHandlers.add(handler) - } - } - abstract val backgroundTexture: Identifier val terminalVC: AbstractTerminalViewController<*, *, *> @@ -160,17 +149,6 @@ abstract class AbstractTerminalScreen