Skip to content

Commit 371dc9a

Browse files
committed
Added Language Settings, done most of the requested fixes.
Slider bars still are wonky, I will rewrite that. Controls are still not working, I am unsure how can I make something that looks good with current UI and menus. Do we... even support resource packs lmao?
1 parent dbfd760 commit 371dc9a

File tree

12 files changed

+736
-86
lines changed

12 files changed

+736
-86
lines changed

src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/input/button/AbstractButtonElement.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
package de.bixilon.minosoft.gui.rendering.gui.elements.input.button
1515

1616
import de.bixilon.kmath.vec.vec2.f.Vec2f
17-
import de.bixilon.kmath.vec.vec2.i.Vec2i
1817
import de.bixilon.minosoft.config.key.KeyCodes
1918
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
2019
import de.bixilon.minosoft.gui.rendering.gui.atlas.AtlasElement
@@ -28,10 +27,11 @@ import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement
2827
import de.bixilon.minosoft.gui.rendering.gui.input.mouse.MouseActions
2928
import de.bixilon.minosoft.gui.rendering.gui.input.mouse.MouseButtons
3029
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions
30+
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions.Companion.copy
3131
import de.bixilon.minosoft.gui.rendering.gui.mesh.consumer.GuiVertexConsumer
3232
import de.bixilon.minosoft.gui.rendering.system.window.CursorShapes
3333
import de.bixilon.minosoft.gui.rendering.system.window.KeyChangeTypes
34-
import de.bixilon.minosoft.util.KUtil.toResourceLocation
34+
import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft
3535

