package net.shadowfacts.cacao.view.button import net.minecraft.client.util.math.MatrixStack import net.minecraft.util.Identifier import net.shadowfacts.cacao.geometry.Point import net.shadowfacts.cacao.geometry.Size import net.shadowfacts.cacao.util.MouseButton import net.shadowfacts.cacao.util.texture.Texture import net.shadowfacts.cacao.view.TextureView import net.shadowfacts.cacao.view.View /** * A button for toggling between on/off states. * * @author shadowfacts * @param initialState Whether the button starts as on or off. * @param handler The handler function to invoke when this button is pressed. */ class ToggleButton( initialState: Boolean, handler: ((ToggleButton) -> Unit)? = null, ): AbstractButton(TextureView(if (initialState) ON else OFF), padding = 0.0) { companion object { val OFF = Texture(Identifier("textures/gui/checkbox.png"), 0, 0, 64, 64) val OFF_HOVERED = Texture(Identifier("textures/gui/checkbox.png"), 20, 0, 64, 64) val ON = Texture(Identifier("textures/gui/checkbox.png"), 0, 20, 64, 64) val ON_HOVERED = Texture(Identifier("textures/gui/checkbox.png"), 20, 20, 64, 64) } private val textureView: TextureView get() = content as TextureView /** * The button's current on/off state. * Updating this property updates the button's texture. */ var state: Boolean = initialState init { this.handler = handler intrinsicContentSize = Size(20.0, 20.0) background = null disabledBackground = null hoveredBackground = null } override fun mouseClicked(point: Point, mouseButton: MouseButton): Boolean { if (!disabled && (mouseButton == MouseButton.LEFT || mouseButton == MouseButton.RIGHT)) { state = !state } return super.mouseClicked(point, mouseButton) } override fun draw(matrixStack: MatrixStack, mouse: Point, delta: Float) { val hovered = mouse in bounds textureView.texture = if (state) { if (hovered) ON_HOVERED else ON } else { if (hovered) OFF_HOVERED else OFF } super.draw(matrixStack, mouse, delta) } override fun getCurrentBackground(mouse: Point) = null }