diff options
author | Thunderblade73 <85900443+Thunderblade73@users.noreply.github.com> | 2024-09-07 16:14:23 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-07 16:14:23 +0200 |
commit | 9d326f9c6bcbb62b120a33930a23f223667cd040 (patch) | |
tree | 4c3d599ff846fa32bc5ac28aaf84980e138b87f7 /src/main/java/at/hannibal2/skyhanni/utils | |
parent | 53b85119ef0961f7088357107e335c308168e4e2 (diff) | |
download | skyhanni-9d326f9c6bcbb62b120a33930a23f223667cd040.tar.gz skyhanni-9d326f9c6bcbb62b120a33930a23f223667cd040.tar.bz2 skyhanni-9d326f9c6bcbb62b120a33930a23f223667cd040.zip |
Backend: Renderable searchbox (#2475)
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/utils')
-rw-r--r-- | src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt | 106 | ||||
-rw-r--r-- | src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt | 12 |
2 files changed, 111 insertions, 7 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt b/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt index 29105459c..a49f58b00 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt @@ -5,6 +5,7 @@ import at.hannibal2.skyhanni.config.features.skillprogress.SkillProgressBarConfi import at.hannibal2.skyhanni.data.GuiData import at.hannibal2.skyhanni.data.HighlightOnHoverSlot import at.hannibal2.skyhanni.data.ToolTipData +import at.hannibal2.skyhanni.data.model.TextInput import at.hannibal2.skyhanni.features.chroma.ChromaShaderManager import at.hannibal2.skyhanni.features.chroma.ChromaType import at.hannibal2.skyhanni.features.misc.DarkenShader @@ -52,7 +53,11 @@ interface Renderable { val horizontalAlign: HorizontalAlignment val verticalAlign: VerticalAlignment fun isHovered(posX: Int, posY: Int) = currentRenderPassMousePosition?.let { (x, y) -> - x in (posX..posX + width) && y in (posY..posY + height) // TODO: adjust for variable height? + x in (posX..posX + width) && y in (posY..posY + height) + } ?: false + + fun isBoxHovered(posX: Int, width: Int, posY: Int, height: Int) = currentRenderPassMousePosition?.let { (x, y) -> + x in (posX..posX + width) && y in (posY..posY + height) } ?: false /** @@ -435,12 +440,7 @@ interface Renderable { val inverseScale = 1 / scale override fun render(posX: Int, posY: Int) { - val fontRenderer = Minecraft.getMinecraft().fontRendererObj - GlStateManager.translate(1.0, 1.0, 0.0) - GlStateManager.scale(scale, scale, 1.0) - fontRenderer.drawStringWithShadow(text, 0f, 0f, color.rgb) - GlStateManager.scale(inverseScale, inverseScale, 1.0) - GlStateManager.translate(-1.0, -1.0, 0.0) + RenderableUtils.renderString(text, scale, color, inverseScale) } } @@ -534,6 +534,98 @@ interface Renderable { } } + /** + * @param searchPrefix text that is static in front of the textbox + * @param onUpdateSize function that is called if the size changes (since the search text can get bigger than [content]) + * @param textInput The text input, can be external or internal + * @param shouldRenderTopElseBottom true == Renders on top, false == Renders at the Bottom + * @param hideIfNoText hides text box if no input is given + * @param ySpacing space between the search and [content] + * @param onHover is triggered if [content] or the text box is hovered + * @param bypassChecks bypass the [shouldAllowLink] logic + * @param condition condition to being able to input / [onHover] to trigger + * @param scale text scale of the textbox + * @param color color of the textbox + * @param key event key for the [textInput] to register the event, needs clearing if [textInput] is external, default = 0 + */ + fun searchBox( + content: Renderable, + searchPrefix: String, + onUpdateSize: (Renderable) -> Unit, + textInput: TextInput = TextInput(), + shouldRenderTopElseBottom: Boolean = true, + hideIfNoText: Boolean = true, + ySpacing: Int = 0, + onHover: (TextInput) -> Unit = {}, + bypassChecks: Boolean = false, + condition: () -> Boolean = { true }, + scale: Double = 1.0, + color: Color = Color.WHITE, + key: Int = 0, + ) = object : Renderable { + + val textBoxHeight = (9 * scale).toInt() + 1 + + override var width: Int = content.width + override val height: Int = content.height + ySpacing + textBoxHeight + override val horizontalAlign = content.horizontalAlign + override val verticalAlign = content.verticalAlign + + val searchWidth get() = (Minecraft.getMinecraft().fontRendererObj.getStringWidth(searchPrefix + textInput.editTextWithAlwaysCarriage()) * scale).toInt() + 1 + + init { + textInput.registerToEvent(key) { + val searchWidth = searchWidth + if (searchWidth > width) { + width = searchWidth + onUpdateSize(this) + } else { + if (width > content.width) { + width = maxOf(content.width, searchWidth) + onUpdateSize(this) + } + } + } + } + + override fun render(posX: Int, posY: Int) { + if (shouldRenderTopElseBottom) { + if (!(hideIfNoText && textInput.textBox.isEmpty())) { + RenderableUtils.renderString(searchPrefix + textInput.editText(), scale, color) + } + GlStateManager.translate(0f, (ySpacing + textBoxHeight).toFloat(), 0f) + } + if (isHovered(posX, posY) && condition() && shouldAllowLink(true, bypassChecks)) { + onHover(textInput) + textInput.makeActive() + textInput.handle() + val yOff: Int + if (shouldRenderTopElseBottom) { + yOff = 0 + } else { + yOff = content.height + ySpacing + } + if (isBoxHovered(posX, width, posY + yOff, textBoxHeight) && (-99).isKeyClicked()) { + textInput.clear() + } + } else { + textInput.disable() + } + if (!shouldRenderTopElseBottom) { + content.render(posX, posY) + GlStateManager.translate(0f, (ySpacing).toFloat(), 0f) + if (!(hideIfNoText && textInput.textBox.isEmpty())) { + RenderableUtils.renderString(searchPrefix + textInput.editText(), scale, color) + } + GlStateManager.translate(0f, -(ySpacing).toFloat(), 0f) + } else { + content.render(posX, posY + textBoxHeight + ySpacing) + GlStateManager.translate(0f, -(ySpacing + textBoxHeight).toFloat(), 0f) + } + } + + } + fun progressBar( percent: Double, startColor: Color = Color(255, 0, 0), diff --git a/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt index a78044d72..4a8f28c8e 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt @@ -2,7 +2,9 @@ package at.hannibal2.skyhanni.utils.renderables import at.hannibal2.skyhanni.utils.RenderUtils.HorizontalAlignment import at.hannibal2.skyhanni.utils.RenderUtils.VerticalAlignment +import net.minecraft.client.Minecraft import net.minecraft.client.renderer.GlStateManager +import java.awt.Color internal object RenderableUtils { @@ -72,6 +74,16 @@ internal object RenderableUtils { GlStateManager.translate(0f, -yOffset.toFloat(), 0f) return yOffset } + + @Suppress("NOTHING_TO_INLINE") + inline fun renderString(text: String, scale: Double = 1.0, color: Color = Color.WHITE, inverseScale: Double = 1 / scale) { + val fontRenderer = Minecraft.getMinecraft().fontRendererObj + GlStateManager.translate(1.0, 1.0, 0.0) + GlStateManager.scale(scale, scale, 1.0) + fontRenderer.drawStringWithShadow(text, 0f, 0f, color.rgb) + GlStateManager.scale(inverseScale, inverseScale, 1.0) + GlStateManager.translate(-1.0, -1.0, 0.0) + } } internal abstract class RenderableWrapper internal constructor(protected val content: Renderable) : Renderable { |