@@ -13,15 +13,27 @@ package gg.essential.gui.common
1313
1414import gg.essential.elementa.components.UIBlock
1515import gg.essential.elementa.components.UIContainer
16- import gg.essential.elementa.constraints.CenterConstraint
17- import gg.essential.elementa.dsl.*
18- import gg.essential.elementa.state.BasicState
19- import gg.essential.elementa.state.State
20- import gg.essential.elementa.state.toConstraint
16+ import gg.essential.elementa.dsl.provideDelegate
2117import gg.essential.gui.EssentialPalette
18+ import gg.essential.gui.elementa.state.v2.State
19+ import gg.essential.gui.elementa.state.v2.combinators.letState
20+ import gg.essential.gui.elementa.state.v2.combinators.map
21+ import gg.essential.gui.elementa.state.v2.mutableStateOf
22+ import gg.essential.gui.elementa.state.v2.onChange
23+ import gg.essential.gui.layoutdsl.Alignment
24+ import gg.essential.gui.layoutdsl.Modifier
25+ import gg.essential.gui.layoutdsl.alignHorizontal
26+ import gg.essential.gui.layoutdsl.alignVertical
27+ import gg.essential.gui.layoutdsl.color
28+ import gg.essential.gui.layoutdsl.fillHeight
29+ import gg.essential.gui.layoutdsl.fillWidth
30+ import gg.essential.gui.layoutdsl.layout
31+ import gg.essential.gui.layoutdsl.then
32+ import gg.essential.gui.layoutdsl.tooltip
33+ import gg.essential.gui.layoutdsl.whenTrue
34+ import gg.essential.gui.layoutdsl.width
2235import gg.essential.universal.USound
23- import gg.essential.util.bindEssentialTooltip
24- import gg.essential.gui.util.hoveredState
36+ import gg.essential.gui.util.hoveredStateV2
2537import gg.essential.vigilance.utils.onLeftClick
2638import kotlin.math.round
2739
@@ -31,39 +43,22 @@ abstract class EssentialSlider(
3143
3244 private val notchWidth = 3
3345
34- val fraction = BasicState (initialValueFraction)
46+ val fraction = mutableStateOf (initialValueFraction)
3547 private val updates = mutableListOf< (Float ) -> Unit > ()
3648
37- private val sliderBar by UIBlock (EssentialPalette .BUTTON_HIGHLIGHT ).constrain {
38- width = 100 .percent
39- height = 100 .percent - 2 .pixels
40- y = CenterConstraint ()
41- } childOf this
42-
43- private val sliderNotch by UIBlock ().constrain {
44- width = notchWidth.pixels
45- height = 100 .percent
46- y = CenterConstraint ()
47- x = basicXConstraint {
48- it.parent.getLeft() + fraction.get() * (it.parent.getWidth() - notchWidth)
49- }
50- } childOf this
49+ private val sliderBar by UIBlock (EssentialPalette .BUTTON_HIGHLIGHT )
5150
52- private val sliderCovered by UIBlock (EssentialPalette .ACCENT_BLUE ).constrain {
53- height = 100 .percent - 2 .pixels
54- width = basicWidthConstraint {
55- sliderNotch.getLeft() - this @EssentialSlider.getLeft()
56- }
57- y = CenterConstraint ()
58- } childOf this
51+ private val sliderNotch by UIBlock ()
52+
53+ private val sliderCovered by UIBlock (EssentialPalette .ACCENT_BLUE )
5954
6055 private var hoveredState: State <Boolean >
6156
6257 init {
6358 // Elementa's onMouseDrag does not check whether the mouse is within the component
6459 // So we need to do that ourselves. We want to ignore any drag that does not start within
6560 // this component
66- val mouseHeld = BasicState (false )
61+ val mouseHeld = mutableStateOf (false )
6762
6863 onLeftClick {
6964 USound .playButtonPress()
@@ -80,19 +75,20 @@ abstract class EssentialSlider(
8075 updateSlider(mouseX)
8176 }
8277 }
83- hoveredState = hoveredState() or sliderNotch.hoveredState() or mouseHeld
78+ hoveredState = State { hoveredStateV2()() || mouseHeld() }
8479
85- sliderNotch.setColor(EssentialPalette .getTextColor(hoveredState).toConstraint())
86- }
87-
88- override fun afterInitialization () {
89- super .afterInitialization()
90- // Kotlin's properties set in a constructor don't have their values written to
91- // until after the parent object is initialized. If this was in the constructor,
92- // the result of reduceFractionToDisplay would not yield the expected result
93- sliderNotch.bindEssentialTooltip(hoveredState, fraction.map { fraction ->
94- reduceFractionToDisplay(fraction)
95- })
80+ this .layout {
81+ sliderBar(Modifier .fillWidth().fillHeight(padding = 1f ).alignVertical(Alignment .Center )) {
82+ sliderCovered(Modifier .fillHeight().then(State { Modifier .fillWidth(fraction()) }))
83+ }
84+ sliderNotch(
85+ Modifier .width(notchWidth.toFloat())
86+ .fillHeight()
87+ .alignHorizontal { parentSize, _ -> fraction.get() * (parentSize - notchWidth) }
88+ .color(EssentialPalette .getTextColor(hoveredState))
89+ .whenTrue(hoveredState, Modifier .tooltip(fraction.letState { reduceFractionToDisplay(it) }))
90+ )
91+ }
9692 }
9793
9894 /* *
@@ -135,7 +131,7 @@ class IntEssentialSlider(
135131 }
136132
137133 init {
138- intValue.onSetValue {
134+ intValue.onChange( this ) {
139135 for (update in updates) {
140136 update(it)
141137 }
0 commit comments