aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/features/chat
diff options
context:
space:
mode:
authornea <nea@nea.moe>2023-08-03 20:12:53 +0200
committernea <nea@nea.moe>2023-08-03 21:55:21 +0200
commit5198a5eca8257ee05e4846dc7ef46c983f7752d0 (patch)
treede470324a8737eccf4222ece4b795c40ca5fb5f6 /src/main/java/at/hannibal2/skyhanni/features/chat
parent5dee3f298497dae472e80235091b659e4042fd49 (diff)
downloadskyhanni-5198a5eca8257ee05e4846dc7ef46c983f7752d0.tar.gz
skyhanni-5198a5eca8257ee05e4846dc7ef46c983f7752d0.tar.bz2
skyhanni-5198a5eca8257ee05e4846dc7ef46c983f7752d0.zip
Add chat filter gui
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/features/chat')
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilterGui.kt119
1 files changed, 119 insertions, 0 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilterGui.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilterGui.kt
new file mode 100644
index 000000000..f9566cdf1
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilterGui.kt
@@ -0,0 +1,119 @@
+package at.hannibal2.skyhanni.features.chat
+
+import at.hannibal2.skyhanni.data.ChatManager
+import at.hannibal2.skyhanni.utils.LorenzUtils
+import at.hannibal2.skyhanni.utils.OSUtils
+import io.github.moulberry.moulconfig.internal.GlScissorStack
+import io.github.moulberry.moulconfig.internal.RenderUtils
+import net.minecraft.client.Minecraft
+import net.minecraft.client.gui.GuiScreen
+import net.minecraft.client.gui.GuiUtilRenderComponents
+import net.minecraft.client.gui.ScaledResolution
+import net.minecraft.client.renderer.GlStateManager
+import net.minecraft.util.IChatComponent
+import org.lwjgl.input.Mouse
+
+class ChatFilterGui(private val history: List<ChatManager.MessageFilteringResult>) : GuiScreen() {
+ private var scroll = -1.0
+ private val w = 500
+ private var wasMouseButtonDown = false
+ private val h = 300
+ private val reasonMaxLength =
+ history.maxOf { it.actionReason?.let { Minecraft.getMinecraft().fontRendererObj.getStringWidth(it) } ?: 0 }
+ private val historySize by lazy {
+ history.sumOf { splitLine(it.message).size * 10 + if (it.modified != null) splitLine(it.modified).size * 10 else 0 }
+ }
+
+ override fun drawScreen(mouseX: Int, mouseY: Int, partialTicks: Float) {
+ super.drawScreen(mouseX, mouseY, partialTicks)
+ drawDefaultBackground()
+ GlStateManager.pushMatrix()
+ val l = (width / 2.0 - w / 2.0).toInt()
+ val t = (height / 2.0 - h / 2.0).toInt()
+ val sr = ScaledResolution(mc)
+ GlStateManager.translate(l + 0.0, t + 0.0, 0.0)
+ RenderUtils.drawFloatingRectDark(0, 0, w, h)
+ GlStateManager.translate(5.0, 5.0 - scroll, 0.0)
+ var mouseX = mouseX - (l)
+ val isMouseButtonDown = if (mouseX in 0..w && mouseY in t..(t + h))
+ Mouse.isButtonDown(0)
+ else false
+ var mouseY = mouseY - (t - scroll).toInt()
+ GlStateManager.color(1f, 1f, 1f, 1f)
+ GlScissorStack.push(l + 5, t + 5, w + l - 5, h + t - 5, sr)
+
+ for (msg in history) {
+ drawString(mc.fontRendererObj, msg.actionKind.renderedString, 0, 0, -1)
+ GlStateManager.color(1f, 1f, 1f, 1f)
+ drawString(mc.fontRendererObj, msg.actionReason, ChatManager.ActionKind.maxLength + 5, 0, -1)
+ GlStateManager.color(1f, 1f, 1f, 1f)
+ var size = drawMultiLineText(
+ msg.message,
+ ChatManager.ActionKind.maxLength + reasonMaxLength + 10,
+ )
+ if (msg.modified != null) {
+ drawString(
+ mc.fontRendererObj,
+ "§e§lNEW TEXT",
+ 0, 0, -1
+ )
+ size += drawMultiLineText(
+ msg.modified,
+ ChatManager.ActionKind.maxLength + reasonMaxLength + 10,
+ )
+ }
+ if (mouseX in 0..w && mouseY in 0..(size * 10) && (isMouseButtonDown && !wasMouseButtonDown)) {
+ OSUtils.copyToClipboard(msg.message.formattedText)
+ LorenzUtils.chat("Copied to clipboard")
+ }
+ mouseY -= size * 10
+ }
+ GlScissorStack.pop(sr)
+ wasMouseButtonDown = isMouseButtonDown
+ GlStateManager.popMatrix()
+ }
+
+ fun splitLine(comp: IChatComponent): MutableList<IChatComponent> {
+ return GuiUtilRenderComponents.splitText(
+ comp,
+ w - (ChatManager.ActionKind.maxLength + reasonMaxLength + 10 + 10),
+ mc.fontRendererObj,
+ false,
+ true
+ )
+ }
+
+ override fun initGui() {
+ super.initGui()
+ if (this.scroll < 0) {
+ setScroll(1000000000.0)
+ }
+ }
+
+ fun setScroll(newScroll: Double) {
+ this.scroll = newScroll.coerceAtMost(historySize - h + 10.0).coerceAtLeast(0.0)
+ }
+
+ fun drawMultiLineText(comp: IChatComponent, xPos: Int): Int {
+ val modifiedSplitText = splitLine(comp)
+ for (line in modifiedSplitText) {
+ drawString(
+ mc.fontRendererObj,
+ line.formattedText,
+ xPos,
+ 0,
+ -1
+ )
+ GlStateManager.color(1f, 1f, 1f, 1f)
+ GlStateManager.translate(0F, 10F, 0F)
+ }
+ return modifiedSplitText.size
+ }
+
+
+ override fun handleMouseInput() {
+ super.handleMouseInput()
+ setScroll(scroll - Mouse.getEventDWheel())
+ }
+
+} \ No newline at end of file