Buttons now have proper isDisabled, regular button is now native panel
Fixes #8
This commit is contained in:
parent
66576fee94
commit
71f0bf3a62
@ -19,6 +19,9 @@ class SkinGrid(
|
|||||||
val imageWidth get() = width * columns
|
val imageWidth get() = width * columns
|
||||||
val imageHeight get() = height * rows
|
val imageHeight get() = height * rows
|
||||||
|
|
||||||
|
val currentX: Float get() = column * width
|
||||||
|
val currentY: Float get() = row * height
|
||||||
|
|
||||||
fun skip(): SkinGrid {
|
fun skip(): SkinGrid {
|
||||||
column++
|
column++
|
||||||
|
|
||||||
@ -36,7 +39,7 @@ class SkinGrid(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun next(): SkinElement {
|
fun next(): SkinElement {
|
||||||
val element = SkinElement(texture, column * width, row * height, width, height, imageWidth, imageHeight)
|
val element = SkinElement(texture, currentX, currentY, width, height, imageWidth, imageHeight)
|
||||||
skip()
|
skip()
|
||||||
return element
|
return element
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,30 @@
|
|||||||
package ru.dbotthepony.mc.otm.client.render
|
package ru.dbotthepony.mc.otm.client.render
|
||||||
|
|
||||||
|
private fun makeButton(grid: SkinGrid): StretchingRectangleElement {
|
||||||
|
val x = grid.currentX
|
||||||
|
val y = grid.currentY
|
||||||
|
|
||||||
|
return StretchingRectangleElement(
|
||||||
|
topLeft = WidgetLocation.WIDGETS_18.element(x, y, 2f, 2f, grid.imageWidth, grid.imageHeight),
|
||||||
|
topRight = WidgetLocation.WIDGETS_18.element(x + 16f, y, 2f, 2f, grid.imageWidth, grid.imageHeight),
|
||||||
|
bottomLeft = WidgetLocation.WIDGETS_18.element(x, y + 16f, 2f, 2f, grid.imageWidth, grid.imageHeight),
|
||||||
|
bottomRight = WidgetLocation.WIDGETS_18.element(x + 16f, y + 16f, 2f, 2f, grid.imageWidth, grid.imageHeight),
|
||||||
|
middle = WidgetLocation.WIDGETS_18.element(x + 2f, y + 2f, 14f, 14f, grid.imageWidth, grid.imageHeight),
|
||||||
|
top = WidgetLocation.WIDGETS_18.element(x + 2f, y, 14f, 2f, grid.imageWidth, grid.imageHeight),
|
||||||
|
left = WidgetLocation.WIDGETS_18.element(x, y + 2f, 2f, 14f, grid.imageWidth, grid.imageHeight),
|
||||||
|
right = WidgetLocation.WIDGETS_18.element(x + 16f, y + 2f, 2f, 14f, grid.imageWidth, grid.imageHeight),
|
||||||
|
bottom = WidgetLocation.WIDGETS_18.element(x + 2f, y + 16f, 14f, 2f, grid.imageWidth, grid.imageHeight),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
object Widgets18 {
|
object Widgets18 {
|
||||||
val GRID = SkinGrid(WidgetLocation.WIDGETS_18, 18f, 18f)
|
val GRID = SkinGrid(WidgetLocation.WIDGETS_18, 18f, 18f)
|
||||||
|
|
||||||
|
val BUTTON_IDLE_STRETCHABLE = makeButton(GRID)
|
||||||
val BUTTON_IDLE = GRID.next()
|
val BUTTON_IDLE = GRID.next()
|
||||||
|
val BUTTON_HOVERED_STRETCHABLE = makeButton(GRID)
|
||||||
val BUTTON_HOVERED = GRID.next()
|
val BUTTON_HOVERED = GRID.next()
|
||||||
|
val BUTTON_PRESSED_STRETCHABLE = makeButton(GRID)
|
||||||
val BUTTON_PRESSED = GRID.next()
|
val BUTTON_PRESSED = GRID.next()
|
||||||
val ARROW_DOWN = GRID.next()
|
val ARROW_DOWN = GRID.next()
|
||||||
val AZ = GRID.next()
|
val AZ = GRID.next()
|
||||||
@ -18,4 +38,11 @@ object Widgets18 {
|
|||||||
val EQUIPMENT_BATTERY_SLOT_BACKGROUND = GRID.next()
|
val EQUIPMENT_BATTERY_SLOT_BACKGROUND = GRID.next()
|
||||||
val MATTER_CAPACITOR_SLOT_BACKGROUND = GRID.next()
|
val MATTER_CAPACITOR_SLOT_BACKGROUND = GRID.next()
|
||||||
val RETURN_ARROW_LEFT = GRID.next()
|
val RETURN_ARROW_LEFT = GRID.next()
|
||||||
|
|
||||||
|
init {
|
||||||
|
GRID.jump()
|
||||||
|
}
|
||||||
|
|
||||||
|
val BUTTON_DISABLED_STRETCHABLE = makeButton(GRID)
|
||||||
|
val BUTTON_DISABLED = GRID.next()
|
||||||
}
|
}
|
||||||
|
@ -25,8 +25,9 @@ object Widgets8 {
|
|||||||
val ARROW_PAINTED_UP = GRID.next()
|
val ARROW_PAINTED_UP = GRID.next()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
GRID.jump().skip()
|
GRID.jump()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val BUTTON_DISABLED = GRID.next()
|
||||||
val MINUS = GRID.next()
|
val MINUS = GRID.next()
|
||||||
}
|
}
|
||||||
|
@ -3,13 +3,12 @@ package ru.dbotthepony.mc.otm.client.screen.panels
|
|||||||
import com.mojang.blaze3d.platform.InputConstants
|
import com.mojang.blaze3d.platform.InputConstants
|
||||||
import com.mojang.blaze3d.vertex.PoseStack
|
import com.mojang.blaze3d.vertex.PoseStack
|
||||||
import net.minecraft.ChatFormatting
|
import net.minecraft.ChatFormatting
|
||||||
import net.minecraft.client.gui.components.Button
|
|
||||||
import net.minecraft.client.gui.components.Button.OnPress
|
|
||||||
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen
|
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen
|
||||||
import net.minecraft.network.chat.Component
|
import net.minecraft.network.chat.Component
|
||||||
import ru.dbotthepony.mc.otm.client.playGuiClickSound
|
import ru.dbotthepony.mc.otm.client.playGuiClickSound
|
||||||
import ru.dbotthepony.mc.otm.core.TextComponent
|
import ru.dbotthepony.mc.otm.core.TextComponent
|
||||||
import ru.dbotthepony.mc.otm.client.render.*
|
import ru.dbotthepony.mc.otm.client.render.*
|
||||||
|
import ru.dbotthepony.mc.otm.core.RGBAColor
|
||||||
import ru.dbotthepony.mc.otm.core.next
|
import ru.dbotthepony.mc.otm.core.next
|
||||||
import ru.dbotthepony.mc.otm.core.prev
|
import ru.dbotthepony.mc.otm.core.prev
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@ -23,9 +22,10 @@ open class ButtonPanel<out S : AbstractContainerScreen<*>>(
|
|||||||
y: Float = 0f,
|
y: Float = 0f,
|
||||||
width: Float = 40f,
|
width: Float = 40f,
|
||||||
height: Float = HEIGHT,
|
height: Float = HEIGHT,
|
||||||
label: Component
|
var label: Component
|
||||||
) : MinecraftWidgetPanel<S, Button>(screen, parent, x, y, width, height) {
|
) : EditablePanel<S>(screen, parent, x, y, width, height) {
|
||||||
constructor(screen: S, parent: EditablePanel<*>?, label: Component) : this(screen, parent, x = 0f, label = label)
|
constructor(screen: S, parent: EditablePanel<*>?, label: Component) : this(screen, parent, x = 0f, label = label)
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
screen: S,
|
screen: S,
|
||||||
parent: EditablePanel<*>?,
|
parent: EditablePanel<*>?,
|
||||||
@ -39,35 +39,76 @@ open class ButtonPanel<out S : AbstractContainerScreen<*>>(
|
|||||||
this.callback = onPress
|
this.callback = onPress
|
||||||
}
|
}
|
||||||
|
|
||||||
var label = label
|
|
||||||
set(value) {
|
|
||||||
field = value
|
|
||||||
widget?.message = value
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun copyValues(new_widget: Button, old_widget: Button) {}
|
|
||||||
override fun configureNew(widget: Button, recreation: Boolean) {}
|
|
||||||
|
|
||||||
override fun makeNew(): Button {
|
|
||||||
return object : Button(0, 0, width.toInt(), height.toInt().coerceAtMost(20), label, OnPress { this@ButtonPanel.onPress() }) {
|
|
||||||
override fun isHoveredOrFocused(): Boolean {
|
|
||||||
return this@ButtonPanel.isHovered
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected var callback: Runnable? = null
|
protected var callback: Runnable? = null
|
||||||
|
protected var pressed = false
|
||||||
|
|
||||||
|
override fun mouseClickedInner(x: Double, y: Double, button: Int): Boolean {
|
||||||
|
if (isDisabled || pressed) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
pressed = true
|
||||||
|
trapMouseInput = true
|
||||||
|
playGuiClickSound()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun mouseReleasedInner(x: Double, y: Double, button: Int): Boolean {
|
||||||
|
if (!pressed) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
trapMouseInput = false
|
||||||
|
pressed = false
|
||||||
|
|
||||||
|
if (isHovered) {
|
||||||
|
callback?.run()
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
fun bind(runnable: Runnable) {
|
fun bind(runnable: Runnable) {
|
||||||
callback = runnable
|
callback = runnable
|
||||||
}
|
}
|
||||||
|
|
||||||
protected open fun onPress() {
|
var textColor = RGBAColor.WHITE
|
||||||
callback?.run()
|
|
||||||
|
var isDisabled = false
|
||||||
|
set(value) {
|
||||||
|
if (field != value) {
|
||||||
|
if (!value) {
|
||||||
|
pressed = false
|
||||||
|
trapMouseInput = false
|
||||||
|
}
|
||||||
|
|
||||||
|
field = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) {
|
||||||
|
if (isDisabled) {
|
||||||
|
Widgets18.BUTTON_DISABLED_STRETCHABLE.render(stack, width = width, height = height)
|
||||||
|
} else if (pressed) {
|
||||||
|
Widgets18.BUTTON_PRESSED_STRETCHABLE.render(stack, width = width, height = height)
|
||||||
|
} else if (isHovered) {
|
||||||
|
Widgets18.BUTTON_HOVERED_STRETCHABLE.render(stack, width = width, height = height)
|
||||||
|
} else {
|
||||||
|
Widgets18.BUTTON_IDLE_STRETCHABLE.render(stack, width = width, height = height)
|
||||||
|
}
|
||||||
|
|
||||||
|
font.drawAligned(stack, label, TextAlign.CENTER_CENTER, width / 2f, height / 2f, textColor.toInt())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun sizeToContents() {
|
||||||
|
super.sizeToContents()
|
||||||
|
|
||||||
|
height = height.coerceAtLeast(HEIGHT).coerceAtLeast(font.lineHeight.toFloat() + 2f)
|
||||||
|
width = width.coerceAtLeast(HEIGHT).coerceAtLeast(font.width(label) + 4f)
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val HEIGHT = 20f
|
const val HEIGHT = 18f
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,6 +131,7 @@ abstract class SquareButtonPanel<out S : AbstractContainerScreen<*>>(
|
|||||||
abstract val PRESSED: SkinElement
|
abstract val PRESSED: SkinElement
|
||||||
abstract val HOVERED: SkinElement
|
abstract val HOVERED: SkinElement
|
||||||
abstract val IDLE: SkinElement
|
abstract val IDLE: SkinElement
|
||||||
|
abstract val DISABLED: SkinElement
|
||||||
|
|
||||||
var isDisabled = false
|
var isDisabled = false
|
||||||
set(value) {
|
set(value) {
|
||||||
@ -104,9 +146,11 @@ abstract class SquareButtonPanel<out S : AbstractContainerScreen<*>>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) {
|
override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) {
|
||||||
if (pressed) {
|
if (isDisabled) {
|
||||||
|
DISABLED.render(stack, 0f, 0f, width, height)
|
||||||
|
} else if (pressed) {
|
||||||
PRESSED.render(stack, 0f, 0f, width, height)
|
PRESSED.render(stack, 0f, 0f, width, height)
|
||||||
} else if (isHovered && !isDisabled) {
|
} else if (isHovered) {
|
||||||
HOVERED.render(stack, 0f, 0f, width, height)
|
HOVERED.render(stack, 0f, 0f, width, height)
|
||||||
} else {
|
} else {
|
||||||
IDLE.render(stack, 0f, 0f, width, height)
|
IDLE.render(stack, 0f, 0f, width, height)
|
||||||
@ -324,6 +368,7 @@ open class LargeSquareButtonPanel<out S : AbstractContainerScreen<*>>(
|
|||||||
final override val IDLE = Widgets18.BUTTON_IDLE
|
final override val IDLE = Widgets18.BUTTON_IDLE
|
||||||
final override val HOVERED = Widgets18.BUTTON_HOVERED
|
final override val HOVERED = Widgets18.BUTTON_HOVERED
|
||||||
final override val PRESSED = Widgets18.BUTTON_PRESSED
|
final override val PRESSED = Widgets18.BUTTON_PRESSED
|
||||||
|
final override val DISABLED = Widgets18.BUTTON_DISABLED
|
||||||
|
|
||||||
override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) {
|
override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) {
|
||||||
super.innerRender(stack, mouseX, mouseY, partialTick)
|
super.innerRender(stack, mouseX, mouseY, partialTick)
|
||||||
@ -355,6 +400,7 @@ open class LargeEnumSquareButtonPanel<out S : AbstractContainerScreen<*>, T : En
|
|||||||
final override val IDLE = Widgets18.BUTTON_IDLE
|
final override val IDLE = Widgets18.BUTTON_IDLE
|
||||||
final override val HOVERED = Widgets18.BUTTON_HOVERED
|
final override val HOVERED = Widgets18.BUTTON_HOVERED
|
||||||
final override val PRESSED = Widgets18.BUTTON_PRESSED
|
final override val PRESSED = Widgets18.BUTTON_PRESSED
|
||||||
|
final override val DISABLED = Widgets18.BUTTON_DISABLED
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val SIZE = 18f
|
const val SIZE = 18f
|
||||||
@ -375,6 +421,7 @@ open class SmallSquareButtonPanel<out S : AbstractContainerScreen<*>>(
|
|||||||
final override val IDLE = Widgets8.BUTTON_IDLE
|
final override val IDLE = Widgets8.BUTTON_IDLE
|
||||||
final override val HOVERED = Widgets8.BUTTON_HOVERED
|
final override val HOVERED = Widgets8.BUTTON_HOVERED
|
||||||
final override val PRESSED = Widgets8.BUTTON_PRESSED
|
final override val PRESSED = Widgets8.BUTTON_PRESSED
|
||||||
|
final override val DISABLED = Widgets8.BUTTON_DISABLED
|
||||||
|
|
||||||
override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) {
|
override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) {
|
||||||
super.innerRender(stack, mouseX, mouseY, partialTick)
|
super.innerRender(stack, mouseX, mouseY, partialTick)
|
||||||
@ -406,6 +453,7 @@ open class SmallEnumSquareButtonPanel<out S : AbstractContainerScreen<*>, T : En
|
|||||||
final override val IDLE = Widgets8.BUTTON_IDLE
|
final override val IDLE = Widgets8.BUTTON_IDLE
|
||||||
final override val HOVERED = Widgets8.BUTTON_HOVERED
|
final override val HOVERED = Widgets8.BUTTON_HOVERED
|
||||||
final override val PRESSED = Widgets8.BUTTON_PRESSED
|
final override val PRESSED = Widgets8.BUTTON_PRESSED
|
||||||
|
final override val DISABLED = Widgets8.BUTTON_DISABLED
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val SIZE = 8f
|
const val SIZE = 8f
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
BIN
src/main/resources/assets/overdrive_that_matters/textures/gui/widgets_18.xcf
(Stored with Git LFS)
BIN
src/main/resources/assets/overdrive_that_matters/textures/gui/widgets_18.xcf
(Stored with Git LFS)
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 852 B After Width: | Height: | Size: 885 B |
BIN
src/main/resources/assets/overdrive_that_matters/textures/gui/widgets_8.xcf
(Stored with Git LFS)
BIN
src/main/resources/assets/overdrive_that_matters/textures/gui/widgets_8.xcf
(Stored with Git LFS)
Binary file not shown.
Loading…
Reference in New Issue
Block a user