73 lines
1.8 KiB
Kotlin
73 lines
1.8 KiB
Kotlin
|
package net.shadowfacts.phycon.block.terminal
|
||
|
|
||
|
import net.minecraft.client.util.math.MatrixStack
|
||
|
import net.shadowfacts.cacao.geometry.Point
|
||
|
import net.shadowfacts.cacao.geometry.Size
|
||
|
import net.shadowfacts.cacao.util.EnumHelper
|
||
|
import net.shadowfacts.cacao.util.MouseButton
|
||
|
import net.shadowfacts.cacao.util.texture.Texture
|
||
|
import net.shadowfacts.cacao.view.TextureView
|
||
|
import net.shadowfacts.cacao.view.button.AbstractButton
|
||
|
import net.shadowfacts.phycon.PhysicalConnectivityClient
|
||
|
import net.shadowfacts.phycon.api.TerminalSetting
|
||
|
import net.shadowfacts.phycon.util.TerminalSettings
|
||
|
import java.util.EnumMap
|
||
|
|
||
|
/**
|
||
|
* @author shadowfacts
|
||
|
*/
|
||
|
class SettingButton<E>(
|
||
|
val key: TerminalSettings.SettingKey<E>,
|
||
|
): AbstractButton<SettingButton<E>>(
|
||
|
TextureView(null).apply {
|
||
|
intrinsicContentSize = Size(16.0, 16.0)
|
||
|
},
|
||
|
padding = 2.0
|
||
|
) where E: Enum<E>, E: TerminalSetting {
|
||
|
|
||
|
private val textureCache = EnumMap<E, Texture>(key.clazz)
|
||
|
|
||
|
private val textureView: TextureView
|
||
|
get() = content as TextureView
|
||
|
|
||
|
init {
|
||
|
updateTexture()
|
||
|
}
|
||
|
|
||
|
private fun updateTexture() {
|
||
|
textureView.texture = textureCache.getOrPut(key.value) {
|
||
|
val uv = key.value.uv
|
||
|
Texture(key.value.iconTexture, uv[0], uv[1])
|
||
|
}
|
||
|
}
|
||
|
|
||
|
override fun mouseClicked(point: Point, mouseButton: MouseButton): Boolean {
|
||
|
if (!disabled) {
|
||
|
val newValue = when (mouseButton) {
|
||
|
MouseButton.LEFT -> EnumHelper.next(key.value)
|
||
|
MouseButton.RIGHT -> EnumHelper.previous(key.value)
|
||
|
else -> {
|
||
|
return false
|
||
|
}
|
||
|
}
|
||
|
|
||
|
PhysicalConnectivityClient.terminalSettings[key] = newValue
|
||
|
|
||
|
updateTexture()
|
||
|
}
|
||
|
|
||
|
return super.mouseClicked(point, mouseButton)
|
||
|
}
|
||
|
|
||
|
override fun draw(matrixStack: MatrixStack, mouse: Point, delta: Float) {
|
||
|
super.draw(matrixStack, mouse, delta)
|
||
|
|
||
|
if (mouse in bounds) {
|
||
|
key.value.tooltip?.also {
|
||
|
window!!.drawTooltip(listOf(it))
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|