aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/utils
diff options
context:
space:
mode:
authorThunderblade73 <85900443+Thunderblade73@users.noreply.github.com>2024-09-07 16:14:23 +0200
committerGitHub <noreply@github.com>2024-09-07 16:14:23 +0200
commit9d326f9c6bcbb62b120a33930a23f223667cd040 (patch)
tree4c3d599ff846fa32bc5ac28aaf84980e138b87f7 /src/main/java/at/hannibal2/skyhanni/utils
parent53b85119ef0961f7088357107e335c308168e4e2 (diff)
downloadskyhanni-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.kt106
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt12
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 {