Skip to content

Commit 179a54e

Browse files
committed
Enum setting & misc
1 parent d876309 commit 179a54e

File tree

9 files changed

+84
-19
lines changed

9 files changed

+84
-19
lines changed

common/src/main/kotlin/com/lambda/config/settings/comparable/EnumSetting.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.lambda.config.settings.comparable
22

33
import com.lambda.config.AbstractSetting
4+
import com.lambda.util.Nameable
5+
import java.util.*
46

57
class EnumSetting<T : Enum<T>>(
68
override val name: String,
@@ -12,7 +14,13 @@ class EnumSetting<T : Enum<T>>(
1214
description,
1315
visibility,
1416
) {
15-
private val enumValues: Array<T> = defaultValue.declaringJavaClass.enumConstants
17+
val displayValue get() = (value as? Nameable)?.name ?: value.name.split('_').joinToString(" ") { low ->
18+
low.lowercase().replaceFirstChar {
19+
if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString()
20+
}
21+
}
22+
23+
val enumValues: Array<T> = defaultValue.declaringJavaClass.enumConstants
1624

1725
fun next() {
1826
value = enumValues[((value.ordinal + 1) % enumValues.size)]

common/src/main/kotlin/com/lambda/gui/api/component/InteractiveComponent.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,30 @@ package com.lambda.gui.api.component
33
import com.lambda.gui.api.GuiEvent
44
import com.lambda.gui.api.component.core.IComponent
55
import com.lambda.util.Mouse
6+
import com.lambda.util.math.Vec2d
67

78
abstract class InteractiveComponent : IComponent {
8-
protected var hovered = false
9+
protected open val hovered get() = rect.contains(lastMouse)
910
protected var activeButton: Mouse.Button? = null
1011

1112
protected open fun onPress(e: GuiEvent.MouseClick) {}
1213
protected open fun onRelease(e: GuiEvent.MouseClick) {}
1314

15+
private var lastMouse = Vec2d.ZERO
16+
1417
override fun onEvent(e: GuiEvent) {
1518
when (e) {
1619
is GuiEvent.Show -> {
17-
hovered = false
20+
lastMouse = Vec2d.ONE * -1000.0
1821
activeButton = null
1922
}
2023

2124
is GuiEvent.MouseMove -> {
22-
hovered = rect.contains(e.mouse)
25+
lastMouse = e.mouse
2326
}
2427

2528
is GuiEvent.MouseClick -> {
26-
hovered = rect.contains(e.mouse)
29+
lastMouse = e.mouse
2730

2831
val prevPressed = activeButton != null
2932
activeButton = if (hovered && e.button.isMainButton && e.action == Mouse.Action.Click) e.button else null

common/src/main/kotlin/com/lambda/gui/api/component/core/list/ChildComponent.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
package com.lambda.gui.api.component.core.list
22

3-
import com.lambda.gui.api.GuiEvent
43
import com.lambda.gui.api.component.InteractiveComponent
54

65
abstract class ChildComponent(open val owner: ChildLayer<*, *>) : InteractiveComponent() {
76
open var accessible = false
8-
9-
override fun onEvent(e: GuiEvent) {
10-
super.onEvent(e)
11-
if (e is GuiEvent.MouseMove || e is GuiEvent.MouseClick) hovered = hovered && accessible
12-
}
7+
override val hovered; get() = super.hovered && accessible
138

149
open fun onAdd() {}
1510
open fun onRemove() {}

common/src/main/kotlin/com/lambda/gui/impl/clickgui/buttons/ModuleButton.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.lambda.gui.impl.clickgui.buttons
33
import com.lambda.config.settings.NumericSetting
44
import com.lambda.config.settings.StringSetting
55
import com.lambda.config.settings.comparable.BooleanSetting
6+
import com.lambda.config.settings.comparable.EnumSetting
67
import com.lambda.core.LambdaSound
78
import com.lambda.core.SoundManager.playSoundRandomly
89
import com.lambda.graphics.animation.Animation.Companion.exp
@@ -13,6 +14,7 @@ import com.lambda.gui.api.component.button.ListButton
1314
import com.lambda.gui.api.component.core.list.ChildLayer
1415
import com.lambda.gui.api.layer.RenderLayer
1516
import com.lambda.gui.impl.clickgui.buttons.setting.BooleanButton
17+
import com.lambda.gui.impl.clickgui.buttons.setting.EnumSlider
1618
import com.lambda.gui.impl.clickgui.buttons.setting.NumberSlider
1719
import com.lambda.gui.impl.clickgui.buttons.setting.StringButton
1820
import com.lambda.module.Module
@@ -99,11 +101,13 @@ class ModuleButton(
99101
colorV(Color.BLACK.setAlpha(0.0), Color.BLACK.setAlpha(0.2 * progress))
100102
}
101103

104+
// TODO: resort when all settings are implemented
102105
module.settings.mapNotNull {
103106
when (it) {
104107
is BooleanSetting -> BooleanButton(it, settingsLayer)
105108
is NumericSetting<*> -> NumberSlider(it, settingsLayer)
106109
is StringSetting -> StringButton(it, settingsLayer)
110+
is EnumSetting<*> -> EnumSlider(it, settingsLayer)
107111
else -> null
108112
}
109113
}.forEach(settingsLayer::addChild)

common/src/main/kotlin/com/lambda/gui/impl/clickgui/buttons/SettingButton.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,11 @@ abstract class SettingButton <V : Any, T : AbstractSetting<V>> (
2626
super.onEvent(e)
2727

2828
if (e !is GuiEvent.Tick) return
29+
2930
if (!prevTickVisible && visible) renderHeightAnimation = heightOffset
3031
prevTickVisible = visible
32+
33+
if (!visible) unfocus()
3134
}
3235

3336
open fun unfocus() {}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.lambda.gui.impl.clickgui.buttons.setting
2+
3+
import com.lambda.config.settings.comparable.EnumSetting
4+
import com.lambda.gui.api.GuiEvent
5+
import com.lambda.gui.api.component.core.list.ChildLayer
6+
import com.lambda.gui.impl.clickgui.buttons.ModuleButton
7+
import com.lambda.gui.impl.clickgui.buttons.SettingButton
8+
import com.lambda.module.modules.client.ClickGui
9+
import com.lambda.util.math.ColorUtils.setAlpha
10+
import com.lambda.util.math.MathUtils.lerp
11+
import com.lambda.util.math.Vec2d
12+
import com.lambda.util.math.transform
13+
import java.awt.Color
14+
import kotlin.math.floor
15+
16+
class EnumSlider <T : Enum<T>> (
17+
setting: EnumSetting<T>,
18+
owner: ChildLayer.Drawable<SettingButton<*, *>, ModuleButton>
19+
) : Slider<T, EnumSetting<T>>(setting, owner) {
20+
private val values = setting.enumValues
21+
private val enumSize = values.size
22+
23+
override val progress get() = if (dragProgress != -1.0) dragProgress else
24+
transform(value.ordinal.toDouble(), 0.0, enumSize - 1.0, 0.0, 1.0)
25+
26+
private var dragProgress = -1.0
27+
28+
override fun setValueByProgress(progress: Double) {
29+
val entryIndex = floor(progress * enumSize).toInt().coerceIn(0, enumSize - 1)
30+
value = values[entryIndex]
31+
dragProgress = progress
32+
}
33+
34+
override fun onPress(e: GuiEvent.MouseClick) {}
35+
36+
override fun onRelease(e: GuiEvent.MouseClick) {
37+
if (dragProgress == -1.0) setting.next()
38+
dragProgress = -1.0
39+
}
40+
41+
init {
42+
renderer.font {
43+
text = setting.displayValue
44+
45+
val progress = 1.0 - activeAnimation
46+
scale = lerp(0.5, 1.0, progress)
47+
position = Vec2d(rect.right, rect.center.y) - Vec2d(ClickGui.windowPadding + stringWidth, 0.0)
48+
color = Color.WHITE.setAlpha(lerp(0.0, progress, showAnimation))
49+
}
50+
}
51+
}

common/src/main/kotlin/com/lambda/gui/impl/clickgui/buttons/setting/NumberSlider.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.lambda.gui.impl.clickgui.buttons.setting
22

33
import com.lambda.config.settings.NumericSetting
4-
import com.lambda.graphics.animation.Animation.Companion.exp
54
import com.lambda.gui.api.GuiEvent
65
import com.lambda.gui.api.component.button.InputBarOverlay
76
import com.lambda.gui.api.component.core.list.ChildLayer
@@ -19,13 +18,11 @@ import com.lambda.util.math.normalize
1918
class NumberSlider <N>(
2019
setting: NumericSetting<N>,
2120
owner: ChildLayer.Drawable<SettingButton<*, *>, ModuleButton>
22-
) : SliderSetting<N, NumericSetting<N>>(
21+
) : Slider<N, NumericSetting<N>>(
2322
setting, owner
2423
) where N : Number, N : Comparable<N> {
2524
private val doubleRange get() = setting.range.let { it.start.toDouble()..it.endInclusive.toDouble() }
26-
private val targetProgress get() = doubleRange.normalize(value.toDouble())
27-
private val renderProgress0 by animation.exp(::targetProgress, 0.6)
28-
override val renderProgress get() = lerp(0.0, renderProgress0, showAnimation)
25+
override val progress get() = doubleRange.normalize(value.toDouble())
2926

3027
private val layer = ChildLayer.Drawable(owner.gui, this, owner.renderer, ::rect, InputBarOverlay::isActive)
3128
private val inputBar: InputBarOverlay = object : InputBarOverlay(renderer, layer) {

common/src/main/kotlin/com/lambda/gui/impl/clickgui/buttons/setting/SliderSetting.kt renamed to common/src/main/kotlin/com/lambda/gui/impl/clickgui/buttons/setting/Slider.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.lambda.gui.impl.clickgui.buttons.setting
33
import com.lambda.config.AbstractSetting
44
import com.lambda.core.LambdaSound
55
import com.lambda.core.SoundManager.playSound
6+
import com.lambda.graphics.animation.Animation.Companion.exp
67
import com.lambda.gui.api.GuiEvent
78
import com.lambda.gui.api.component.core.list.ChildLayer
89
import com.lambda.gui.impl.clickgui.buttons.ModuleButton
@@ -14,10 +15,13 @@ import com.lambda.util.math.MathUtils.lerp
1415
import com.lambda.util.math.Vec2d
1516
import com.lambda.util.math.transform
1617

17-
abstract class SliderSetting <V : Any, T : AbstractSetting<V>>(
18+
abstract class Slider <V : Any, T : AbstractSetting<V>>(
1819
setting: T, owner: ChildLayer.Drawable<SettingButton<*, *>, ModuleButton>
1920
) : SettingButton<V, T>(setting, owner) {
20-
protected abstract val renderProgress: Double
21+
protected abstract val progress: Double
22+
private val progressAnimation by animation.exp(::progress, 0.6)
23+
private val renderProgress get() = lerp(0.0, progressAnimation, showAnimation)
24+
2125
protected abstract fun setValueByProgress(progress: Double)
2226
private var lastPlayedValue = value
2327
private var lastPlayedTiming = 0L

common/src/main/kotlin/com/lambda/module/modules/client/ClickGui.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ object ClickGui : Module(
1717
val windowRadius by setting("Window Radius", 2.0, 0.0..10.0, 0.1)
1818
val windowPadding by setting("Window Padding", 2.0, 0.0..10.0, 0.1)
1919
val buttonHeight by setting("Button Height", 11.0, 8.0..20.0, 0.1)
20-
val buttonStep by setting("Button Step", 1.0, 0.0..5.0, 0.1)
20+
val buttonStep by setting("Button Step", 0.0, 0.0..5.0, 0.1)
2121
val windowBlur by setting("Window Blur", 30, 0..100, 1)
2222

2323
// Animation

0 commit comments

Comments
 (0)