nageyqma·git
HTTPS https://git.nageyqma.icu/nageyqma/odin_next.git SSH git@git.nageyqma.icu:nageyqma/odin_next.git

HTTPS 链接可直接 git clone;推送代码请使用 SSH。

2.4 KB · 74 行raw
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
package com.odtheking.odin.clickgui.widget

import com.odtheking.odin.OdinMod.mc
import com.odtheking.odin.clickgui.GuiTheme
import com.odtheking.odin.clickgui.hoverTint
import com.odtheking.odin.utils.Colors
import com.odtheking.odin.utils.render.*
import net.minecraft.client.gui.GuiGraphicsExtractor
import net.minecraft.client.gui.components.EditBox
import net.minecraft.network.chat.Component
import net.minecraft.resources.Identifier
import kotlin.math.roundToInt

object Toggle {
    const val WIDTH = 24
    const val HEIGHT = 16

    private const val KNOB_INSET = 4

    internal const val RADIUS = 9f
    internal const val KNOB_RADIUS = (HEIGHT / 2 - KNOB_INSET).toFloat()

    internal const val KNOB_HOME = HEIGHT / 2

    internal const val TRAVEL = WIDTH - HEIGHT

    internal val CORNERS = Corners(RADIUS)
}

fun GuiGraphicsExtractor.drawToggle(x: Int, centerY: Int, progress: Float, hover: Float) {
    val top = centerY - Toggle.HEIGHT / 2
    val bottom = top + Toggle.HEIGHT
    val right = x + Toggle.WIDTH
    val corners = Toggle.CORNERS

    roundedRectOutlined(x, top, right, bottom, GuiTheme.surface.hoverTint(hover), GuiTheme.accent.rgba, 1.5f, corners)

    val fillRight = x + (Toggle.WIDTH * progress).roundToInt()

    if (progress > 0f) roundedRectClipped(x, top, right, bottom, x, top, fillRight, bottom, GuiTheme.accent.hoverTint(hover), corners)

    circle(x + Toggle.KNOB_HOME + (Toggle.TRAVEL * progress).roundToInt(), centerY, Toggle.KNOB_RADIUS, Colors.WHITE.rgba)
}

private const val FIELD_HEIGHT = 8

fun rowTextField(width: Int, name: String, centered: Boolean): EditBox =
    EditBox(mc.font, 0, 0, width, FIELD_HEIGHT, Component.literal(name)).stripChrome(centered)

fun <T : EditBox> T.stripChrome(centered: Boolean): T = apply {
    isBordered = false
    setCentered(centered)
    setTextShadow(false)
    setTextColor(Colors.WHITE.rgba)
}

private const val HOVER_GROWTH = 0.15f

fun GuiGraphicsExtractor.drawIcon(
    texture: Identifier, x: Int, y: Int, size: Int, hover: Float, rotation: Float = 0f
) {
    val centerX = x + size / 2f
    val centerY = y + size / 2f
    val scale = 1f + HOVER_GROWTH * hover

    pose().pushMatrix()
    pose().translate(centerX, centerY)
    pose().scale(scale, scale)
    pose().rotate(rotation)
    pose().translate(-centerX, -centerY)
    roundedTexture(x, y, x + size, y + size, texture)
    pose().popMatrix()
}