From a50cad68327b390d7624247196b71d7b21f7a943 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sun, 10 Nov 2024 14:10:27 +0700 Subject: [PATCH] Refactor buttons to have more streamlined hierarchy --- .../mc/otm/client/ClientEventHandler.kt | 12 +- .../mc/otm/client/render/WidgetLocation.kt | 6 +- .../mc/otm/client/render/Widgets.kt | 2 - .../mc/otm/client/render/Widgets15.kt | 19 ++ .../mc/otm/client/render/Widgets18.kt | 43 +-- .../mc/otm/client/render/Widgets8.kt | 7 +- .../render/sprites/AbstractMatterySprite.kt | 5 +- .../mc/otm/client/render/sprites/GridAtlas.kt | 22 +- .../sprites/StretchingRectangleElement.kt | 55 ++-- .../client/screen/ExopackInventoryScreen.kt | 4 +- .../screen/decorative/HoloSignScreen.kt | 43 +-- .../client/screen/decorative/PainterScreen.kt | 19 +- .../screen/matter/MatterBottlerScreen.kt | 2 +- .../client/screen/matter/MatterPanelScreen.kt | 29 +- .../screen/panels/EntityRendererPanel.kt | 26 +- .../mc/otm/client/screen/panels/FramePanel.kt | 2 +- .../panels/button/AbstractButtonPanel.kt | 3 + .../button/AbstractCheckBoxLabelPanel.kt | 29 -- .../panels/button/BooleanButtonPanel.kt | 288 ++++++++++++++++++ .../button/BooleanRectangleButtonPanel.kt | 95 ------ .../screen/panels/button/ButtonPanel.kt | 273 +++++++++++++++-- .../client/screen/panels/button/Buttons.kt | 99 +++--- .../panels/button/CheckBoxInputPanel.kt | 20 -- .../panels/button/CheckBoxLabelInputPanel.kt | 24 -- .../panels/button/CheckBoxLabelPanel.kt | 21 -- .../screen/panels/button/CheckBoxPanel.kt | 92 ------ ...angleButtonPanel.kt => EnumButtonPanel.kt} | 104 ++++++- .../LargeBooleanRectangleButtonPanel.kt | 32 -- .../button/LargeEnumRectangleButtonPanel.kt | 27 -- .../button/LargeRectangleButtonPanel.kt | 65 ---- .../panels/button/RectangleButtonPanel.kt | 43 --- .../SmallBooleanRectangleButtonPanel.kt | 29 -- .../button/SmallEnumRectangleButtonPanel.kt | 27 -- .../button/SmallRectangleButtonPanel.kt | 39 --- .../screen/panels/input/NumberInputPanel.kt | 12 +- .../screen/panels/input/QueryUserPanel.kt | 4 +- .../screen/panels/util/BackgroundPanel.kt | 2 +- .../screen/panels/util/HeightControls.kt | 12 +- .../client/screen/storage/DriveRackScreen.kt | 1 - .../screen/storage/DriveViewerScreen.kt | 8 +- .../screen/storage/ItemMonitorScreen.kt | 14 +- .../client/screen/storage/StorageBusScreen.kt | 4 +- .../storage/StorageImporterExporterScreen.kt | 8 +- .../screen/tech/AndroidStationScreen.kt | 2 +- .../screen/tech/BlackHoleGeneratorScreen.kt | 4 +- .../client/screen/tech/EnergyCounterScreen.kt | 9 +- .../screen/tech/EssenceStorageScreen.kt | 48 ++- .../mc/otm/compat/cos/CosmeticArmorCompat.kt | 27 +- .../mc/otm/compat/curios/CuriosCompat.kt | 12 +- .../mc/otm/menu/matter/MatterPanelMenu.kt | 2 +- .../textures/gui/widgets/checkbox.png | Bin 817 -> 0 bytes .../textures/gui/widgets/large_button.png | Bin 663 -> 0 bytes .../textures/gui/widgets/large_button.xcf | Bin 3043 -> 0 bytes .../textures/gui/widgets/misc18.png | Bin 951 -> 0 bytes .../textures/gui/widgets/widget_15.png | Bin 0 -> 800 bytes .../textures/gui/widgets/widget_15.xcf | Bin 0 -> 4575 bytes .../textures/gui/widgets/widget_18.png | Bin 0 -> 1098 bytes .../gui/widgets/{misc18.xcf => widget_18.xcf} | Bin 5499 -> 7343 bytes .../{widgets_8.png => widgets/widget_8.png} | Bin .../{widgets_8.xcf => widgets/widget_8.xcf} | Bin 60 files changed, 930 insertions(+), 845 deletions(-) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets15.kt delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/AbstractCheckBoxLabelPanel.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/BooleanButtonPanel.kt delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/BooleanRectangleButtonPanel.kt delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/CheckBoxInputPanel.kt delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/CheckBoxLabelInputPanel.kt delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/CheckBoxLabelPanel.kt delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/CheckBoxPanel.kt rename src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/{EnumRectangleButtonPanel.kt => EnumButtonPanel.kt} (62%) delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/LargeBooleanRectangleButtonPanel.kt delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/LargeEnumRectangleButtonPanel.kt delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/LargeRectangleButtonPanel.kt delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/RectangleButtonPanel.kt delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/SmallBooleanRectangleButtonPanel.kt delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/SmallEnumRectangleButtonPanel.kt delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/SmallRectangleButtonPanel.kt delete mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/checkbox.png delete mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/large_button.png delete mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/large_button.xcf delete mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/misc18.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/widget_15.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/widget_15.xcf create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/widget_18.png rename src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/{misc18.xcf => widget_18.xcf} (54%) rename src/main/resources/assets/overdrive_that_matters/textures/gui/{widgets_8.png => widgets/widget_8.png} (100%) rename src/main/resources/assets/overdrive_that_matters/textures/gui/{widgets_8.xcf => widgets/widget_8.xcf} (100%) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/ClientEventHandler.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/ClientEventHandler.kt index 0621d3e0a..49876eaf8 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/ClientEventHandler.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/ClientEventHandler.kt @@ -27,8 +27,8 @@ import ru.dbotthepony.mc.otm.client.screen.ExopackInventoryScreen import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel import ru.dbotthepony.mc.otm.client.screen.panels.util.DiscreteScrollBarPanel -import ru.dbotthepony.mc.otm.client.screen.panels.button.LargeRectangleButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.Panel2Widget +import ru.dbotthepony.mc.otm.client.screen.panels.button.ButtonPanel import ru.dbotthepony.mc.otm.compat.vanilla.InventoryScrollPacket import ru.dbotthepony.mc.otm.compat.cos.isCosmeticArmorScreen import ru.dbotthepony.mc.otm.core.TranslatableComponent @@ -89,9 +89,9 @@ private fun inventoryLogic(event: ScreenEvent.Init.Post) { val eventScreen = event.screen val screen = if (eventScreen is AbstractContainerScreen<*> && (eventScreen.menu is InventoryMenu || eventScreen.isCosmeticArmorScreen)) eventScreen else return - val widget = Panel2Widget(LargeRectangleButtonPanel(screen, null, - x = screen.guiLeft + screen.xSize - 2f - LargeRectangleButtonPanel.SIZE, - y = screen.guiTop.toFloat() - LargeRectangleButtonPanel.SIZE - 2, + val widget = Panel2Widget(ButtonPanel.square18(screen, null, + x = screen.guiLeft + screen.xSize - 2f - 18f, + y = screen.guiTop.toFloat() - 18f - 2, icon = Widgets18.RETURN_ARROW_LEFT, iconWinding = UVWindingOrder.FLOP, onPress = { @@ -108,8 +108,8 @@ private fun inventoryLogic(event: ScreenEvent.Init.Post) { event.addListener(widget) tickWhileClient({ minecraft.screen == screen }) { - widget.panel.x = screen.guiLeft + screen.xSize - 2f - LargeRectangleButtonPanel.SIZE - widget.panel.y = screen.guiTop.toFloat() - LargeRectangleButtonPanel.SIZE - 2f + widget.panel.x = screen.guiLeft + screen.xSize - 2f - 18f + widget.panel.y = screen.guiTop.toFloat() - 18f - 2f } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/WidgetLocation.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/WidgetLocation.kt index 3377e5dcf..6792c4b7c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/WidgetLocation.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/WidgetLocation.kt @@ -1,14 +1,14 @@ package ru.dbotthepony.mc.otm.client.render -import net.minecraft.resources.ResourceLocation import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.client.render.sprites.MatteryAtlas import ru.dbotthepony.mc.otm.core.ResourceLocation object WidgetLocation { - val LARGE_BUTTON = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/large_button.png"), 72f, 18f) val STORAGE_CONTROLS = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/storage_controls.png"), 90f, 72f) - val MISC_18 = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/misc18.png"), 72f, 72f) + val WIDGET_18 = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/widget_18.png"), 72f, 72f) + val WIDGET_15 = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/widget_15.png"), 60f, 60f) + val WIDGET_8 = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/widget_8.png"), 64f, 32f) val SLOT_BACKGROUNDS = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/slot_backgrounds.png"), 72f, 72f) val MISC = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/misc.png"), 64f, 64f) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets.kt index 5248b2d71..9af200de7 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets.kt @@ -1,8 +1,6 @@ package ru.dbotthepony.mc.otm.client.render object Widgets { - val SLOT = WidgetLocation.MISC.sprite(0f, 0f, 18f, 18f) - val ARROW_UP_BUTTON_IDLE = WidgetLocation.MISC.sprite(0f, 18f, 18f, 6f) val ARROW_UP_BUTTON_HOVERED = WidgetLocation.MISC.sprite(0f, 18f + 6f, 18f, 6f) val ARROW_UP_BUTTON_PRESSED = WidgetLocation.MISC.sprite(0f, 18f + 6f * 2f, 18f, 6f) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets15.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets15.kt new file mode 100644 index 000000000..adad65d22 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets15.kt @@ -0,0 +1,19 @@ +package ru.dbotthepony.mc.otm.client.render + +object Widgets15 { + private val misc15 = WidgetLocation.WIDGET_15.grid(rows = 4, columns = 4) + + val CHECKED = misc15.next() + val CHECKED_DISABLED = misc15.next() + val UNCHECKED = misc15.next() + val UNCHECKED_DISABLED = misc15.next() + + val BUTTON_IDLE_STRETCHABLE = misc15.makeButton(2f) + val BUTTON_IDLE = misc15.next() + val BUTTON_HOVERED_STRETCHABLE = misc15.makeButton(2f) + val BUTTON_HOVERED = misc15.next() + val BUTTON_PRESSED_STRETCHABLE = misc15.makeButton(2f) + val BUTTON_PRESSED = misc15.next() + val BUTTON_DISABLED_STRETCHABLE = misc15.makeButton(2f) + val BUTTON_DISABLED = misc15.next() +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt index a405fed3d..2d52e5824 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt @@ -2,42 +2,12 @@ package ru.dbotthepony.mc.otm.client.render import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity import ru.dbotthepony.mc.otm.capability.FlowDirection -import ru.dbotthepony.mc.otm.client.render.sprites.GridAtlas -import ru.dbotthepony.mc.otm.client.render.sprites.StretchingRectangleElement -import ru.dbotthepony.mc.otm.client.render.sprites.sprite import ru.dbotthepony.mc.otm.core.immutableMap import ru.dbotthepony.mc.otm.core.math.RelativeSide -private fun makeButton(grid: GridAtlas): StretchingRectangleElement { - val x = grid.currentX - val y = grid.currentY - - return StretchingRectangleElement( - topLeft = grid.texture.sprite(x, y, 2f, 2f, grid.atlasWidth, grid.atlasHeight), - topRight = grid.texture.sprite(x + 16f, y, 2f, 2f, grid.atlasWidth, grid.atlasHeight), - bottomLeft = grid.texture.sprite(x, y + 16f, 2f, 2f, grid.atlasWidth, grid.atlasHeight), - bottomRight = grid.texture.sprite(x + 16f, y + 16f, 2f, 2f, grid.atlasWidth, grid.atlasHeight), - middle = grid.texture.sprite(x + 2f, y + 2f, 14f, 14f, grid.atlasWidth, grid.atlasHeight), - top = grid.texture.sprite(x + 2f, y, 14f, 2f, grid.atlasWidth, grid.atlasHeight), - left = grid.texture.sprite(x, y + 2f, 2f, 14f, grid.atlasWidth, grid.atlasHeight), - right = grid.texture.sprite(x + 16f, y + 2f, 2f, 14f, grid.atlasWidth, grid.atlasHeight), - bottom = grid.texture.sprite(x + 2f, y + 16f, 14f, 2f, grid.atlasWidth, grid.atlasHeight), - ) -} - object Widgets18 { - private val buttonGrids = WidgetLocation.LARGE_BUTTON.grid(rows = 1, columns = 4) - - val BUTTON_IDLE_STRETCHABLE = makeButton(buttonGrids) - val BUTTON_IDLE = buttonGrids.next() - val BUTTON_HOVERED_STRETCHABLE = makeButton(buttonGrids) - val BUTTON_HOVERED = buttonGrids.next() - val BUTTON_PRESSED_STRETCHABLE = makeButton(buttonGrids) - val BUTTON_PRESSED = buttonGrids.next() - val BUTTON_DISABLED_STRETCHABLE = makeButton(buttonGrids) - val BUTTON_DISABLED = buttonGrids.next() - private val storageGrid = WidgetLocation.STORAGE_CONTROLS.grid(rows = 4, columns = 5) + val SORT_DESCENDING = storageGrid.next() val SORT_ASCENDING = storageGrid.next() val SORT_DEFAULT = storageGrid.next() @@ -55,7 +25,16 @@ object Widgets18 { val STOP = storageGrid.next() val SORT_NOW = storageGrid.next() - private val miscGrid = WidgetLocation.MISC_18.grid(4, 4) + private val miscGrid = WidgetLocation.WIDGET_18.grid(4, 4) + + val BUTTON_IDLE_STRETCHABLE = miscGrid.makeButton(2f) + val BUTTON_IDLE = miscGrid.next() + val BUTTON_HOVERED_STRETCHABLE = miscGrid.makeButton(2f) + val BUTTON_HOVERED = miscGrid.next() + val BUTTON_PRESSED_STRETCHABLE = miscGrid.makeButton(2f) + val BUTTON_PRESSED = miscGrid.next() + val BUTTON_DISABLED_STRETCHABLE = miscGrid.makeButton(2f) + val BUTTON_DISABLED = miscGrid.next() val COOLDOWN = miscGrid.next() val CROSS = miscGrid.next() diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets8.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets8.kt index d53587cc0..f1ee262d2 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets8.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets8.kt @@ -6,13 +6,18 @@ import ru.dbotthepony.mc.otm.client.render.sprites.GridAtlas import ru.dbotthepony.mc.otm.core.ResourceLocation object Widgets8 { - val GRID = GridAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets_8.png"), 8f, 8f, columns = 64 / 8, rows = 32 / 8) + private val GRID = WidgetLocation.WIDGET_8.grid(columns = 8, rows = 4) val BUTTON_IDLE = GRID[0, 0] val BUTTON_HOVERED = GRID[0, 1] val BUTTON_PRESSED = GRID[0, 2] val BUTTON_DISABLED = GRID[0, 3] + val BUTTON_IDLE_STRETCHABLE = GRID.makeButton(2f, 0, 0) + val BUTTON_HOVERED_STRETCHABLE = GRID.makeButton(2f, 0, 1) + val BUTTON_PRESSED_STRETCHABLE = GRID.makeButton(2f, 0, 2) + val BUTTON_DISABLED_STRETCHABLE = GRID.makeButton(2f, 0, 3) + val WHITE_ARROW_DOWN = GRID[1, 0] val S = GRID[2, 0] val F = GRID[3, 0] diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/sprites/AbstractMatterySprite.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/sprites/AbstractMatterySprite.kt index 0211f3bd2..7e3183fbe 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/sprites/AbstractMatterySprite.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/sprites/AbstractMatterySprite.kt @@ -66,9 +66,10 @@ sealed class AbstractMatterySprite : IGUIRenderable, IUVCoords { y: Float = 0f, width: Float = this.width, height: Float = this.height, - winding: UVWindingOrder = this.winding + winding: UVWindingOrder = this.winding, + color: RGBAColor = RGBAColor.WHITE ) { - renderTexturedRect(stack.last().pose(), x, y, width, height, uvWinding = winding, uv = this, texture = texture) + renderTexturedRect(stack.last().pose(), x, y, width, height, uvWinding = winding, uv = this, texture = texture, color = color) } override fun render( diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/sprites/GridAtlas.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/sprites/GridAtlas.kt index 6d2650488..f449927fe 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/sprites/GridAtlas.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/sprites/GridAtlas.kt @@ -53,6 +53,24 @@ data class GridAtlas( return this } - operator fun get(column: Int, row: Int) = - MatterySprite(texture, column * width, row * height, width, height, atlasWidth, atlasHeight) + operator fun get(column: Int, row: Int) = MatterySprite(texture, column * width, row * height, width, height, atlasWidth, atlasHeight) + + fun makeButton(padding: Float, column: Int = this.column, row: Int = this.row): StretchingRectangleElement { + val x = column * width + val y = row * height + + return StretchingRectangleElement( + topLeft = texture.sprite(x, y, padding, padding, atlasWidth, atlasHeight), + topRight = texture.sprite(x + width - padding, y, padding, padding, atlasWidth, atlasHeight), + bottomLeft = texture.sprite(x, y + height - padding, padding, padding, atlasWidth, atlasHeight), + bottomRight = texture.sprite(x + width - padding, y + height - padding, padding, padding, atlasWidth, atlasHeight), + + middle = texture.sprite(x + padding, y + padding, width - padding * 2, height - padding * 2, atlasWidth, atlasHeight), + + top = texture.sprite(x + padding, y, width - padding * 2, padding, atlasWidth, atlasHeight), + left = texture.sprite(x, y + padding, padding, height - padding * 2, atlasWidth, atlasHeight), + right = texture.sprite(x + width - padding, y + padding, padding, height - padding * 2, atlasWidth, atlasHeight), + bottom = texture.sprite(x + padding, y + height - padding, width - padding * 2, padding, atlasWidth, atlasHeight), + ) + } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/sprites/StretchingRectangleElement.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/sprites/StretchingRectangleElement.kt index bc68a78e1..4c08d9aff 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/sprites/StretchingRectangleElement.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/sprites/StretchingRectangleElement.kt @@ -1,8 +1,10 @@ package ru.dbotthepony.mc.otm.client.render.sprites -import com.mojang.blaze3d.vertex.PoseStack import net.minecraft.resources.ResourceLocation +import ru.dbotthepony.kommons.math.RGBAColor +import ru.dbotthepony.mc.otm.client.render.IGUIRenderable import ru.dbotthepony.mc.otm.client.render.MGUIGraphics +import ru.dbotthepony.mc.otm.client.render.UVWindingOrder import ru.dbotthepony.mc.otm.client.screen.panels.DockProperty data class StretchingRectangleElement( @@ -16,42 +18,41 @@ data class StretchingRectangleElement( val bottom: AbstractMatterySprite, val middle: AbstractMatterySprite, val padding: DockProperty = DockProperty.EMPTY -) { - fun render( - stack: PoseStack, - x: Float = 0f, - y: Float = 0f, - width: Float, - height: Float, +) : IGUIRenderable { + override fun render( + guiGraphics: MGUIGraphics, + x: Float, + y: Float, + canvasWidth: Float, + canvasHeight: Float, + winding: UVWindingOrder, + color: RGBAColor, ) { - val bgWidth = width - topLeft.width.coerceAtMost(bottomLeft.width) - topRight.width.coerceAtMost(bottomRight.width) - padding.left - padding.right - val bgHeight = height - topLeft.height.coerceAtMost(bottomLeft.height) - topRight.height.coerceAtMost(bottomRight.height) - padding.top - padding.bottom + val bgWidth = canvasWidth - topLeft.width.coerceAtMost(bottomLeft.width) - topRight.width.coerceAtMost(bottomRight.width) - padding.left - padding.right + val bgHeight = canvasHeight - topLeft.height.coerceAtMost(bottomLeft.height) - topRight.height.coerceAtMost(bottomRight.height) - padding.top - padding.bottom if (bgWidth > 0 && bgHeight > 0) { - middle.render(stack, x + topLeft.width + padding.left, y + topLeft.height + padding.top, bgWidth, bgHeight) + middle.render(guiGraphics, x + topLeft.width + padding.left, y + topLeft.height + padding.top, bgWidth, bgHeight, color = color) } - top.render(stack, x + topLeft.width, y, width = width - topLeft.width - topRight.width) - bottom.render(stack, x + bottomLeft.width, y + height - bottom.height, width = width - bottomLeft.width - bottomRight.width) + top.render(guiGraphics, x + topLeft.width, y, canvasHeight = top.height, canvasWidth = canvasWidth - topLeft.width - topRight.width, color = color) + bottom.render(guiGraphics, x + bottomLeft.width, y + canvasHeight - bottom.height, canvasWidth = canvasWidth - bottomLeft.width - bottomRight.width, color = color) - left.render(stack, x, y + topLeft.height, height = height - topLeft.height - bottomLeft.height) - right.render(stack, x + width - right.width, y + topRight.height, height = height - topRight.height - bottomRight.height) + left.render(guiGraphics, x, y + topLeft.height, canvasHeight = canvasHeight - topLeft.height - bottomLeft.height, color = color) + right.render(guiGraphics, x + canvasWidth - right.width, y + topRight.height, canvasHeight = canvasHeight - topRight.height - bottomRight.height, color = color) - topLeft.render(stack, x, y) - topRight.render(stack, x + width - topRight.width, y) + topLeft.render(guiGraphics, x, y, color = color) + topRight.render(guiGraphics, x + canvasWidth - topRight.width, y, color = color) - bottomLeft.render(stack, x, y + height - bottomLeft.height) - bottomRight.render(stack, x + width - bottomRight.width, y + height - bottomLeft.height) + bottomLeft.render(guiGraphics, x, y + canvasHeight - bottomLeft.height, color = color) + bottomRight.render(guiGraphics, x + canvasWidth - bottomRight.width, y + canvasHeight - bottomLeft.height, color = color) } - @JvmOverloads - fun render( - graphics: MGUIGraphics, - x: Float = 0f, - y: Float = 0f, - width: Float, - height: Float, - ) = render(graphics.pose, x, y, width, height) + override val width: Float + get() = left.width + middle.width + right.width + + override val height: Float + get() = top.height + middle.height + right.height companion object { fun square( diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExopackInventoryScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExopackInventoryScreen.kt index b61decaf9..fba31c2b9 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExopackInventoryScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExopackInventoryScreen.kt @@ -13,8 +13,8 @@ import ru.dbotthepony.mc.otm.client.render.Widgets18 import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.render.sprites.sprite import ru.dbotthepony.mc.otm.client.screen.panels.* +import ru.dbotthepony.mc.otm.client.screen.panels.button.ButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.button.DeviceControls -import ru.dbotthepony.mc.otm.client.screen.panels.button.LargeRectangleButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.InventorySlotPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.SlotPanel @@ -247,7 +247,7 @@ class ExopackInventoryScreen(menu: ExopackInventoryMenu) : MatteryScreen(menu, title) { @@ -31,26 +31,29 @@ class HoloSignScreen(menu: HoloSignMenu, inventory: Inventory, title: Component) val controls = makeDeviceControls(this, frame, redstoneConfig = menu.redstone) - controls.addButton(object : LargeRectangleButtonPanel(this@HoloSignScreen, frame, onPress = { - frame.blockingWindow = ColorPickerPanel.frame( - this@HoloSignScreen, - callback = { - menu.textRed.accept(it.red) - menu.textGreen.accept(it.green) - menu.textBlue.accept(it.blue) - menu.textAlpha.accept(it.alpha) - }, - color = RGBAColor(menu.textRed.value, menu.textGreen.value, menu.textBlue.value, menu.textAlpha.value), - isDisabled = { !menu.textRed.and(menu.textGreen).and(menu.textBlue).and(menu.textAlpha).test(minecraft?.player) }, - title = TranslatableComponent("otm.gui.change_color")) - }) { - init { - tooltips.add(TranslatableComponent("otm.gui.change_color")) - icon = Widgets18.COLOR_PALETTE + controls.addButton(ButtonPanel.square18( + this@HoloSignScreen, + frame, + icon = Widgets18.COLOR_PALETTE, + onPress = { + frame.blockingWindow = ColorPickerPanel.frame( + this@HoloSignScreen, + callback = { + menu.textRed.accept(it.red) + menu.textGreen.accept(it.green) + menu.textBlue.accept(it.blue) + menu.textAlpha.accept(it.alpha) + }, + color = RGBAColor(menu.textRed.value, menu.textGreen.value, menu.textBlue.value, menu.textAlpha.value), + isDisabled = { !menu.textRed.and(menu.textGreen).and(menu.textBlue).and(menu.textAlpha).test(minecraft?.player) }, + title = TranslatableComponent("otm.gui.change_color") + ) } + ).also { + it.tooltips.add(TranslatableComponent("otm.gui.change_color")) }) - controls.addButton(LargeBooleanRectangleButtonPanel( + controls.addButton(BooleanButtonPanel.square18( this@HoloSignScreen, frame, prop = menu.textAutoScale, @@ -60,7 +63,7 @@ class HoloSignScreen(menu: HoloSignMenu, inventory: Inventory, title: Component) tooltipInactive = TranslatableComponent("otm.gui.holo_screen.do_not_resize_text"), )) - controls.addButton(LargeBooleanRectangleButtonPanel( + controls.addButton(BooleanButtonPanel.square18( this@HoloSignScreen, frame, prop = menu.locked, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/PainterScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/PainterScreen.kt index 1c0dc1c2d..8a78d61cf 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/PainterScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/PainterScreen.kt @@ -3,32 +3,31 @@ package ru.dbotthepony.mc.otm.client.screen.decorative import net.minecraft.ChatFormatting import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.network.chat.Component -import net.minecraft.util.RandomSource import net.minecraft.world.entity.player.Inventory import net.minecraft.world.item.DyeColor import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Items import net.neoforged.neoforge.common.Tags +import ru.dbotthepony.kommons.math.RGBAColor import ru.dbotthepony.mc.otm.block.entity.decorative.PainterBlockEntity -import ru.dbotthepony.mc.otm.client.render.MGUIGraphics import ru.dbotthepony.mc.otm.client.render.FlatRectangleIcon +import ru.dbotthepony.mc.otm.client.render.IGUIRenderable import ru.dbotthepony.mc.otm.client.render.ItemStackIcon +import ru.dbotthepony.mc.otm.client.render.MGUIGraphics import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.panels.Dock import ru.dbotthepony.mc.otm.client.screen.panels.DockResizeMode import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel import ru.dbotthepony.mc.otm.client.screen.panels.FramePanel -import ru.dbotthepony.mc.otm.client.screen.panels.button.CheckBoxLabelInputPanel +import ru.dbotthepony.mc.otm.client.screen.panels.button.BooleanButtonPanel +import ru.dbotthepony.mc.otm.client.screen.panels.button.ButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.button.DeviceControls -import ru.dbotthepony.mc.otm.client.screen.panels.button.LargeRectangleButtonPanel -import ru.dbotthepony.mc.otm.client.screen.panels.button.RectangleButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.SlotPanel import ru.dbotthepony.mc.otm.client.screen.panels.util.ScrollableCanvasPanel import ru.dbotthepony.mc.otm.core.TextComponent import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.map -import ru.dbotthepony.kommons.math.RGBAColor import ru.dbotthepony.mc.otm.core.util.CreativeMenuItemComparator import ru.dbotthepony.mc.otm.menu.decorative.PainterMenu @@ -114,7 +113,7 @@ class PainterScreen(menu: PainterMenu, inventory: Inventory, title: Component) : val column = EditablePanel(this, frame) column.dock = Dock.FILL - val bulk = CheckBoxLabelInputPanel(this, column, menu.isBulk, TranslatableComponent("otm.gui.painter.is_bulk")) + val bulk = BooleanButtonPanel.Checkbox(this, column, menu.isBulk, TranslatableComponent("otm.gui.painter.is_bulk")) bulk.dock = Dock.BOTTOM bulk.tooltips.add(TranslatableComponent("otm.gui.painter.is_bulk.desc")) bulk.tooltips.add(TranslatableComponent("otm.gui.painter.is_bulk.desc2").withStyle(ChatFormatting.GRAY)) @@ -124,7 +123,7 @@ class PainterScreen(menu: PainterMenu, inventory: Inventory, title: Component) : canvas.dock = Dock.FILL canvas.dockPaddingBottom = 4f - val buttons = ArrayList>() + val buttons = ArrayList>() menu.listeners.addListener(Runnable { if (frame.isRemoved) return@Runnable @@ -143,13 +142,15 @@ class PainterScreen(menu: PainterMenu, inventory: Inventory, title: Component) : for (recipe in recipes) { val recipeOutput = recipe.value.getOutput(menu.inputContainer) - object : LargeRectangleButtonPanel(this@PainterScreen, canvas.canvas, icon = ItemStackIcon(recipeOutput, 14f, 14f).fixed()) { + object : ButtonPanel(this@PainterScreen, canvas.canvas) { init { buttons.add(this) dockRight = 1f dockBottom = 1f } + override val icon: IGUIRenderable = ItemStackIcon(recipeOutput, 14f, 14f).fixed() + override var isDisabled: Boolean get() = !recipe.value.canCraft(menu.dyeStoredDirect) set(value) {} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/matter/MatterBottlerScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/matter/MatterBottlerScreen.kt index 3813f8290..622954e65 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/matter/MatterBottlerScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/matter/MatterBottlerScreen.kt @@ -40,7 +40,7 @@ class MatterBottlerScreen(menu: MatterBottlerMenu, inventory: Inventory, title: progress = ProgressGaugePanel(this, frame, menu.progressWidget, 90f, PROGRESS_ARROW_TOP) if (minecraft?.player?.isSpectator != true) { - ButtonPanel(this, frame, 46f, 69f, 100f, 20f, TranslatableComponent("otm.matter_bottler.switch_mode"), onPress = menu.workFlow::switchValue) + ButtonPanel.Simple(this, frame, 46f, 69f, 100f, 20f, TranslatableComponent("otm.matter_bottler.switch_mode"), onPress = menu.workFlow::switchValue) } makeDeviceControls(this, frame, redstoneConfig = menu.redstoneConfig, upgrades = menu.upgrades) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/matter/MatterPanelScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/matter/MatterPanelScreen.kt index 37159af87..a6c888eba 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/matter/MatterPanelScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/matter/MatterPanelScreen.kt @@ -14,8 +14,6 @@ import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.panels.* import ru.dbotthepony.mc.otm.client.screen.panels.button.ButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.button.DeviceControls -import ru.dbotthepony.mc.otm.client.screen.panels.button.LargeBooleanRectangleButtonPanel -import ru.dbotthepony.mc.otm.client.screen.panels.button.LargeRectangleButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.input.TextInputPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel import ru.dbotthepony.mc.otm.client.screen.panels.util.DiscreteScrollBarPanel @@ -24,6 +22,7 @@ import ru.dbotthepony.mc.otm.core.TextComponent import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.kommons.math.RGBAColor import ru.dbotthepony.kommons.util.Delegate +import ru.dbotthepony.mc.otm.client.screen.panels.button.BooleanButtonPanel import ru.dbotthepony.mc.otm.core.math.integerDivisionDown import ru.dbotthepony.mc.otm.core.util.ItemSorter import ru.dbotthepony.mc.otm.core.util.formatMatter @@ -62,10 +61,10 @@ class MatterPanelScreen( } controls.addButton( - LargeBooleanRectangleButtonPanel( + BooleanButtonPanel.square18( this, frame, - prop = Delegate.Of(menu::isProvidingTasks), + prop = menu.isProvidingTasks, iconActive = Widgets18.PLAY, iconInactive = Widgets18.PAUSE, tooltipActive = TranslatableComponent("otm.gui.matter_panel.is_providing_tasks"), @@ -74,7 +73,7 @@ class MatterPanelScreen( ) controls.addButton( - LargeRectangleButtonPanel( + ButtonPanel.square18( this, frame, icon = Widgets18.STOP, @@ -284,13 +283,13 @@ class MatterPanelScreen( } } - ButtonPanel(this@MatterPanelScreen, frame, width = 40f, label = TranslatableComponent("otm.gui.matter_panel.close"), onPress = frame::remove).also { + ButtonPanel.Simple(this@MatterPanelScreen, frame, width = 40f, label = TranslatableComponent("otm.gui.matter_panel.close"), onPress = frame::remove).also { it.dock = Dock.RIGHT it.dockLeft = 2f } if (minecraft?.player?.isSpectator != true) { - ButtonPanel(this@MatterPanelScreen, frame, width = 80f, label = TranslatableComponent("otm.gui.matter_panel.cancel_task"), onPress = Runnable { + ButtonPanel.Simple(this@MatterPanelScreen, frame, width = 80f, label = TranslatableComponent("otm.gui.matter_panel.cancel_task"), onPress = Runnable { menu.requestTaskCancel(task.id) frame.remove() }).also { @@ -399,42 +398,42 @@ class MatterPanelScreen( } } - ButtonPanel(this, rowTop, width = 40f, label = TranslatableComponent("otm.gui.matter_panel.increase_by", 8), onPress = Runnable { input.increase(8) }).also { + ButtonPanel.Simple(this, rowTop, width = 40f, label = TranslatableComponent("otm.gui.matter_panel.increase_by", 8), onPress = Runnable { input.increase(8) }).also { it.dock = Dock.RIGHT it.dockLeft = 2f } - ButtonPanel(this, rowTop, width = 40f, label = TranslatableComponent("otm.gui.matter_panel.increase_by", 64), onPress = Runnable { input.increase(64) }).also { + ButtonPanel.Simple(this, rowTop, width = 40f, label = TranslatableComponent("otm.gui.matter_panel.increase_by", 64), onPress = Runnable { input.increase(64) }).also { it.dock = Dock.RIGHT it.dockLeft = 2f } - ButtonPanel(this, rowTop, width = 40f, label = TranslatableComponent("otm.gui.matter_panel.increase_by", 256), onPress = Runnable { input.increase(256) }).also { + ButtonPanel.Simple(this, rowTop, width = 40f, label = TranslatableComponent("otm.gui.matter_panel.increase_by", 256), onPress = Runnable { input.increase(256) }).also { it.dock = Dock.RIGHT it.dockLeft = 2f } - ButtonPanel(this, rowBottom, width = 40f, label = TranslatableComponent("otm.gui.matter_panel.decrease_by", 8), onPress = Runnable { input.increase(-8) }).also { + ButtonPanel.Simple(this, rowBottom, width = 40f, label = TranslatableComponent("otm.gui.matter_panel.decrease_by", 8), onPress = Runnable { input.increase(-8) }).also { it.dock = Dock.RIGHT it.dockLeft = 2f } - ButtonPanel(this, rowBottom, width = 40f, label = TranslatableComponent("otm.gui.matter_panel.decrease_by", 64), onPress = Runnable { input.increase(-64) }).also { + ButtonPanel.Simple(this, rowBottom, width = 40f, label = TranslatableComponent("otm.gui.matter_panel.decrease_by", 64), onPress = Runnable { input.increase(-64) }).also { it.dock = Dock.RIGHT it.dockLeft = 2f } - ButtonPanel(this, rowBottom, width = 40f, label = TranslatableComponent("otm.gui.matter_panel.decrease_by", 256), onPress = Runnable { input.increase(-256) }).also { + ButtonPanel.Simple(this, rowBottom, width = 40f, label = TranslatableComponent("otm.gui.matter_panel.decrease_by", 256), onPress = Runnable { input.increase(-256) }).also { it.dock = Dock.RIGHT it.dockLeft = 2f } - ButtonPanel(this, rowControls, width = 40f, label = TranslatableComponent("otm.gui.matter_panel.cancel"), onPress = frame::remove).also { + ButtonPanel.Simple(this, rowControls, width = 40f, label = TranslatableComponent("otm.gui.matter_panel.cancel"), onPress = frame::remove).also { it.dock = Dock.RIGHT it.dockLeft = 2f } - ButtonPanel(this, rowControls, width = 82f, label = TranslatableComponent("otm.gui.matter_panel.send"), onPress = input::send).also { + ButtonPanel.Simple(this, rowControls, width = 82f, label = TranslatableComponent("otm.gui.matter_panel.send"), onPress = input::send).also { it.dock = Dock.RIGHT it.dockLeft = 2f } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EntityRendererPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EntityRendererPanel.kt index 9811a3056..f065cc23d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EntityRendererPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EntityRendererPanel.kt @@ -14,14 +14,12 @@ import ru.dbotthepony.mc.otm.client.render.sprites.sprite import ru.dbotthepony.mc.otm.client.screen.ExopackInventoryScreen import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.panels.button.ButtonPanel -import ru.dbotthepony.mc.otm.client.screen.panels.button.CheckBoxLabelPanel -import ru.dbotthepony.mc.otm.client.screen.panels.button.SmallBooleanRectangleButtonPanel -import ru.dbotthepony.mc.otm.client.screen.panels.button.SmallRectangleButtonPanel import ru.dbotthepony.mc.otm.compat.cos.CosmeticToggleRenderButton import ru.dbotthepony.mc.otm.compat.cos.isCosmeticArmorLoaded import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.kommons.math.RGBAColor import ru.dbotthepony.kommons.util.Delegate +import ru.dbotthepony.mc.otm.client.screen.panels.button.BooleanButtonPanel import ru.dbotthepony.mc.otm.network.DisableExopackGlowPacket import ru.dbotthepony.mc.otm.network.DisplayExopackPacket import ru.dbotthepony.mc.otm.network.EnableExopackGlowPacket @@ -53,11 +51,11 @@ private fun createExopackAppearanceWindow(screen: MatteryScreen<*>, matteryPlaye frame.behaveAsWindow() frame.requestFocus() - CheckBoxLabelPanel( + BooleanButtonPanel.Checkbox( screen, frame, - text = TranslatableComponent("otm.gui.exopack.toggle_visibility"), - isChecked = Delegate.Of( + label = TranslatableComponent("otm.gui.exopack.toggle_visibility"), + prop = Delegate.Of( { matteryPlayer.isExopackVisible }, @@ -74,11 +72,11 @@ private fun createExopackAppearanceWindow(screen: MatteryScreen<*>, matteryPlaye it.dockTop = 2f } - CheckBoxLabelPanel( + BooleanButtonPanel.Checkbox( screen, frame, - text = TranslatableComponent("otm.gui.exopack.toggle_glow"), - isChecked = Delegate.Of( + label = TranslatableComponent("otm.gui.exopack.toggle_glow"), + prop = Delegate.Of( { matteryPlayer.exopackGlows }, @@ -95,7 +93,7 @@ private fun createExopackAppearanceWindow(screen: MatteryScreen<*>, matteryPlaye it.dockTop = 2f } - ButtonPanel(screen, frame, label = TranslatableComponent("otm.gui.exopack.change_color"), onPress = IntConsumer { + ButtonPanel.Simple(screen, frame, label = TranslatableComponent("otm.gui.exopack.change_color"), onPress = IntConsumer { frame.blockingWindow = ColorPickerPanel.frame( screen, callback = { PacketDistributor.sendToServer(SetExopackColorPacket(it)) }, @@ -106,7 +104,7 @@ private fun createExopackAppearanceWindow(screen: MatteryScreen<*>, matteryPlaye it.dockTop = 2f } - ButtonPanel(screen, frame, label = TranslatableComponent("otm.gui.exopack.change_color2"), onPress = IntConsumer { PacketDistributor.sendToServer(ResetExopackColorPacket) }).also { + ButtonPanel.Simple(screen, frame, label = TranslatableComponent("otm.gui.exopack.change_color2"), onPress = IntConsumer { PacketDistributor.sendToServer(ResetExopackColorPacket) }).also { it.dock = Dock.TOP it.dockTop = 2f } @@ -148,9 +146,9 @@ class EntityRendererPanel @JvmOverloads constructor( if (entity is Player) { val matteryPlayer = entity.matteryPlayer - if (matteryPlayer != null && matteryPlayer.hasExopack && screen is MatteryScreen<*>) { - exosuitButton = SmallRectangleButtonPanel(screen, this, this.width - 2f - SmallBooleanRectangleButtonPanel.SIZE, 2f, - skinElement = Widgets8.EXOPACK_SHOWN, + if (matteryPlayer.hasExopack && screen is MatteryScreen<*>) { + exosuitButton = ButtonPanel.square8(screen, this, this.width - 2f - 8f, 2f, + icon = Widgets8.EXOPACK_SHOWN, onPress = { blockingWindow = createExopackAppearanceWindow(screen, matteryPlayer) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/FramePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/FramePanel.kt index 087f79782..3cd03b067 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/FramePanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/FramePanel.kt @@ -395,7 +395,7 @@ open class FramePanel( } override fun innerRender(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float) { - RECTANGLE.render(graphics, width = width, height = height) + RECTANGLE.render(graphics, canvasWidth = width, canvasHeight = height) // title val title = title ?: return diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/AbstractButtonPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/AbstractButtonPanel.kt index 188b134de..c3ee3a4f2 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/AbstractButtonPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/AbstractButtonPanel.kt @@ -8,6 +8,9 @@ import ru.dbotthepony.mc.otm.client.playGuiClickSound import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel import java.util.function.IntPredicate +/** + * Barebones "button" base panel, representing anything remotely clickable + */ abstract class AbstractButtonPanel( screen: S, parent: EditablePanel<*>?, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/AbstractCheckBoxLabelPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/AbstractCheckBoxLabelPanel.kt deleted file mode 100644 index 3e6384b24..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/AbstractCheckBoxLabelPanel.kt +++ /dev/null @@ -1,29 +0,0 @@ -package ru.dbotthepony.mc.otm.client.screen.panels.button - -import net.minecraft.client.gui.screens.Screen -import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel -import ru.dbotthepony.mc.otm.client.screen.panels.Label -import kotlin.math.roundToInt - -abstract class AbstractCheckBoxLabelPanel @JvmOverloads constructor( - screen: S, - parent: EditablePanel<*>?, - x: Float = 0f, - y: Float = 0f, - width: Float = CheckBoxPanel.REGULAR_DIMENSIONS + 120f, - height: Float = CheckBoxPanel.REGULAR_DIMENSIONS -) : EditablePanel(screen, parent, x, y, width, height) { - abstract val checkbox: CheckBoxPanel - abstract val label: Label - - override fun performLayout() { - super.performLayout() - - checkbox.x = dockPadding.left - checkbox.y = dockPadding.top + (height / 2f - checkbox.height / 2f).roundToInt().toFloat() - - label.x = checkbox.x + checkbox.width + 4f - label.y = ((height - dockPadding.top - dockPadding.bottom) / 2f - font.lineHeight / 2f).roundToInt().toFloat() - label.width = width - checkbox.width - dockPadding.right - } -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/BooleanButtonPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/BooleanButtonPanel.kt new file mode 100644 index 000000000..9383a117a --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/BooleanButtonPanel.kt @@ -0,0 +1,288 @@ +package ru.dbotthepony.mc.otm.client.screen.panels.button + +import net.minecraft.ChatFormatting +import net.minecraft.client.gui.screens.Screen +import net.minecraft.network.chat.Component +import ru.dbotthepony.kommons.math.RGBAColor +import ru.dbotthepony.kommons.util.Delegate +import ru.dbotthepony.kommons.util.value +import ru.dbotthepony.mc.otm.client.render.MGUIGraphics +import ru.dbotthepony.mc.otm.client.minecraft +import ru.dbotthepony.mc.otm.client.render.IGUIRenderable +import ru.dbotthepony.mc.otm.client.render.UVWindingOrder +import ru.dbotthepony.mc.otm.client.render.Widgets15 +import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel +import ru.dbotthepony.mc.otm.core.TextComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent +import ru.dbotthepony.mc.otm.menu.input.IPlayerInputWithFeedback + +abstract class BooleanButtonPanel( + screen: S, + parent: EditablePanel<*>?, + x: Float = 0f, + y: Float = 0f, + width: Float, + height: Float, +) : ButtonPanel(screen, parent, x, y, width, height) { + protected abstract fun onChange(newValue: Boolean) + + abstract var isChecked: Boolean + abstract val tooltipActive: Component? + abstract val tooltipInactive: Component? + abstract val iconActive: IGUIRenderable? + abstract val iconInactive: IGUIRenderable? + open val iconDisabledActive: IGUIRenderable? + get() = iconActive + open val iconDisabledInactive: IGUIRenderable? + get() = iconInactive + + override val icon: IGUIRenderable? + get() = if (isChecked) { + if (isDisabled) iconDisabledActive else iconActive + } else { + if (isDisabled) iconDisabledInactive else iconInactive + } + + override fun onClick(mouseButton: Int) { + val newValue = !isChecked + isChecked = newValue + onChange(newValue) + } + + override fun innerRenderTooltips(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float): Boolean { + if (isHovered) { + val tooltipActive = tooltipActive + val tooltipInactive = tooltipInactive + + if (tooltipActive != null || tooltipInactive != null || tooltips.isNotEmpty()) { + val tooltips = ArrayList(2 + this.tooltips.size) + + if (this.tooltips.isNotEmpty()) { + tooltips.addAll(this.tooltips) + + if (tooltipActive != null || tooltipInactive != null) + tooltips.add(SPACE) + } + + if (tooltipActive != null) { + if (isChecked) + tooltips.add(TranslatableComponent("otm.gui.tooltip.enum.active", tooltipActive.copy().withStyle(ChatFormatting.WHITE))) + else + tooltips.add(tooltipActive.copy().withStyle(ChatFormatting.GRAY)) + } + + if (tooltipInactive != null) { + if (isChecked) + tooltips.add(tooltipInactive.copy().withStyle(ChatFormatting.GRAY)) + else + tooltips.add(TranslatableComponent("otm.gui.tooltip.enum.active", tooltipInactive.copy().withStyle(ChatFormatting.WHITE))) + } + + graphics.renderComponentTooltip(font, tooltips, mouseX.toInt(), mouseY.toInt()) + } + } + + return super.innerRenderTooltips(graphics, mouseX, mouseY, partialTick) + } + + open class Checkbox( + screen: S, + parent: EditablePanel<*>?, + x: Float = 0f, + y: Float = 0f, + val prop: Delegate, + ) : BooleanButtonPanel(screen, parent, x, y, 15f, 15f) { + constructor( + screen: S, + parent: EditablePanel<*>?, + x: Float = 0f, + y: Float = 0f, + prop: Delegate, + label: Component + ) : this(screen, parent, x, y, prop) { + width = font.width(label) + 24f + height = 18f + + this.label = label + } + + constructor( + screen: S, + parent: EditablePanel<*>?, + prop: Delegate, + label: Component + ) : this(screen, parent, 0f, 0f, prop, label) + + constructor( + screen: S, + parent: EditablePanel<*>?, + prop: Delegate, + ) : this(screen, parent, 0f, 0f, prop) + + override fun onChange(newValue: Boolean) { + // do nothing + } + + var displayUncheckedIcon = true + + override var label: Component? = null + override var isChecked: Boolean + get() = prop.get() + set(value) { prop.accept(value) } + override var labelColor: RGBAColor = RGBAColor.WHITE + + override val iconWinding: UVWindingOrder + get() = UVWindingOrder.NORMAL + override var iconOnLeft: Boolean = true + override val iconSpaceReservation: SpaceReservation = SpaceReservation.ICON_AND_TEXT + + override var isDisabled: Boolean + get() { + if (prop is IPlayerInputWithFeedback) { + return !prop.test(minecraft.player!!) + } else { + return super.isDisabled + } + } + set(value) { super.isDisabled = value } + + override var tooltipActive: Component? = null + override val tooltipInactive: Component? = null + override val iconActive: IGUIRenderable + get() = Widgets15.CHECKED + override val iconInactive: IGUIRenderable? + get() = if (displayUncheckedIcon) Widgets15.UNCHECKED else null + + override val iconDisabledActive: IGUIRenderable + get() = Widgets15.CHECKED_DISABLED + override val iconDisabledInactive: IGUIRenderable? + get() = if (displayUncheckedIcon) Widgets15.UNCHECKED_DISABLED else null + } + + open class Simple( + screen: S, + parent: EditablePanel<*>?, + x: Float = 0f, + y: Float = 0f, + width: Float, + height: Float, + val prop: Delegate, + override var iconActive: IGUIRenderable? = null, + override var iconInactive: IGUIRenderable? = null, + val onChange: ((newValue: Boolean) -> Unit)? = null, + override var tooltipActive: Component? = null, + override var tooltipInactive: Component? = null, + ) : BooleanButtonPanel(screen, parent, x, y, width, height) { + override fun onChange(newValue: Boolean) { + // do nothing + } + + override var label: Component? = null + override var isChecked: Boolean + get() = prop.get() + set(value) { prop.accept(value) } + override var labelColor: RGBAColor = RGBAColor.WHITE + + override var iconWinding: UVWindingOrder = UVWindingOrder.NORMAL + override var iconOnLeft: Boolean = true + override val iconSpaceReservation: SpaceReservation = SpaceReservation.DEFAULT + + override var isDisabled: Boolean + get() { + if (prop is IPlayerInputWithFeedback) { + return !prop.test(minecraft.player!!) + } else { + return super.isDisabled + } + } + set(value) { super.isDisabled = value } + } + + companion object { + private val SPACE = TextComponent("") + + fun square18( + screen: S, + parent: EditablePanel<*>?, + x: Float = 0f, + y: Float = 0f, + prop: Delegate, + iconActive: IGUIRenderable? = null, + iconInactive: IGUIRenderable? = null, + onChange: ((newValue: Boolean) -> Unit)? = null, + tooltipActive: Component? = null, + tooltipInactive: Component? = null, + ): Simple { + return Simple(screen, parent, x, y, 18f, 18f, prop, iconActive, iconInactive, onChange, tooltipActive, tooltipInactive) + } + + fun square15( + screen: S, + parent: EditablePanel<*>?, + x: Float = 0f, + y: Float = 0f, + prop: Delegate, + iconActive: IGUIRenderable? = null, + iconInactive: IGUIRenderable? = null, + onChange: ((newValue: Boolean) -> Unit)? = null, + tooltipActive: Component? = null, + tooltipInactive: Component? = null, + ): Simple { + return Simple(screen, parent, x, y, 15f, 15f, prop, iconActive, iconInactive, onChange, tooltipActive, tooltipInactive) + } + + fun square8( + screen: S, + parent: EditablePanel<*>?, + x: Float = 0f, + y: Float = 0f, + prop: Delegate, + iconActive: IGUIRenderable? = null, + iconInactive: IGUIRenderable? = null, + onChange: ((newValue: Boolean) -> Unit)? = null, + tooltipActive: Component? = null, + tooltipInactive: Component? = null, + ): Simple { + return Simple(screen, parent, x, y, 8f, 8f, prop, iconActive, iconInactive, onChange, tooltipActive, tooltipInactive) + } + + fun square18( + screen: S, + parent: EditablePanel<*>?, + prop: Delegate, + iconActive: IGUIRenderable? = null, + iconInactive: IGUIRenderable? = null, + onChange: ((newValue: Boolean) -> Unit)? = null, + tooltipActive: Component? = null, + tooltipInactive: Component? = null, + ): Simple { + return Simple(screen, parent, 0f, 0f, 18f, 18f, prop, iconActive, iconInactive, onChange, tooltipActive, tooltipInactive) + } + + fun square15( + screen: S, + parent: EditablePanel<*>?, + prop: Delegate, + iconActive: IGUIRenderable? = null, + iconInactive: IGUIRenderable? = null, + onChange: ((newValue: Boolean) -> Unit)? = null, + tooltipActive: Component? = null, + tooltipInactive: Component? = null, + ): Simple { + return Simple(screen, parent, 0f, 0f, 15f, 15f, prop, iconActive, iconInactive, onChange, tooltipActive, tooltipInactive) + } + + fun square8( + screen: S, + parent: EditablePanel<*>?, + prop: Delegate, + iconActive: IGUIRenderable? = null, + iconInactive: IGUIRenderable? = null, + onChange: ((newValue: Boolean) -> Unit)? = null, + tooltipActive: Component? = null, + tooltipInactive: Component? = null, + ): Simple { + return Simple(screen, parent, 0f, 0f, 8f, 8f, prop, iconActive, iconInactive, onChange, tooltipActive, tooltipInactive) + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/BooleanRectangleButtonPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/BooleanRectangleButtonPanel.kt deleted file mode 100644 index 5569db12f..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/BooleanRectangleButtonPanel.kt +++ /dev/null @@ -1,95 +0,0 @@ -package ru.dbotthepony.mc.otm.client.screen.panels.button - -import net.minecraft.ChatFormatting -import net.minecraft.client.gui.screens.Screen -import net.minecraft.network.chat.Component -import ru.dbotthepony.kommons.util.Delegate -import ru.dbotthepony.kommons.util.value -import ru.dbotthepony.mc.otm.client.render.MGUIGraphics -import ru.dbotthepony.mc.otm.client.minecraft -import ru.dbotthepony.mc.otm.client.render.IGUIRenderable -import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel -import ru.dbotthepony.mc.otm.core.TextComponent -import ru.dbotthepony.mc.otm.core.TranslatableComponent -import ru.dbotthepony.mc.otm.menu.input.IPlayerInputWithFeedback - -abstract class BooleanRectangleButtonPanel( - screen: S, - parent: EditablePanel<*>?, - x: Float = 0f, - y: Float = 0f, - width: Float, - height: Float, - val prop: Delegate, - var iconActive: IGUIRenderable? = null, - var iconInactive: IGUIRenderable? = null, - val onChange: ((newValue: Boolean) -> Unit)? = null, - var tooltipActive: Component? = null, - var tooltipInactive: Component? = null, -) : RectangleButtonPanel(screen, parent, x, y, width, height, null) { - override fun onClick(mouseButton: Int) { - val newValue = !prop.value - prop.value = newValue - onChange?.invoke(newValue) - } - - override fun innerRenderTooltips(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float): Boolean { - if (isHovered) { - val tooltipActive = tooltipActive - val tooltipInactive = tooltipInactive - - if (tooltipActive != null || tooltipInactive != null || tooltips.isNotEmpty()) { - val tooltips = ArrayList(2 + this.tooltips.size) - - if (this.tooltips.isNotEmpty()) { - tooltips.addAll(this.tooltips) - - if (tooltipActive != null || tooltipInactive != null) - tooltips.add(SPACE) - } - - if (tooltipActive != null) { - if (prop.get()) - tooltips.add(TranslatableComponent("otm.gui.tooltip.enum.active", tooltipActive.copy().withStyle(ChatFormatting.WHITE))) - else - tooltips.add(tooltipActive.copy().withStyle(ChatFormatting.GRAY)) - } - - if (tooltipInactive != null) { - if (prop.get()) - tooltips.add(tooltipInactive.copy().withStyle(ChatFormatting.GRAY)) - else - tooltips.add(TranslatableComponent("otm.gui.tooltip.enum.active", tooltipInactive.copy().withStyle(ChatFormatting.WHITE))) - } - - graphics.renderComponentTooltip(font, tooltips, mouseX.toInt(), mouseY.toInt()) - } - } - - return super.innerRenderTooltips(graphics, mouseX, mouseY, partialTick) - } - - override var isDisabled: Boolean - get() { - if (prop is IPlayerInputWithFeedback) { - return !prop.test(minecraft.player!!) - } else { - return super.isDisabled - } - } - set(value) { super.isDisabled = value } - - override fun innerRender(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float) { - super.innerRender(graphics, mouseX, mouseY, partialTick) - - if (prop.value) { - iconActive?.render(graphics, canvasWidth = width, canvasHeight = height) - } else { - iconInactive?.render(graphics, canvasWidth = width, canvasHeight = height) - } - } - - companion object { - private val SPACE = TextComponent("") - } -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/ButtonPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/ButtonPanel.kt index d5b87d7ea..9c50d5ea2 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/ButtonPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/ButtonPanel.kt @@ -7,62 +7,269 @@ import ru.dbotthepony.mc.otm.client.render.RenderGravity import ru.dbotthepony.mc.otm.client.render.Widgets18 import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel import ru.dbotthepony.kommons.math.RGBAColor +import ru.dbotthepony.mc.otm.client.render.IGUIRenderable +import ru.dbotthepony.mc.otm.client.render.UVWindingOrder +import ru.dbotthepony.mc.otm.client.render.Widgets15 +import ru.dbotthepony.mc.otm.client.render.Widgets8 import java.util.function.IntConsumer +import kotlin.math.min -open class ButtonPanel( +/** + * Base button panel, representing traditional buttons, extending [AbstractButtonPanel] + */ +abstract class ButtonPanel( screen: S, parent: EditablePanel<*>?, x: Float = 0f, y: Float = 0f, width: Float = 40f, height: Float = HEIGHT, - var label: Component, - var onPress: IntConsumer? = null ) : AbstractButtonPanel(screen, parent, x, y, width, height) { - constructor(screen: S, parent: EditablePanel<*>?, label: Component, onPress: IntConsumer? = null) : this(screen, parent, x = 0f, label = label, onPress = onPress) + open val labelColor: RGBAColor + get() = RGBAColor.WHITE + open val label: Component? + get() = null + open val icon: IGUIRenderable? + get() = null + open val iconWinding: UVWindingOrder + get() = UVWindingOrder.NORMAL + open val iconOnLeft: Boolean + get() = true + open val iconSpaceReservation: SpaceReservation + get() = SpaceReservation.DEFAULT - constructor( + enum class SpaceReservation { + /** + * Don't reserve space, icon pushes text only when present + */ + DEFAULT, + + /** + * Space for icon is always reserved + */ + ICON_AND_TEXT, + + /** + * Consider only icon will be present, and align it according to [RenderGravity.CENTER_CENTER]. + * + * Having both icon and text will result in undefined behavior + */ + ICON_ONLY; + } + + protected open val disabledSprite: IGUIRenderable + get() = if (width >= 18f && height >= 18f) + Widgets18.BUTTON_DISABLED_STRETCHABLE + else if (width >= 15f && height >= 15f) + Widgets15.BUTTON_DISABLED_STRETCHABLE + else + Widgets8.BUTTON_DISABLED_STRETCHABLE + + protected open val pressedSprite: IGUIRenderable + get() = if (width >= 18f && height >= 18f) + Widgets18.BUTTON_PRESSED_STRETCHABLE + else if (width >= 15f && height >= 15f) + Widgets15.BUTTON_PRESSED_STRETCHABLE + else + Widgets8.BUTTON_PRESSED_STRETCHABLE + + protected open val hoveredSprite: IGUIRenderable + get() = if (width >= 18f && height >= 18f) + Widgets18.BUTTON_HOVERED_STRETCHABLE + else if (width >= 15f && height >= 15f) + Widgets15.BUTTON_HOVERED_STRETCHABLE + else + Widgets8.BUTTON_HOVERED_STRETCHABLE + + protected open val idleSprite: IGUIRenderable + get() = if (width >= 18f && height >= 18f) + Widgets18.BUTTON_IDLE_STRETCHABLE + else if (width >= 15f && height >= 15f) + Widgets15.BUTTON_IDLE_STRETCHABLE + else + Widgets8.BUTTON_IDLE_STRETCHABLE + + protected open fun renderBackground(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float) { + if (isDisabled) { + disabledSprite.render(graphics, canvasWidth = width, canvasHeight = height) + } else if (isPressed) { + pressedSprite.render(graphics, canvasWidth = width, canvasHeight = height) + } else if (isHovered) { + hoveredSprite.render(graphics, canvasWidth = width, canvasHeight = height) + } else { + idleSprite.render(graphics, canvasWidth = width, canvasHeight = height) + } + } + + override fun innerRender(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float) { + renderBackground(graphics, mouseX, mouseY, partialTick) + + val label = label + val icon = icon + + if (label != null) { + if (icon == null && iconSpaceReservation == SpaceReservation.DEFAULT) { + graphics.draw(label, width / 2f, height / 2f, color = labelColor, gravity = RenderGravity.CENTER_CENTER) + } else { + val lWidth = font.width(label).toFloat() + val min = min(width, height) + + if (width / 2f - lWidth / 2f >= min + 1f) { + // text to center + graphics.draw(label, width / 2f, height / 2f, color = labelColor, gravity = RenderGravity.CENTER_CENTER) + } else if (iconOnLeft) { + graphics.draw(label, min + 1f, height / 2f, color = labelColor, gravity = RenderGravity.CENTER_LEFT) + } else { + graphics.draw(label, 1f, height / 2f, color = labelColor, gravity = RenderGravity.CENTER_LEFT) + } + } + } + + if (icon != null) { + if (iconSpaceReservation != SpaceReservation.ICON_ONLY) { + val size = min(width, height) + + if (iconOnLeft) { + icon.render(graphics, 0f, 0f, size, size, winding = iconWinding) + } else { + icon.render(graphics, width - size, 0f, size, size, winding = iconWinding) + } + } else { + icon.render(graphics, 0f, 0f, width, height, winding = iconWinding) + } + } + } + + override fun sizeToContents(performLayout: Boolean) { + super.sizeToContents(performLayout) + + val label = label + + if (label != null) { + height = height.coerceAtLeast(HEIGHT).coerceAtLeast(font.lineHeight.toFloat() + 2f) + width = width.coerceAtLeast(HEIGHT).coerceAtLeast(font.width(label) + 4f) + } + } + + open class Simple( screen: S, parent: EditablePanel<*>?, x: Float = 0f, y: Float = 0f, width: Float = 40f, height: Float = HEIGHT, - label: Component, - onPress: Runnable - ) : this(screen, parent, x, y, width, height, label, onPress = IntConsumer { onPress.run() }) + override var label: Component?, + var onPress: IntConsumer? = null + ) : ButtonPanel(screen, parent, x, y, width, height) { + constructor(screen: S, parent: EditablePanel<*>?, label: Component, onPress: IntConsumer? = null) : this(screen, parent, x = 0f, label = label, onPress = onPress) - var textColor = RGBAColor.WHITE + constructor( + screen: S, + parent: EditablePanel<*>?, + x: Float = 0f, + y: Float = 0f, + width: Float = 40f, + height: Float = HEIGHT, + label: Component, + onPress: Runnable + ) : this(screen, parent, x, y, width, height, label, onPress = IntConsumer { onPress.run() }) - override fun onClick(mouseButton: Int) { - onPress?.accept(mouseButton) - } - - protected fun renderStretchableBackground(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float) { - if (isDisabled) { - Widgets18.BUTTON_DISABLED_STRETCHABLE.render(graphics, width = width, height = height) - } else if (isPressed) { - Widgets18.BUTTON_PRESSED_STRETCHABLE.render(graphics, width = width, height = height) - } else if (isHovered) { - Widgets18.BUTTON_HOVERED_STRETCHABLE.render(graphics, width = width, height = height) - } else { - Widgets18.BUTTON_IDLE_STRETCHABLE.render(graphics, width = width, height = height) + override fun onClick(mouseButton: Int) { + onPress?.accept(mouseButton) } - } - override fun innerRender(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float) { - renderStretchableBackground(graphics, mouseX, mouseY, partialTick) - graphics.draw(label, width / 2f, height / 2f, color = textColor, gravity = RenderGravity.CENTER_CENTER) - } - - override fun sizeToContents(performLayout: Boolean) { - super.sizeToContents(performLayout) - - height = height.coerceAtLeast(HEIGHT).coerceAtLeast(font.lineHeight.toFloat() + 2f) - width = width.coerceAtLeast(HEIGHT).coerceAtLeast(font.width(label) + 4f) + override var labelColor: RGBAColor = RGBAColor.WHITE + override var icon: IGUIRenderable? = null + override var iconOnLeft: Boolean = true + override var iconSpaceReservation = SpaceReservation.DEFAULT + override var iconWinding: UVWindingOrder = UVWindingOrder.NORMAL } companion object { const val HEIGHT = 18f + + fun square18( + screen: S, + parent: EditablePanel<*>?, + x: Float = 0f, + y: Float = 0f, + icon: IGUIRenderable? = null, + iconWinding: UVWindingOrder = UVWindingOrder.NORMAL, + onPress: IntConsumer? = null + ): Simple { + return Simple(screen, parent, x, y, 18f, 18f, null, onPress).also { + it.icon = icon + it.iconWinding = iconWinding + } + } + + fun square15( + screen: S, + parent: EditablePanel<*>?, + x: Float = 0f, + y: Float = 0f, + icon: IGUIRenderable? = null, + iconWinding: UVWindingOrder = UVWindingOrder.NORMAL, + onPress: IntConsumer? = null + ): Simple { + return Simple(screen, parent, x, y, 15f, 15f, null, onPress).also { + it.icon = icon + it.iconWinding = iconWinding + } + } + + fun square8( + screen: S, + parent: EditablePanel<*>?, + x: Float = 0f, + y: Float = 0f, + icon: IGUIRenderable? = null, + iconWinding: UVWindingOrder = UVWindingOrder.NORMAL, + onPress: IntConsumer? = null + ): Simple { + return Simple(screen, parent, x, y, 8f, 8f, null, onPress).also { + it.icon = icon + it.iconWinding = iconWinding + } + } + + fun square18( + screen: S, + parent: EditablePanel<*>?, + icon: IGUIRenderable? = null, + iconWinding: UVWindingOrder = UVWindingOrder.NORMAL, + onPress: IntConsumer? = null + ): Simple { + return Simple(screen, parent, 0f, 0f, 18f, 18f, null, onPress).also { + it.icon = icon + it.iconWinding = iconWinding + } + } + + fun square15( + screen: S, + parent: EditablePanel<*>?, + icon: IGUIRenderable? = null, + iconWinding: UVWindingOrder = UVWindingOrder.NORMAL, + onPress: IntConsumer? = null + ): Simple { + return Simple(screen, parent, 0f, 0f, 15f, 15f, null, onPress).also { + it.icon = icon + it.iconWinding = iconWinding + } + } + + fun square8( + screen: S, + parent: EditablePanel<*>?, + icon: IGUIRenderable? = null, + iconWinding: UVWindingOrder = UVWindingOrder.NORMAL, + onPress: IntConsumer? = null + ): Simple { + return Simple(screen, parent, 0f, 0f, 8f, 8f, null, onPress).also { + it.icon = icon + it.iconWinding = iconWinding + } + } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/Buttons.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/Buttons.kt index 1935cfd62..1ac4a9613 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/Buttons.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/Buttons.kt @@ -5,6 +5,7 @@ import net.minecraft.ChatFormatting import net.minecraft.network.chat.Component import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Items +import ru.dbotthepony.kommons.math.RGBAColor import ru.dbotthepony.kommons.util.Delegate import ru.dbotthepony.kommons.util.value import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity @@ -16,8 +17,10 @@ import ru.dbotthepony.mc.otm.client.render.MGUIGraphics import ru.dbotthepony.mc.otm.client.isCtrlDown import ru.dbotthepony.mc.otm.client.isShiftDown import ru.dbotthepony.mc.otm.client.minecraft +import ru.dbotthepony.mc.otm.client.render.IGUIRenderable import ru.dbotthepony.mc.otm.client.render.sprites.AbstractMatterySprite import ru.dbotthepony.mc.otm.client.render.ItemStackIcon +import ru.dbotthepony.mc.otm.client.render.UVWindingOrder import ru.dbotthepony.mc.otm.client.render.Widgets18 import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.panels.Dock @@ -40,6 +43,7 @@ import ru.dbotthepony.mc.otm.menu.input.EnergyConfigPlayerInput import ru.dbotthepony.mc.otm.menu.input.FluidConfigPlayerInput import ru.dbotthepony.mc.otm.menu.input.IPlayerInputWithFeedback import ru.dbotthepony.mc.otm.menu.input.ItemConfigPlayerInput +import java.util.function.IntConsumer import java.util.function.Predicate import kotlin.math.ceil import kotlin.math.pow @@ -55,11 +59,11 @@ private fun > makeRedstoneSettingButton( x: Float = 0f, y: Float = 0f, control: IPlayerInputWithFeedback -): LargeEnumRectangleButtonPanel { - return object : LargeEnumRectangleButtonPanel( +): EnumButtonPanel { + return object : EnumButtonPanel( screen, parent, x = x, y = y, defaultValue = RedstoneSetting.LOW, enum = RedstoneSetting::class.java, - prop = control, + prop = control, height = 18f, width = 18f, ) { override var isDisabled: Boolean get() = !control.test(minecraft.player!!) @@ -83,7 +87,7 @@ private class PullPushButton, T : Enum>( defaultValue: T, val pullProp: BooleanInputWithFeedback, val pushProp: BooleanInputWithFeedback -) : LargeEnumRectangleButtonPanel(screen, parent, x = x, y = y, enum = enum, prop = prop, defaultValue = defaultValue) { +) : EnumButtonPanel(screen, parent, x = x, y = y, enum = enum, prop = prop, width = 18f, height = 18f, defaultValue = defaultValue) { init { if (pullProp.test(minecraft.player!!)) { tooltips.add(TranslatableComponent("otm.gui.sides.pull_help").withStyle(ChatFormatting.GRAY)) @@ -121,11 +125,11 @@ private class PullPushButton, T : Enum>( } } -private fun > makeItemModeButton(screen: S, parent: FramePanel, input: ItemConfigPlayerInput.Piece, side: RelativeSide): LargeEnumRectangleButtonPanel { +private fun > makeItemModeButton(screen: S, parent: FramePanel, input: ItemConfigPlayerInput.Piece, side: RelativeSide): EnumButtonPanel { val button = PullPushButton(screen, parent, enum = MatteryDeviceBlockEntity.ItemHandlerMode::class.java, prop = input.input, defaultValue = input.default, pullProp = input.pull, pushProp = input.push) val widgets = Widgets18.CONTROLS[side]!! - for (v in MatteryDeviceBlockEntity.ItemHandlerMode.values()) { + for (v in MatteryDeviceBlockEntity.ItemHandlerMode.entries) { button.add(v, tooltip = TranslatableComponent(v.translationKey)) button.addSprite(false, false, v, widgets.items[v]!!) button.addSprite(true, false, v, widgets.itemsPull[v]!!) @@ -139,11 +143,11 @@ private fun > makeItemModeButton(screen: S, parent: FramePa return button } -private fun > makeEnergyModeButton(screen: S, parent: FramePanel, input: EnergyConfigPlayerInput.Piece, side: RelativeSide): LargeEnumRectangleButtonPanel { +private fun > makeEnergyModeButton(screen: S, parent: FramePanel, input: EnergyConfigPlayerInput.Piece, side: RelativeSide): EnumButtonPanel { val button = PullPushButton(screen, parent, enum = FlowDirection::class.java, prop = input.input, defaultValue = input.default, pullProp = input.pull, pushProp = input.push) val widgets = Widgets18.CONTROLS[side]!! - for (v in FlowDirection.values()) { + for (v in FlowDirection.entries) { button.add(v, tooltip = TranslatableComponent(v.translationKey)) button.addSprite(false, false, v, widgets.flow[v]!!) button.addSprite(true, false, v, widgets.flowPull[v]!!) @@ -162,11 +166,11 @@ private fun > makeEnergyModeButton(screen: S, parent: Frame return button } -private fun > makeFluidModeButton(screen: S, parent: FramePanel, input: FluidConfigPlayerInput.Piece, side: RelativeSide): LargeEnumRectangleButtonPanel { +private fun > makeFluidModeButton(screen: S, parent: FramePanel, input: FluidConfigPlayerInput.Piece, side: RelativeSide): EnumButtonPanel { val button = PullPushButton(screen, parent, enum = FlowDirection::class.java, prop = input.input, defaultValue = input.default, pullProp = input.pull, pushProp = input.push) val widgets = Widgets18.CONTROLS[side]!! - for (v in FlowDirection.values()) { + for (v in FlowDirection.entries) { button.add(v, tooltip = TranslatableComponent(v.translationKey)) button.addSprite(false, false, v, widgets.flow[v]!!) button.addSprite(true, false, v, widgets.flowPull[v]!!) @@ -311,12 +315,12 @@ class DeviceControls>( val balanceInputs: BooleanInputWithFeedback? = null, val upgrades: UpgradeSlots? = null, ) : EditablePanel(screen, parent, x = parent.width + 3f, height = 0f, width = 0f) { - val itemConfigButton: LargeRectangleButtonPanel? - val energyConfigButton: LargeRectangleButtonPanel? - val fluidConfigButton: LargeRectangleButtonPanel? - val redstoneControlsButton: LargeEnumRectangleButtonPanel? - val balanceInputsButton: LargeBooleanRectangleButtonPanel? - val upgradesButton: LargeRectangleButtonPanel? + val itemConfigButton: ButtonPanel? + val energyConfigButton: ButtonPanel? + val fluidConfigButton: ButtonPanel? + val redstoneControlsButton: EnumButtonPanel? + val balanceInputsButton: BooleanButtonPanel? + val upgradesButton: ButtonPanel? init { childrenOrder = -1000 @@ -374,7 +378,7 @@ class DeviceControls>( } fun addStorageMode(prop: Delegate) { - val mode = LargeEnumRectangleButtonPanel(screen, this, prop = prop, defaultValue = FlowDirection.BI_DIRECTIONAL, enum = FlowDirection::class.java) + val mode = EnumButtonPanel.square18(screen, this, prop = prop, defaultValue = FlowDirection.BI_DIRECTIONAL, enum = FlowDirection::class.java) mode.add(FlowDirection.INPUT, Widgets18.ONLY_STORE, FlowDirection.INPUT.title) mode.add(FlowDirection.OUTPUT, Widgets18.ONLY_EXTRACT, FlowDirection.OUTPUT.title) @@ -384,10 +388,10 @@ class DeviceControls>( addButton(mode) } - inline fun > sortingButtons(ascending: Delegate, sorting: Delegate, default: T, configurator: LargeEnumRectangleButtonPanel.() -> Unit): List> { + inline fun > sortingButtons(ascending: Delegate, sorting: Delegate, default: T, configurator: EnumButtonPanel.() -> Unit): List> { val result = ArrayList>() - LargeBooleanRectangleButtonPanel( + BooleanButtonPanel.square18( screen, this, prop = ascending, @@ -400,7 +404,7 @@ class DeviceControls>( result.add(it) } - LargeEnumRectangleButtonPanel(screen, this, enum = T::class.java, prop = sorting, defaultValue = default).also { + EnumButtonPanel.square18(screen, this, enum = T::class.java, prop = sorting, defaultValue = default).also { prependButton(it) configurator.invoke(it) it.finish() @@ -411,7 +415,7 @@ class DeviceControls>( } fun sortingButtons(input: MatteryMenu.SortInput, unfoldableSettings: Boolean = true) { - object : LargeRectangleButtonPanel(screen, this@DeviceControls) { + object : ButtonPanel(screen, this@DeviceControls, width = 18f, height = 18f) { var buttons: List>? = null init { @@ -421,9 +425,6 @@ class DeviceControls>( tooltips.add(TextComponent("")) tooltips.add(TranslatableComponent("otm.gui.sorting.sort_settings").withStyle(ChatFormatting.GRAY)) } - - icon = Widgets18.SORT_NOW - addButton(this) if (!unfoldableSettings) { @@ -431,6 +432,9 @@ class DeviceControls>( } } + override val icon: IGUIRenderable + get() = Widgets18.SORT_NOW + override fun test(value: Int): Boolean { return value == InputConstants.MOUSE_BUTTON_LEFT || unfoldableSettings && value == InputConstants.MOUSE_BUTTON_RIGHT } @@ -479,14 +483,16 @@ class DeviceControls>( } if (upgrades != null) { - upgradesButton = addButton(object : LargeRectangleButtonPanel( + upgradesButton = addButton(object : ButtonPanel( screen, this@DeviceControls, - icon = Widgets18.UPGRADES ) { init { tooltips.add(TranslatableComponent("otm.gui.upgrades")) } + override val icon: IGUIRenderable + get() = Widgets18.UPGRADES + override fun innerRenderTooltips(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float): Boolean { graphics.renderComponentTooltip(font, ArrayList().also { it.add(TranslatableComponent("otm.gui.upgrades")) @@ -559,7 +565,7 @@ class DeviceControls>( } if (balanceInputs != null) { - balanceInputsButton = addButton(LargeBooleanRectangleButtonPanel( + balanceInputsButton = addButton(BooleanButtonPanel.square18( screen, this, prop = balanceInputs, iconActive = Widgets18.BALANCING_ENABLED, @@ -571,12 +577,11 @@ class DeviceControls>( } if (itemConfig != null) { - itemConfigButton = addButton(object : LargeRectangleButtonPanel(screen, this@DeviceControls, icon = Widgets18.ITEMS_CONFIGURATION) { - init { - tooltips.add(TranslatableComponent("otm.gui.sides.item_config")) - } - - override fun onClick(mouseButton: Int) { + itemConfigButton = addButton(ButtonPanel.square18( + screen, + this@DeviceControls, + icon = Widgets18.ITEMS_CONFIGURATION, + onPress = IntConsumer { mouseButton -> if (mouseButton == InputConstants.MOUSE_BUTTON_LEFT) { val frame = makeItemHandlerControlPanel(screen, itemConfig) @@ -584,18 +589,19 @@ class DeviceControls>( frame.y = absoluteY + height + 8f } } + ).also { + tooltips.add(TranslatableComponent("otm.gui.sides.item_config")) }) } else { itemConfigButton = null } if (energyConfig != null) { - energyConfigButton = addButton(object : LargeRectangleButtonPanel(screen, this@DeviceControls, icon = Widgets18.ENERGY_CONFIGURATION) { - init { - tooltips.add(TranslatableComponent("otm.gui.sides.energy_config")) - } - - override fun onClick(mouseButton: Int) { + energyConfigButton = addButton(ButtonPanel.square18( + screen, + this@DeviceControls, + icon = Widgets18.ENERGY_CONFIGURATION, + onPress = IntConsumer { mouseButton -> if (mouseButton == InputConstants.MOUSE_BUTTON_LEFT) { val frame = makeEnergyConfigPanel(screen, energyConfig) @@ -603,18 +609,19 @@ class DeviceControls>( frame.y = absoluteY + height + 8f } } + ).also { + tooltips.add(TranslatableComponent("otm.gui.sides.energy_config")) }) } else { energyConfigButton = null } if (fluidConfig != null) { - fluidConfigButton = addButton(object : LargeRectangleButtonPanel(screen, this@DeviceControls, icon = Widgets18.FLUID_CONFIGURATION) { - init { - tooltips.add(TranslatableComponent("otm.gui.sides.fluid_config")) - } - - override fun onClick(mouseButton: Int) { + fluidConfigButton = addButton(ButtonPanel.square18( + screen, + this@DeviceControls, + icon = Widgets18.FLUID_CONFIGURATION, + onPress = IntConsumer { mouseButton -> if (mouseButton == InputConstants.MOUSE_BUTTON_LEFT) { val frame = makeFluidConfigPanel(screen, fluidConfig) @@ -622,6 +629,8 @@ class DeviceControls>( frame.y = absoluteY + height + 8f } } + ).also { + tooltips.add(TranslatableComponent("otm.gui.sides.fluid_config")) }) } else { fluidConfigButton = null diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/CheckBoxInputPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/CheckBoxInputPanel.kt deleted file mode 100644 index fe0559eb5..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/CheckBoxInputPanel.kt +++ /dev/null @@ -1,20 +0,0 @@ -package ru.dbotthepony.mc.otm.client.screen.panels.button - -import net.minecraft.client.gui.screens.Screen -import ru.dbotthepony.mc.otm.client.minecraft -import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel -import ru.dbotthepony.mc.otm.menu.input.IPlayerInputWithFeedback - -open class CheckBoxInputPanel( - screen: S, - parent: EditablePanel<*>?, - val widget: IPlayerInputWithFeedback, - x: Float = 0f, - y: Float = 0f, - width: Float = REGULAR_DIMENSIONS + 120f, - height: Float = REGULAR_DIMENSIONS -) : CheckBoxPanel(screen, parent, x, y, width, height, isChecked = widget) { - override var isDisabled: Boolean - get() = !widget.test(minecraft.player!!) - set(value) {} -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/CheckBoxLabelInputPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/CheckBoxLabelInputPanel.kt deleted file mode 100644 index ac46a9b5a..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/CheckBoxLabelInputPanel.kt +++ /dev/null @@ -1,24 +0,0 @@ -package ru.dbotthepony.mc.otm.client.screen.panels.button - -import net.minecraft.client.gui.screens.Screen -import net.minecraft.network.chat.Component -import ru.dbotthepony.mc.otm.client.screen.panels.Dock -import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel -import ru.dbotthepony.mc.otm.client.screen.panels.Label -import ru.dbotthepony.mc.otm.menu.input.BooleanInputWithFeedback -import ru.dbotthepony.mc.otm.menu.input.IPlayerInputWithFeedback -import kotlin.math.roundToInt - -open class CheckBoxLabelInputPanel( - screen: S, - parent: EditablePanel<*>?, - val widget: IPlayerInputWithFeedback, - text: Component, - x: Float = 0f, - y: Float = 0f, - width: Float = CheckBoxPanel.REGULAR_DIMENSIONS + 120f, - height: Float = CheckBoxPanel.REGULAR_DIMENSIONS -) : AbstractCheckBoxLabelPanel(screen, parent, x, y, width, height) { - override val checkbox = CheckBoxInputPanel(screen = screen, parent = this, widget = widget, x = 0f, y = 0f, width = CheckBoxPanel.REGULAR_DIMENSIONS, height = CheckBoxPanel.REGULAR_DIMENSIONS) - override val label = Label(screen, this, CheckBoxPanel.REGULAR_DIMENSIONS + 4f, 4f, text = text) -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/CheckBoxLabelPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/CheckBoxLabelPanel.kt deleted file mode 100644 index 394eac64d..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/CheckBoxLabelPanel.kt +++ /dev/null @@ -1,21 +0,0 @@ -package ru.dbotthepony.mc.otm.client.screen.panels.button - -import net.minecraft.client.gui.screens.Screen -import net.minecraft.network.chat.Component -import ru.dbotthepony.kommons.util.Delegate -import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel -import ru.dbotthepony.mc.otm.client.screen.panels.Label - -open class CheckBoxLabelPanel( - screen: S, - parent: EditablePanel<*>?, - text: Component, - x: Float = 0f, - y: Float = 0f, - width: Float = CheckBoxPanel.REGULAR_DIMENSIONS + 120f, - height: Float = CheckBoxPanel.REGULAR_DIMENSIONS, - isChecked: Delegate = Delegate.Box(false) -) : AbstractCheckBoxLabelPanel(screen, parent, x, y, width, height) { - override val checkbox = CheckBoxPanel(screen, this, 0f, 0f, isChecked = isChecked) - override val label = Label(screen, this, CheckBoxPanel.REGULAR_DIMENSIONS + 4f, 4f, text = text) -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/CheckBoxPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/CheckBoxPanel.kt deleted file mode 100644 index 694d24aa3..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/CheckBoxPanel.kt +++ /dev/null @@ -1,92 +0,0 @@ -package ru.dbotthepony.mc.otm.client.screen.panels.button - -import net.minecraft.client.gui.screens.Screen -import ru.dbotthepony.kommons.util.Delegate -import ru.dbotthepony.mc.otm.client.render.MGUIGraphics -import ru.dbotthepony.mc.otm.client.render.sprites.AbstractMatterySprite -import ru.dbotthepony.mc.otm.client.render.WidgetLocation -import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel - -open class CheckBoxPanel( - screen: S, - parent: EditablePanel<*>?, - x: Float = 0f, - y: Float = 0f, - width: Float = REGULAR_DIMENSIONS, - height: Float = REGULAR_DIMENSIONS, - open val isChecked: Delegate = Delegate.Box(false) -) : AbstractButtonPanel(screen, parent, x, y, width, height) { - open val IDLE_UNCHECKED: AbstractMatterySprite get() = Companion.IDLE_UNCHECKED - open val IDLE_CHECKED: AbstractMatterySprite get() = Companion.IDLE_CHECKED - open val HOVERED_UNCHECKED: AbstractMatterySprite get() = Companion.HOVERED_UNCHECKED - open val HOVERED_CHECKED: AbstractMatterySprite get() = Companion.HOVERED_CHECKED - open val PRESSED_UNCHECKED: AbstractMatterySprite get() = Companion.PRESSED_UNCHECKED - open val PRESSED_CHECKED: AbstractMatterySprite get() = Companion.PRESSED_CHECKED - open val DISABLED_UNCHECKED: AbstractMatterySprite get() = Companion.DISABLED_UNCHECKED - open val DISABLED_CHECKED: AbstractMatterySprite get() = Companion.DISABLED_CHECKED - - protected fun renderCheckboxBackground(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float) { - if (isDisabled) { - if (isChecked.get()) { - DISABLED_CHECKED.render(graphics, canvasWidth = width, canvasHeight = height) - } else { - DISABLED_UNCHECKED.render(graphics, canvasWidth = width, canvasHeight = height) - } - } else { - if (isPressed) { - if (isChecked.get()) { - PRESSED_CHECKED.render(graphics, canvasWidth = width, canvasHeight = height) - } else { - PRESSED_UNCHECKED.render(graphics, canvasWidth = width, canvasHeight = height) - } - } else if (isHovered) { - if (isChecked.get()) { - HOVERED_CHECKED.render(graphics, canvasWidth = width, canvasHeight = height) - } else { - HOVERED_UNCHECKED.render(graphics, canvasWidth = width, canvasHeight = height) - } - } else { - if (isChecked.get()) { - IDLE_CHECKED.render(graphics, canvasWidth = width, canvasHeight = height) - } else { - IDLE_UNCHECKED.render(graphics, canvasWidth = width, canvasHeight = height) - } - } - } - } - - override fun innerRender(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float) { - renderCheckboxBackground(graphics, mouseX, mouseY, partialTick) - } - - override fun onClick(mouseButton: Int) { - isChecked.accept(!isChecked.get()) - } - - companion object { - const val REGULAR_DIMENSIONS = 15f - - val IDLE_UNCHECKED: AbstractMatterySprite - val IDLE_CHECKED: AbstractMatterySprite - val HOVERED_UNCHECKED: AbstractMatterySprite - val HOVERED_CHECKED: AbstractMatterySprite - val PRESSED_UNCHECKED: AbstractMatterySprite - val PRESSED_CHECKED: AbstractMatterySprite - val DISABLED_UNCHECKED: AbstractMatterySprite - val DISABLED_CHECKED: AbstractMatterySprite - - init { - val grid = WidgetLocation.CHECKBOX.grid(columns = 2, rows = 4) - - IDLE_CHECKED = grid.next() - IDLE_UNCHECKED = grid.next() - HOVERED_CHECKED = grid.next() - HOVERED_UNCHECKED = grid.next() - PRESSED_CHECKED = grid.next() - PRESSED_UNCHECKED = grid.next() - DISABLED_CHECKED = grid.next() - DISABLED_UNCHECKED = grid.next() - } - } -} - diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/EnumRectangleButtonPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/EnumButtonPanel.kt similarity index 62% rename from src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/EnumRectangleButtonPanel.kt rename to src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/EnumButtonPanel.kt index 9cc623ea4..65c667ba8 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/EnumRectangleButtonPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/EnumButtonPanel.kt @@ -4,6 +4,7 @@ import com.mojang.blaze3d.platform.InputConstants import net.minecraft.ChatFormatting import net.minecraft.client.gui.screens.Screen import net.minecraft.network.chat.Component +import ru.dbotthepony.kommons.math.RGBAColor import ru.dbotthepony.kommons.util.Delegate import ru.dbotthepony.kommons.util.value import ru.dbotthepony.mc.otm.client.render.MGUIGraphics @@ -18,7 +19,7 @@ import java.util.* import java.util.function.Predicate import kotlin.collections.ArrayList -abstract class EnumRectangleButtonPanel>( +open class EnumButtonPanel>( screen: S, parent: EditablePanel<*>?, x: Float = 0f, @@ -28,7 +29,7 @@ abstract class EnumRectangleButtonPanel>( enum: Class, val prop: Delegate, val defaultValue: T, -) : RectangleButtonPanel(screen, parent, x, y, width, height, null) { +) : ButtonPanel(screen, parent, x, y, width, height) { val enum = MatteryStreamCodec.Enum.searchClass(enum) private val constants: Array = enum.enumConstants private var isBuilding = true @@ -44,27 +45,48 @@ abstract class EnumRectangleButtonPanel>( } set(value) { super.isDisabled = value } + override val labelColor: RGBAColor + get() = RGBAColor.WHITE + override val label: Component? + get() = enumMapping[prop.get()]?.label + override val icon: IGUIRenderable? + get() = if (isDisabled) enumMapping[prop.get()]?.skinElementDisabled else enumMapping[prop.get()]?.skinElement + override var iconOnLeft: Boolean = true + override val iconSpaceReservation: SpaceReservation + get() = if (enumMapping.values.any { it.skinElement != null }) SpaceReservation.ICON_AND_TEXT else SpaceReservation.DEFAULT + override val iconWinding: UVWindingOrder + get() = enumMapping[prop.get()]?.winding ?: UVWindingOrder.NORMAL + data class Entry>( val key: T, val skinElement: IGUIRenderable?, + val skinElementDisabled: IGUIRenderable? = skinElement, val winding: UVWindingOrder = UVWindingOrder.NORMAL, - val tooltip: Component? = null + val tooltip: Component? = null, + val label: Component? = null, ) protected val enumMapping = EnumMap>(enum) - fun add(key: T, skinElement: IGUIRenderable? = null, tooltip: Component? = null, winding: UVWindingOrder = UVWindingOrder.NORMAL): EnumRectangleButtonPanel { - return add(Entry(key = key, skinElement = skinElement, winding = winding, tooltip = tooltip)) + fun add( + key: T, + skinElement: IGUIRenderable? = null, + tooltip: Component? = null, + label: Component? = null, + skinElementDisabled: IGUIRenderable? = skinElement, + winding: UVWindingOrder = UVWindingOrder.NORMAL + ): EnumButtonPanel { + return add(Entry(key = key, skinElement = skinElement, winding = winding, tooltip = tooltip, label = label, skinElementDisabled = skinElementDisabled)) } - fun add(entry: Entry): EnumRectangleButtonPanel { + fun add(entry: Entry): EnumButtonPanel { check(isBuilding) { "Not building" } check(enumMapping.put(entry.key, entry) == null) { "Already has mapping for ${entry.key}" } if (enumMapping.size == enum.enumConstants.size) finish() return this } - fun finish(): EnumRectangleButtonPanel { + fun finish(): EnumButtonPanel { if (!isBuilding) return this check(enumMapping.isNotEmpty()) { "No enums were defined, like, at all." } check(enumMapping.containsKey(defaultValue)) { "Default value $defaultValue is missing from mapping" } @@ -75,8 +97,6 @@ abstract class EnumRectangleButtonPanel>( override fun innerRender(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float) { check(!isBuilding) { "Still building this button!" } super.innerRender(graphics, mouseX, mouseY, partialTick) - val entry = enumMapping[prop.get()] ?: return - entry.skinElement?.render(graphics, 0f, 0f, width, height, entry.winding) } override fun mouseClickedInner(x: Double, y: Double, button: Int): Boolean { @@ -172,5 +192,71 @@ abstract class EnumRectangleButtonPanel>( companion object { private val SPACE = TextComponent("") + + fun > square18( + screen: S, + parent: EditablePanel<*>?, + x: Float = 0f, + y: Float = 0f, + enum: Class, + prop: Delegate, + defaultValue: T, + ): EnumButtonPanel { + return EnumButtonPanel(screen, parent, x, y, 18f, 18f, enum, prop, defaultValue) + } + + fun > square15( + screen: S, + parent: EditablePanel<*>?, + x: Float = 0f, + y: Float = 0f, + enum: Class, + prop: Delegate, + defaultValue: T, + ): EnumButtonPanel { + return EnumButtonPanel(screen, parent, x, y, 15f, 15f, enum, prop, defaultValue) + } + + fun > square8( + screen: S, + parent: EditablePanel<*>?, + x: Float = 0f, + y: Float = 0f, + enum: Class, + prop: Delegate, + defaultValue: T, + ): EnumButtonPanel { + return EnumButtonPanel(screen, parent, x, y, 8f, 8f, enum, prop, defaultValue) + } + + fun > square18( + screen: S, + parent: EditablePanel<*>?, + enum: Class, + prop: Delegate, + defaultValue: T, + ): EnumButtonPanel { + return EnumButtonPanel(screen, parent, 0f, 0f, 18f, 18f, enum, prop, defaultValue) + } + + fun > square15( + screen: S, + parent: EditablePanel<*>?, + enum: Class, + prop: Delegate, + defaultValue: T, + ): EnumButtonPanel { + return EnumButtonPanel(screen, parent, 0f, 0f, 15f, 15f, enum, prop, defaultValue) + } + + fun > square8( + screen: S, + parent: EditablePanel<*>?, + enum: Class, + prop: Delegate, + defaultValue: T, + ): EnumButtonPanel { + return EnumButtonPanel(screen, parent, 0f, 0f, 8f, 8f, enum, prop, defaultValue) + } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/LargeBooleanRectangleButtonPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/LargeBooleanRectangleButtonPanel.kt deleted file mode 100644 index 86328b2ed..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/LargeBooleanRectangleButtonPanel.kt +++ /dev/null @@ -1,32 +0,0 @@ -package ru.dbotthepony.mc.otm.client.screen.panels.button - -import net.minecraft.client.gui.screens.Screen -import net.minecraft.network.chat.Component -import ru.dbotthepony.kommons.util.Delegate -import ru.dbotthepony.mc.otm.client.render.IGUIRenderable -import ru.dbotthepony.mc.otm.client.render.Widgets18 -import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel - -open class LargeBooleanRectangleButtonPanel( - screen: S, - parent: EditablePanel<*>?, - x: Float = 0f, - y: Float = 0f, - width: Float = SIZE, - height: Float = SIZE, - prop: Delegate, - iconActive: IGUIRenderable? = null, - iconInactive: IGUIRenderable? = null, - onChange: ((newValue: Boolean) -> Unit)? = null, - tooltipActive: Component? = null, - tooltipInactive: Component? = null, -) : BooleanRectangleButtonPanel(screen, parent, x, y, width, height, prop, iconActive, iconInactive, onChange, tooltipActive, tooltipInactive) { - final override val IDLE = Widgets18.BUTTON_IDLE - final override val HOVERED = Widgets18.BUTTON_HOVERED - final override val PRESSED = Widgets18.BUTTON_PRESSED - final override val DISABLED = Widgets18.BUTTON_DISABLED - - companion object { - const val SIZE = 18f - } -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/LargeEnumRectangleButtonPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/LargeEnumRectangleButtonPanel.kt deleted file mode 100644 index e11063e92..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/LargeEnumRectangleButtonPanel.kt +++ /dev/null @@ -1,27 +0,0 @@ -package ru.dbotthepony.mc.otm.client.screen.panels.button - -import net.minecraft.client.gui.screens.Screen -import ru.dbotthepony.kommons.util.Delegate -import ru.dbotthepony.mc.otm.client.render.Widgets18 -import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel - -open class LargeEnumRectangleButtonPanel>( - screen: S, - parent: EditablePanel<*>?, - x: Float = 0f, - y: Float = 0f, - width: Float = SIZE, - height: Float = SIZE, - enum: Class, - prop: Delegate, - defaultValue: T, -) : EnumRectangleButtonPanel(screen, parent, x, y, width, height, enum, prop, defaultValue) { - final override val IDLE = Widgets18.BUTTON_IDLE - final override val HOVERED = Widgets18.BUTTON_HOVERED - final override val PRESSED = Widgets18.BUTTON_PRESSED - final override val DISABLED = Widgets18.BUTTON_DISABLED - - companion object { - const val SIZE = 18f - } -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/LargeRectangleButtonPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/LargeRectangleButtonPanel.kt deleted file mode 100644 index c0953ef4b..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/LargeRectangleButtonPanel.kt +++ /dev/null @@ -1,65 +0,0 @@ -package ru.dbotthepony.mc.otm.client.screen.panels.button - -import net.minecraft.client.gui.screens.Screen -import ru.dbotthepony.mc.otm.client.render.MGUIGraphics -import ru.dbotthepony.mc.otm.client.minecraft -import ru.dbotthepony.mc.otm.client.render.IGUIRenderable -import ru.dbotthepony.mc.otm.client.render.UVWindingOrder -import ru.dbotthepony.mc.otm.client.render.Widgets18 -import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel -import ru.dbotthepony.kommons.math.RGBAColor -import ru.dbotthepony.mc.otm.menu.MatteryMenu - -open class LargeRectangleButtonPanel( - screen: S, - parent: EditablePanel<*>?, - x: Float = 0f, - y: Float = 0f, - width: Float = SIZE, - height: Float = SIZE, - onPress: ((clickButton: Int) -> Unit)? = null, - var icon: IGUIRenderable? = null, - var iconWinding: UVWindingOrder? = null, -) : RectangleButtonPanel(screen, parent, x, y, width, height, onPress) { - final override val IDLE = Widgets18.BUTTON_IDLE - final override val HOVERED = Widgets18.BUTTON_HOVERED - final override val PRESSED = Widgets18.BUTTON_PRESSED - final override val DISABLED = Widgets18.BUTTON_DISABLED - - override fun innerRender(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float) { - super.innerRender(graphics, mouseX, mouseY, partialTick) - - val color = if (isDisabled || isPressed) RGBAColor.DARK_GRAY else RGBAColor.WHITE - if (iconWinding != null) { - icon?.render(graphics, canvasWidth = width, canvasHeight = height, winding = iconWinding!!, color = color) - } else { - icon?.render(graphics, canvasWidth = width, canvasHeight = height, color = color) - } - } - - companion object { - const val SIZE = 18f - - fun input( - screen: S, - parent: EditablePanel<*>?, - input: MatteryMenu.PlayerInput, - x: Float = 0f, - y: Float = 0f, - width: Float = SIZE, - height: Float = SIZE, - icon: IGUIRenderable? = null, - iconWinding: UVWindingOrder? = null, - ): LargeRectangleButtonPanel { - return object : LargeRectangleButtonPanel(screen, parent, x, y, width, height, null, icon, iconWinding) { - override fun onClick(mouseButton: Int) { - input.accept(null) - } - - override var isDisabled: Boolean - get() { return !input.test(minecraft.player ?: return false) } - set(value) {} - } - } - } -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/RectangleButtonPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/RectangleButtonPanel.kt deleted file mode 100644 index 3f862a190..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/RectangleButtonPanel.kt +++ /dev/null @@ -1,43 +0,0 @@ -package ru.dbotthepony.mc.otm.client.screen.panels.button - -import net.minecraft.client.gui.screens.Screen -import ru.dbotthepony.mc.otm.client.render.MGUIGraphics -import ru.dbotthepony.mc.otm.client.render.IGUIRenderable -import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel -import java.util.function.IntConsumer - -@Suppress("PropertyName") -abstract class RectangleButtonPanel( - screen: S, - parent: EditablePanel<*>?, - x: Float = 0f, - y: Float = 0f, - width: Float, - height: Float, - var onPress: IntConsumer? = null, -) : AbstractButtonPanel(screen, parent, x, y, width, height) { - abstract val PRESSED: IGUIRenderable - abstract val HOVERED: IGUIRenderable - abstract val IDLE: IGUIRenderable - abstract val DISABLED: IGUIRenderable - - override fun onClick(mouseButton: Int) { - onPress?.accept(mouseButton) - } - - protected fun renderSquareButton(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float) { - if (isDisabled) { - DISABLED.render(graphics, 0f, 0f, width, height) - } else if (isPressed) { - PRESSED.render(graphics, 0f, 0f, width, height) - } else if (isHovered) { - HOVERED.render(graphics, 0f, 0f, width, height) - } else { - IDLE.render(graphics, 0f, 0f, width, height) - } - } - - override fun innerRender(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float) { - renderSquareButton(graphics, mouseX, mouseY, partialTick) - } -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/SmallBooleanRectangleButtonPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/SmallBooleanRectangleButtonPanel.kt deleted file mode 100644 index 090a95144..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/SmallBooleanRectangleButtonPanel.kt +++ /dev/null @@ -1,29 +0,0 @@ -package ru.dbotthepony.mc.otm.client.screen.panels.button - -import net.minecraft.client.gui.screens.Screen -import ru.dbotthepony.kommons.util.Delegate -import ru.dbotthepony.mc.otm.client.render.* -import ru.dbotthepony.mc.otm.client.render.sprites.AbstractMatterySprite -import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel - -open class SmallBooleanRectangleButtonPanel( - screen: S, - parent: EditablePanel<*>?, - x: Float = 0f, - y: Float = 0f, - width: Float = SIZE, - height: Float = SIZE, - prop: Delegate, - skinElementActive: AbstractMatterySprite? = null, - skinElementInactive: AbstractMatterySprite? = null, - onChange: ((newValue: Boolean) -> Unit)? = null, -) : BooleanRectangleButtonPanel(screen, parent, x, y, width, height, prop, skinElementActive, skinElementInactive, onChange) { - final override val IDLE = Widgets8.BUTTON_IDLE - final override val HOVERED = Widgets8.BUTTON_HOVERED - final override val PRESSED = Widgets8.BUTTON_PRESSED - final override val DISABLED = Widgets8.BUTTON_DISABLED - - companion object { - const val SIZE = 8f - } -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/SmallEnumRectangleButtonPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/SmallEnumRectangleButtonPanel.kt deleted file mode 100644 index 2dd0383ff..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/SmallEnumRectangleButtonPanel.kt +++ /dev/null @@ -1,27 +0,0 @@ -package ru.dbotthepony.mc.otm.client.screen.panels.button - -import net.minecraft.client.gui.screens.Screen -import ru.dbotthepony.kommons.util.Delegate -import ru.dbotthepony.mc.otm.client.render.Widgets8 -import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel - -open class SmallEnumRectangleButtonPanel>( - screen: S, - parent: EditablePanel<*>?, - x: Float = 0f, - y: Float = 0f, - width: Float = SIZE, - height: Float = SIZE, - enum: Class, - prop: Delegate, - defaultValue: T, -) : EnumRectangleButtonPanel(screen, parent, x, y, width, height, enum, prop, defaultValue) { - final override val IDLE = Widgets8.BUTTON_IDLE - final override val HOVERED = Widgets8.BUTTON_HOVERED - final override val PRESSED = Widgets8.BUTTON_PRESSED - final override val DISABLED = Widgets8.BUTTON_DISABLED - - companion object { - const val SIZE = 8f - } -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/SmallRectangleButtonPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/SmallRectangleButtonPanel.kt deleted file mode 100644 index 7e9b5341e..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/SmallRectangleButtonPanel.kt +++ /dev/null @@ -1,39 +0,0 @@ -package ru.dbotthepony.mc.otm.client.screen.panels.button - -import net.minecraft.client.gui.screens.Screen -import ru.dbotthepony.mc.otm.client.render.MGUIGraphics -import ru.dbotthepony.mc.otm.client.render.sprites.MatterySprite -import ru.dbotthepony.mc.otm.client.render.UVWindingOrder -import ru.dbotthepony.mc.otm.client.render.Widgets8 -import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel - -open class SmallRectangleButtonPanel( - screen: S, - parent: EditablePanel<*>?, - x: Float = 0f, - y: Float = 0f, - width: Float = SIZE, - height: Float = SIZE, - onPress: ((clickButton: Int) -> Unit)? = null, - val skinElement: MatterySprite? = null, - val skinElementWinding: UVWindingOrder? = null, -) : RectangleButtonPanel(screen, parent, x, y, width, height, onPress) { - final override val IDLE = Widgets8.BUTTON_IDLE - final override val HOVERED = Widgets8.BUTTON_HOVERED - final override val PRESSED = Widgets8.BUTTON_PRESSED - final override val DISABLED = Widgets8.BUTTON_DISABLED - - override fun innerRender(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float) { - super.innerRender(graphics, mouseX, mouseY, partialTick) - - if (skinElementWinding != null) { - skinElement?.render(graphics, canvasWidth = width, canvasHeight = height, winding = skinElementWinding) - } else { - skinElement?.render(graphics, canvasWidth = width, canvasHeight = height) - } - } - - companion object { - const val SIZE = 8f - } -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/input/NumberInputPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/input/NumberInputPanel.kt index d2750c805..2ac442cb7 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/input/NumberInputPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/input/NumberInputPanel.kt @@ -6,7 +6,7 @@ import ru.dbotthepony.kommons.util.Delegate import ru.dbotthepony.mc.otm.client.render.Widgets import ru.dbotthepony.mc.otm.client.screen.panels.Dock import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel -import ru.dbotthepony.mc.otm.client.screen.panels.button.RectangleButtonPanel +import ru.dbotthepony.mc.otm.client.screen.panels.button.ButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.util.HeightControls import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.math.Decimal @@ -85,11 +85,11 @@ abstract class NumberInputPanel( controls.dock = Dock.RIGHT } - inner class Control(val isIncrease: Boolean) : RectangleButtonPanel(screen, controls, width = HeightControls.BUTTON_WIDTH, height = HeightControls.BUTTON_HEIGHT) { - override val PRESSED = if (!isIncrease) Widgets.ARROW_DOWN_BUTTON_PRESSED else Widgets.ARROW_UP_BUTTON_PRESSED - override val HOVERED = if (!isIncrease) Widgets.ARROW_DOWN_BUTTON_HOVERED else Widgets.ARROW_UP_BUTTON_HOVERED - override val IDLE = if (!isIncrease) Widgets.ARROW_DOWN_BUTTON_IDLE else Widgets.ARROW_UP_BUTTON_IDLE - override val DISABLED = if (!isIncrease) Widgets.ARROW_DOWN_BUTTON_DISABLED else Widgets.ARROW_UP_BUTTON_DISABLED + inner class Control(val isIncrease: Boolean) : ButtonPanel(screen, controls, width = HeightControls.BUTTON_WIDTH, height = HeightControls.BUTTON_HEIGHT) { + override val pressedSprite get() = if (!isIncrease) Widgets.ARROW_DOWN_BUTTON_PRESSED else Widgets.ARROW_UP_BUTTON_PRESSED + override val hoveredSprite get() = if (!isIncrease) Widgets.ARROW_DOWN_BUTTON_HOVERED else Widgets.ARROW_UP_BUTTON_HOVERED + override val idleSprite get() = if (!isIncrease) Widgets.ARROW_DOWN_BUTTON_IDLE else Widgets.ARROW_UP_BUTTON_IDLE + override val disabledSprite get() = if (!isIncrease) Widgets.ARROW_DOWN_BUTTON_DISABLED else Widgets.ARROW_UP_BUTTON_DISABLED init { dock = Dock.TOP diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/input/QueryUserPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/input/QueryUserPanel.kt index b36deebb1..b21826fc4 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/input/QueryUserPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/input/QueryUserPanel.kt @@ -45,13 +45,13 @@ open class QueryUserPanel( this.height = height + bottom.height + PADDING + PADDING_TOP + 4f - ButtonPanel(screen, bottom, width = font.width(TranslatableComponent("otm.gui.cancel")) + 12f, label = TranslatableComponent("otm.gui.cancel"), onPress = Runnable { + ButtonPanel.Simple(screen, bottom, width = font.width(TranslatableComponent("otm.gui.cancel")) + 12f, label = TranslatableComponent("otm.gui.cancel"), onPress = Runnable { onCancel?.run() this.remove() }).dock = Dock.RIGHT if (onConfirm != null) { - ButtonPanel(screen, bottom, width = font.width(TranslatableComponent("otm.gui.confirm")) + 12f, label = TranslatableComponent("otm.gui.confirm"), onPress = Runnable { + ButtonPanel.Simple(screen, bottom, width = font.width(TranslatableComponent("otm.gui.confirm")) + 12f, label = TranslatableComponent("otm.gui.confirm"), onPress = Runnable { onConfirm.run() this.remove() }).also { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/util/BackgroundPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/util/BackgroundPanel.kt index 5a6955b6f..1086cf02b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/util/BackgroundPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/util/BackgroundPanel.kt @@ -23,7 +23,7 @@ open class BackgroundPanel( override fun innerRender(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float) { if (drawBackground) { - RECTANGLE.render(graphics, width = width, height = height) + RECTANGLE.render(graphics, canvasWidth = width, canvasHeight = height) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/util/HeightControls.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/util/HeightControls.kt index 653bfe9f5..ec5b8f683 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/util/HeightControls.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/util/HeightControls.kt @@ -6,7 +6,7 @@ import ru.dbotthepony.mc.otm.client.render.sprites.AbstractMatterySprite import ru.dbotthepony.mc.otm.client.render.Widgets import ru.dbotthepony.mc.otm.client.screen.panels.Dock import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel -import ru.dbotthepony.mc.otm.client.screen.panels.button.RectangleButtonPanel +import ru.dbotthepony.mc.otm.client.screen.panels.button.ButtonPanel open class HeightControls( screen: S, @@ -46,11 +46,11 @@ open class HeightControls( decrease.isDisabled = !value.canDecrease } - inner class Control(val isIncrease: Boolean) : RectangleButtonPanel(screen, this@HeightControls, width = BUTTON_WIDTH, height = BUTTON_HEIGHT) { - override val PRESSED: AbstractMatterySprite = if (isIncrease) Widgets.ARROW_DOWN_BUTTON_PRESSED else Widgets.ARROW_UP_BUTTON_PRESSED - override val HOVERED: AbstractMatterySprite = if (isIncrease) Widgets.ARROW_DOWN_BUTTON_HOVERED else Widgets.ARROW_UP_BUTTON_HOVERED - override val IDLE: AbstractMatterySprite = if (isIncrease) Widgets.ARROW_DOWN_BUTTON_IDLE else Widgets.ARROW_UP_BUTTON_IDLE - override val DISABLED: AbstractMatterySprite = if (isIncrease) Widgets.ARROW_DOWN_BUTTON_DISABLED else Widgets.ARROW_UP_BUTTON_DISABLED + inner class Control(val isIncrease: Boolean) : ButtonPanel(screen, this@HeightControls, width = BUTTON_WIDTH, height = BUTTON_HEIGHT) { + override val pressedSprite get() = if (isIncrease) Widgets.ARROW_DOWN_BUTTON_PRESSED else Widgets.ARROW_UP_BUTTON_PRESSED + override val hoveredSprite get() = if (isIncrease) Widgets.ARROW_DOWN_BUTTON_HOVERED else Widgets.ARROW_UP_BUTTON_HOVERED + override val idleSprite get() = if (isIncrease) Widgets.ARROW_DOWN_BUTTON_IDLE else Widgets.ARROW_UP_BUTTON_IDLE + override val disabledSprite get() = if (isIncrease) Widgets.ARROW_DOWN_BUTTON_DISABLED else Widgets.ARROW_UP_BUTTON_DISABLED init { dock = Dock.TOP diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/DriveRackScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/DriveRackScreen.kt index a153f8e41..a47d52d35 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/DriveRackScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/DriveRackScreen.kt @@ -11,7 +11,6 @@ import ru.dbotthepony.mc.otm.client.screen.panels.DockProperty import ru.dbotthepony.mc.otm.client.screen.panels.slot.BatterySlotPanel import ru.dbotthepony.mc.otm.client.screen.panels.FramePanel import ru.dbotthepony.mc.otm.client.screen.panels.button.DeviceControls -import ru.dbotthepony.mc.otm.client.screen.panels.button.LargeEnumRectangleButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.input.IntInputPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.SlotPanel diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/DriveViewerScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/DriveViewerScreen.kt index 636b45724..d37c8e84b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/DriveViewerScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/DriveViewerScreen.kt @@ -9,7 +9,7 @@ import ru.dbotthepony.mc.otm.client.render.ItemStackIcon import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.screen.panels.* -import ru.dbotthepony.mc.otm.client.screen.panels.button.CheckBoxLabelInputPanel +import ru.dbotthepony.mc.otm.client.screen.panels.button.BooleanButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.button.DeviceControls import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.BatterySlotPanel @@ -71,9 +71,9 @@ class DriveViewerScreen(menu: DriveViewerMenu, inventory: Inventory, title: Comp settings.add(EditablePanel(this, frame, width = 90f).also { it.dock = Dock.LEFT - CheckBoxLabelInputPanel(this, it, menu.isWhitelist, TranslatableComponent("otm.gui.filter.is_whitelist")).also { it.dockTop = 20f; it.dock = Dock.TOP } - CheckBoxLabelInputPanel(this, it, menu.matchTag, TranslatableComponent("otm.gui.filter.match_tag")).also { it.dockTop = 4f; it.dock = Dock.TOP } - CheckBoxLabelInputPanel(this, it, menu.matchComponents, TranslatableComponent("otm.gui.filter.match_nbt")).also { it.dockTop = 4f; it.dock = Dock.TOP } + BooleanButtonPanel.Checkbox(this, it, menu.isWhitelist, TranslatableComponent("otm.gui.filter.is_whitelist")).also { it.dockTop = 20f; it.dock = Dock.TOP } + BooleanButtonPanel.Checkbox(this, it, menu.matchTag, TranslatableComponent("otm.gui.filter.match_tag")).also { it.dockTop = 4f; it.dock = Dock.TOP } + BooleanButtonPanel.Checkbox(this, it, menu.matchComponents, TranslatableComponent("otm.gui.filter.match_nbt")).also { it.dockTop = 4f; it.dock = Dock.TOP } }) frame.CustomTab(view, activeIcon = ItemStackIcon(ItemStack(MItems.PORTABLE_CONDENSATION_DRIVE))) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/ItemMonitorScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/ItemMonitorScreen.kt index 163f913d0..29ab44e11 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/ItemMonitorScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/ItemMonitorScreen.kt @@ -14,7 +14,7 @@ import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel import ru.dbotthepony.mc.otm.client.screen.panels.FramePanel import ru.dbotthepony.mc.otm.client.screen.panels.NetworkedItemGridPanel import ru.dbotthepony.mc.otm.client.screen.panels.button.DeviceControls -import ru.dbotthepony.mc.otm.client.screen.panels.button.SmallEnumRectangleButtonPanel +import ru.dbotthepony.mc.otm.client.screen.panels.button.EnumButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.BatterySlotPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.SlotPanel @@ -81,7 +81,7 @@ class ItemMonitorScreen(menu: ItemMonitorMenu, inventory: Inventory, title: Comp val arrowLine = EditablePanel(this, arrowAndButtons, y = 38f, height = 8f, width = arrowAndButtons.width) - SmallEnumRectangleButtonPanel(this, arrowLine, + EnumButtonPanel.square8(this, arrowLine, enum = ItemMonitorPlayerSettings.IngredientPriority::class.java, prop = Delegate.Of(menu.settings::ingredientPriority), defaultValue = ItemMonitorPlayerSettings.IngredientPriority.SYSTEM) @@ -89,7 +89,7 @@ class ItemMonitorScreen(menu: ItemMonitorMenu, inventory: Inventory, title: Comp it.tooltips.add(TranslatableComponent("otm.gui.item_monitor.refill_source.desc")) for (setting in ItemMonitorPlayerSettings.IngredientPriority.entries) { - it.add(setting, setting.icon, setting.component, setting.winding) + it.add(setting, skinElement = setting.icon, tooltip = setting.component, winding = setting.winding) } it.dock = Dock.LEFT @@ -102,7 +102,7 @@ class ItemMonitorScreen(menu: ItemMonitorMenu, inventory: Inventory, title: Comp SlotPanel(this, resultAndButtons, menu.craftingResult, y = 18f) - SmallEnumRectangleButtonPanel(this, resultAndButtons, y = 38f, + EnumButtonPanel.square8(this, resultAndButtons, y = 38f, enum = ItemMonitorPlayerSettings.ResultTarget::class.java, prop = Delegate.Of(menu.settings::resultTarget), defaultValue = ItemMonitorPlayerSettings.ResultTarget.MIXED) @@ -110,11 +110,11 @@ class ItemMonitorScreen(menu: ItemMonitorMenu, inventory: Inventory, title: Comp it.tooltips.add(TranslatableComponent("otm.gui.item_monitor.result_target.desc")) for (setting in ItemMonitorPlayerSettings.ResultTarget.entries) { - it.add(setting, setting.icon, setting.component, setting.winding) + it.add(setting, skinElement = setting.icon, tooltip = setting.component, winding = setting.winding) } } - SmallEnumRectangleButtonPanel(this, resultAndButtons, x = 10f, y = 38f, + EnumButtonPanel.square8(this, resultAndButtons, x = 10f, y = 38f, enum = ItemMonitorPlayerSettings.Amount::class.java, prop = Delegate.Of(menu.settings::craftingAmount), defaultValue = ItemMonitorPlayerSettings.Amount.STACK) @@ -122,7 +122,7 @@ class ItemMonitorScreen(menu: ItemMonitorMenu, inventory: Inventory, title: Comp it.tooltips.add(TranslatableComponent("otm.gui.item_monitor.amount.desc")) for (setting in ItemMonitorPlayerSettings.Amount.entries) { - it.add(setting, setting.icon, setting.component, setting.winding) + it.add(setting, skinElement = setting.icon, tooltip = setting.component, winding = setting.winding) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/StorageBusScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/StorageBusScreen.kt index 833658e1f..21b3bafdb 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/StorageBusScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/StorageBusScreen.kt @@ -5,7 +5,7 @@ import net.minecraft.world.entity.player.Inventory import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.screen.panels.* -import ru.dbotthepony.mc.otm.client.screen.panels.button.CheckBoxLabelInputPanel +import ru.dbotthepony.mc.otm.client.screen.panels.button.BooleanButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.button.DeviceControls import ru.dbotthepony.mc.otm.client.screen.panels.input.IntInputPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel @@ -43,7 +43,7 @@ class StorageBusScreen(menu: StorageBusMenu, inventory: Inventory, title: Compon it.childrenOrder = -2 } - CheckBoxLabelInputPanel(this, right, menu.filter.isWhitelist, TranslatableComponent("otm.gui.filter.is_whitelist")).also { + BooleanButtonPanel.Checkbox(this, right, menu.filter.isWhitelist, TranslatableComponent("otm.gui.filter.is_whitelist")).also { it.dock = Dock.BOTTOM it.childrenOrder = -3 } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/StorageImporterExporterScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/StorageImporterExporterScreen.kt index e67b1d901..a85e84860 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/StorageImporterExporterScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/storage/StorageImporterExporterScreen.kt @@ -5,7 +5,7 @@ import net.minecraft.world.entity.player.Inventory import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.screen.panels.* -import ru.dbotthepony.mc.otm.client.screen.panels.button.CheckBoxLabelInputPanel +import ru.dbotthepony.mc.otm.client.screen.panels.button.BooleanButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.button.makeDeviceControls import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.FilterSlotPanel @@ -28,19 +28,19 @@ class StorageImporterExporterScreen(menu: StorageImporterExporterMenu, inventory FilterSlotPanel(this, grid, slot) } - CheckBoxLabelInputPanel(this, right, menu.filter.isWhitelist, TranslatableComponent("otm.gui.filter.is_whitelist")).also { + BooleanButtonPanel.Checkbox(this, right, menu.filter.isWhitelist, TranslatableComponent("otm.gui.filter.is_whitelist")).also { it.dock = Dock.BOTTOM it.dockTop = 2f it.childrenOrder = -1 } - CheckBoxLabelInputPanel(this, right, menu.filter.matchComponents, TranslatableComponent("otm.gui.filter.match_nbt")).also { + BooleanButtonPanel.Checkbox(this, right, menu.filter.matchComponents, TranslatableComponent("otm.gui.filter.match_nbt")).also { it.dock = Dock.BOTTOM it.dockTop = 2f it.childrenOrder = -2 } - CheckBoxLabelInputPanel(this, right, menu.filter.matchTag, TranslatableComponent("otm.gui.filter.match_tag")).also { + BooleanButtonPanel.Checkbox(this, right, menu.filter.matchTag, TranslatableComponent("otm.gui.filter.match_tag")).also { it.dock = Dock.BOTTOM it.dockTop = 2f it.childrenOrder = -3 diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/AndroidStationScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/AndroidStationScreen.kt index 2515c8ad9..48ddcdd96 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/AndroidStationScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/AndroidStationScreen.kt @@ -614,7 +614,7 @@ class AndroidStationScreen(p_97741_: AndroidStationMenu, p_97742_: Inventory, p_ researchCanvas.parent = research val bottom = EditablePanel(this, research, 0f, 0f, 0f, 20f) - val close = ButtonPanel(this, bottom, 0f, 0f, 90f, 20f, TranslatableComponent("otm.gui.matter_panel.close"), onPress = Runnable { research!!.remove() }) + val close = ButtonPanel.Simple(this, bottom, 0f, 0f, 90f, 20f, TranslatableComponent("otm.gui.matter_panel.close"), onPress = Runnable { research!!.remove() }) bottom.dock = Dock.BOTTOM close.dock = Dock.RIGHT diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/BlackHoleGeneratorScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/BlackHoleGeneratorScreen.kt index 92f2328cc..45f38334c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/BlackHoleGeneratorScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/BlackHoleGeneratorScreen.kt @@ -6,7 +6,7 @@ import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.panels.Dock import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel import ru.dbotthepony.mc.otm.client.screen.panels.FramePanel -import ru.dbotthepony.mc.otm.client.screen.panels.button.CheckBoxLabelInputPanel +import ru.dbotthepony.mc.otm.client.screen.panels.button.BooleanButtonPanel import ru.dbotthepony.mc.otm.client.screen.widget.ProfiledMatterGaugePanel import ru.dbotthepony.mc.otm.client.screen.widget.ProfiledPowerGaugePanel import ru.dbotthepony.mc.otm.core.TranslatableComponent @@ -25,7 +25,7 @@ class BlackHoleGeneratorScreen(menu: BlackHoleGeneratorMenu, inventory: Inventor matter.dockRight = 4f - val drawGuide = CheckBoxLabelInputPanel(this, frame, menu.drawBuildingGuide, TranslatableComponent("otm.gui.draw_multiblock_guide")) + val drawGuide = BooleanButtonPanel.Checkbox(this, frame, menu.drawBuildingGuide, TranslatableComponent("otm.gui.draw_multiblock_guide")) drawGuide.dock = Dock.TOP drawGuide.dockBottom = 2f diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EnergyCounterScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EnergyCounterScreen.kt index fcb4c43d8..b552b93a1 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EnergyCounterScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EnergyCounterScreen.kt @@ -9,8 +9,8 @@ import ru.dbotthepony.mc.otm.client.render.Widgets18 import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.screen.panels.* +import ru.dbotthepony.mc.otm.client.screen.panels.button.BooleanButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.button.ButtonPanel -import ru.dbotthepony.mc.otm.client.screen.panels.button.CheckBoxLabelInputPanel import ru.dbotthepony.mc.otm.client.screen.panels.button.makeDeviceControls import ru.dbotthepony.mc.otm.client.screen.panels.input.TextInputPanel import ru.dbotthepony.mc.otm.core.math.Decimal @@ -43,9 +43,10 @@ class EnergyCounterScreen(menu: EnergyCounterMenu, inventory: Inventory, title: panel.dock = Dock.FILL val current = i++ - val button = CheckBoxLabelInputPanel(this, tab.canvas, menu.displayChartOnBlock.map({ it == current }, { current }), TranslatableComponent("block.overdrive_that_matters.energy_counter.display_this")) + val button = BooleanButtonPanel.Checkbox(this, tab.canvas, menu.displayChartOnBlock.map({ it == current }, { current }), TranslatableComponent("block.overdrive_that_matters.energy_counter.display_this")) button.dock = Dock.BOTTOM button.dockTop = 2f + button.displayUncheckedIcon = false } } @@ -63,7 +64,7 @@ class EnergyCounterScreen(menu: EnergyCounterMenu, inventory: Inventory, title: labels.add(Label(this, informationTab.canvas, text = TranslatableComponent("otm.gui.power.last_tick"))) labels.add(DynamicLabel(this, informationTab.canvas, textSupplier = { menu.lastTick.formatPower(formatAsReadable = ShiftPressedCond) })) labels.add(DynamicLabel(this, informationTab.canvas, textSupplier = { TranslatableComponent("block.overdrive_that_matters.energy_counter.facing", menu.inputDirection) })) - labels.add(CheckBoxLabelInputPanel(this, informationTab.canvas, menu.displayChartOnBlock.map({ it == 0 }, { 0 }), TranslatableComponent("block.overdrive_that_matters.energy_counter.display_this"))) + labels.add(BooleanButtonPanel.Checkbox(this, informationTab.canvas, menu.displayChartOnBlock.map({ it == 0 }, { 0 }), TranslatableComponent("block.overdrive_that_matters.energy_counter.display_this")).also { it.displayUncheckedIcon = false }) for ((i, label) in labels.withIndex()) { if (i == 0) { @@ -76,7 +77,7 @@ class EnergyCounterScreen(menu: EnergyCounterMenu, inventory: Inventory, title: } if (!menu.player.isSpectator) { - val button = ButtonPanel(this, informationTab.canvas, 0f, 0f, 0f, 20f, TranslatableComponent("block.overdrive_that_matters.energy_counter.switch"), onPress = Runnable { menu.switchDirection.accept(null) }) + val button = ButtonPanel.Simple(this, informationTab.canvas, 0f, 0f, 0f, 20f, TranslatableComponent("block.overdrive_that_matters.energy_counter.switch"), onPress = Runnable { menu.switchDirection.accept(null) }) button.dock = Dock.TOP button.setDockMargin(4f, 5f, 4f, 0f) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EssenceStorageScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EssenceStorageScreen.kt index 0ac68e287..e8402486d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EssenceStorageScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EssenceStorageScreen.kt @@ -7,6 +7,7 @@ import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.client.render.MGUIGraphics import ru.dbotthepony.mc.otm.client.isShiftDown import ru.dbotthepony.mc.otm.client.playGuiClickSound +import ru.dbotthepony.mc.otm.client.render.IGUIRenderable import ru.dbotthepony.mc.otm.client.render.sprites.MatteryAtlas import ru.dbotthepony.mc.otm.client.render.RenderGravity import ru.dbotthepony.mc.otm.client.screen.MatteryScreen @@ -16,7 +17,7 @@ import ru.dbotthepony.mc.otm.client.screen.panels.DockResizeMode import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel import ru.dbotthepony.mc.otm.client.screen.panels.FramePanel import ru.dbotthepony.mc.otm.client.screen.panels.Label -import ru.dbotthepony.mc.otm.client.screen.panels.button.LargeRectangleButtonPanel +import ru.dbotthepony.mc.otm.client.screen.panels.button.ButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.button.makeDeviceControls import ru.dbotthepony.mc.otm.client.screen.panels.input.TextInputPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.SlotPanel @@ -93,12 +94,15 @@ class EssenceStorageScreen(menu: EssenceStorageMenu, inventory: Inventory, title outputs.dockResize = DockResizeMode.NONE outputs.dockMargin = DockProperty(bottom = 3f) - object : LargeRectangleButtonPanel(this@EssenceStorageScreen, inputs, icon = STORE_1) { + object : ButtonPanel(this@EssenceStorageScreen, inputs) { init { dockRight = 3f tooltips.add(TranslatableComponent("otm.gui.experience.store", 1)) } + override val icon: IGUIRenderable + get() = STORE_1 + override fun onClick(mouseButton: Int) { menu.storeLevels.accept(1) } @@ -108,12 +112,15 @@ class EssenceStorageScreen(menu: EssenceStorageMenu, inventory: Inventory, title set(_) {} } - object : LargeRectangleButtonPanel(this@EssenceStorageScreen, inputs, icon = STORE_10) { + object : ButtonPanel(this@EssenceStorageScreen, inputs) { init { dockRight = 3f tooltips.add(TranslatableComponent("otm.gui.experience.store", 10)) } + override val icon: IGUIRenderable + get() = STORE_10 + override fun onClick(mouseButton: Int) { menu.storeLevels.accept(10) } @@ -123,12 +130,15 @@ class EssenceStorageScreen(menu: EssenceStorageMenu, inventory: Inventory, title set(_) {} } - object : LargeRectangleButtonPanel(this@EssenceStorageScreen, inputs, icon = STORE_ALL) { + object : ButtonPanel(this@EssenceStorageScreen, inputs) { init { dockRight = 3f tooltips.add(TranslatableComponent("otm.gui.experience.store_all")) } + override val icon: IGUIRenderable + get() = STORE_ALL + override fun onClick(mouseButton: Int) { menu.storeLevels.accept((minecraft!!.player!!.experienceLevel ?: 0) + 1) } @@ -138,12 +148,15 @@ class EssenceStorageScreen(menu: EssenceStorageMenu, inventory: Inventory, title set(_) {} } - object : LargeRectangleButtonPanel(this@EssenceStorageScreen, outputs, icon = DISPENSE_1) { + object : ButtonPanel(this@EssenceStorageScreen, outputs) { init { dockRight = 3f tooltips.add(TranslatableComponent("otm.gui.experience.dispense", 1)) } + override val icon: IGUIRenderable + get() = DISPENSE_1 + override fun onClick(mouseButton: Int) { menu.dispenseLevels.accept(1) } @@ -153,12 +166,15 @@ class EssenceStorageScreen(menu: EssenceStorageMenu, inventory: Inventory, title set(_) {} } - object : LargeRectangleButtonPanel(this@EssenceStorageScreen, outputs, icon = DISPENSE_10) { + object : ButtonPanel(this@EssenceStorageScreen, outputs) { init { dockRight = 3f tooltips.add(TranslatableComponent("otm.gui.experience.dispense", 10)) } + override val icon: IGUIRenderable + get() = DISPENSE_10 + override fun onClick(mouseButton: Int) { menu.dispenseLevels.accept(10) } @@ -168,12 +184,15 @@ class EssenceStorageScreen(menu: EssenceStorageMenu, inventory: Inventory, title set(_) {} } - object : LargeRectangleButtonPanel(this@EssenceStorageScreen, outputs, icon = DISPENSE_ALL) { + object : ButtonPanel(this@EssenceStorageScreen, outputs) { init { dockRight = 3f tooltips.add(TranslatableComponent("otm.gui.experience.dispense_all")) } + override val icon: IGUIRenderable + get() = DISPENSE_ALL + override fun onClick(mouseButton: Int) { menu.dispenseLevels.accept(getLevelFromXp(menu.experienceStored) + 1) } @@ -186,11 +205,14 @@ class EssenceStorageScreen(menu: EssenceStorageMenu, inventory: Inventory, title val customBar = HorizontalStripPanel(this, frame, height = 18f) customBar.dock = Dock.TOP - object : LargeRectangleButtonPanel(this@EssenceStorageScreen, customBar, icon = STORE_CUSTOM) { + object : ButtonPanel(this@EssenceStorageScreen, customBar) { init { tooltips.add(TranslatableComponent("otm.gui.experience.store", customDispense)) } + override val icon: IGUIRenderable + get() = STORE_CUSTOM + override fun onClick(mouseButton: Int) { menu.storeLevels.accept(customDispense) } @@ -227,11 +249,14 @@ class EssenceStorageScreen(menu: EssenceStorageMenu, inventory: Inventory, title } } - object : LargeRectangleButtonPanel(this@EssenceStorageScreen, customBar, icon = DISPENSE_CUSTOM) { + object : ButtonPanel(this@EssenceStorageScreen, customBar) { init { tooltips.add(TranslatableComponent("otm.gui.experience.dispense", customDispense)) } + override val icon: IGUIRenderable + get() = DISPENSE_CUSTOM + override fun onClick(mouseButton: Int) { menu.dispenseLevels.accept(customDispense) } @@ -241,13 +266,16 @@ class EssenceStorageScreen(menu: EssenceStorageMenu, inventory: Inventory, title set(_) {} } - object : LargeRectangleButtonPanel(this@EssenceStorageScreen, customBar, icon = SET_EXACT) { + object : ButtonPanel(this@EssenceStorageScreen, customBar) { init { tooltips.add(TranslatableComponent("otm.gui.experience.set_exact", customDispense)) dock = Dock.RIGHT dockMargin = DockProperty(right = 4f) } + override val icon: IGUIRenderable + get() = SET_EXACT + override fun onClick(mouseButton: Int) { val player = minecraft!!.player!! ?: return diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/cos/CosmeticArmorCompat.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/cos/CosmeticArmorCompat.kt index 4421a4f2c..8f2f3b46b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/cos/CosmeticArmorCompat.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/cos/CosmeticArmorCompat.kt @@ -6,6 +6,7 @@ import lain.mods.cos.impl.client.PlayerRenderHandler import lain.mods.cos.impl.client.gui.GuiCosArmorInventory import lain.mods.cos.impl.network.payload.PayloadSetSkinArmor import net.minecraft.client.gui.screens.Screen +import net.minecraft.network.chat.Component import net.minecraft.resources.ResourceLocation import net.minecraft.server.level.ServerPlayer import net.minecraft.world.Container @@ -19,10 +20,12 @@ import net.neoforged.neoforge.network.PacketDistributor import ru.dbotthepony.kommons.math.RGBAColor import ru.dbotthepony.mc.otm.client.render.MGUIGraphics import ru.dbotthepony.mc.otm.client.minecraft +import ru.dbotthepony.mc.otm.client.render.IGUIRenderable +import ru.dbotthepony.mc.otm.client.render.UVWindingOrder import ru.dbotthepony.mc.otm.client.render.sprites.MatterySprite import ru.dbotthepony.mc.otm.client.render.sprites.sprite import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel -import ru.dbotthepony.mc.otm.client.screen.panels.button.RectangleButtonPanel +import ru.dbotthepony.mc.otm.client.screen.panels.button.ButtonPanel import ru.dbotthepony.mc.otm.compat.cos.CosmeticToggleButton.Companion.BUTTON_ACTIVE import ru.dbotthepony.mc.otm.compat.cos.CosmeticToggleButton.Companion.BUTTON_INACTIVE import ru.dbotthepony.mc.otm.container.util.awareStream @@ -151,16 +154,7 @@ class CosmeticToggleButton( y: Float = 0f, width: Float = 5f, height: Float = 5f -) : RectangleButtonPanel(screen, parent, x, y, width, height) { - override val PRESSED: MatterySprite - get() = BUTTON_ACTIVE - override val HOVERED: MatterySprite - get() = BUTTON_ACTIVE - override val IDLE: MatterySprite - get() = BUTTON_INACTIVE - override val DISABLED: MatterySprite - get() = BUTTON_INACTIVE - +) : ButtonPanel(screen, parent, x, y, width, height) { private val index = when (index) { EquipmentSlot.FEET -> 0 EquipmentSlot.LEGS -> 1 @@ -201,16 +195,7 @@ class CosmeticToggleRenderButton( y: Float = 0f, width: Float = 5f, height: Float = 5f -) : RectangleButtonPanel(screen, parent, x, y, width, height) { - override val PRESSED: MatterySprite - get() = BUTTON_ACTIVE - override val HOVERED: MatterySprite - get() = BUTTON_ACTIVE - override val IDLE: MatterySprite - get() = BUTTON_INACTIVE - override val DISABLED: MatterySprite - get() = BUTTON_INACTIVE - +) : ButtonPanel(screen, parent, x, y, width, height) { override fun onClick(mouseButton: Int) { if (mouseButton == InputConstants.MOUSE_BUTTON_LEFT) { PlayerRenderHandler.Disabled = !PlayerRenderHandler.Disabled diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/curios/CuriosCompat.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/curios/CuriosCompat.kt index 2db6097ed..1bf4ebf86 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/curios/CuriosCompat.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/curios/CuriosCompat.kt @@ -18,7 +18,7 @@ import ru.dbotthepony.mc.otm.client.render.sprites.MatterySprite import ru.dbotthepony.mc.otm.client.render.sprites.sprite import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel -import ru.dbotthepony.mc.otm.client.screen.panels.button.RectangleButtonPanel +import ru.dbotthepony.mc.otm.client.screen.panels.button.ButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.SlotPanel import ru.dbotthepony.mc.otm.container.util.awareStream import ru.dbotthepony.mc.otm.container.util.iterator @@ -193,14 +193,14 @@ class CurioToggleButton( y: Float = 0f, width: Float = 8f, height: Float = 8f -) : RectangleButtonPanel(screen, parent, x, y, width, height) { - override val PRESSED: MatterySprite +) : ButtonPanel(screen, parent, x, y, width, height) { + override val pressedSprite: MatterySprite get() = BUTTON_ACTIVE - override val HOVERED: MatterySprite + override val hoveredSprite: MatterySprite get() = BUTTON_ACTIVE - override val IDLE: MatterySprite + override val idleSprite: MatterySprite get() = BUTTON_INACTIVE - override val DISABLED: MatterySprite + override val disabledSprite: MatterySprite get() = BUTTON_INACTIVE override fun onClick(mouseButton: Int) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/matter/MatterPanelMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/matter/MatterPanelMenu.kt index 793449415..7fc4be6b3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/matter/MatterPanelMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/matter/MatterPanelMenu.kt @@ -198,7 +198,7 @@ class MatterPanelMenu( val settings = IItemSortingSettings.inputs(this, tile?.getPlayerSettings(player), ::updateComparators) - var isProvidingTasks by BooleanInputWithFeedback(this, tile?.let { it::isProvidingTasks }) + val isProvidingTasks = BooleanInputWithFeedback(this, tile?.let { it::isProvidingTasks }) val cancelAll = PlayerInput(StreamCodecs.NOTHING) { tile?.dropAllTasks() } val totalMatterStored: Decimal by mSynchronizer.computed( diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/checkbox.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/checkbox.png deleted file mode 100644 index 55b1deff250c3f42f0fdc4189ded6329ac17c87d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 817 zcmV-11J3-3P)4Tx04UFukvT{MK^TR<#7IOUDNG?^v4vV05EZeMD2kvUF@jg&?#4tRy9v7y z8%x1fu<&TS3L9%}Eo=or@Bp#2vQo5>u>P|V5`+j24D<13-ecws1P^nj<%YV!vWre~ zG@;GR&S~Kn8i^1kL{vB3!o<`_ikjo|j(}Qk<0^~)ji&UHYeGO19yAM1QFu|ff2~+h zyek|tm-V#pnQ)gQ7ZiR_x>4p=#aW+&Dl_J!l0(8VVJ%z5MiraOjwReD+@7{<$q&wy zIjwkIv6Wjjf9|PX7+JEXr<5+UjZwy!U=j_3RaVGRBrdBhic3=V6E*y;zJF3&hPYNR z#W74C3*Gml{@{1FZl<@VoD@kw{j=x2cR+X>N?V@yb>w-aW2k$AOS|IFAHu+g=vx)7 z{Q#mHaDG+Mj2*bxgqFvG?&!W$Co`DIz}u;O(=0UKK;wM5x1W7Z?ja>zjbFpwK6GX! zd!fd=8>)Nz^NimgiEkTna)dh9-B|zt010qNS#tmY4#5Bb4#5Gqk!$S$00C7=L_t(o zNA1|rZG|1$@AfM@VS*D}?ZRukJ;7 znx@~Y8}0iZkG1!Hr}OUp4S3tOxLRa}TY-`Z&e3_E)7i5MSQ{k+Me2?PW1*;k^M^B0 zblLG4VW3DIH85GMRJccOu;16|^)8)vEyC-%rb~OvvczNUy`T4T-GVV98S&H1a4S$U z!8uymCKm-de1 zh{xJ{Kkwzb1!F`q;-{J6R-j~pbF}7V(kftWlnfN9I~I(Eq5{qz&P35=$7h6rB6ZZj zWU*4=9=XAOKiY<2@Pq&VMD5Wn7$cGqKg|rc0woiiqcty+Rsn0HWS~ghv0y9|6>$D= vCWr&00000NkvXXu0mjfeD!zR diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/large_button.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/large_button.png deleted file mode 100644 index dbacdc975fd42f0b8d7c7cdb928d12c6dedffd5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmV;I0%-k-P)EX>4Tx04R}tkv&MmP!xqvQ$>+V2Rn#}WQa}{L`58>ibb$c+6t{Yn7s54nlvOS zE{=k0!NH%!s)LKOt`4q(Aov5~>f)s6A|>9J6k5c1;qgAsyXWxUeSpxYFwN?k05sh; zQ}LLX&8><(uLxiSVMvfWLS5n{2}!Ab|SlBp3-6HBV5Q@)V( zSmnIMS*z4o>z@3Dp}fA5<~prm#Ib|~k`SSwhB7L!5v5%x#X^eCV?O>N*PkSpLas6x zITlcb2HEw4|H1FsT7{`eFDVoQx?ddUV-)Dw1)6oo`95}><_Qpd2CnqBzuEw1KS{5* zHR%WlZvz+CZB5w&E_Z;zCqp)6R|?V+3I*W(jJ_!c4BP^JYu?;i=Qw=;GBm5@8{ps& z7%Nity3f0NJLmRqPiuZZxTA8z1ijBF00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru=K&uCDJ+8+v^M|%0F+5YK~z}7?U=C*#2^eszfbJJ z6o>^t%#2_G#1u?Iid2boDIDvr`LA>HgdUYG05%NR+eBkV&e_D{03gQrN;1YUc~ol+ z03aeJpVfPRfdIgJuac~_E^{eG<*Bt^<`9C)Gv_q*d_W#yAO>O}24WxvVju=$ xAi_Wl#6Z8tecQ^l+_!Qq_pSV29sv(#j~w0JD^D^xh9dv~002ovPDHLkV1mKP8_WOz diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/large_button.xcf b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/large_button.xcf deleted file mode 100644 index c8ec6176243d42a6e9b8df345f6460bd0f4b6594..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3043 zcmds2O=}ZD7@mzyV^_o4_2VQmeiRZUm_2Af5JC3f*@K?be5?y;QnFFnlWDIW^duta zFYvGwTS~$7>T&k!&+weEKJV-fPRiOtAQ18{&pgk(@8q3i^6akXZ*B9PMw`E_Iu1iT z2W%3EPry207#OYs7oUA(jDWZXtN^RPja1XR>%cGIiig$}f2;1bDqi1jBE_iwy%Y>~ zJ1rjcI)1ZkmfBvU*Xi|nNm8ZnZPs~JUQQY1&5W|cF{nC(u@(n;k_ z*B@}d+j!jy=o7tmJ7^8KT(9XwPA{hKtcCF^nXJ(7K&*aEcd;-0iZm!UQ0EI-O=<- zO`DqLn!cpz%bG4~+JdJ29sv{ufcB>T8>t4dd!%Co_^zgPn;@+sx33gf9ToLOby#SAxQ#fM|&x^tolT3gI^mv^&wbcX+qpX{`8j#EQ%Btke&*i^Nq+$8 zGjx&sNgkq@)t{;Nk|t;~QVM*=pM~EUHKYoER34Ub;ZL{te(cVTCTMNB(w|GZS%yC! z{MVnS(NK({J$iP^_k1W0Bl!YcB$q0K%<9q$szJhLQ=6Z0sX5H3A!UA6d7D`^gT=Mt W%W;jdIne~It(uK{XjwNSm;MC^Q|e0q diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/misc18.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/misc18.png deleted file mode 100644 index d37acf339dcd7ec9189a888138bbddeb1e2f3f18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 951 zcmV;o14#UdP)EX>4Tx04R}tkv&MmKpe$iTcs-13RVzt$WWc^q9Tr^ibb$c+6t{Ym|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jfc5qU3krMxx6k5c1aNLh~_a1le0B@th6r(E&D5|Na z;xQqcTNV7T=*2Jw5yXJV3@wpf%)oVg-NVDzy9m#6KlkV8m-7Y#JOXi)X}U?gK|H%@ zYMl3pL#!mq#OK75I$e4=GxZD9oo-|PxZOKQ|TPOhUXY@@uVCWX;TXTAA?c?+T$WT|yH^9Lm zFj1uJb(eSdboTb|nO1*4d4F=L8$wk=00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru=m{1IDLTP?n(_bu0kla(K~#9!?V8c9gCGosSF`tj zWzLOT2nTEn6fyh0WETq7@>APt_IklO(#hy`y>=paw;V3diHNl3m18NTRGV+TSC5@2 zj+w^t#aJRBpOatfwX+W9M|TaI}bI!h$Y*K+)@?Dj~gYxyOr0JLmqPe?g_Se?JS+|Cqf zYMCEx+O#Bnhe*=|l8jMtN;^*xNlnDPN%Cs`jD$PW&Q+2gs$wIK?;uhceQKGX(Fb`P z-ZhfKs+iZ&C+4IrK6k9XKLGp`>HPK1^PZ3Eq&E_D#+e_iW+oHS^GIsHwf#)qSLFSLq0cA<_zG4YJ9AcYjy)rS zDhue1pwXn?#rxsOxi&xcT@3b%pw`ZdGm_SQ5?-97tvTjrle9;mG4=LM}%G>ZLg z1V5LR#}gBEig?UqK~C`=*TfMeXQik$J)w%pO&bjW0000000000000000000000026 ZDStx_Oh+8OPYnP7002ovPDHLkV1jkKt5N^} diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/widget_15.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/widget_15.png new file mode 100644 index 0000000000000000000000000000000000000000..95af9fdc1b1006f481c327378d1ffd74ed038e61 GIT binary patch literal 800 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$>^XU~J8Fb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJhrF9{)ZxkL)SXj1+PwP>{st6YDrE4#&YCgF%{=yPP&%#2H7;e5g zoiN#$Ii;lqqAUmb1=88oUBxv&)_X2=?O{Lux1#)g;dj0dW?DXmyB0MpnpLGGC%kEA z=)wP8bzhPM5`DVPTo8JBlqcr+bz7U7z1<&lz8BZ`FTe zIp5-h*CL-9KbwV@Sv%!->RJ9dwlib%^mMkbK3VfDJaj~?BVHwhT@rmH`DntL6;s}y zwbCiR_h?N>)|yiPe}^36Vm*uJK9hJ9;l$+0F(JTNQglYgg;kT16kLBBivM5n)_;<> zQn+M~4EGAB#*E(w|34_-?v_|}%9HCz!#nZQza-fI>~`3k7kU5qw5v9ZHRlgZz4a|z z`oJCamtVJuSuwS3YwUi#P3^%3GYP0?F*VfLl zV~~86^^?uQg5{9wskrjWa{u)F|MN1xerJA?Q*_1Dk;e)cFKkKP?k)`fL2$v|<&%LT zoCO|{#S9F52SJ!|$HeTnKtc8rPhVH|7u=kDdTdu7o;ePTN*PZV$B>MBZ*LsrJ!HVs z`fz&3Od~J#mlAWAEKboZe#kIYTBbRKv(8&)l}4eRu=|vxv|r0t{MyV=6L{mXvGuZR zv$kH-u?pM2V`E~ESy@E=7n_*+FLM}|=Wl1&Vo~`f<&SFB`=>LWTi*Y?LuKj%U0JVx zeAPa3I$0;huAUBOb~kJJ+V@7~TC{!4oyWh@f4-XS6}{~e=Nnbqm`%rTyk5$`A(gFm z+Ii>e+I^t{(oWSk1b>OWQBA!#`Jw3TO-H}&dw3{6^T2-5hjNAav$}6B+&XPu_2ea~ zk;~NI{nqomwJo>m-L7>nd%xfNdUD>&!~+eC%xpXo1_=imDxhT0~mA+p00i_>zopr0OF2fB>(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/widget_15.xcf b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/widget_15.xcf new file mode 100644 index 0000000000000000000000000000000000000000..0e578bf3a3ab4556c0837a6cbb0607d36e6c39fb GIT binary patch literal 4575 zcmeHKJ8aWX6tx}a)5IhVP{aVm{G=8sw2|1@4k=i>*HgmR-c{o7t2-u z`e?Ce!7eH%z6a04Z5z!&_#nLC5U|OyDR69%O^(eWcxr6(!$~^uVYmzLhaXXx%Ld?Y z;Qck6K%qW6QL7Yc^YtmDEbjAUsI{;(Q}J8PnflaldZ=0}H)opj{!kPO^R>wde>D0P zhcP_aVYui=KMpUp<|fMZM$IpdqPMiGr#gjejrxLLZq_rq7=X1KO>$H!@vuTC}>&(Ae# zT)-OA5^&a6z*%qi(han@2XN-OPoKgF)+qxYGjQ6#zJW6a_6&T$z&u|bk4Bt?^Vr<~ ztilM^8DarLJZ)f;BS>p=9&3cC>%x6u&TAQ?R*y0NUgxvcaghy#<&}0U;jP%h3wA`{ zt?UGQKP3Wr_4_r*s!IIdJXnt1;xor*Q)|n>xF2qW&%@Pled}hp7Cr^u;Iq?9f>PiK z!MYU`ike}GuSQ1~LkUWfuQzRa4E^M}cG4@^&<@+OOLpMG5rLh+fqxSvs1JaE+hQBN zSjh#FlWZaLj$AI>AO;l87u-N@q-M!ESc`mg5P9GnZr=VWf6hAqchG-FOi<#ShQ|Q&ucNP@3Ya-SFT8(<}tMCG4#_X z+DU_P0;E@bMpa9(h~?lgxa}&&Ck(#3h*xh<}yA zgW+AM_{(rTT>V+nH^Nok$X;SMSw`!Y-HN$#6U*}6YJ{j6tmb$hJB%UaZR>nnPszSM zs4aCn1qEkJQpuGTQ>nE|Q^_TxUA_jO^G*;))K7|6GL`z@+4(XwG85^i)XPrVI>yrJ zI#WM0ZT4}fm#D_`p><2Om|U*g+y#vgbqN&Ja#uQxaoV)b|3bA$FhR8_f@(j6lY*+K z773-I8l{j_6ThX}Kd|#3Q;mP^=%iXQe1yNlJ@=8S?{K#?)BohvKKTcFLqvV~ie~v2 R9mbH#ztj2UY`-wv`VM`cc!&T1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/widget_18.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/widget_18.png new file mode 100644 index 0000000000000000000000000000000000000000..4ecb9767763641c75945cefd7d7059fb44900c6a GIT binary patch literal 1098 zcmV-Q1hxB#P)EX>4Tx04R}tkv&MmKpe$iTcv(f9qb_DkfC<64l3eUs#pXIrLEAagUO{|(4-+r zad8w}3l4rPRvlcNb#-tR1i=pwX9p)m7b)?7NufoI2gm(*ckglc4)8WAOfkBmfTEgu zDjpNExmCgcihlHB5MfM;%+M0)#SC1>*F8LZy^HWH_j7-a0Xc6lz#|YxnWme>8^p7l zrp9@nILJz(Ongo}q0I7loMJ6P&qR?-#X8RC$vsFd%` zIxKVE;;d9^taVTR!a!bKNpqd%7~)t$0!avvP(v9Nn26A-l42l5`!N^)sO?XZOCnbp zj2sK7LV;-e!T;cQw?<)l%1H{ufbJK|`WOfNyFjyUS>MN&)jR=w&%l-1_E#Ig+$ZVv zwiY@9hPHu=>$WEC0hc?#$de}OqAmGodJ6^M{fxdT2Mpf=eQQo{t$mz602%6P`35*R z1j0qiUUzwSPiJrco@w>>1LSOS)HOj2IsgCw24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j~k5201Jie}B;c00KryL_t(|+U=T6j>0euh3$$< zu;K>n5GO#K8F2!{t~X%CF*1vxC=K~@;)GVbPntzYYMhtUcET_b8B)L)6*Fp_PA3&R z8zQ3P@mOW#cDt!Kb-iARh=`e07HhxXSJ@fI@n0Y!qTOy+WaRO9%-ZMkxya7ta+$Rc zheMH_`~5y^Z@1ebJJ08nh=>LPQ6LZmfkCEQg4XcKjb?9?R2Xtl4_c-E!t8+ z`Wqst3B(q);<$F!B2qFCmj=n$c#VLoX(tw>tFl;)<4X|9-F?Y4uTcj{9A4^9YL>;M zj;=8#E#kVP_xA$;ehNc*KNN(s!y*b%kADWYih10B^zEwlHQHVc$A-kY@s= zJE%737qMA+aQ2OFdlm!B+d-j~XW>rjcO~38Nax0wpAFIyfx4&p;6E><3dKyZ--Y1x znA=ti)TYI2#vNjcwCxjz6EVxQn$sGx7=LM@0RR9100000000000D!Li0Yj5_=|^F$ Q&j0`b07*qoM6N<$f_^#W+5i9m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/misc18.xcf b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/widget_18.xcf similarity index 54% rename from src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/misc18.xcf rename to src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/widget_18.xcf index 58329e112595958b14359531a3ccfce8cb0a3d3f..ceec2f67e7ca9d94341498a229bea1b0fd481172 100644 GIT binary patch literal 7343 zcmeHMOK6-`6u$pF|CwYm%_KHjAN<+`5@Bd&VX_ot7D5-UEN;^@83)p&%%sw;65EA~ z6s;T4LKVb?ph6G>X+q*gQFr%uAqaxFbnD7Wn(O!7N9M*%7ETn$CO4dW&OPTo&*Pr^ zPipncSE6gvv(angm5M-l(E{mr0R4at4uS`wX=W9`A9Ifm7TDDQXI$vLm>hsgD&NMk< zVRp7Tvl!|A9&O0|ow;YP1b0m%j1BJj(BQuJ4DP>U@W7J6r)~eoJ~HinHO)cIQzwtg zJ91loDc9q-B9L3Uu_0GEfVyYN0H|*Tc$)O{%cx-!0QsCJXK5huj7LA=(Rq)KJi5oD zdp)|~(M8Z)&y_3)uFd&JEDa=vNh=iKvmWhyhI{i$V$Ewfy>MQX#E%AtUmL7z*N5`^ zhM%=IpxvCPy$z7p})j$=+uBwKOT`^g>urn!CwXm{N#oh|f?V!=fuAE5zX&oHY zzOl-QZT@>-JF!jo-UEl(W+}C-veisORnsfGjiXnYMp*6k`If|O<`3o)<~0`POP4bX zUd}v6VK*g6ZkikIG(qw#UdjF7HJlP`g3SHaMg~@%iC&kI2viRs5DAq7Bmh}J3Xle5 z07*ayV4u85t6q^*1wb$8yya8Qe(cY29M5?;ALkA1Iwc(ac&u2&sXK!}(Tw^LO@fcN zmpq4-AIP=6fi9))K46MSFj-M7v^@|4z4@9wpTJ?z#KAeX? z_X2j6=z*I9CE?vEkbkg~(5{YGWgqN*02Sc$56~+V8I2h}S&>uc#KXMW%UYAvW{68h zK~-uGmq0t{2i*saT%ZYPE9dt9J^l)X-Q=`xqn$df?}#{B@qHf97B{zb+Tw;206Q7T z;`fe!TyE8eJy&`5<-Py7fA4R^H|1s|zrY=SQ*P1n-4qVo4_&jfSzR+aPZnH7B->HrL--j^G;M+W) zElwlW#)IwbkFJAzzxAAlzL|uXSF<`_Cv_c~+>9I?dR)K9Vf0}mTkD(`C#zDg`t|cK zX&6R!zQE`hkauz6y&m7dn|E8@!>f0l9@9->!H_sgSn#-B8T#03I91rN82YM>46LD_ z9KVdPC<3wwi&K_PAWTBgyq?^bn2)objC@{)9K&mlbWUUQcyoPCCJxk?I1Ve0SWUDN z1vSKro*x4_Xxn`MQafo4N#G>3XRzVXDz0A+<9hUWvP&jrZlm!Ln$y{yVNjIsG6>{0 z!T|pYptzetfLlFE2<-hJ!Gj?seqyk$of>QiocX4WjAMRwd~-*eA05nH&#$ad{H}8~ w@^z?F2Gd4+Xxp_FJ}wLVzgK95t#MiBx-P(Z5&T`+T^_^^=+=(zL_Q+^1h0pZ)&Kwi delta 393 zcmZ2)`CDs32BZAM%-5Dv8Nh%g4MMZWLTIiy2+iXRq4^Ubv`_|wW?-0nP)K<49gd}w z6PRo!@8#rYVwwdK;$(p+VA=-ci7_#q+kA>YiE(oZw*ezq8~k8WNp&BF)) D?6FbN diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets_8.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/widget_8.png similarity index 100% rename from src/main/resources/assets/overdrive_that_matters/textures/gui/widgets_8.png rename to src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/widget_8.png diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets_8.xcf b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/widget_8.xcf similarity index 100% rename from src/main/resources/assets/overdrive_that_matters/textures/gui/widgets_8.xcf rename to src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/widget_8.xcf