package net.shadowfacts.phycon.block.redstone_emitter import com.mojang.blaze3d.systems.RenderSystem import net.minecraft.client.MinecraftClient import net.minecraft.client.render.GameRenderer import net.minecraft.client.util.math.MatrixStack import net.minecraft.entity.player.PlayerInventory import net.minecraft.text.Text import net.minecraft.text.TranslatableText import net.minecraft.util.Identifier import net.shadowfacts.cacao.CacaoHandledScreen import net.shadowfacts.cacao.geometry.Axis import net.shadowfacts.cacao.util.Color import net.shadowfacts.cacao.view.Label import net.shadowfacts.cacao.view.StackView import net.shadowfacts.cacao.view.View import net.shadowfacts.cacao.view.textfield.NumberField import net.shadowfacts.cacao.window.ScreenHandlerWindow import net.shadowfacts.kiwidsl.dsl import net.shadowfacts.phycon.PhysicalConnectivity import net.shadowfacts.phycon.init.PhyBlocks import net.shadowfacts.phycon.networking.C2SConfigureDevice import no.birkett.kiwi.Variable import kotlin.math.ceil /** * @author shadowfacts */ class RedstoneEmitterScreen( handler: RedstoneEmitterScreenHandler, playerInv: PlayerInventory, title: Text ): CacaoHandledScreen( handler, playerInv, title ) { companion object { val BACKGROUND = Identifier(PhysicalConnectivity.MODID, "textures/gui/redstone_emitter.png") } init { backgroundWidth = 176 backgroundHeight = 166 addWindow(ScreenHandlerWindow(handler, ViewController(handler.emitter))) } override fun drawBackground(matrixStack: MatrixStack, delta: Float, mouseX: Int, mouseY: Int) { super.drawBackground(matrixStack, delta, mouseX, mouseY) RenderSystem.setShader(GameRenderer::getPositionTexShader) RenderSystem.setShaderTexture(0, BACKGROUND) val x = (width - backgroundWidth) / 2 val y = (height - backgroundHeight) / 2 drawTexture(matrixStack, x, y, 0, 0, backgroundWidth, backgroundHeight) } class ViewController( private val emitter: RedstoneEmitterBlockEntity, ): net.shadowfacts.cacao.viewcontroller.ViewController() { lateinit var halfLabel: Label lateinit var fullLabel: Label override fun viewDidLoad() { super.viewDidLoad() val title = Label(PhyBlocks.REDSTONE_EMITTER.name) title.textColor = Color.TEXT view.addSubview(title) val inv = Label(MinecraftClient.getInstance().player!!.inventory.displayName) inv.textColor = Color.TEXT view.addSubview(inv) val field = NumberField(emitter.maxAmount) { if (it.number != null) { emitter.maxAmount = it.number!! MinecraftClient.getInstance().player!!.networkHandler.sendPacket(C2SConfigureDevice(emitter)) } updateLabelTexts() } field.validator = { it >= 0 } field.drawBackground = false view.addSubview(field) val hStack = StackView(Axis.HORIZONTAL, StackView.Distribution.FILL, spacing = 2.0) view.addSubview(hStack) val zeroStack = hStack.addArrangedSubview(StackView(Axis.VERTICAL)) zeroStack.addArrangedSubview(Label(TranslatableText("gui.phycon.emitter.count", 0), textAlignment = Label.TextAlignment.CENTER)).apply { textColor = Color.TEXT } zeroStack.addArrangedSubview(View()) zeroStack.addArrangedSubview(Label("0", textAlignment = Label.TextAlignment.CENTER)).apply { textColor = Color.RED } val halfStack = hStack.addArrangedSubview(StackView(Axis.VERTICAL)) halfLabel = halfStack.addArrangedSubview(Label("half", textAlignment = Label.TextAlignment.CENTER)).apply { textColor = Color.TEXT } halfStack.addArrangedSubview(View()) halfStack.addArrangedSubview(Label("8", textAlignment = Label.TextAlignment.CENTER)).apply { textColor = Color.RED } val fullStack = hStack.addArrangedSubview(StackView(Axis.VERTICAL)) fullLabel = fullStack.addArrangedSubview(Label("full", textAlignment = Label.TextAlignment.CENTER)).apply { textColor = Color.TEXT } fullStack.addArrangedSubview(View()) fullStack.addArrangedSubview(Label("15", textAlignment = Label.TextAlignment.CENTER)).apply { textColor = Color.RED } updateLabelTexts() view.solver.dsl { val minX = Variable("minX") val minY = Variable("minY") minX equalTo ((view.widthAnchor - 176) / 2) minY equalTo ((view.heightAnchor - 166) / 2) title.leftAnchor equalTo (minX + 8) title.topAnchor equalTo (minY + 6) inv.leftAnchor equalTo (minX + 8) inv.topAnchor equalTo (minY + 72) field.widthAnchor equalTo 82 field.heightAnchor equalTo 11 field.leftAnchor equalTo (minX + 57) field.topAnchor equalTo (minY + 23) hStack.centerXAnchor equalTo view.centerXAnchor hStack.widthAnchor equalTo (176 - 4) hStack.topAnchor equalTo (field.bottomAnchor + 8) hStack.bottomAnchor equalTo inv.topAnchor zeroStack.widthAnchor equalTo halfStack.widthAnchor halfStack.widthAnchor equalTo fullStack.widthAnchor } } private fun updateLabelTexts() { halfLabel.text = TranslatableText("gui.phycon.emitter.count", ceil(emitter.maxAmount / 2.0).toInt()) fullLabel.text = TranslatableText("gui.phycon.emitter.count", emitter.maxAmount) window!!.layout() } } }