[enhancement] Improved value typing in GUI.

This commit is contained in:
Xiaro 2021-01-12 09:53:03 -05:00
parent 382736bb22
commit 3d8e0f1fd0
No known key found for this signature in database
GPG Key ID: 996D265D6E155377
4 changed files with 59 additions and 40 deletions

View File

@ -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()

View File

@ -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()) {

View File

@ -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))

View File

@ -63,8 +63,10 @@ abstract class SettingWindow<T : Any>(
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 }
}
}
}