diff --git a/src/main/java/me/zeroeightsix/kami/gui/rgui/component/SettingSlider.kt b/src/main/java/me/zeroeightsix/kami/gui/rgui/component/SettingSlider.kt index 5147a2d24..3ba704d25 100644 --- a/src/main/java/me/zeroeightsix/kami/gui/rgui/component/SettingSlider.kt +++ b/src/main/java/me/zeroeightsix/kami/gui/rgui/component/SettingSlider.kt @@ -34,21 +34,13 @@ class SettingSlider(val setting: NumberSetting<*>) : Slider(setting.name, 0.0, s else -> range / 20.0 } - override fun onClosed() { - super.onClosed() - name = originalName - } - - override fun onTick() { - super.onTick() - if (mouseState != MouseState.DRAG && !listening) { - val min = setting.range.start.toDouble() - val flooredSettingValue = floor((settingValueDouble - min) / stepDouble) * stepDouble - if (value * range + min !in (flooredSettingValue - stepDouble)..flooredSettingValue) { - value = (setting.value.toDouble() - min) / range - } + override fun onStopListening(success: Boolean) { + if (success) { + name.toDoubleOrNull()?.let { setting.setValue(it.toString()) } } - visible = setting.isVisible + + super.onStopListening(success) + name = originalName } override fun onClick(mousePos: Vec2f, buttonId: Int) { @@ -64,12 +56,13 @@ class SettingSlider(val setting: NumberSetting<*>) : Slider(setting.name, 0.0, s if (buttonId == 1) { if (!listening) { listening = true + name = setting.value.toString() value = 0.0 - name = "0" } else { - listening = false - name = originalName + onStopListening(false) } + } else if (buttonId == 0 && listening) { + onStopListening(true) } } @@ -93,22 +86,40 @@ class SettingSlider(val setting: NumberSetting<*>) : Slider(setting.name, 0.0, s if (keyState) { when (keyCode) { Keyboard.KEY_RETURN -> { - name.toDoubleOrNull()?.let { setting.setValue(it.toString()) } - listening = false - name = originalName + onStopListening(true) } Keyboard.KEY_BACK, Keyboard.KEY_DELETE -> { name = name.substring(0, max(name.length - 1, 0)) if (name.isBlank()) name = "0" } - else -> if (typedChar.isDigit() || typedChar == '.' || typedChar.equals('e', true)) { - if (name == "0") name = "" + else -> if (isNumber(typedChar)) { + if (name == "0" && (typedChar.isDigit() || typedChar == '-')) { + name = "" + } name += typedChar } } } } + private fun isNumber(char: Char) = + char.isDigit() + || char == '-' + || char == '.' + || char.equals('e', true) + + override fun onTick() { + super.onTick() + if (mouseState != MouseState.DRAG && !listening) { + val min = setting.range.start.toDouble() + val flooredSettingValue = floor((settingValueDouble - min) / stepDouble) * stepDouble + if (value * range + min !in (flooredSettingValue - stepDouble)..flooredSettingValue) { + value = (setting.value.toDouble() - min) / range + } + } + visible = setting.isVisible + } + override fun onRender(vertexHelper: VertexHelper, absolutePos: Vec2f) { val valueText = setting.toString() protectedWidth = FontRenderAdapter.getStringWidth(valueText, 0.75f).toDouble() diff --git a/src/main/java/me/zeroeightsix/kami/gui/rgui/component/Slider.kt b/src/main/java/me/zeroeightsix/kami/gui/rgui/component/Slider.kt index b6c58e2ef..f57983e10 100644 --- a/src/main/java/me/zeroeightsix/kami/gui/rgui/component/Slider.kt +++ b/src/main/java/me/zeroeightsix/kami/gui/rgui/component/Slider.kt @@ -43,7 +43,7 @@ open class Slider( override fun onClosed() { super.onClosed() - listening = false + onStopListening(false) } override fun onDisplayed() { @@ -53,6 +53,10 @@ open class Slider( setupDescription() } + open fun onStopListening(success: Boolean) { + listening = false + } + private fun setupDescription() { description.clear() if (descriptionIn.isNotBlank()) { diff --git a/src/main/java/me/zeroeightsix/kami/gui/rgui/component/StringButton.kt b/src/main/java/me/zeroeightsix/kami/gui/rgui/component/StringButton.kt index ae24b2236..9c6566330 100644 --- a/src/main/java/me/zeroeightsix/kami/gui/rgui/component/StringButton.kt +++ b/src/main/java/me/zeroeightsix/kami/gui/rgui/component/StringButton.kt @@ -7,16 +7,21 @@ import kotlin.math.max class StringButton(val setting: StringSetting) : BooleanSlider(setting.name, 1.0, setting.description) { - override fun onClosed() { - super.onClosed() - name = originalName - } - override fun onDisplayed() { super.onDisplayed() value = 1.0 } + override fun onStopListening(success: Boolean) { + if (success) { + setting.setValue(name) + } + + super.onStopListening(success) + name = originalName + value = 1.0 + } + override fun onMouseInput(mousePos: Vec2f) { super.onMouseInput(mousePos) if (!listening) { @@ -36,14 +41,15 @@ class StringButton(val setting: StringSetting) : BooleanSlider(setting.name, 1.0 override fun onRelease(mousePos: Vec2f, buttonId: Int) { super.onRelease(mousePos, buttonId) if (buttonId == 1) { - listening = !listening - - value = if (listening) { - name = "" - 0.0 + if (!listening) { + listening = true + name = value.toString() + value = 0.0 } else { - 1.0 + onStopListening(false) } + } else if (buttonId == 0 && listening) { + onStopListening(true) } } @@ -53,10 +59,6 @@ class StringButton(val setting: StringSetting) : BooleanSlider(setting.name, 1.0 if (keyState) { when (keyCode) { Keyboard.KEY_RETURN -> { - setting.setValue(name) - listening = false - name = originalName - value = 1.0 } Keyboard.KEY_BACK, Keyboard.KEY_DELETE -> { name = name.substring(0, max(name.length - 1, 0)) diff --git a/src/main/java/me/zeroeightsix/kami/gui/rgui/windows/SettingWindow.kt b/src/main/java/me/zeroeightsix/kami/gui/rgui/windows/SettingWindow.kt index 54c0ae9a7..c1691c9cb 100644 --- a/src/main/java/me/zeroeightsix/kami/gui/rgui/windows/SettingWindow.kt +++ b/src/main/java/me/zeroeightsix/kami/gui/rgui/windows/SettingWindow.kt @@ -63,8 +63,10 @@ abstract class SettingWindow( override fun onRelease(mousePos: Vec2f, buttonId: Int) { super.onRelease(mousePos, buttonId) (hoveredChild as? Slider)?.let { - listeningChild = if (it.listening) it - else null + if (it != listeningChild) { + listeningChild?.onStopListening(false) + listeningChild = it.takeIf { it.listening } + } } }