3636
abstract class AbstractButtonElement(
3737
guiRenderer: GUIRenderer,
@@ -114,8 +114,7 @@ abstract class AbstractButtonElement(
114114
background.size = size
115115
val textSize = textElement.size
116116

117-
// Apply reduced opacity when disabled
118-
val renderOptions = if (disabled) GUIVertexOptions(alpha = 0.4f) else options
117+
val renderOptions = if (disabled) options.copy(alpha = 0.4f) else options
119118

120119
background.render(offset, consumer, renderOptions)
121120
textElement.render(offset + Vec2f(HorizontalAlignments.CENTER.getOffset(size.x, textSize.x), VerticalAlignments.CENTER.getOffset(size.y, textSize.y)), consumer, renderOptions)
@@ -184,15 +183,15 @@ abstract class AbstractButtonElement(
184183
override fun onChildChange(child: Element) {
185184
if (child == textElement) {
186185
if (dynamicSized) {
187-
size = textElement.size + Vec2i(TEXT_PADDING * 2, TEXT_PADDING * 2)
186+
size = textElement.size + Vec2f(TEXT_PADDING * 2, TEXT_PADDING * 2)
188187
}
189188
cacheUpToDate = false
190189
}
191190
parent?.onChildChange(this)
192191
}
193192

194193
private companion object {
195-
val CLICK_SOUND = "minecraft:ui.button.click".toResourceLocation()
194+
val CLICK_SOUND = minecraft("ui.button.click") // This still doesnt play sound for some reason...
196195
const val TEXT_PADDING = 4
197196
}
198197
}

src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/input/slider/SliderElement.kt

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class SliderElement(
5454
init {
5555
textElement = TextElement(guiRenderer, getDisplayText(), background = null, parent = this)
5656
updateText()
57-
// Set initial size based on text element size plus padding (similar to ButtonElement)
57+
// Set initial size based on text element size with padding (similar to ButtonElement)
5858
size = Vec2f(textElement.size.x + TEXT_PADDING * 2, 20.0f)
5959
}
6060

@@ -65,7 +65,6 @@ class SliderElement(
6565
private fun updateText() {
6666
textElement.text = getDisplayText()
6767
textElement.silentApply()
68-
// Update size when text changes
6968
if (size.x == 0.0f) {
7069
size = Vec2f(textElement.size.x + TEXT_PADDING * 2, 20.0f)
7170
}
@@ -80,23 +79,17 @@ class SliderElement(
8079
val size = size
8180
val sliderHeight = 20.0f
8281

83-
// Render background (button texture)
8482
val background = AtlasImageElement(guiRenderer, buttonAtlas?.get("normal") ?: guiRenderer.context.textures.whiteTexture)
8583
background.size = size
8684
background.render(offset, consumer, options)
8785

88-
// Calculate slider position (0.0 to 1.0)
8986
val normalizedValue = (value - min) / (max - min)
9087
val sliderWidth = 8.0f
9188
val trackWidth = size.x - sliderWidth
9289
val sliderX = trackWidth * normalizedValue
93-
94-
// Render slider handle as a raised button (hovered state for popped-out look)
9590
val slider = AtlasImageElement(guiRenderer, buttonAtlas?.get("hovered") ?: guiRenderer.context.textures.whiteTexture)
9691
slider.size = Vec2f(sliderWidth, sliderHeight)
9792
slider.render(offset + Vec2f(sliderX, 0.0f), consumer, options)
98-
99-
// Render text centered
10093
val textSize = textElement.size
10194
val textX = (size.x - textSize.x) / 2
10295
val textY = (size.y - textSize.y) / 2
@@ -129,7 +122,6 @@ class SliderElement(
129122
}
130123

131124
override fun onMouseLeave(): Boolean {
132-
// Stop dragging when mouse leaves the element
133125
isDragging = false
134126
return super.onMouseLeave()
135127
}

src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/Menu.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ package de.bixilon.minosoft.gui.rendering.gui.gui.screen.menu
1616
import de.bixilon.kmath.vec.vec2.f.MVec2f
1717
import de.bixilon.kmath.vec.vec2.f.Vec2f
1818
import de.bixilon.minosoft.config.key.KeyCodes
19+
import de.bixilon.minosoft.data.language.IntegratedLanguage
20+
import de.bixilon.minosoft.data.language.LanguageUtil.i18n
1921
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
2022
import de.bixilon.minosoft.gui.rendering.gui.elements.Element
2123
import de.bixilon.minosoft.gui.rendering.gui.gui.AbstractLayout
@@ -221,4 +223,12 @@ abstract class Menu(
221223
private companion object {
222224
const val BUTTON_Y_MARGIN = 5.0f
223225
}
226+
227+
protected fun translate(key: String): String {
228+
return IntegratedLanguage.LANGUAGE.forceTranslate(key.i18n().translationKey).message
229+
}
230+
231+
protected fun formatEnabled(key: String, enabled: Boolean): String {
232+
return "${translate(key)}: ${if (enabled) "ON" else "OFF"}"
233+
}
224234
}

src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/options/ChatSettingsMenu.kt

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414
package de.bixilon.minosoft.gui.rendering.gui.gui.screen.menu.options
1515

1616
import de.bixilon.kmath.vec.vec2.f.Vec2f
17-
import de.bixilon.minosoft.data.language.IntegratedLanguage
1817
import de.bixilon.minosoft.data.language.LanguageUtil.i18n
18+
import de.bixilon.minosoft.data.text.BaseComponent
19+
import de.bixilon.minosoft.data.text.TextComponent
1920
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
2021
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
2122
import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments
@@ -36,7 +37,7 @@ class ChatSettingsMenu(guiRenderer: GUIRenderer) : Menu(guiRenderer, PREFERRED_W
3637

3738
init {
3839
this += TextElement(guiRenderer, "menu.options.chat.title".i18n(), background = null, properties = TextRenderProperties(HorizontalAlignments.CENTER, scale = 2.0f))
39-
this += SpacerElement(guiRenderer, Vec2f(0f, 10f))
40+
this += SpacerElement(guiRenderer, Vec2f(0.0f, 10.0f))
4041

4142
hiddenButton = ButtonElement(guiRenderer, formatEnabled("menu.options.chat.hidden", chatProfile.hidden)) {
4243
chatProfile.hidden = !chatProfile.hidden
@@ -61,22 +62,14 @@ class ChatSettingsMenu(guiRenderer: GUIRenderer) : Menu(guiRenderer, PREFERRED_W
6162
val currentIndex = modes.indexOf(chatProfile.chatMode)
6263
val nextIndex = (currentIndex + 1) % modes.size
6364
chatProfile.chatMode = modes[nextIndex]
64-
chatModeButton.textElement.text = "${translate("menu.options.chat.mode")}: ${chatProfile.chatMode.name}"
65+
chatModeButton.textElement.text = BaseComponent("menu.options.chat.mode".i18n(), TextComponent(": ${chatProfile.chatMode.name}"))
6566
}
6667
this += chatModeButton
6768

68-
this += SpacerElement(guiRenderer, Vec2f(0f, 10f))
69+
this += SpacerElement(guiRenderer, Vec2f(0.0f, 10.0f))
6970
this += ButtonElement(guiRenderer, "menu.options.done".i18n()) { guiRenderer.gui.pop() }
7071
}
7172

72-
private fun translate(key: String): String {
73-
return IntegratedLanguage.LANGUAGE.forceTranslate(key.i18n().translationKey).message
74-
}
75-
76-
private fun formatEnabled(key: String, enabled: Boolean): String {
77-
return "${translate(key)}: ${if (enabled) "ON" else "OFF"}"
78-
}
79-
8073
companion object : GUIBuilder<LayoutedGUIElement<ChatSettingsMenu>> {
8174
private const val PREFERRED_WIDTH = 200.0f
8275

src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/options/CloudSettingsMenu.kt

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
package de.bixilon.minosoft.gui.rendering.gui.gui.screen.menu.options
1515

1616
import de.bixilon.kmath.vec.vec2.f.Vec2f
17-
import de.bixilon.minosoft.data.language.IntegratedLanguage
1817
import de.bixilon.minosoft.data.language.LanguageUtil.i18n
1918
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
2019
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
@@ -30,18 +29,24 @@ import de.bixilon.minosoft.gui.rendering.gui.gui.screen.menu.Menu
3029
class CloudSettingsMenu(guiRenderer: GUIRenderer) : Menu(guiRenderer, PREFERRED_WIDTH) {
3130
private val cloudProfile = guiRenderer.context.profile.sky.clouds
3231

33-
private val cloudsEnabledButton: ButtonElement
34-
private val cloudsFlatButton: ButtonElement
35-
private val cloudsMovementButton: ButtonElement
36-
3732
init {
3833
this += TextElement(guiRenderer, "menu.options.clouds.title".i18n(), background = null, properties = TextRenderProperties(HorizontalAlignments.CENTER, scale = 2.0f))
39-
this += SpacerElement(guiRenderer, Vec2f(0f, 10f))
34+
this += SpacerElement(guiRenderer, Vec2f(0.0f, 10.0f))
35+
36+
lateinit var cloudsFlatButton: ButtonElement
37+
lateinit var cloudsMovementButton: ButtonElement
4038

39+
fun updateCloudsDisabledStates() {
40+
val cloudsDisabled = !cloudProfile.enabled
41+
cloudsFlatButton.disabled = cloudsDisabled
42+
cloudsMovementButton.disabled = cloudsDisabled
43+
}
44+
45+
lateinit var cloudsEnabledButton: ButtonElement
4146
cloudsEnabledButton = ButtonElement(guiRenderer, formatEnabled("menu.options.clouds.enabled", cloudProfile.enabled)) {
4247
cloudProfile.enabled = !cloudProfile.enabled
4348
cloudsEnabledButton.textElement.text = formatEnabled("menu.options.clouds.enabled", cloudProfile.enabled)
44-
updateDisabledStates()
49+
updateCloudsDisabledStates()
4550
}
4651
this += cloudsEnabledButton
4752

@@ -57,32 +62,18 @@ class CloudSettingsMenu(guiRenderer: GUIRenderer) : Menu(guiRenderer, PREFERRED_
5762
}
5863
this += cloudsMovementButton
5964

60-
this += SliderElement(guiRenderer, translate("menu.options.clouds.max_distance"), 0f, 200f, cloudProfile.maxDistance) {
65+
this += SliderElement(guiRenderer, translate("menu.options.clouds.max_distance"), 0.0f, 200.0f, cloudProfile.maxDistance) {
6166
cloudProfile.maxDistance = it
6267
}
6368

64-
this += SliderElement(guiRenderer, translate("menu.options.clouds.layers"), 1f, 3f, cloudProfile.layers.toFloat()) {
69+
this += SliderElement(guiRenderer, translate("menu.options.clouds.layers"), 1.0f, 3.0f, cloudProfile.layers.toFloat()) {
6570
cloudProfile.layers = it.toInt()
6671
}
6772

68-
this += SpacerElement(guiRenderer, Vec2f(0f, 10f))
73+
this += SpacerElement(guiRenderer, Vec2f(0.0f, 10.0f))
6974
this += ButtonElement(guiRenderer, "menu.options.done".i18n()) { guiRenderer.gui.pop() }
7075

71-
updateDisabledStates()
72-
}
73-
74-
private fun updateDisabledStates() {
75-
val cloudsDisabled = !cloudProfile.enabled
76-
cloudsFlatButton.disabled = cloudsDisabled
77-
cloudsMovementButton.disabled = cloudsDisabled
78-
}
79-
80-
private fun translate(key: String): String {
81-
return IntegratedLanguage.LANGUAGE.forceTranslate(key.i18n().translationKey).message
82-
}
83-
84-
private fun formatEnabled(key: String, enabled: Boolean): String {
85-
return "${translate(key)}: ${if (enabled) "ON" else "OFF"}"
76+
updateCloudsDisabledStates()
8677
}
8778

8879
companion object : GUIBuilder<LayoutedGUIElement<CloudSettingsMenu>> {

src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/options/GUISettingsMenu.kt

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
package de.bixilon.minosoft.gui.rendering.gui.gui.screen.menu.options
1515

1616
import de.bixilon.kmath.vec.vec2.f.Vec2f
17-
import de.bixilon.minosoft.data.language.IntegratedLanguage
1817
import de.bixilon.minosoft.data.language.LanguageUtil.i18n
1918
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
2019
import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer
@@ -41,14 +40,14 @@ class GUISettingsMenu(guiRenderer: GUIRenderer) : Menu(guiRenderer, PREFERRED_WI
4140

4241
init {
4342
this += TextElement(guiRenderer, "menu.options.gui.title".i18n(), background = null, properties = TextRenderProperties(HorizontalAlignments.CENTER, scale = 2.0f))
44-
this += SpacerElement(guiRenderer, Vec2f(0f, 10f))
43+
this += SpacerElement(guiRenderer, Vec2f(0.0f, 10.0f))
4544

4645
val currentHudScale = guiProfile.scale.toInt().coerceIn(1, 4)
4746
hudScaleButton = ButtonElement(guiRenderer, "${translate("menu.options.gui.hud_scale")}: ${currentHudScale}x") {
4847
val currentIndex = HUD_SCALE_OPTIONS.indexOf(guiProfile.scale).let { if (it == -1) 0 else it }
4948
val nextIndex = (currentIndex + 1) % HUD_SCALE_OPTIONS.size
5049
guiProfile.scale = HUD_SCALE_OPTIONS[nextIndex]
51-
hudScaleButton.textElement.text = "${translate("menu.options.gui.hud_scale")}: ${HUD_SCALE_OPTIONS[nextIndex].toInt()}x"
50+
hudScaleButton.textElement.text = "${translate("menu.options.gui.hud_scale")}: ${HUD_SCALE_OPTIONS[nextIndex].toInt()}x" // The text breaks when clicked if we dont do it like this... TODO: HUD scaling should be related to window size percentage! But I'm tired for now.
5251
}
5352
this += hudScaleButton
5453

@@ -95,7 +94,7 @@ class GUISettingsMenu(guiRenderer: GUIRenderer) : Menu(guiRenderer, PREFERRED_WI
9594
}
9695
this += wawlaEntityHandButton
9796

98-
this += SpacerElement(guiRenderer, Vec2f(0f, 10f))
97+
this += SpacerElement(guiRenderer, Vec2f(0.0f, 10.0f))
9998
this += ButtonElement(guiRenderer, "menu.options.done".i18n()) { guiRenderer.gui.pop() }
10099

101100
updateDisabledStates()
@@ -111,14 +110,6 @@ class GUISettingsMenu(guiRenderer: GUIRenderer) : Menu(guiRenderer, PREFERRED_WI
111110
wawlaEntityHandButton.disabled = wawlaDisabled
112111
}
113112

114-
private fun translate(key: String): String {
115-
return IntegratedLanguage.LANGUAGE.forceTranslate(key.i18n().translationKey).message
116-
}
117-
118-
private fun formatEnabled(key: String, enabled: Boolean): String {
119-
return "${translate(key)}: ${if (enabled) "ON" else "OFF"}"
120-
}
121-
122113
companion object : GUIBuilder<LayoutedGUIElement<GUISettingsMenu>> {
123114
private const val PREFERRED_WIDTH = 200.0f
124115
private val HUD_SCALE_OPTIONS = listOf(1.0f, 2.0f, 3.0f, 4.0f)

0 commit comments

Comments
 (0)