71 lines
2.0 KiB
Kotlin
71 lines
2.0 KiB
Kotlin
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<ToggleButton>(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
|
|
|
|
}
|