mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-16 02:45:13 -04:00
refactor TextElement
does improve the gui api a lot, still a lot of things broken
This commit is contained in:
parent
025505074e
commit
72ebb2303d
@ -5,7 +5,7 @@ import de.bixilon.minosoft.data.text.BaseComponent
|
|||||||
import de.bixilon.minosoft.data.text.ChatComponent
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
import de.bixilon.minosoft.data.text.TextComponent
|
import de.bixilon.minosoft.data.text.TextComponent
|
||||||
import de.bixilon.minosoft.gui.rendering.font.manager.FontManager
|
import de.bixilon.minosoft.gui.rendering.font.manager.FontManager
|
||||||
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextLineInfo
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.LineRenderInfo
|
||||||
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextOffset
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextOffset
|
||||||
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderInfo
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderInfo
|
||||||
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
@ -29,7 +29,7 @@ class ChatComponentRendererTest {
|
|||||||
|
|
||||||
private fun TextRenderInfo.assert(
|
private fun TextRenderInfo.assert(
|
||||||
lineIndex: Int? = null,
|
lineIndex: Int? = null,
|
||||||
lines: List<TextLineInfo>? = null,
|
lines: List<LineRenderInfo>? = null,
|
||||||
size: Vec2? = null,
|
size: Vec2? = null,
|
||||||
cutOff: Boolean = false,
|
cutOff: Boolean = false,
|
||||||
) {
|
) {
|
||||||
@ -53,7 +53,7 @@ class ChatComponentRendererTest {
|
|||||||
val info = render(TextComponent("b"))
|
val info = render(TextComponent("b"))
|
||||||
info.assert(
|
info.assert(
|
||||||
lineIndex = 0,
|
lineIndex = 0,
|
||||||
lines = listOf(TextLineInfo(BaseComponent(TextComponent("b")), 0.5f)),
|
lines = listOf(LineRenderInfo(BaseComponent(TextComponent("b")), 0.5f)),
|
||||||
size = Vec2(0.5f, 11.0f),
|
size = Vec2(0.5f, 11.0f),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -62,7 +62,7 @@ class ChatComponentRendererTest {
|
|||||||
val info = render(TextComponent("bc"))
|
val info = render(TextComponent("bc"))
|
||||||
info.assert(
|
info.assert(
|
||||||
lineIndex = 0,
|
lineIndex = 0,
|
||||||
lines = listOf(TextLineInfo(BaseComponent(TextComponent("bc")), 2.5f)),
|
lines = listOf(LineRenderInfo(BaseComponent(TextComponent("bc")), 2.5f)),
|
||||||
size = Vec2(2.5f, 11.0f), // b + spacing + c
|
size = Vec2(2.5f, 11.0f), // b + spacing + c
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -71,7 +71,7 @@ class ChatComponentRendererTest {
|
|||||||
val info = render(TextComponent("bcd"))
|
val info = render(TextComponent("bcd"))
|
||||||
info.assert(
|
info.assert(
|
||||||
lineIndex = 0,
|
lineIndex = 0,
|
||||||
lines = listOf(TextLineInfo(BaseComponent(TextComponent("bcd")), 5.0f)),
|
lines = listOf(LineRenderInfo(BaseComponent(TextComponent("bcd")), 5.0f)),
|
||||||
size = Vec2(5.0f, 11.0f),
|
size = Vec2(5.0f, 11.0f),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -81,8 +81,8 @@ class ChatComponentRendererTest {
|
|||||||
info.assert(
|
info.assert(
|
||||||
lineIndex = 1,
|
lineIndex = 1,
|
||||||
lines = listOf(
|
lines = listOf(
|
||||||
TextLineInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
LineRenderInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
||||||
TextLineInfo(BaseComponent(TextComponent("ef")), 5.5f),
|
LineRenderInfo(BaseComponent(TextComponent("ef")), 5.5f),
|
||||||
),
|
),
|
||||||
size = Vec2(5.5f, 22.0f),
|
size = Vec2(5.5f, 22.0f),
|
||||||
)
|
)
|
||||||
@ -93,9 +93,9 @@ class ChatComponentRendererTest {
|
|||||||
info.assert(
|
info.assert(
|
||||||
lineIndex = 2,
|
lineIndex = 2,
|
||||||
lines = listOf(
|
lines = listOf(
|
||||||
TextLineInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
LineRenderInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
||||||
TextLineInfo(BaseComponent(TextComponent("ef")), 5.5f),
|
LineRenderInfo(BaseComponent(TextComponent("ef")), 5.5f),
|
||||||
TextLineInfo(BaseComponent(TextComponent("g")), 3.0f),
|
LineRenderInfo(BaseComponent(TextComponent("g")), 3.0f),
|
||||||
),
|
),
|
||||||
size = Vec2(5.5f, 33.0f),
|
size = Vec2(5.5f, 33.0f),
|
||||||
)
|
)
|
||||||
@ -106,7 +106,7 @@ class ChatComponentRendererTest {
|
|||||||
info.assert(
|
info.assert(
|
||||||
lineIndex = 0,
|
lineIndex = 0,
|
||||||
lines = listOf(
|
lines = listOf(
|
||||||
TextLineInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
LineRenderInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
||||||
),
|
),
|
||||||
size = Vec2(5.0f, 11.0f),
|
size = Vec2(5.0f, 11.0f),
|
||||||
)
|
)
|
||||||
@ -117,8 +117,8 @@ class ChatComponentRendererTest {
|
|||||||
info.assert(
|
info.assert(
|
||||||
lineIndex = 1,
|
lineIndex = 1,
|
||||||
lines = listOf(
|
lines = listOf(
|
||||||
TextLineInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
LineRenderInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
||||||
TextLineInfo(BaseComponent(TextComponent("ef")), 5.5f),
|
LineRenderInfo(BaseComponent(TextComponent("ef")), 5.5f),
|
||||||
),
|
),
|
||||||
size = Vec2(5.5f, 23.0f),
|
size = Vec2(5.5f, 23.0f),
|
||||||
)
|
)
|
||||||
@ -129,9 +129,9 @@ class ChatComponentRendererTest {
|
|||||||
info.assert(
|
info.assert(
|
||||||
lineIndex = 2,
|
lineIndex = 2,
|
||||||
lines = listOf(
|
lines = listOf(
|
||||||
TextLineInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
LineRenderInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
||||||
TextLineInfo(BaseComponent(TextComponent("ef")), 5.5f),
|
LineRenderInfo(BaseComponent(TextComponent("ef")), 5.5f),
|
||||||
TextLineInfo(BaseComponent(TextComponent("g")), 3.0f),
|
LineRenderInfo(BaseComponent(TextComponent("g")), 3.0f),
|
||||||
),
|
),
|
||||||
size = Vec2(5.5f, 35.0f),
|
size = Vec2(5.5f, 35.0f),
|
||||||
)
|
)
|
||||||
@ -142,9 +142,9 @@ class ChatComponentRendererTest {
|
|||||||
info.assert(
|
info.assert(
|
||||||
lineIndex = 2,
|
lineIndex = 2,
|
||||||
lines = listOf(
|
lines = listOf(
|
||||||
TextLineInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
LineRenderInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
||||||
TextLineInfo(BaseComponent(TextComponent("ef")), 5.5f),
|
LineRenderInfo(BaseComponent(TextComponent("ef")), 5.5f),
|
||||||
TextLineInfo(BaseComponent(TextComponent("g")), 3.0f),
|
LineRenderInfo(BaseComponent(TextComponent("g")), 3.0f),
|
||||||
),
|
),
|
||||||
size = Vec2(5.5f, 73.0f),
|
size = Vec2(5.5f, 73.0f),
|
||||||
)
|
)
|
||||||
@ -155,7 +155,7 @@ class ChatComponentRendererTest {
|
|||||||
info.assert(
|
info.assert(
|
||||||
lineIndex = 1,
|
lineIndex = 1,
|
||||||
lines = listOf(
|
lines = listOf(
|
||||||
TextLineInfo(BaseComponent(), 0.0f),
|
LineRenderInfo(BaseComponent(), 0.0f),
|
||||||
),
|
),
|
||||||
size = Vec2(0.0f, 11.0f),
|
size = Vec2(0.0f, 11.0f),
|
||||||
)
|
)
|
||||||
@ -166,8 +166,8 @@ class ChatComponentRendererTest {
|
|||||||
info.assert(
|
info.assert(
|
||||||
lineIndex = 1,
|
lineIndex = 1,
|
||||||
lines = listOf(
|
lines = listOf(
|
||||||
TextLineInfo(BaseComponent(TextComponent("b")), 0.5f),
|
LineRenderInfo(BaseComponent(TextComponent("b")), 0.5f),
|
||||||
TextLineInfo(BaseComponent(TextComponent("b")), 0.5f),
|
LineRenderInfo(BaseComponent(TextComponent("b")), 0.5f),
|
||||||
),
|
),
|
||||||
size = Vec2(0.5f, 22.0f),
|
size = Vec2(0.5f, 22.0f),
|
||||||
)
|
)
|
||||||
@ -178,9 +178,9 @@ class ChatComponentRendererTest {
|
|||||||
info.assert(
|
info.assert(
|
||||||
lineIndex = 2,
|
lineIndex = 2,
|
||||||
lines = listOf(
|
lines = listOf(
|
||||||
TextLineInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
LineRenderInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
||||||
TextLineInfo(BaseComponent(), 0.0f),
|
LineRenderInfo(BaseComponent(), 0.0f),
|
||||||
TextLineInfo(BaseComponent(TextComponent("efgh")), 14.0f),
|
LineRenderInfo(BaseComponent(TextComponent("efgh")), 14.0f),
|
||||||
),
|
),
|
||||||
size = Vec2(14f, 33.0f),
|
size = Vec2(14f, 33.0f),
|
||||||
)
|
)
|
||||||
@ -221,7 +221,7 @@ class ChatComponentRendererTest {
|
|||||||
info.assert(
|
info.assert(
|
||||||
lineIndex = 0,
|
lineIndex = 0,
|
||||||
lines = listOf(
|
lines = listOf(
|
||||||
TextLineInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
LineRenderInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
||||||
),
|
),
|
||||||
size = Vec2(5.0f, 11.0f),
|
size = Vec2(5.0f, 11.0f),
|
||||||
cutOff = true,
|
cutOff = true,
|
||||||
@ -233,7 +233,7 @@ class ChatComponentRendererTest {
|
|||||||
info.assert(
|
info.assert(
|
||||||
lineIndex = 0,
|
lineIndex = 0,
|
||||||
lines = listOf(
|
lines = listOf(
|
||||||
TextLineInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
LineRenderInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
||||||
),
|
),
|
||||||
size = Vec2(5.0f, 11.0f),
|
size = Vec2(5.0f, 11.0f),
|
||||||
cutOff = true,
|
cutOff = true,
|
||||||
@ -245,8 +245,8 @@ class ChatComponentRendererTest {
|
|||||||
info.assert(
|
info.assert(
|
||||||
lineIndex = 1,
|
lineIndex = 1,
|
||||||
lines = listOf(
|
lines = listOf(
|
||||||
TextLineInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
LineRenderInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
||||||
TextLineInfo(BaseComponent(TextComponent("efgh")), 14.0f),
|
LineRenderInfo(BaseComponent(TextComponent("efgh")), 14.0f),
|
||||||
),
|
),
|
||||||
size = Vec2(14.0f, 22.0f),
|
size = Vec2(14.0f, 22.0f),
|
||||||
cutOff = true,
|
cutOff = true,
|
||||||
@ -269,7 +269,7 @@ class ChatComponentRendererTest {
|
|||||||
|
|
||||||
info.assert(
|
info.assert(
|
||||||
lineIndex = 1,
|
lineIndex = 1,
|
||||||
lines = listOf(TextLineInfo()),
|
lines = listOf(LineRenderInfo()),
|
||||||
size = Vec2(0.0f, 11.0f),
|
size = Vec2(0.0f, 11.0f),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -23,5 +23,6 @@ data class CharSpacing(
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val DEFAULT = CharSpacing()
|
val DEFAULT = CharSpacing()
|
||||||
|
val VERTICAL = CharSpacing(0.0f, 0.0f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ package de.bixilon.minosoft.gui.rendering.font.renderer.element
|
|||||||
import de.bixilon.minosoft.data.text.BaseComponent
|
import de.bixilon.minosoft.data.text.BaseComponent
|
||||||
import de.bixilon.minosoft.data.text.TextComponent
|
import de.bixilon.minosoft.data.text.TextComponent
|
||||||
|
|
||||||
data class TextLineInfo(
|
data class LineRenderInfo(
|
||||||
val text: BaseComponent = BaseComponent(),
|
val text: BaseComponent = BaseComponent(),
|
||||||
var width: Float = 0.0f,
|
var width: Float = 0.0f,
|
||||||
) {
|
) {
|
@ -58,7 +58,7 @@ class TextOffset(
|
|||||||
|
|
||||||
this.offset.y += height
|
this.offset.y += height
|
||||||
this.offset.x = initial.x
|
this.offset.x = initial.x
|
||||||
info.lines += TextLineInfo()
|
info.lines += LineRenderInfo()
|
||||||
info.lineIndex++
|
info.lineIndex++
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
@ -19,20 +19,20 @@ import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2Util.EMPTY
|
|||||||
class TextRenderInfo(
|
class TextRenderInfo(
|
||||||
val maxSize: Vec2,
|
val maxSize: Vec2,
|
||||||
) {
|
) {
|
||||||
val lines: MutableList<TextLineInfo> = mutableListOf()
|
val lines: MutableList<LineRenderInfo> = mutableListOf()
|
||||||
var lineIndex: Int = 0
|
var lineIndex: Int = 0
|
||||||
|
|
||||||
var size = Vec2.EMPTY
|
var size = Vec2.EMPTY
|
||||||
var cutOff = false
|
var cutOff = false
|
||||||
|
|
||||||
|
|
||||||
fun update(offset: TextOffset, properties: TextRenderProperties, width: Float): TextLineInfo {
|
fun update(offset: TextOffset, properties: TextRenderProperties, width: Float): LineRenderInfo {
|
||||||
size.x = maxOf(offset.offset.x - offset.initial.x + width, size.x)
|
size.x = maxOf(offset.offset.x - offset.initial.x + width, size.x)
|
||||||
|
|
||||||
val line: TextLineInfo
|
val line: LineRenderInfo
|
||||||
if (lineIndex == 0 && lines.isEmpty()) {
|
if (lineIndex == 0 && lines.isEmpty()) {
|
||||||
// first char of all lines
|
// first char of all lines
|
||||||
line = TextLineInfo()
|
line = LineRenderInfo()
|
||||||
lines += line
|
lines += line
|
||||||
size.y = properties.lineHeight
|
size.y = properties.lineHeight
|
||||||
} else {
|
} else {
|
||||||
@ -43,4 +43,8 @@ class TextRenderInfo(
|
|||||||
|
|
||||||
return line
|
return line
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun rewind() {
|
||||||
|
lineIndex = 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ abstract class AbstractButtonElement(
|
|||||||
text: Any,
|
text: Any,
|
||||||
disabled: Boolean = false,
|
disabled: Boolean = false,
|
||||||
) : Element(guiRenderer) {
|
) : Element(guiRenderer) {
|
||||||
protected val textElement = TextElement(guiRenderer, text, background = false, parent = this)
|
protected val textElement = TextElement(guiRenderer, text, background = null, parent = this)
|
||||||
protected abstract val disabledAtlas: AtlasElement?
|
protected abstract val disabledAtlas: AtlasElement?
|
||||||
protected abstract val normalAtlas: AtlasElement?
|
protected abstract val normalAtlas: AtlasElement?
|
||||||
protected abstract val hoveredAtlas: AtlasElement?
|
protected abstract val hoveredAtlas: AtlasElement?
|
||||||
|
@ -37,7 +37,7 @@ open class SwitchElement(
|
|||||||
parent: Element?,
|
parent: Element?,
|
||||||
var onChange: (state: Boolean) -> Unit,
|
var onChange: (state: Boolean) -> Unit,
|
||||||
) : AbstractCheckboxElement(guiRenderer) {
|
) : AbstractCheckboxElement(guiRenderer) {
|
||||||
protected val textElement = TextElement(guiRenderer, text, background = false).apply { this.parent = this@SwitchElement }
|
protected val textElement = TextElement(guiRenderer, text, background = null).apply { this.parent = this@SwitchElement }
|
||||||
private val disabledAtlas = guiRenderer.atlasManager["minosoft:switch_disabled"]
|
private val disabledAtlas = guiRenderer.atlasManager["minosoft:switch_disabled"]
|
||||||
private val normalAtlas = guiRenderer.atlasManager["minosoft:switch_normal"]
|
private val normalAtlas = guiRenderer.atlasManager["minosoft:switch_normal"]
|
||||||
private val hoveredAtlas = guiRenderer.atlasManager["minosoft:switch_hovered"]
|
private val hoveredAtlas = guiRenderer.atlasManager["minosoft:switch_hovered"]
|
||||||
|
@ -22,6 +22,8 @@ import de.bixilon.minosoft.data.registries.item.stack.StackableItem
|
|||||||
import de.bixilon.minosoft.data.text.ChatComponent
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
import de.bixilon.minosoft.data.text.TextComponent
|
import de.bixilon.minosoft.data.text.TextComponent
|
||||||
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.CharSpacing
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
||||||
@ -42,7 +44,7 @@ class RawItemElement(
|
|||||||
stack: ItemStack?,
|
stack: ItemStack?,
|
||||||
parent: Element?,
|
parent: Element?,
|
||||||
) : Element(guiRenderer) {
|
) : Element(guiRenderer) {
|
||||||
private val countText = TextElement(guiRenderer, "", background = false, noBorder = true)
|
private val countText = TextElement(guiRenderer, "", background = null, properties = TextRenderProperties(charSpacing = CharSpacing.VERTICAL))
|
||||||
|
|
||||||
var _stack: ItemStack? = null
|
var _stack: ItemStack? = null
|
||||||
set(value) {
|
set(value) {
|
||||||
|
@ -13,15 +13,16 @@
|
|||||||
|
|
||||||
package de.bixilon.minosoft.gui.rendering.gui.elements.text
|
package de.bixilon.minosoft.gui.rendering.gui.elements.text
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.text.EmptyComponent
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
|
||||||
|
|
||||||
class AutoTextElement(
|
class AutoTextElement(
|
||||||
guiRenderer: GUIRenderer,
|
guiRenderer: GUIRenderer,
|
||||||
var interval: Int,
|
var interval: Int,
|
||||||
alignment: HorizontalAlignments = HorizontalAlignments.LEFT,
|
properties: TextRenderProperties = TextRenderProperties.DEFAULT,
|
||||||
private val updater: () -> Any,
|
private val updater: () -> Any,
|
||||||
) : TextElement(guiRenderer, "", alignment) {
|
) : TextElement(guiRenderer, EmptyComponent, properties = properties) {
|
||||||
private var remainingTicks = 0
|
private var remainingTicks = 0
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
@ -16,11 +16,12 @@ package de.bixilon.minosoft.gui.rendering.gui.elements.text
|
|||||||
import de.bixilon.kotlinglm.vec2.Vec2i
|
import de.bixilon.kotlinglm.vec2.Vec2i
|
||||||
import de.bixilon.kutil.primitive.BooleanUtil.decide
|
import de.bixilon.kutil.primitive.BooleanUtil.decide
|
||||||
import de.bixilon.kutil.time.TimeUtil
|
import de.bixilon.kutil.time.TimeUtil
|
||||||
|
import de.bixilon.kutil.time.TimeUtil.millis
|
||||||
import de.bixilon.minosoft.data.text.formatting.color.RGBColor
|
import de.bixilon.minosoft.data.text.formatting.color.RGBColor
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.Pollable
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Pollable
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
|
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions
|
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions
|
||||||
@ -33,19 +34,16 @@ class FadingTextElement(
|
|||||||
var fadeInTime: Long = 100,
|
var fadeInTime: Long = 100,
|
||||||
var stayTime: Long = 1000,
|
var stayTime: Long = 1000,
|
||||||
var fadeOutTime: Long = 100,
|
var fadeOutTime: Long = 100,
|
||||||
fontAlignment: HorizontalAlignments = HorizontalAlignments.LEFT,
|
background: RGBColor? = RenderConstants.TEXT_BACKGROUND_COLOR,
|
||||||
background: Boolean = true,
|
|
||||||
backgroundColor: RGBColor = RenderConstants.TEXT_BACKGROUND_COLOR,
|
|
||||||
noBorder: Boolean = false,
|
|
||||||
parent: Element? = null,
|
parent: Element? = null,
|
||||||
scale: Float = 1.0f,
|
properties: TextRenderProperties,
|
||||||
) : TextElement(guiRenderer = guiRenderer, text = text, fontAlignment = fontAlignment, background = background, backgroundColor = backgroundColor, noBorder = noBorder, parent, scale), Pollable {
|
) : TextElement(guiRenderer = guiRenderer, text = text, background = background, parent, properties), Pollable {
|
||||||
override var cacheEnabled: Boolean
|
override var cacheEnabled: Boolean
|
||||||
get() {
|
get() {
|
||||||
if (hidden || !super.cacheEnabled) {
|
if (hidden || !super.cacheEnabled) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
val time = TimeUtil.millis
|
val time = millis()
|
||||||
return (time >= fadeInEndTime) && (time < fadeOutStartTime)
|
return (time >= fadeInEndTime) && (time < fadeOutStartTime)
|
||||||
}
|
}
|
||||||
set(value) {
|
set(value) {
|
||||||
@ -79,7 +77,7 @@ class FadingTextElement(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun show() {
|
fun show() {
|
||||||
val time = TimeUtil.millis
|
val time = millis()
|
||||||
if (time in (fadeInEndTime + 1) until fadeOutStartTime) {
|
if (time in (fadeInEndTime + 1) until fadeOutStartTime) {
|
||||||
fadeOutStartTime = time + stayTime
|
fadeOutStartTime = time + stayTime
|
||||||
} else {
|
} else {
|
||||||
@ -96,7 +94,7 @@ class FadingTextElement(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
// ToDo: Eventually fade out when fading in
|
// ToDo: Eventually fade out when fading in
|
||||||
val time = TimeUtil.millis
|
val time = millis()
|
||||||
fadeInStartTime = -1L
|
fadeInStartTime = -1L
|
||||||
fadeInEndTime = -1L
|
fadeInEndTime = -1L
|
||||||
fadeOutStartTime = time
|
fadeOutStartTime = time
|
||||||
@ -111,7 +109,7 @@ class FadingTextElement(
|
|||||||
if (hidden) {
|
if (hidden) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
val hidden = TimeUtil.millis > fadeOutEndTime
|
val hidden = millis() > fadeOutEndTime
|
||||||
if (this.hidden != hidden) {
|
if (this.hidden != hidden) {
|
||||||
this.hidden = hidden
|
this.hidden = hidden
|
||||||
return true
|
return true
|
||||||
@ -123,7 +121,7 @@ class FadingTextElement(
|
|||||||
if (hidden) {
|
if (hidden) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
val time = TimeUtil.millis
|
val time = millis()
|
||||||
if (time > fadeOutEndTime) {
|
if (time > fadeOutEndTime) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -14,11 +14,8 @@
|
|||||||
package de.bixilon.minosoft.gui.rendering.gui.elements.text
|
package de.bixilon.minosoft.gui.rendering.gui.elements.text
|
||||||
|
|
||||||
import de.bixilon.minosoft.data.text.ChatComponent
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
|
||||||
|
|
||||||
interface Labeled {
|
interface Labeled {
|
||||||
var text: Any
|
var text: Any
|
||||||
val chatComponent: ChatComponent
|
val chatComponent: ChatComponent
|
||||||
|
|
||||||
val fontAlignment: HorizontalAlignments
|
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ package de.bixilon.minosoft.gui.rendering.gui.elements.text
|
|||||||
import de.bixilon.kotlinglm.vec2.Vec2
|
import de.bixilon.kotlinglm.vec2.Vec2
|
||||||
import de.bixilon.kotlinglm.vec2.Vec2i
|
import de.bixilon.kotlinglm.vec2.Vec2i
|
||||||
import de.bixilon.kutil.cast.CastUtil.unsafeNull
|
import de.bixilon.kutil.cast.CastUtil.unsafeNull
|
||||||
import de.bixilon.kutil.primitive.BooleanUtil.decide
|
import de.bixilon.kutil.exception.Broken
|
||||||
import de.bixilon.minosoft.Minosoft
|
import de.bixilon.minosoft.Minosoft
|
||||||
import de.bixilon.minosoft.data.text.ChatComponent
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
import de.bixilon.minosoft.data.text.EmptyComponent
|
import de.bixilon.minosoft.data.text.EmptyComponent
|
||||||
@ -24,14 +24,12 @@ import de.bixilon.minosoft.data.text.TextComponent
|
|||||||
import de.bixilon.minosoft.data.text.formatting.color.RGBColor
|
import de.bixilon.minosoft.data.text.formatting.color.RGBColor
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
||||||
import de.bixilon.minosoft.gui.rendering.font.renderer.component.ChatComponentRenderer
|
import de.bixilon.minosoft.gui.rendering.font.renderer.component.ChatComponentRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.font.renderer.element.CharSpacing
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.LineRenderInfo
|
||||||
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextOffset
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextOffset
|
||||||
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderInfo
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderInfo
|
||||||
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.font.types.font.Font
|
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments.Companion.getOffset
|
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments.Companion.getOffset
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.input.mouse.MouseActions
|
import de.bixilon.minosoft.gui.rendering.gui.input.mouse.MouseActions
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.input.mouse.MouseButtons
|
import de.bixilon.minosoft.gui.rendering.gui.input.mouse.MouseButtons
|
||||||
@ -39,29 +37,23 @@ import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIMesh
|
|||||||
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
|
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions
|
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions
|
||||||
import de.bixilon.minosoft.gui.rendering.system.window.CursorShapes
|
import de.bixilon.minosoft.gui.rendering.system.window.CursorShapes
|
||||||
|
import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2Util.EMPTY
|
||||||
import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2Util.MAX
|
import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2Util.MAX
|
||||||
import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2iUtil.EMPTY
|
|
||||||
import de.bixilon.minosoft.gui.rendering.util.vec.vec4.Vec4iUtil.offset
|
import de.bixilon.minosoft.gui.rendering.util.vec.vec4.Vec4iUtil.offset
|
||||||
import de.bixilon.minosoft.util.KUtil.charCount
|
import de.bixilon.minosoft.util.KUtil.charCount
|
||||||
|
|
||||||
open class TextElement(
|
open class TextElement(
|
||||||
guiRenderer: GUIRenderer,
|
guiRenderer: GUIRenderer,
|
||||||
text: Any,
|
text: Any,
|
||||||
override var fontAlignment: HorizontalAlignments = HorizontalAlignments.LEFT,
|
background: RGBColor? = RenderConstants.TEXT_BACKGROUND_COLOR,
|
||||||
background: Boolean = true,
|
|
||||||
var backgroundColor: RGBColor = RenderConstants.TEXT_BACKGROUND_COLOR,
|
|
||||||
noBorder: Boolean = false,
|
|
||||||
parent: Element? = null,
|
parent: Element? = null,
|
||||||
scale: Float = 1.0f,
|
properties: TextRenderProperties = TextRenderProperties.DEFAULT,
|
||||||
shadow: Boolean = true,
|
|
||||||
) : Element(guiRenderer, text.charCount * 6 * GUIMesh.GUIMeshStruct.FLOATS_PER_VERTEX), Labeled {
|
) : Element(guiRenderer, text.charCount * 6 * GUIMesh.GUIMeshStruct.FLOATS_PER_VERTEX), Labeled {
|
||||||
private var activeElement: TextComponent? = null
|
private var activeElement: TextComponent? = null
|
||||||
lateinit var info: TextRenderInfo
|
lateinit var info: TextRenderInfo
|
||||||
private set
|
private set
|
||||||
|
|
||||||
// ToDo: Reapply if backgroundColor or fontAlignment changes
|
var background: RGBColor? = background
|
||||||
|
|
||||||
var scale: Float = scale
|
|
||||||
set(value) {
|
set(value) {
|
||||||
if (field == value) {
|
if (field == value) {
|
||||||
return
|
return
|
||||||
@ -69,35 +61,14 @@ open class TextElement(
|
|||||||
field = value
|
field = value
|
||||||
cacheUpToDate = false
|
cacheUpToDate = false
|
||||||
}
|
}
|
||||||
var background: Boolean = background
|
var properties: TextRenderProperties = properties
|
||||||
set(value) {
|
set(value) {
|
||||||
if (field == value) {
|
if (field == value) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
field = value
|
field = value
|
||||||
cacheUpToDate = false
|
|
||||||
}
|
|
||||||
var shadow: Boolean = shadow
|
|
||||||
set(value) {
|
|
||||||
if (field == value) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
field = value
|
|
||||||
cacheUpToDate = false
|
|
||||||
}
|
|
||||||
var noBorder: Boolean = noBorder
|
|
||||||
@Synchronized set(value) {
|
|
||||||
if (field == value) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
field = value
|
|
||||||
applyNoBorder()
|
|
||||||
forceApply()
|
forceApply()
|
||||||
}
|
}
|
||||||
var charHeight: Int = 0
|
|
||||||
private set
|
|
||||||
var charMargin: Int = 0
|
|
||||||
private set
|
|
||||||
|
|
||||||
override var size: Vec2i
|
override var size: Vec2i
|
||||||
get() = super.size
|
get() = super.size
|
||||||
@ -109,7 +80,7 @@ open class TextElement(
|
|||||||
field = value
|
field = value
|
||||||
}
|
}
|
||||||
|
|
||||||
private var emptyMessage: Boolean = true
|
private var empty: Boolean = true
|
||||||
|
|
||||||
var _chatComponent: ChatComponent = unsafeNull()
|
var _chatComponent: ChatComponent = unsafeNull()
|
||||||
set(value) {
|
set(value) {
|
||||||
@ -117,20 +88,8 @@ open class TextElement(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
field = value
|
field = value
|
||||||
emptyMessage = value is EmptyComponent || value.message.isEmpty()
|
empty = value is EmptyComponent || value.message.isEmpty()
|
||||||
val prefSize = Vec2i.EMPTY
|
updatePrefSize(value)
|
||||||
if (!emptyMessage) {
|
|
||||||
val info = TextRenderInfo(Vec2.MAX)
|
|
||||||
val properties = TextRenderProperties(
|
|
||||||
alignment = fontAlignment,
|
|
||||||
charBaseHeight = charHeight.toFloat(),
|
|
||||||
charSpacing = CharSpacing(charMargin.toFloat(), charMargin.toFloat()),
|
|
||||||
scale = scale,
|
|
||||||
shadow = shadow,
|
|
||||||
)
|
|
||||||
ChatComponentRenderer.render(TextOffset(), context.font, properties, info, null, null, value)
|
|
||||||
}
|
|
||||||
_prefSize = prefSize
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override var chatComponent: ChatComponent
|
override var chatComponent: ChatComponent
|
||||||
@ -142,66 +101,70 @@ open class TextElement(
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
this._parent = parent
|
this._parent = parent
|
||||||
applyNoBorder()
|
|
||||||
this._chatComponent = ChatComponent.of(text)
|
this._chatComponent = ChatComponent.of(text)
|
||||||
forceSilentApply()
|
forceSilentApply()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun applyNoBorder() {
|
private fun updatePrefSize(text: ChatComponent) {
|
||||||
charHeight = (noBorder.decide(Font.CHAR_HEIGHT, Font.TOTAL_CHAR_HEIGHT) * scale).toInt()
|
var prefSize = Vec2.EMPTY
|
||||||
charMargin = (noBorder.decide(0, Font.CHAR_MARGIN) * scale).toInt()
|
if (!empty) {
|
||||||
|
val info = TextRenderInfo(Vec2.MAX)
|
||||||
|
ChatComponentRenderer.render(TextOffset(), context.font, properties, info, null, null, text)
|
||||||
|
prefSize = info.size
|
||||||
|
}
|
||||||
|
_prefSize = Vec2i(prefSize)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun forceSilentApply() {
|
private fun updateText(text: ChatComponent) {
|
||||||
val info = TextRenderInfo(Vec2(maxSize))
|
val info = TextRenderInfo(Vec2(maxSize))
|
||||||
val properties = TextRenderProperties(
|
if (!empty) {
|
||||||
alignment = fontAlignment,
|
ChatComponentRenderer.render(TextOffset(), context.font, properties, info, null, null, text)
|
||||||
charBaseHeight = charHeight.toFloat(),
|
info.rewind()
|
||||||
charSpacing = CharSpacing(charMargin.toFloat(), charMargin.toFloat()),
|
|
||||||
scale = scale,
|
|
||||||
shadow = shadow,
|
|
||||||
)
|
|
||||||
if (!emptyMessage) {
|
|
||||||
ChatComponentRenderer.render(TextOffset(), context.font, properties, info, null, null, chatComponent)
|
|
||||||
info.lineIndex = 0
|
|
||||||
}
|
}
|
||||||
this.info = info
|
this.info = info
|
||||||
|
|
||||||
this.cacheUpToDate = false
|
|
||||||
_size = Vec2i(info.size)
|
_size = Vec2i(info.size)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onChildChange(child: Element) = error("A TextElement can not have a child!")
|
override fun forceSilentApply() {
|
||||||
|
updateText(this._chatComponent)
|
||||||
|
this.cacheUpToDate = false
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onChildChange(child: Element) = Broken("A TextElement can not have a child!")
|
||||||
|
|
||||||
|
private fun GUIVertexConsumer.renderBackground(color: RGBColor, properties: TextRenderProperties, info: TextRenderInfo, offset: Vec2, options: GUIVertexOptions?) {
|
||||||
|
val start = Vec2()
|
||||||
|
val end = Vec2()
|
||||||
|
|
||||||
|
val lineHeight = properties.lineHeight
|
||||||
|
|
||||||
|
for ((index, line) in info.lines.withIndex()) {
|
||||||
|
start.x = offset.x + properties.alignment.getOffset(line.width, info.size.x)
|
||||||
|
start.y = offset.y + (index * lineHeight) + (maxOf(index - 1, 0) * properties.lineSpacing)
|
||||||
|
|
||||||
|
end.x = start.x + line.width
|
||||||
|
end.y = start.y + lineHeight
|
||||||
|
|
||||||
|
addQuad(start, end, context.textureManager.whiteTexture, color, options)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun forceRender(offset: Vec2i, consumer: GUIVertexConsumer, options: GUIVertexOptions?) {
|
override fun forceRender(offset: Vec2i, consumer: GUIVertexConsumer, options: GUIVertexOptions?) {
|
||||||
if (emptyMessage) {
|
if (empty) return
|
||||||
return
|
val info = this.info
|
||||||
}
|
val properties = this.properties
|
||||||
val initialOffset = offset + margin.offset
|
val initialOffset = Vec2(offset + margin.offset)
|
||||||
|
|
||||||
|
this.background?.let { consumer.renderBackground(it, properties, info, initialOffset, options) }
|
||||||
if (background) {
|
|
||||||
for ((line, info) in info.lines.withIndex()) {
|
|
||||||
val start = initialOffset + Vec2i(fontAlignment.getOffset(size.x.toFloat(), info.width), line * charHeight)
|
|
||||||
consumer.addQuad(start, start + Vec2i(info.width + charMargin, charHeight), context.textureManager.whiteTexture, backgroundColor, options)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var vertices = ChatComponentRenderer.calculatePrimitiveCount(chatComponent) * consumer.order.size * GUIMesh.GUIMeshStruct.FLOATS_PER_VERTEX
|
var vertices = ChatComponentRenderer.calculatePrimitiveCount(chatComponent) * consumer.order.size * GUIMesh.GUIMeshStruct.FLOATS_PER_VERTEX
|
||||||
if (shadow) {
|
if (properties.shadow) {
|
||||||
vertices *= 2
|
vertices *= 2
|
||||||
}
|
}
|
||||||
consumer.ensureSize(vertices)
|
consumer.ensureSize(vertices)
|
||||||
|
|
||||||
val properties = TextRenderProperties(
|
|
||||||
alignment = fontAlignment,
|
|
||||||
charBaseHeight = charHeight.toFloat(),
|
|
||||||
charSpacing = CharSpacing(charMargin.toFloat(), charMargin.toFloat()),
|
|
||||||
scale = scale,
|
|
||||||
shadow = shadow,
|
|
||||||
)
|
|
||||||
ChatComponentRenderer.render(TextOffset(Vec2(initialOffset)), context.font, properties, info, consumer, options, chatComponent)
|
ChatComponentRenderer.render(TextOffset(Vec2(initialOffset)), context.font, properties, info, consumer, options, chatComponent)
|
||||||
info.lineIndex = 0
|
info.rewind()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onMouseAction(position: Vec2i, button: MouseButtons, action: MouseActions, count: Int): Boolean {
|
override fun onMouseAction(position: Vec2i, button: MouseButtons, action: MouseActions, count: Int): Boolean {
|
||||||
@ -224,7 +187,7 @@ open class TextElement(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onMouseMove(position: Vec2i, absolute: Vec2i): Boolean {
|
override fun onMouseMove(position: Vec2i, absolute: Vec2i): Boolean {
|
||||||
val pair = getTextComponentAt(position)
|
val pair = getTextComponentAt(Vec2(position))
|
||||||
|
|
||||||
if (activeElement != pair?.first) {
|
if (activeElement != pair?.first) {
|
||||||
val activeElement = activeElement
|
val activeElement = activeElement
|
||||||
@ -234,9 +197,9 @@ open class TextElement(
|
|||||||
} else {
|
} else {
|
||||||
context.window.cursorShape = CursorShapes.HAND
|
context.window.cursorShape = CursorShapes.HAND
|
||||||
}
|
}
|
||||||
return (activeElement?.hoverEvent?.onMouseLeave(guiRenderer) ?: false) || (pair?.first?.hoverEvent?.onMouseEnter(guiRenderer, pair.second, absolute) ?: false)
|
return (activeElement?.hoverEvent?.onMouseLeave(guiRenderer) ?: false) || (pair?.first?.hoverEvent?.onMouseEnter(guiRenderer, Vec2i(pair.second), absolute) ?: false)
|
||||||
}
|
}
|
||||||
return pair?.first?.hoverEvent?.onMouseMove(guiRenderer, pair.second, absolute) ?: false
|
return pair?.first?.hoverEvent?.onMouseMove(guiRenderer, Vec2i(pair.second), absolute) ?: false
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onMouseLeave(): Boolean {
|
override fun onMouseLeave(): Boolean {
|
||||||
@ -254,28 +217,48 @@ open class TextElement(
|
|||||||
activeElement = null
|
activeElement = null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getTextComponentAt(position: Vec2i): Pair<TextComponent, Vec2i>? {
|
private fun TextRenderInfo.getLineAt(lineHeight: Float, lineSpacing: Float, offset: Float): Pair<LineRenderInfo, Float>? {
|
||||||
val offset = Vec2i(position)
|
var offset = offset
|
||||||
val line = info.lines.getOrNull(offset.y / charHeight) ?: return null
|
|
||||||
offset.y = offset.y % charHeight
|
|
||||||
|
|
||||||
val cutText = TextElement(guiRenderer, line.text, fontAlignment, false, backgroundColor, noBorder, parent, scale)
|
for ((index, line) in info.lines.withIndex()) {
|
||||||
cutText._prefMaxSize = Vec2i(offset.x, charHeight)
|
if (offset in 0.0f..lineHeight) {
|
||||||
cutText.forceSilentApply()
|
return Pair(line, offset)
|
||||||
|
}
|
||||||
|
offset -= lineHeight
|
||||||
|
if (index > 0) {
|
||||||
|
offset -= lineSpacing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated("int")
|
||||||
|
private fun getTextComponentAt(position: Vec2i): Pair<TextComponent, Vec2i>? = getTextComponentAt(Vec2(position))?.let { Pair(it.first, Vec2i(it.second)) }
|
||||||
|
|
||||||
|
private fun getTextComponentAt(position: Vec2): Pair<TextComponent, Vec2>? {
|
||||||
|
val offset = Vec2(position)
|
||||||
|
val info = this.info
|
||||||
|
val properties = this.properties
|
||||||
|
val (line, yOffset) = info.getLineAt(properties.lineHeight, properties.lineSpacing, offset.y) ?: return null
|
||||||
|
offset.y = yOffset
|
||||||
|
|
||||||
|
|
||||||
val line0 = cutText.info.lines.getOrNull(0) ?: return null
|
val cutInfo = TextRenderInfo(Vec2(offset.x, properties.lineHeight))
|
||||||
|
val cut = ChatComponentRenderer.render(TextOffset(), context.font, properties, cutInfo, null, null, line.text)
|
||||||
|
|
||||||
|
val line0 = cutInfo.lines.getOrNull(0) ?: return null
|
||||||
val message = line0.text.message
|
val message = line0.text.message
|
||||||
var charToCheck = message.length
|
var charToCheck = message.length
|
||||||
if (line0.width < offset.x && charToCheck < line.text.message.length) {
|
if (cut) {
|
||||||
// last char got cut off
|
// last char got cut off
|
||||||
charToCheck++
|
charToCheck++
|
||||||
}
|
}
|
||||||
val text = line.text.getTextAt(charToCheck)
|
val text = line.text.getTextAt(charToCheck)
|
||||||
offset.x -= line0.width.toInt() // ToDo: Not 100% correct
|
offset.x -= line0.width // TODO: the cut part of the last char is missing
|
||||||
|
|
||||||
|
|
||||||
offset.x += fontAlignment.getOffset(size.x, line.width.toInt())
|
offset.x += properties.alignment.getOffset(info.size.x, line.width)
|
||||||
return Pair(text, offset)
|
return Pair(text, offset)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,7 +118,7 @@ open class TextFlowElement(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ToDo: Cache lines
|
// ToDo: Cache lines
|
||||||
val textElement = TextElement(guiRenderer, message.text, background = false, parent = this)
|
val textElement = TextElement(guiRenderer, message.text, background = null, parent = this)
|
||||||
val lines = textElement.info.lines
|
val lines = textElement.info.lines
|
||||||
|
|
||||||
val lineIterator = lines.reversed().iterator()
|
val lineIterator = lines.reversed().iterator()
|
||||||
@ -143,7 +143,7 @@ open class TextFlowElement(
|
|||||||
if (visibleLines.size >= maxLines) {
|
if (visibleLines.size >= maxLines) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
val lineElement = TextElement(guiRenderer, line.text, background = false)
|
val lineElement = TextElement(guiRenderer, line.text, background = null)
|
||||||
textSize = textSize.max(lineElement.size)
|
textSize = textSize.max(lineElement.size)
|
||||||
visibleLines += TextFlowLineElement(lineElement, message)
|
visibleLines += TextFlowLineElement(lineElement, message)
|
||||||
}
|
}
|
||||||
|
@ -19,10 +19,9 @@ import de.bixilon.minosoft.data.text.ChatComponent
|
|||||||
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
||||||
import de.bixilon.minosoft.data.text.formatting.color.RGBColor
|
import de.bixilon.minosoft.data.text.formatting.color.RGBColor
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
||||||
import de.bixilon.minosoft.gui.rendering.font.types.font.Font
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.primitive.ColorElement
|
import de.bixilon.minosoft.gui.rendering.gui.elements.primitive.ColorElement
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement
|
import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.input.ModifierKeys
|
import de.bixilon.minosoft.gui.rendering.gui.input.ModifierKeys
|
||||||
@ -33,14 +32,10 @@ import de.bixilon.minosoft.gui.rendering.system.window.KeyChangeTypes
|
|||||||
class MarkTextElement(
|
class MarkTextElement(
|
||||||
guiRenderer: GUIRenderer,
|
guiRenderer: GUIRenderer,
|
||||||
text: Any,
|
text: Any,
|
||||||
fontAlignment: HorizontalAlignments = HorizontalAlignments.LEFT,
|
background: RGBColor? = RenderConstants.TEXT_BACKGROUND_COLOR,
|
||||||
background: Boolean = true,
|
|
||||||
backgroundColor: RGBColor = RenderConstants.TEXT_BACKGROUND_COLOR,
|
|
||||||
noBorder: Boolean = false,
|
|
||||||
parent: Element? = null,
|
parent: Element? = null,
|
||||||
scale: Float = 1.0f,
|
properties: TextRenderProperties = TextRenderProperties.DEFAULT,
|
||||||
shadow: Boolean = true,
|
) : TextElement(guiRenderer, text, background, parent, properties) {
|
||||||
) : TextElement(guiRenderer, text, fontAlignment, background, backgroundColor, noBorder, parent, scale, shadow) {
|
|
||||||
var markStartPosition = 0
|
var markStartPosition = 0
|
||||||
var markEndPosition = 0
|
var markEndPosition = 0
|
||||||
|
|
||||||
@ -80,17 +75,17 @@ class MarkTextElement(
|
|||||||
override fun forceRender(offset: Vec2i, consumer: GUIVertexConsumer, options: GUIVertexOptions?) {
|
override fun forceRender(offset: Vec2i, consumer: GUIVertexConsumer, options: GUIVertexOptions?) {
|
||||||
if (markStartPosition >= 0) {
|
if (markStartPosition >= 0) {
|
||||||
val message = chatComponent.message // ToDo: This does not include formatting
|
val message = chatComponent.message // ToDo: This does not include formatting
|
||||||
val preMark = TextElement(guiRenderer, message.substring(0, markStartPosition), scale = scale, parent = _parent)
|
val preMark = TextElement(guiRenderer, message.substring(0, markStartPosition), properties = properties, parent = _parent)
|
||||||
val mark = TextElement(guiRenderer, message.substring(markStartPosition, markEndPosition), scale = scale, parent = _parent)
|
val mark = TextElement(guiRenderer, message.substring(markStartPosition, markEndPosition), properties = properties, parent = _parent)
|
||||||
val markOffset = Vec2i(preMark.info.lines.lastOrNull()?.width ?: 0, preMark.size.y)
|
val markOffset = Vec2i(preMark.info.lines.lastOrNull()?.width ?: 0, preMark.size.y)
|
||||||
if (markOffset.y > 0 && (preMark.info.lines.lastOrNull()?.width ?: 0.0f) <= (info.lines.lastOrNull()?.width ?: 0.0f)) {
|
if (markOffset.y > 0 && (preMark.info.lines.lastOrNull()?.width ?: 0.0f) <= (info.lines.lastOrNull()?.width ?: 0.0f)) {
|
||||||
markOffset.y -= (Font.TOTAL_CHAR_HEIGHT * scale).toInt()
|
markOffset.y -= (properties.lineHeight * properties.scale).toInt()
|
||||||
}
|
}
|
||||||
|
|
||||||
for (line in mark.info.lines) {
|
for (line in mark.info.lines) {
|
||||||
ColorElement(guiRenderer, size = Vec2i(line.width, Font.TOTAL_CHAR_HEIGHT * scale), color = ChatColors.DARK_BLUE).render(offset + markOffset, consumer, options)
|
ColorElement(guiRenderer, size = Vec2i(line.width, (properties.lineHeight * properties.scale).toInt()), color = ChatColors.DARK_BLUE).render(offset + markOffset, consumer, options)
|
||||||
markOffset.x = 0
|
markOffset.x = 0
|
||||||
markOffset.y += (Font.TOTAL_CHAR_HEIGHT * scale).toInt()
|
markOffset.y += (properties.lineHeight * properties.scale).toInt()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,11 +102,13 @@ class MarkTextElement(
|
|||||||
}
|
}
|
||||||
mark(0, chatComponent.message.length)
|
mark(0, chatComponent.message.length)
|
||||||
}
|
}
|
||||||
|
|
||||||
KeyCodes.KEY_C -> {
|
KeyCodes.KEY_C -> {
|
||||||
if (controlDown) {
|
if (controlDown) {
|
||||||
copy()
|
copy()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
KeyCodes.KEY_ESCAPE -> unmark()
|
KeyCodes.KEY_ESCAPE -> unmark()
|
||||||
else -> return super.onKey(key, type)
|
else -> return super.onKey(key, type)
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,9 @@ import de.bixilon.kotlinglm.vec2.Vec2i
|
|||||||
import de.bixilon.kutil.string.StringUtil.codePointAtOrNull
|
import de.bixilon.kutil.string.StringUtil.codePointAtOrNull
|
||||||
import de.bixilon.minosoft.config.key.KeyCodes
|
import de.bixilon.minosoft.config.key.KeyCodes
|
||||||
import de.bixilon.minosoft.data.text.TextComponent
|
import de.bixilon.minosoft.data.text.TextComponent
|
||||||
|
import de.bixilon.minosoft.data.text.formatting.color.RGBColor
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.font.types.font.Font
|
import de.bixilon.minosoft.gui.rendering.font.types.font.Font
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
@ -41,14 +43,13 @@ open class TextInputElement(
|
|||||||
val cursorStyles: TextCursorStyles = TextCursorStyles.CLICKED,
|
val cursorStyles: TextCursorStyles = TextCursorStyles.CLICKED,
|
||||||
var editable: Boolean = true,
|
var editable: Boolean = true,
|
||||||
var onChangeCallback: () -> Unit = {},
|
var onChangeCallback: () -> Unit = {},
|
||||||
val background: Boolean = true,
|
val background: RGBColor? = null,
|
||||||
shadow: Boolean = true,
|
properties: TextRenderProperties = TextRenderProperties.DEFAULT,
|
||||||
scale: Float = 1.0f,
|
|
||||||
val cutAtSize: Boolean = false,
|
val cutAtSize: Boolean = false,
|
||||||
parent: Element? = null,
|
parent: Element? = null,
|
||||||
) : Element(guiRenderer) {
|
) : Element(guiRenderer) {
|
||||||
protected val cursor = ColorElement(guiRenderer, size = Vec2i(minOf(1.0f, scale), Font.TOTAL_CHAR_HEIGHT * scale))
|
protected val cursor = ColorElement(guiRenderer, size = Vec2i(minOf(1.0f, properties.scale), properties.lineHeight * properties.scale))
|
||||||
protected val textElement = MarkTextElement(guiRenderer, "", background = false, parent = this, scale = scale, shadow = shadow)
|
protected val textElement = MarkTextElement(guiRenderer, "", background = null, parent = this, properties = properties)
|
||||||
protected val backgroundElement = ColorElement(guiRenderer, Vec2i.EMPTY, RenderConstants.TEXT_BACKGROUND_COLOR)
|
protected val backgroundElement = ColorElement(guiRenderer, Vec2i.EMPTY, RenderConstants.TEXT_BACKGROUND_COLOR)
|
||||||
protected var cursorOffset: Vec2i = Vec2i.EMPTY
|
protected var cursorOffset: Vec2i = Vec2i.EMPTY
|
||||||
val _value = StringBuffer(256)
|
val _value = StringBuffer(256)
|
||||||
@ -74,7 +75,7 @@ open class TextInputElement(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun forceRender(offset: Vec2i, consumer: GUIVertexConsumer, options: GUIVertexOptions?) {
|
override fun forceRender(offset: Vec2i, consumer: GUIVertexConsumer, options: GUIVertexOptions?) {
|
||||||
if (background) {
|
if (background != null) {
|
||||||
backgroundElement.render(offset, consumer, options)
|
backgroundElement.render(offset, consumer, options)
|
||||||
}
|
}
|
||||||
textElement.render(offset, consumer, options)
|
textElement.render(offset, consumer, options)
|
||||||
@ -142,9 +143,9 @@ open class TextInputElement(
|
|||||||
val preCursorText = if (_pointer == value.length) {
|
val preCursorText = if (_pointer == value.length) {
|
||||||
textElement
|
textElement
|
||||||
} else {
|
} else {
|
||||||
TextElement(guiRenderer, value.substring(0, _pointer), scale = textElement.scale, parent = this)
|
TextElement(guiRenderer, value.substring(0, _pointer), properties = textElement.properties, parent = this)
|
||||||
}
|
}
|
||||||
Vec2i(preCursorText.info.lines.lastOrNull()?.width ?: 0, maxOf(preCursorText.info.lines.size - 1, 0) * preCursorText.charHeight)
|
Vec2i(preCursorText.info.lines.lastOrNull()?.width ?: 0, maxOf(preCursorText.info.lines.size - 1, 0) * preCursorText.properties.lineHeight)
|
||||||
}
|
}
|
||||||
cacheUpToDate = false
|
cacheUpToDate = false
|
||||||
}
|
}
|
||||||
@ -332,7 +333,7 @@ open class TextInputElement(
|
|||||||
if (action != MouseActions.PRESS) {
|
if (action != MouseActions.PRESS) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
val leftText = TextElement(guiRenderer, value, background = false)
|
val leftText = TextElement(guiRenderer, value, background = null)
|
||||||
leftText.prefMaxSize = Vec2i(position.x, size.y)
|
leftText.prefMaxSize = Vec2i(position.x, size.y)
|
||||||
var pointer = 0
|
var pointer = 0
|
||||||
var heightLeft = position.y
|
var heightLeft = position.y
|
||||||
|
@ -24,6 +24,8 @@ import de.bixilon.minosoft.commands.util.CommandReader
|
|||||||
import de.bixilon.minosoft.config.key.KeyCodes
|
import de.bixilon.minosoft.config.key.KeyCodes
|
||||||
import de.bixilon.minosoft.data.text.TextComponent
|
import de.bixilon.minosoft.data.text.TextComponent
|
||||||
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
||||||
|
import de.bixilon.minosoft.data.text.formatting.color.RGBColor
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.text.mark.TextCursorStyles
|
import de.bixilon.minosoft.gui.rendering.gui.elements.text.mark.TextCursorStyles
|
||||||
@ -44,12 +46,11 @@ class NodeTextInputElement(
|
|||||||
cursorStyles: TextCursorStyles = TextCursorStyles.CLICKED,
|
cursorStyles: TextCursorStyles = TextCursorStyles.CLICKED,
|
||||||
editable: Boolean = true,
|
editable: Boolean = true,
|
||||||
onChange: () -> Unit = {},
|
onChange: () -> Unit = {},
|
||||||
background: Boolean = true,
|
background: RGBColor? = null,
|
||||||
shadow: Boolean = true,
|
|
||||||
scale: Float = 1.0f,
|
|
||||||
cutAtSize: Boolean = false,
|
cutAtSize: Boolean = false,
|
||||||
parent: Element? = null,
|
parent: Element? = null,
|
||||||
) : TextInputElement(guiRenderer, value, maxLength, cursorStyles, editable, onChange, background, shadow, scale, cutAtSize, parent) {
|
properties: TextRenderProperties = TextRenderProperties.DEFAULT,
|
||||||
|
) : TextInputElement(guiRenderer, value, maxLength, cursorStyles, editable, onChange, background, properties, cutAtSize, parent) {
|
||||||
private var showError = false
|
private var showError = false
|
||||||
private val errorElement = NodeErrorElement(guiRenderer, Vec2i.EMPTY)
|
private val errorElement = NodeErrorElement(guiRenderer, Vec2i.EMPTY)
|
||||||
private val suggestions = NodeSuggestionsElement(guiRenderer, Vec2i.EMPTY, this)
|
private val suggestions = NodeSuggestionsElement(guiRenderer, Vec2i.EMPTY, this)
|
||||||
|
@ -32,7 +32,7 @@ class ItemInfoPopper(
|
|||||||
position: Vec2i,
|
position: Vec2i,
|
||||||
val stack: ItemStack,
|
val stack: ItemStack,
|
||||||
) : MouseTrackedPopper(guiRenderer, position) {
|
) : MouseTrackedPopper(guiRenderer, position) {
|
||||||
private val textElement = TextElement(guiRenderer, "", background = false, parent = this)
|
private val textElement = TextElement(guiRenderer, "", background = null, parent = this)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
forceSilentApply()
|
forceSilentApply()
|
||||||
|
@ -26,7 +26,7 @@ open class TextPopper(
|
|||||||
position: Vec2i,
|
position: Vec2i,
|
||||||
text: Any,
|
text: Any,
|
||||||
) : MouseTrackedPopper(guiRenderer, position) {
|
) : MouseTrackedPopper(guiRenderer, position) {
|
||||||
protected val textElement = TextElement(guiRenderer, text, background = false, parent = this)
|
protected val textElement = TextElement(guiRenderer, text, background = null, parent = this)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
forceSilentApply()
|
forceSilentApply()
|
||||||
|
@ -15,6 +15,7 @@ package de.bixilon.minosoft.gui.rendering.gui.gui.screen
|
|||||||
|
|
||||||
import de.bixilon.kotlinglm.vec2.Vec2i
|
import de.bixilon.kotlinglm.vec2.Vec2i
|
||||||
import de.bixilon.minosoft.data.registries.misc.event.world.handler.win.WinGameEvent
|
import de.bixilon.minosoft.data.registries.misc.event.world.handler.win.WinGameEvent
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments.Companion.getOffset
|
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments.Companion.getOffset
|
||||||
@ -28,8 +29,8 @@ import de.bixilon.minosoft.protocol.packets.c2s.play.ClientActionC2SP
|
|||||||
class CreditsScreen(
|
class CreditsScreen(
|
||||||
guiRenderer: GUIRenderer,
|
guiRenderer: GUIRenderer,
|
||||||
) : Screen(guiRenderer) {
|
) : Screen(guiRenderer) {
|
||||||
private val headerElement = TextElement(guiRenderer, "Minecraft", background = false, scale = 3.0f, parent = this)
|
private val headerElement = TextElement(guiRenderer, "Minecraft", background = null, properties = TextRenderProperties(scale = 3.0f), parent = this)
|
||||||
private val textElement = TextElement(guiRenderer, "Ähm, yes. This is not yet implemented -/-\nI don't know how to make moving text in the current gui system.\nI am so sorry...", background = false, parent = this)
|
private val textElement = TextElement(guiRenderer, "Ähm, yes. This is not yet implemented -/-\nI don't know how to make moving text in the current gui system.\nI am so sorry...", background = null, parent = this)
|
||||||
|
|
||||||
|
|
||||||
override fun forceRender(offset: Vec2i, consumer: GUIVertexConsumer, options: GUIVertexOptions?) {
|
override fun forceRender(offset: Vec2i, consumer: GUIVertexConsumer, options: GUIVertexOptions?) {
|
||||||
|
@ -24,6 +24,7 @@ import de.bixilon.minosoft.data.entities.block.sign.SignSides
|
|||||||
import de.bixilon.minosoft.data.registries.blocks.state.BlockState
|
import de.bixilon.minosoft.data.registries.blocks.state.BlockState
|
||||||
import de.bixilon.minosoft.data.registries.blocks.types.pixlyzer.entity.sign.SignBlock
|
import de.bixilon.minosoft.data.registries.blocks.types.pixlyzer.entity.sign.SignBlock
|
||||||
import de.bixilon.minosoft.data.text.ChatComponent
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.font.types.font.Font
|
import de.bixilon.minosoft.gui.rendering.font.types.font.Font
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
@ -57,10 +58,10 @@ class SignEditorScreen(
|
|||||||
val blockState: BlockState? = guiRenderer.connection.world[blockPosition],
|
val blockState: BlockState? = guiRenderer.connection.world[blockPosition],
|
||||||
val blockEntity: SignBlockEntity? = guiRenderer.connection.world.getBlockEntity(blockPosition).nullCast(),
|
val blockEntity: SignBlockEntity? = guiRenderer.connection.world.getBlockEntity(blockPosition).nullCast(),
|
||||||
) : Screen(guiRenderer), AbstractLayout<Element> {
|
) : Screen(guiRenderer), AbstractLayout<Element> {
|
||||||
private val headerElement = TextElement(guiRenderer, "Edit sign message", background = false, scale = 3.0f, parent = this)
|
private val headerElement = TextElement(guiRenderer, "Edit sign message", background = null, properties = TextRenderProperties(scale = 3.0f), parent = this)
|
||||||
private val positionElement = TextElement(guiRenderer, "at $blockPosition", background = false, parent = this)
|
private val positionElement = TextElement(guiRenderer, "at $blockPosition", background = null, parent = this)
|
||||||
private val backgroundElement = ImageElement(guiRenderer, getTexture(), uvStart = SIGN_UV_START, uvEnd = SIGN_UV_END, size = BACKGROUND_SIZE)
|
private val backgroundElement = ImageElement(guiRenderer, getTexture(), uvStart = SIGN_UV_START, uvEnd = SIGN_UV_END, size = BACKGROUND_SIZE)
|
||||||
private val lines = Array(SignBlockEntity.LINES) { TextInputElement(guiRenderer, blockEntity?.lines?.get(it)?.message ?: "", SIGN_MAX_CHARS, scale = TEXT_SCALE, background = false, cutAtSize = true, parent = this) }
|
private val lines = Array(SignBlockEntity.LINES) { TextInputElement(guiRenderer, blockEntity?.lines?.get(it)?.message ?: "", SIGN_MAX_CHARS, properties = TextRenderProperties(scale = TEXT_SCALE), background = null, cutAtSize = true, parent = this) }
|
||||||
private val doneButton = ButtonElement(guiRenderer, "Done") { guiRenderer.gui.pop() }.apply { size = Vec2i(BACKGROUND_SIZE.x, size.y);parent = this@SignEditorScreen }
|
private val doneButton = ButtonElement(guiRenderer, "Done") { guiRenderer.gui.pop() }.apply { size = Vec2i(BACKGROUND_SIZE.x, size.y);parent = this@SignEditorScreen }
|
||||||
private val lengthLimitSwitch = SwitchElement(guiRenderer, "Limit length", guiRenderer.connection.profiles.gui.sign.limitLength, parent = this) { guiRenderer.connection.profiles.gui.sign.limitLength = it; forceSilentApply() }
|
private val lengthLimitSwitch = SwitchElement(guiRenderer, "Limit length", guiRenderer.connection.profiles.gui.sign.limitLength, parent = this) { guiRenderer.connection.profiles.gui.sign.limitLength = it; forceSilentApply() }
|
||||||
override var activeElement: Element? = null
|
override var activeElement: Element? = null
|
||||||
|
@ -41,7 +41,7 @@ class EnchantmentButtonElement(
|
|||||||
override val disabledAtlas = guiRenderer.atlasManager["enchanting_table_card_disabled"]
|
override val disabledAtlas = guiRenderer.atlasManager["enchanting_table_card_disabled"]
|
||||||
override val normalAtlas = guiRenderer.atlasManager["enchanting_table_card_normal"]
|
override val normalAtlas = guiRenderer.atlasManager["enchanting_table_card_normal"]
|
||||||
override val hoveredAtlas = guiRenderer.atlasManager["enchanting_table_card_hovered"]
|
override val hoveredAtlas = guiRenderer.atlasManager["enchanting_table_card_hovered"]
|
||||||
private val levelText = TextElement(guiRenderer, ChatComponent.EMPTY, background = false)
|
private val levelText = TextElement(guiRenderer, ChatComponent.EMPTY, background = null)
|
||||||
|
|
||||||
override fun forceRender(offset: Vec2i, consumer: GUIVertexConsumer, options: GUIVertexOptions?) {
|
override fun forceRender(offset: Vec2i, consumer: GUIVertexConsumer, options: GUIVertexOptions?) {
|
||||||
super.forceRender(offset, consumer, options)
|
super.forceRender(offset, consumer, options)
|
||||||
|
@ -17,6 +17,7 @@ import de.bixilon.kotlinglm.vec2.Vec2i
|
|||||||
import de.bixilon.minosoft.data.text.ChatComponent
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
import de.bixilon.minosoft.data.text.TextComponent
|
import de.bixilon.minosoft.data.text.TextComponent
|
||||||
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.atlas.AtlasArea
|
import de.bixilon.minosoft.gui.rendering.gui.atlas.AtlasArea
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement
|
import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement
|
||||||
@ -41,7 +42,7 @@ class ContainerText(
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
text.setFallbackColor(DEFAULT_TEXT_COLOR)
|
text.setFallbackColor(DEFAULT_TEXT_COLOR)
|
||||||
val textElement = TextElement(guiRenderer, text, background = false, shadow = false)
|
val textElement = TextElement(guiRenderer, text, background = null, properties = TextRenderProperties(shadow = false))
|
||||||
textElement.prefMaxSize = area.size
|
textElement.prefMaxSize = area.size
|
||||||
|
|
||||||
return ContainerText(textElement, area.start)
|
return ContainerText(textElement, area.start)
|
||||||
|
@ -15,6 +15,7 @@ package de.bixilon.minosoft.gui.rendering.gui.gui.screen.menu.confirmation
|
|||||||
|
|
||||||
import de.bixilon.kotlinglm.vec2.Vec2i
|
import de.bixilon.kotlinglm.vec2.Vec2i
|
||||||
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.input.button.ButtonElement
|
import de.bixilon.minosoft.gui.rendering.gui.elements.input.button.ButtonElement
|
||||||
@ -46,8 +47,8 @@ abstract class AbstractConfirmationMenu(
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected fun initButtons() {
|
protected fun initButtons() {
|
||||||
add(TextElement(guiRenderer, text, HorizontalAlignments.CENTER, false, scale = 1.5f))
|
add(TextElement(guiRenderer, text, background = null, properties = TextRenderProperties(HorizontalAlignments.CENTER, scale = 1.5f)))
|
||||||
add(TextElement(guiRenderer, subtext, HorizontalAlignments.CENTER, false))
|
add(TextElement(guiRenderer, subtext, background = null, properties = TextRenderProperties(HorizontalAlignments.CENTER)))
|
||||||
add(SpacerElement(guiRenderer, Vec2i(0, 30)))
|
add(SpacerElement(guiRenderer, Vec2i(0, 30)))
|
||||||
|
|
||||||
for (button in createButtons()) {
|
for (button in createButtons()) {
|
||||||
|
@ -15,6 +15,7 @@ package de.bixilon.minosoft.gui.rendering.gui.gui.screen.menu.debug
|
|||||||
|
|
||||||
import de.bixilon.kotlinglm.vec2.Vec2i
|
import de.bixilon.kotlinglm.vec2.Vec2i
|
||||||
import de.bixilon.kotlinglm.vec3.Vec3d
|
import de.bixilon.kotlinglm.vec3.Vec3d
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.input.button.ButtonElement
|
import de.bixilon.minosoft.gui.rendering.gui.elements.input.button.ButtonElement
|
||||||
@ -28,7 +29,7 @@ class DebugMenu(guiRenderer: GUIRenderer) : Menu(guiRenderer) {
|
|||||||
private val connection = guiRenderer.connection
|
private val connection = guiRenderer.connection
|
||||||
|
|
||||||
init {
|
init {
|
||||||
add(TextElement(guiRenderer, "Debug options", HorizontalAlignments.CENTER, false))
|
add(TextElement(guiRenderer, "Debug options", properties = TextRenderProperties(HorizontalAlignments.CENTER)))
|
||||||
add(SpacerElement(guiRenderer, Vec2i(0, 10)))
|
add(SpacerElement(guiRenderer, Vec2i(0, 10)))
|
||||||
add(ButtonElement(guiRenderer, "Switch to next gamemode") { connection.util.typeChat("/gamemode ${connection.player.gamemode.next().name.lowercase()}") })
|
add(ButtonElement(guiRenderer, "Switch to next gamemode") { connection.util.typeChat("/gamemode ${connection.player.gamemode.next().name.lowercase()}") })
|
||||||
add(ButtonElement(guiRenderer, "Hack to next gamemode") {
|
add(ButtonElement(guiRenderer, "Hack to next gamemode") {
|
||||||
|
@ -19,6 +19,7 @@ import de.bixilon.minosoft.config.profile.profiles.eros.ErosProfileManager
|
|||||||
import de.bixilon.minosoft.data.language.LanguageUtil.i18n
|
import de.bixilon.minosoft.data.language.LanguageUtil.i18n
|
||||||
import de.bixilon.minosoft.gui.eros.Eros
|
import de.bixilon.minosoft.gui.eros.Eros
|
||||||
import de.bixilon.minosoft.gui.eros.util.JavaFXUtil
|
import de.bixilon.minosoft.gui.eros.util.JavaFXUtil
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.input.button.ButtonElement
|
import de.bixilon.minosoft.gui.rendering.gui.elements.input.button.ButtonElement
|
||||||
@ -34,7 +35,7 @@ import de.bixilon.minosoft.terminal.RunConfiguration
|
|||||||
class PauseMenu(guiRenderer: GUIRenderer) : Menu(guiRenderer) {
|
class PauseMenu(guiRenderer: GUIRenderer) : Menu(guiRenderer) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
add(TextElement(guiRenderer, RunConfiguration.APPLICATION_NAME, HorizontalAlignments.CENTER, false, scale = 3.0f))
|
add(TextElement(guiRenderer, RunConfiguration.APPLICATION_NAME, properties = TextRenderProperties(HorizontalAlignments.CENTER, scale = 3.0f)))
|
||||||
add(SpacerElement(guiRenderer, Vec2i(0, 20)))
|
add(SpacerElement(guiRenderer, Vec2i(0, 20)))
|
||||||
add(ButtonElement(guiRenderer, "menu.pause.back_to_game".i18n()) { guiRenderer.gui.pause(false) })
|
add(ButtonElement(guiRenderer, "menu.pause.back_to_game".i18n()) { guiRenderer.gui.pause(false) })
|
||||||
add(ButtonElement(guiRenderer, "menu.pause.options.debug".i18n()) { guiRenderer.gui.push(DebugMenu) })
|
add(ButtonElement(guiRenderer, "menu.pause.options.debug".i18n()) { guiRenderer.gui.push(DebugMenu) })
|
||||||
|
@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.gui.gui.screen.menu.pause
|
|||||||
import de.bixilon.kotlinglm.vec2.Vec2i
|
import de.bixilon.kotlinglm.vec2.Vec2i
|
||||||
import de.bixilon.kutil.observer.DataObserver.Companion.observe
|
import de.bixilon.kutil.observer.DataObserver.Companion.observe
|
||||||
import de.bixilon.minosoft.data.text.formatting.color.RGBColor
|
import de.bixilon.minosoft.data.text.formatting.color.RGBColor
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.input.button.ButtonElement
|
import de.bixilon.minosoft.gui.rendering.gui.elements.input.button.ButtonElement
|
||||||
@ -32,7 +33,7 @@ class RespawnMenu(guiRenderer: GUIRenderer) : Menu(guiRenderer) {
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
background.tint = RGBColor(0xFF, 0x00, 0x00, 0x7F)
|
background.tint = RGBColor(0xFF, 0x00, 0x00, 0x7F)
|
||||||
add(TextElement(guiRenderer, "You died!", HorizontalAlignments.CENTER, false, scale = 3.0f))
|
add(TextElement(guiRenderer, "You died!", background = null, properties = TextRenderProperties(HorizontalAlignments.CENTER, scale = 3.0f)))
|
||||||
add(SpacerElement(guiRenderer, Vec2i(0, 20)))
|
add(SpacerElement(guiRenderer, Vec2i(0, 20)))
|
||||||
if (guiRenderer.connection.world.hardcore) {
|
if (guiRenderer.connection.world.hardcore) {
|
||||||
add(TextElement(guiRenderer, "This world is hardcore, you cannot respawn!"))
|
add(TextElement(guiRenderer, "This world is hardcore, you cannot respawn!"))
|
||||||
|
@ -37,7 +37,7 @@ class BossbarElement(
|
|||||||
private var color: BossbarColors = bossbar.color
|
private var color: BossbarColors = bossbar.color
|
||||||
private var notches: BossbarNotches = bossbar.notches
|
private var notches: BossbarNotches = bossbar.notches
|
||||||
|
|
||||||
private val titleElement = TextElement(guiRenderer, text = bossbar.title, background = false, parent = this)
|
private val titleElement = TextElement(guiRenderer, text = bossbar.title, background = null, parent = this)
|
||||||
private lateinit var progress: BossbarProgressElement
|
private lateinit var progress: BossbarProgressElement
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
@ -20,6 +20,8 @@ import de.bixilon.minosoft.data.container.equipment.EquipmentSlots
|
|||||||
import de.bixilon.minosoft.data.container.stack.ItemStack
|
import de.bixilon.minosoft.data.container.stack.ItemStack
|
||||||
import de.bixilon.minosoft.data.entities.entities.player.Arms
|
import de.bixilon.minosoft.data.entities.entities.player.Arms
|
||||||
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.CharSpacing
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
||||||
@ -46,10 +48,10 @@ class HotbarElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedEl
|
|||||||
val offhand = HotbarOffhandElement(guiRenderer)
|
val offhand = HotbarOffhandElement(guiRenderer)
|
||||||
private var renderOffhand = false
|
private var renderOffhand = false
|
||||||
|
|
||||||
val hoverText = FadingTextElement(guiRenderer, text = "", fadeInTime = 300, stayTime = 3000, fadeOutTime = 500, background = false, noBorder = true)
|
val hoverText = FadingTextElement(guiRenderer, text = "", fadeInTime = 300, stayTime = 3000, fadeOutTime = 500, background = null, properties = TextRenderProperties(charSpacing = CharSpacing.VERTICAL))
|
||||||
private var hoverTextShown = false
|
private var hoverTextShown = false
|
||||||
|
|
||||||
private val itemText = FadingTextElement(guiRenderer, text = "", fadeInTime = 300, stayTime = 1500, fadeOutTime = 500, background = false, noBorder = true)
|
private val itemText = FadingTextElement(guiRenderer, text = "", fadeInTime = 300, stayTime = 1500, fadeOutTime = 500, background = null, properties = TextRenderProperties(charSpacing = CharSpacing.VERTICAL))
|
||||||
private var lastItemStackNameShown: ItemStack? = null
|
private var lastItemStackNameShown: ItemStack? = null
|
||||||
private var lastItemSlot = -1
|
private var lastItemSlot = -1
|
||||||
private var itemTextShown = true
|
private var itemTextShown = true
|
||||||
|
@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.gui.hud.elements.hotbar
|
|||||||
import de.bixilon.kotlinglm.vec2.Vec2i
|
import de.bixilon.kotlinglm.vec2.Vec2i
|
||||||
import de.bixilon.minosoft.data.text.TextComponent
|
import de.bixilon.minosoft.data.text.TextComponent
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.font.types.font.Font
|
import de.bixilon.minosoft.gui.rendering.font.types.font.Font
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
@ -61,7 +62,7 @@ class HotbarExperienceBarElement(guiRenderer: GUIRenderer) : Element(guiRenderer
|
|||||||
|
|
||||||
if (level > 0) {
|
if (level > 0) {
|
||||||
// level
|
// level
|
||||||
val text = TextElement(guiRenderer, TextComponent(level).apply { color = RenderConstants.EXPERIENCE_BAR_LEVEL_COLOR }, fontAlignment = HorizontalAlignments.CENTER, false)
|
val text = TextElement(guiRenderer, TextComponent(level).apply { color = RenderConstants.EXPERIENCE_BAR_LEVEL_COLOR }, properties = TextRenderProperties(HorizontalAlignments.CENTER, shadow = false))
|
||||||
|
|
||||||
text.render(offset + Vec2i(HorizontalAlignments.CENTER.getOffset(size.x, text.size.x), -Font.CHAR_HEIGHT + 1), consumer, options)
|
text.render(offset + Vec2i(HorizontalAlignments.CENTER.getOffset(size.x, text.size.x), -Font.CHAR_HEIGHT + 1), consumer, options)
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,7 @@ import de.bixilon.minosoft.data.world.chunk.chunk.Chunk
|
|||||||
import de.bixilon.minosoft.data.world.chunk.light.SectionLight
|
import de.bixilon.minosoft.data.world.chunk.light.SectionLight
|
||||||
import de.bixilon.minosoft.gui.rendering.entity.EntityRenderer
|
import de.bixilon.minosoft.gui.rendering.entity.EntityRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.events.ResizeWindowEvent
|
import de.bixilon.minosoft.gui.rendering.events.ResizeWindowEvent
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
||||||
@ -195,8 +196,8 @@ class DebugHUDElement(guiRenderer: GUIRenderer) : Element(guiRenderer), Layouted
|
|||||||
private fun initRight(): Element {
|
private fun initRight(): Element {
|
||||||
val layout = RowLayout(guiRenderer, HorizontalAlignments.RIGHT)
|
val layout = RowLayout(guiRenderer, HorizontalAlignments.RIGHT)
|
||||||
layout.margin = Vec4i(2)
|
layout.margin = Vec4i(2)
|
||||||
layout += TextElement(guiRenderer, "Java ${Runtime.version()} ${System.getProperty("sun.arch.data.model")}bit", HorizontalAlignments.RIGHT)
|
layout += TextElement(guiRenderer, "Java ${Runtime.version()} ${System.getProperty("sun.arch.data.model")}bit", properties = Companion.RIGHT)
|
||||||
layout += TextElement(guiRenderer, "OS ${SystemInformation.OS_TEXT}", HorizontalAlignments.RIGHT)
|
layout += TextElement(guiRenderer, "OS ${SystemInformation.OS_TEXT}", properties = Companion.RIGHT)
|
||||||
|
|
||||||
layout += LineSpacerElement(guiRenderer)
|
layout += LineSpacerElement(guiRenderer)
|
||||||
|
|
||||||
@ -217,39 +218,39 @@ class DebugHUDElement(guiRenderer: GUIRenderer) : Element(guiRenderer), Layouted
|
|||||||
|
|
||||||
layout += LineSpacerElement(guiRenderer)
|
layout += LineSpacerElement(guiRenderer)
|
||||||
|
|
||||||
layout += TextElement(guiRenderer, "CPU ${SystemInformation.PROCESSOR_TEXT}", HorizontalAlignments.RIGHT)
|
layout += TextElement(guiRenderer, "CPU ${SystemInformation.PROCESSOR_TEXT}", properties = Companion.RIGHT)
|
||||||
layout += TextElement(guiRenderer, "Memory ${SystemInformation.SYSTEM_MEMORY.formatBytes()}")
|
layout += TextElement(guiRenderer, "Memory ${SystemInformation.SYSTEM_MEMORY.formatBytes()}")
|
||||||
|
|
||||||
|
|
||||||
layout += LineSpacerElement(guiRenderer)
|
layout += LineSpacerElement(guiRenderer)
|
||||||
|
|
||||||
layout += TextElement(guiRenderer, "Display <?>", HorizontalAlignments.RIGHT).apply {
|
layout += TextElement(guiRenderer, "Display <?>", properties = Companion.RIGHT).apply {
|
||||||
guiRenderer.context.connection.events.listen<ResizeWindowEvent> {
|
guiRenderer.context.connection.events.listen<ResizeWindowEvent> {
|
||||||
text = "Display ${it.size.x.format()}x${it.size.y.format()}"
|
text = "Display ${it.size.x.format()}x${it.size.y.format()}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
context.renderSystem.apply {
|
context.renderSystem.apply {
|
||||||
layout += TextElement(guiRenderer, "GPU $gpuType", HorizontalAlignments.RIGHT)
|
layout += TextElement(guiRenderer, "GPU $gpuType", properties = Companion.RIGHT)
|
||||||
layout += TextElement(guiRenderer, "Version $version", HorizontalAlignments.RIGHT)
|
layout += TextElement(guiRenderer, "Version $version", properties = Companion.RIGHT)
|
||||||
}
|
}
|
||||||
|
|
||||||
MinosoftProperties.git?.let {
|
MinosoftProperties.git?.let {
|
||||||
layout += LineSpacerElement(guiRenderer)
|
layout += LineSpacerElement(guiRenderer)
|
||||||
|
|
||||||
MinosoftPropertiesLoader.apply {
|
MinosoftPropertiesLoader.apply {
|
||||||
layout += TextElement(guiRenderer, "Git ${it.commitShort}/${it.branch}", HorizontalAlignments.RIGHT)
|
layout += TextElement(guiRenderer, "Git ${it.commitShort}/${it.branch}", properties = Companion.RIGHT)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
layout += LineSpacerElement(guiRenderer)
|
layout += LineSpacerElement(guiRenderer)
|
||||||
|
|
||||||
layout += TextElement(guiRenderer, "${connection.events.size.format()}x listeners", HorizontalAlignments.RIGHT)
|
layout += TextElement(guiRenderer, "${connection.events.size.format()}x listeners", properties = Companion.RIGHT)
|
||||||
|
|
||||||
layout += LineSpacerElement(guiRenderer)
|
layout += LineSpacerElement(guiRenderer)
|
||||||
|
|
||||||
context.connection.camera.target.apply {
|
context.connection.camera.target.apply {
|
||||||
layout += AutoTextElement(guiRenderer, 1, HorizontalAlignments.RIGHT) {
|
layout += AutoTextElement(guiRenderer, 1, properties = Companion.RIGHT) {
|
||||||
// ToDo: Tags
|
// ToDo: Tags
|
||||||
target ?: "No target"
|
target ?: "No target"
|
||||||
}
|
}
|
||||||
@ -332,6 +333,8 @@ class DebugHUDElement(guiRenderer: GUIRenderer) : Element(guiRenderer), Layouted
|
|||||||
KeyActions.STICKY to setOf(KeyCodes.KEY_F3),
|
KeyActions.STICKY to setOf(KeyCodes.KEY_F3),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private val RIGHT = TextRenderProperties(HorizontalAlignments.RIGHT)
|
||||||
|
|
||||||
override fun build(guiRenderer: GUIRenderer): LayoutedGUIElement<DebugHUDElement> {
|
override fun build(guiRenderer: GUIRenderer): LayoutedGUIElement<DebugHUDElement> {
|
||||||
return LayoutedGUIElement(DebugHUDElement(guiRenderer)).apply { enabled = false }
|
return LayoutedGUIElement(DebugHUDElement(guiRenderer)).apply { enabled = false }
|
||||||
}
|
}
|
||||||
|
@ -31,8 +31,8 @@ class ScoreboardScoreElement(
|
|||||||
val score: ScoreboardScore,
|
val score: ScoreboardScore,
|
||||||
parent: Element?,
|
parent: Element?,
|
||||||
) : Element(guiRenderer) {
|
) : Element(guiRenderer) {
|
||||||
private val nameElement = TextElement(guiRenderer, "", background = false, parent = this)
|
private val nameElement = TextElement(guiRenderer, "", background = null, parent = this)
|
||||||
private val scoreElement = TextElement(guiRenderer, "", background = false, parent = this)
|
private val scoreElement = TextElement(guiRenderer, "", background = null, parent = this)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
nameElement.prefMaxSize = Vec2i(-1, ScoreboardSideElement.SCORE_HEIGHT)
|
nameElement.prefMaxSize = Vec2i(-1, ScoreboardSideElement.SCORE_HEIGHT)
|
||||||
|
@ -45,7 +45,7 @@ import de.bixilon.minosoft.util.KUtil.toResourceLocation
|
|||||||
class ScoreboardSideElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedElement, Initializable, AsyncDrawable {
|
class ScoreboardSideElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedElement, Initializable, AsyncDrawable {
|
||||||
private val backgroundElement = ColorElement(guiRenderer, size = Vec2i.EMPTY, color = RenderConstants.TEXT_BACKGROUND_COLOR)
|
private val backgroundElement = ColorElement(guiRenderer, size = Vec2i.EMPTY, color = RenderConstants.TEXT_BACKGROUND_COLOR)
|
||||||
private val nameBackgroundElement = ColorElement(guiRenderer, size = Vec2i.EMPTY, color = RenderConstants.TEXT_BACKGROUND_COLOR)
|
private val nameBackgroundElement = ColorElement(guiRenderer, size = Vec2i.EMPTY, color = RenderConstants.TEXT_BACKGROUND_COLOR)
|
||||||
private val nameElement = TextElement(guiRenderer, "", background = false, parent = this)
|
private val nameElement = TextElement(guiRenderer, "", background = null, parent = this)
|
||||||
private val scores: LockMap<ScoreboardScore, ScoreboardScoreElement> = lockMapOf()
|
private val scores: LockMap<ScoreboardScore, ScoreboardScoreElement> = lockMapOf()
|
||||||
|
|
||||||
override val layoutOffset: Vec2i
|
override val layoutOffset: Vec2i
|
||||||
|
@ -23,6 +23,7 @@ import de.bixilon.minosoft.config.key.KeyBinding
|
|||||||
import de.bixilon.minosoft.config.key.KeyCodes
|
import de.bixilon.minosoft.config.key.KeyCodes
|
||||||
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
||||||
import de.bixilon.minosoft.data.text.formatting.color.RGBColor
|
import de.bixilon.minosoft.data.text.formatting.color.RGBColor
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.atlas.AtlasElement
|
import de.bixilon.minosoft.gui.rendering.gui.atlas.AtlasElement
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
@ -45,8 +46,8 @@ import java.util.*
|
|||||||
import java.util.concurrent.locks.ReentrantLock
|
import java.util.concurrent.locks.ReentrantLock
|
||||||
|
|
||||||
class TabListElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedElement, Initializable, AsyncDrawable {
|
class TabListElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedElement, Initializable, AsyncDrawable {
|
||||||
val header = TextElement(guiRenderer, "", background = false, fontAlignment = HorizontalAlignments.CENTER, parent = this)
|
val header = TextElement(guiRenderer, "", background = null, properties = TextRenderProperties(HorizontalAlignments.CENTER), parent = this)
|
||||||
val footer = TextElement(guiRenderer, "", background = false, fontAlignment = HorizontalAlignments.CENTER, parent = this)
|
val footer = TextElement(guiRenderer, "", background = null, properties = TextRenderProperties(HorizontalAlignments.CENTER), parent = this)
|
||||||
|
|
||||||
private val background = ColorElement(guiRenderer, Vec2i.EMPTY, color = RGBColor(0, 0, 0, 120))
|
private val background = ColorElement(guiRenderer, Vec2i.EMPTY, color = RGBColor(0, 0, 0, 120))
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ class TabListEntryElement(
|
|||||||
private val skinElement = DynamicImageElement(guiRenderer, null, uvStart = Vec2(0.125), uvEnd = Vec2(0.25), size = Vec2i(8, 8), parent = this)
|
private val skinElement = DynamicImageElement(guiRenderer, null, uvStart = Vec2(0.125), uvEnd = Vec2(0.25), size = Vec2i(8, 8), parent = this)
|
||||||
|
|
||||||
// private val skinElement = ImageElement(guiRenderer, guiRenderer.context.textureManager.steveTexture, uvStart = Vec2(0.125), uvEnd = Vec2(0.25), size = Vec2i(512, 512))
|
// private val skinElement = ImageElement(guiRenderer, guiRenderer.context.textureManager.steveTexture, uvStart = Vec2(0.125), uvEnd = Vec2(0.25), size = Vec2i(512, 512))
|
||||||
private val nameElement = TextElement(guiRenderer, "", background = false, parent = this)
|
private val nameElement = TextElement(guiRenderer, "", background = null, parent = this)
|
||||||
private lateinit var pingElement: AtlasImageElement
|
private lateinit var pingElement: AtlasImageElement
|
||||||
|
|
||||||
private var displayName: ChatComponent = item.tabDisplayName
|
private var displayName: ChatComponent = item.tabDisplayName
|
||||||
|
@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.gui.hud.elements.title
|
|||||||
import de.bixilon.kotlinglm.vec2.Vec2i
|
import de.bixilon.kotlinglm.vec2.Vec2i
|
||||||
import de.bixilon.kutil.time.TimeUtil.millis
|
import de.bixilon.kutil.time.TimeUtil.millis
|
||||||
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
|
||||||
@ -36,8 +37,8 @@ import java.lang.Integer.max
|
|||||||
|
|
||||||
// ToDo: Remove subtitle when hidden
|
// ToDo: Remove subtitle when hidden
|
||||||
class TitleElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedElement, Initializable {
|
class TitleElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedElement, Initializable {
|
||||||
val title = FadingTextElement(guiRenderer, "", background = false, scale = 4.0f, parent = this)
|
val title = FadingTextElement(guiRenderer, "", background = null, properties = TextRenderProperties(scale = 4.0f), parent = this)
|
||||||
val subtitle = FadingTextElement(guiRenderer, "", background = false, scale = 2.0f, parent = this)
|
val subtitle = FadingTextElement(guiRenderer, "", background = null, properties = TextRenderProperties(scale = 2.0f), parent = this)
|
||||||
var fadeInTime = 0L
|
var fadeInTime = 0L
|
||||||
set(value) {
|
set(value) {
|
||||||
title.fadeInTime = value
|
title.fadeInTime = value
|
||||||
|
@ -17,6 +17,7 @@ import de.bixilon.kotlinglm.vec2.Vec2i
|
|||||||
import de.bixilon.minosoft.data.registries.identified.Identified
|
import de.bixilon.minosoft.data.registries.identified.Identified
|
||||||
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
||||||
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement
|
import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
|
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
|
||||||
@ -54,13 +55,13 @@ abstract class WawlaElement(protected val wawla: WawlaHUDElement) : Element(wawl
|
|||||||
protected fun createNameElement(translationKey: ResourceLocation?): TextElement {
|
protected fun createNameElement(translationKey: ResourceLocation?): TextElement {
|
||||||
val name = wawla.context.connection.language.forceTranslate(translationKey)
|
val name = wawla.context.connection.language.forceTranslate(translationKey)
|
||||||
name.setFallbackColor(ChatColors.WHITE)
|
name.setFallbackColor(ChatColors.WHITE)
|
||||||
return TextElement(guiRenderer, name, background = false, scale = 1.2f)
|
return TextElement(guiRenderer, name, background = null, properties = TextRenderProperties(scale = 1.2f))
|
||||||
}
|
}
|
||||||
|
|
||||||
protected fun createIdentifierElement(item: Identified): TextElement? {
|
protected fun createIdentifierElement(item: Identified): TextElement? {
|
||||||
if (!wawla.profile.identifier) {
|
if (!wawla.profile.identifier) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
return TextElement(guiRenderer, item.identifier.format(), background = false, scale = 0.8f)
|
return TextElement(guiRenderer, item.identifier.format(), background = null, properties = TextRenderProperties(scale = 1.2f))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ class BlockWawlaElement(wawla: WawlaHUDElement, val target: BlockTarget) : Wawla
|
|||||||
if (namespace == Namespaces.DEFAULT) {
|
if (namespace == Namespaces.DEFAULT) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
return TextElement(guiRenderer, TextComponent(namespace).color(ChatColors.BLUE), background = false)
|
return TextElement(guiRenderer, TextComponent(namespace).color(ChatColors.BLUE), background = null)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createAdditionalInformation(): TextElement? {
|
private fun createAdditionalInformation(): TextElement? {
|
||||||
@ -69,6 +69,6 @@ class BlockWawlaElement(wawla: WawlaHUDElement, val target: BlockTarget) : Wawla
|
|||||||
|
|
||||||
component.setFallbackColor(ChatColors.GRAY)
|
component.setFallbackColor(ChatColors.GRAY)
|
||||||
|
|
||||||
return TextElement(guiRenderer, component, background = false)
|
return TextElement(guiRenderer, component, background = null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,7 @@ import de.bixilon.minosoft.data.text.BaseComponent
|
|||||||
import de.bixilon.minosoft.data.text.ChatComponentUtil.removeTrailingNewlines
|
import de.bixilon.minosoft.data.text.ChatComponentUtil.removeTrailingNewlines
|
||||||
import de.bixilon.minosoft.data.text.TextComponent
|
import de.bixilon.minosoft.data.text.TextComponent
|
||||||
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
|
||||||
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement
|
import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement
|
||||||
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.wawla.WawlaElement
|
import de.bixilon.minosoft.gui.rendering.gui.hud.elements.wawla.WawlaElement
|
||||||
@ -50,7 +51,7 @@ class EntityWawlaElement(wawla: WawlaHUDElement, private val target: EntityTarge
|
|||||||
val name = target.entity.additional.tabDisplayName
|
val name = target.entity.additional.tabDisplayName
|
||||||
if (name.length > 0) {
|
if (name.length > 0) {
|
||||||
name.setFallbackColor(ChatColors.WHITE)
|
name.setFallbackColor(ChatColors.WHITE)
|
||||||
return TextElement(guiRenderer, name, background = false, scale = 1.2f)
|
return TextElement(guiRenderer, name, background = null, properties = TextRenderProperties(scale = 1.2f))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return createNameElement(target.entity.type.translationKey)
|
return createNameElement(target.entity.type.translationKey)
|
||||||
@ -61,7 +62,7 @@ class EntityWawlaElement(wawla: WawlaHUDElement, private val target: EntityTarge
|
|||||||
if (namespace == Namespaces.DEFAULT) {
|
if (namespace == Namespaces.DEFAULT) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
return TextElement(guiRenderer, TextComponent(namespace).color(ChatColors.BLUE), background = false)
|
return TextElement(guiRenderer, TextComponent(namespace).color(ChatColors.BLUE), background = null)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createBaseInformation(): TextElement? {
|
private fun createBaseInformation(): TextElement? {
|
||||||
@ -82,7 +83,7 @@ class EntityWawlaElement(wawla: WawlaHUDElement, private val target: EntityTarge
|
|||||||
|
|
||||||
component.setFallbackColor(ChatColors.GRAY)
|
component.setFallbackColor(ChatColors.GRAY)
|
||||||
|
|
||||||
return TextElement(guiRenderer, component, background = false)
|
return TextElement(guiRenderer, component, background = null)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createAdditionalInformation(): TextElement? {
|
private fun createAdditionalInformation(): TextElement? {
|
||||||
@ -95,6 +96,6 @@ class EntityWawlaElement(wawla: WawlaHUDElement, private val target: EntityTarge
|
|||||||
|
|
||||||
text.setFallbackColor(ChatColors.GRAY)
|
text.setFallbackColor(ChatColors.GRAY)
|
||||||
|
|
||||||
return TextElement(guiRenderer, text, background = false)
|
return TextElement(guiRenderer, text, background = null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user