chat box: set background dynamically

This commit is contained in:
Bixilon 2021-05-01 22:49:17 +02:00
parent c23a4a9970
commit 8e4ffe5962
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
2 changed files with 9 additions and 14 deletions

View File

@ -16,9 +16,9 @@ package de.bixilon.minosoft.gui.rendering.hud.elements.input
import de.bixilon.minosoft.config.key.KeyCodes
import de.bixilon.minosoft.data.text.ChatComponent
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.font.text.TextSetProperties
import de.bixilon.minosoft.gui.rendering.hud.nodes.layout.AbsoluteLayout
import de.bixilon.minosoft.gui.rendering.hud.nodes.primitive.LabelNode
import de.bixilon.minosoft.gui.rendering.hud.nodes.properties.NodeSizing
import de.bixilon.minosoft.util.MMath
import glm_.vec2.Vec2i
@ -26,9 +26,10 @@ import glm_.vec2.Vec2i
open class TextField(
renderWindow: RenderWindow,
val properties: TextFieldProperties,
) : AbsoluteLayout(renderWindow), KeyConsumer, MouseConsumer {
sizing: NodeSizing = NodeSizing(),
) : AbsoluteLayout(renderWindow, sizing = sizing), KeyConsumer, MouseConsumer {
private var textBuilder: StringBuilder = StringBuilder(properties.defaultText)
val textElement = LabelNode(renderWindow, sizing = sizing.copy(), setProperties = TextSetProperties(hardWrap = 100), text = ChatComponent.of(text), background = false)
val textElement = LabelNode(renderWindow, sizing = sizing.copy(), text = ChatComponent.of(text))
private var position = text.length
var text: String

View File

@ -15,22 +15,15 @@ package de.bixilon.minosoft.gui.rendering.hud.nodes.chat
import de.bixilon.minosoft.config.config.game.controls.KeyBindingsNames
import de.bixilon.minosoft.gui.rendering.RenderConstants
import de.bixilon.minosoft.gui.rendering.font.Font
import de.bixilon.minosoft.gui.rendering.hud.HUDRenderer
import de.bixilon.minosoft.gui.rendering.hud.elements.input.TextField
import de.bixilon.minosoft.gui.rendering.hud.elements.input.TextFieldProperties
import de.bixilon.minosoft.gui.rendering.hud.nodes.HUDElement
import de.bixilon.minosoft.gui.rendering.hud.nodes.primitive.ImageNode
import de.bixilon.minosoft.gui.rendering.hud.nodes.properties.NodeSizing
import de.bixilon.minosoft.gui.rendering.hud.nodes.properties.Spacing
import de.bixilon.minosoft.gui.rendering.util.abstractions.ScreenResizeCallback
import de.bixilon.minosoft.util.MMath
import glm_.vec2.Vec2i
class ChatBoxHUDElement(hudRenderer: HUDRenderer) : HUDElement(hudRenderer), ScreenResizeCallback {
private lateinit var inputField: TextField
private var inputFieldBackground = ImageNode(hudRenderer.renderWindow, sizing = NodeSizing(margin = Spacing(left = 1, right = 1)), textureLike = hudRenderer.renderWindow.WHITE_TEXTURE, z = 0, tintColor = RenderConstants.TEXT_BACKGROUND_COLOR)
override fun init() {
inputField = TextField(
@ -40,7 +33,8 @@ class ChatBoxHUDElement(hudRenderer: HUDRenderer) : HUDElement(hudRenderer), Scr
submitCloses = true,
onSubmit = { hudRenderer.renderWindow.connection.sender.sendChatMessage(it) },
onClose = { closeChat() },
))
),
)
layout.addChild(Vec2i(0, 0), inputField)
inputField.apply()
@ -52,19 +46,19 @@ class ChatBoxHUDElement(hudRenderer: HUDRenderer) : HUDElement(hudRenderer), Scr
override fun onScreenResize(screenDimensions: Vec2i) {
layout.sizing.minSize.x = screenDimensions.x
inputFieldBackground.sizing.forceSize = Vec2i(screenDimensions.x - 2, MMath.clamp(inputField.textElement.getProperties.lines, 1, Int.MAX_VALUE) * (Font.CHAR_HEIGHT + RenderConstants.TEXT_LINE_PADDING)) // 2 pixels for margin
inputField.sizing.minSize.x = screenDimensions.x
inputField.sizing.maxSize.x = screenDimensions.x
layout.sizing.maxSize.x = screenDimensions.x
inputField.textElement.setProperties.hardWrap = inputField.textElement.sizing.minSize.x
layout.sizing.validate()
layout.apply()
}
fun openChat() {
layout.addChild(Vec2i(0, 0), inputFieldBackground)
hudRenderer.renderWindow.inputHandler.currentKeyConsumer = inputField
}
fun closeChat() {
layout.removeChild(inputFieldBackground)
hudRenderer.renderWindow.inputHandler.currentKeyConsumer = null
}
}