From b145e60c58a66153ea5a5e3b0a854ab7e88803f5 Mon Sep 17 00:00:00 2001 From: mems01 <70612656+mems01@users.noreply.github.com> Date: Sat, 18 Jan 2025 22:17:14 +0200 Subject: [PATCH] feat(legacy): Improved range value options handling. (#5358) --- .../net/ccbluex/liquidbounce/config/Value.kt | 17 ++- .../clickgui/style/styles/BlackStyle.kt | 127 ++++++++++++------ .../style/styles/LiquidBounceStyle.kt | 116 ++++++++++++---- .../client/clickgui/style/styles/NullStyle.kt | 108 +++++++++++---- .../clickgui/style/styles/SlowlyStyle.kt | 103 +++++++++----- .../ui/client/hud/designer/EditorPanel.kt | 11 +- 6 files changed, 348 insertions(+), 134 deletions(-) diff --git a/src/main/java/net/ccbluex/liquidbounce/config/Value.kt b/src/main/java/net/ccbluex/liquidbounce/config/Value.kt index c2da27584ce..d4b3b8b91e8 100644 --- a/src/main/java/net/ccbluex/liquidbounce/config/Value.kt +++ b/src/main/java/net/ccbluex/liquidbounce/config/Value.kt @@ -193,6 +193,12 @@ open class IntegerRangeValue( isSupported: (() -> Boolean)? = null, ) : Value(name, value, subjective, isSupported, suffix) { + var lastChosenSlider: RangeSlider? = null + get() { + if (!Mouse.isButtonDown(0)) field = null + return field + } + fun setFirst(newValue: Int, immediate: Boolean = true) = set(newValue..value.last, immediate) fun setLast(newValue: Int, immediate: Boolean = true) = set(value.first..newValue, immediate) @@ -232,6 +238,12 @@ open class FloatRangeValue( isSupported: (() -> Boolean)? = null, ) : Value>(name, value, subjective, isSupported, suffix) { + var lastChosenSlider: RangeSlider? = null + get() { + if (!Mouse.isButtonDown(0)) field = null + return field + } + fun setFirst(newValue: Float, immediate: Boolean = true) = set(newValue..value.endInclusive, immediate) fun setLast(newValue: Float, immediate: Boolean = true) = set(value.start..newValue, immediate) @@ -259,6 +271,7 @@ open class FloatRangeValue( val random get() = nextFloat(value.start, value.endInclusive) + } /** @@ -529,4 +542,6 @@ fun color( fun color( name: String, value: Int, rainbow: Boolean = false, showPicker: Boolean = false, subjective: Boolean = false, isSupported: (() -> Boolean)? = null -) = color(name, Color(value, true), rainbow, showPicker, subjective, isSupported) \ No newline at end of file +) = color(name, Color(value, true), rainbow, showPicker, subjective, isSupported) + +enum class RangeSlider { LEFT, RIGHT } diff --git a/src/main/java/net/ccbluex/liquidbounce/ui/client/clickgui/style/styles/BlackStyle.kt b/src/main/java/net/ccbluex/liquidbounce/ui/client/clickgui/style/styles/BlackStyle.kt index e4b6c9c7e88..1fbfc091eca 100644 --- a/src/main/java/net/ccbluex/liquidbounce/ui/client/clickgui/style/styles/BlackStyle.kt +++ b/src/main/java/net/ccbluex/liquidbounce/ui/client/clickgui/style/styles/BlackStyle.kt @@ -303,47 +303,69 @@ object BlackStyle : Style() { val slider1 = value.get().first val slider2 = value.get().last - val text = "${value.name}§f: $slider1 - $slider2 §7$suffix§f (Beta)" + val text = "${value.name}§f: $slider1 - $slider2 §7$suffix" moduleElement.settingsWidth = font35.getStringWidth(text) + 8 val x = minX + 4 val y = yPos + 14 val width = moduleElement.settingsWidth - 12 val color = Color(20, 20, 20) + val endX = x + width - if (mouseButton == 0 && mouseX in x..x + width && mouseY in y - 2..y + 5 || sliderValueHeld == value) { - val slider1Pos = - minX + ((slider1 - value.minimum).toFloat() / (value.maximum - value.minimum)) * (maxX - minX) - val slider2Pos = - minX + ((slider2 - value.minimum).toFloat() / (value.maximum - value.minimum)) * (maxX - minX) + val currSlider = value.lastChosenSlider - val distToSlider1 = mouseX - slider1Pos - val distToSlider2 = mouseX - slider2Pos + if (mouseButton == 0 && mouseX in x..endX && mouseY in y - 2..y + 5 || sliderValueHeld == value) { + val leftSliderPos = + x + (slider1 - value.minimum).toFloat() / (value.maximum - value.minimum) * (endX - x) + val rightSliderPos = + x + (slider2 - value.minimum).toFloat() / (value.maximum - value.minimum) * (endX - x) - val percentage = (mouseX - minX - 4F) / (maxX - minX - 8F) + val distToSlider1 = mouseX - leftSliderPos + val distToSlider2 = mouseX - rightSliderPos - if (abs(distToSlider1) <= abs(distToSlider2) && distToSlider2 <= 0) { + val closerToLeft = abs(distToSlider1) < abs(distToSlider2) + + val isOnLeftSlider = + (mouseX.toFloat() in x.toFloat()..leftSliderPos || closerToLeft) && rightSliderPos > x + val isOnRightSlider = + (mouseX.toFloat() in rightSliderPos..endX.toFloat() || !closerToLeft) && leftSliderPos < endX + + val percentage = (mouseX.toFloat() - x) / (endX - x) + + if (isOnLeftSlider && currSlider == null || currSlider == RangeSlider.LEFT) { withDelayedSave { - value.setFirst(value.lerpWith(percentage).coerceIn(value.minimum, slider2), false) + value.setFirst( + value.lerpWith(percentage).coerceIn(value.minimum, slider2), + false + ) } - } else { + } + + if (isOnRightSlider && currSlider == null || currSlider == RangeSlider.RIGHT) { withDelayedSave { - value.setLast(value.lerpWith(percentage).coerceIn(slider1, value.maximum), false) + value.setLast( + value.lerpWith(percentage).coerceIn(slider1, value.maximum), + false + ) } } + // Keep changing this slider until mouse is unpressed. sliderValueHeld = value - if (mouseButton == 0) return true + // Stop rendering and interacting only when this event was triggered by a mouse click. + if (mouseButton == 0) { + value.lastChosenSlider = when { + isOnLeftSlider -> RangeSlider.LEFT + isOnRightSlider -> RangeSlider.RIGHT + else -> null + } + return true + } } - val displayValue1 = value.get().first - val displayValue2 = value.get().last - - val sliderValue1 = - x + width * (displayValue1 - value.minimum) / (value.maximum - value.minimum) - val sliderValue2 = - x + width * (displayValue2 - value.minimum) / (value.maximum - value.minimum) + val sliderValue1 = x + width * (slider1 - value.minimum) / (value.maximum - value.minimum) + val sliderValue2 = x + width * (slider2 - value.minimum) / (value.maximum - value.minimum) drawRect(x, y, x + width, y + 2, Int.MAX_VALUE) drawRect(sliderValue1, y, sliderValue2, y + 2, color.rgb) @@ -359,7 +381,7 @@ object BlackStyle : Style() { val slider1 = value.get().start val slider2 = value.get().endInclusive - val text = "${value.name}§f: ${round(slider1)} - ${round(slider2)} §7$suffix§f (Beta)" + val text = "${value.name}§f: ${round(slider1)} - ${round(slider2)} §7$suffix" moduleElement.settingsWidth = font35.getStringWidth(text) + 8 val x = minX + 4 @@ -367,39 +389,64 @@ object BlackStyle : Style() { val width = moduleElement.settingsWidth - 12 val color = Color(20, 20, 20) - if (mouseButton == 0 && mouseX in x..x + width && mouseY in y - 2..y + 5 || sliderValueHeld == value) { - val slider1Pos = - minX + ((slider1 - value.minimum) / (value.maximum - value.minimum)) * (maxX - minX) - val slider2Pos = - minX + ((slider2 - value.minimum) / (value.maximum - value.minimum)) * (maxX - minX) + val endX = x + width - val distToSlider1 = mouseX - slider1Pos - val distToSlider2 = mouseX - slider2Pos + val currSlider = value.lastChosenSlider - val percentage = (mouseX - minX - 4F) / (maxX - minX - 8F) + if (mouseButton == 0 && mouseX in x..endX && mouseY in y - 2..y + 5 || sliderValueHeld == value) { + val leftSliderPos = + x + (slider1 - value.minimum) / (value.maximum - value.minimum) * (endX - x) + val rightSliderPos = + x + (slider2 - value.minimum) / (value.maximum - value.minimum) * (endX - x) - if (abs(distToSlider1) <= abs(distToSlider2) && distToSlider2 <= 0) { + val distToSlider1 = mouseX - leftSliderPos + val distToSlider2 = mouseX - rightSliderPos + + val closerToLeft = abs(distToSlider1) < abs(distToSlider2) + + val isOnLeftSlider = + (mouseX.toFloat() in x.toFloat()..leftSliderPos || closerToLeft) && rightSliderPos > x + val isOnRightSlider = + (mouseX.toFloat() in rightSliderPos..endX.toFloat() || !closerToLeft) && leftSliderPos < endX + + val percentage = (mouseX.toFloat() - x) / (endX - x) + + if (isOnLeftSlider && currSlider == null || currSlider == RangeSlider.LEFT) { withDelayedSave { - value.setFirst(value.lerpWith(percentage).coerceIn(value.minimum, slider2), false) + value.setFirst( + value.lerpWith(percentage).coerceIn(value.minimum, slider2), + false + ) } - } else { + } + + if (isOnRightSlider && currSlider == null || currSlider == RangeSlider.RIGHT) { withDelayedSave { - value.setLast(value.lerpWith(percentage).coerceIn(slider1, value.maximum), false) + value.setLast( + value.lerpWith(percentage).coerceIn(slider1, value.maximum), + false + ) } } + // Keep changing this slider until mouse is unpressed. sliderValueHeld = value - if (mouseButton == 0) return true + // Stop rendering and interacting only when this event was triggered by a mouse click. + if (mouseButton == 0) { + value.lastChosenSlider = when { + isOnLeftSlider -> RangeSlider.LEFT + isOnRightSlider -> RangeSlider.RIGHT + else -> null + } + return true + } } - val displayValue1 = value.get().start - val displayValue2 = value.get().endInclusive - val sliderValue1 = - x + width * (displayValue1 - value.minimum) / (value.maximum - value.minimum) + x + width * (slider1 - value.minimum) / (value.maximum - value.minimum) val sliderValue2 = - x + width * (displayValue2 - value.minimum) / (value.maximum - value.minimum) + x + width * (slider2 - value.minimum) / (value.maximum - value.minimum) drawRect(x, y, x + width, y + 2, Int.MAX_VALUE) drawRect(sliderValue1, y.toFloat(), sliderValue2, y + 2f, color.rgb) diff --git a/src/main/java/net/ccbluex/liquidbounce/ui/client/clickgui/style/styles/LiquidBounceStyle.kt b/src/main/java/net/ccbluex/liquidbounce/ui/client/clickgui/style/styles/LiquidBounceStyle.kt index df6e16bb0e6..b1acc0fdf3b 100644 --- a/src/main/java/net/ccbluex/liquidbounce/ui/client/clickgui/style/styles/LiquidBounceStyle.kt +++ b/src/main/java/net/ccbluex/liquidbounce/ui/client/clickgui/style/styles/LiquidBounceStyle.kt @@ -269,27 +269,50 @@ object LiquidBounceStyle : Style() { val slider1 = value.get().first val slider2 = value.get().last - val text = "${value.name}§f: §c$slider1 §f- §c$slider2 §8${suffix}§c (Beta)" + val text = "${value.name}§f: §c$slider1 §f- §c$slider2 §8${suffix}" moduleElement.settingsWidth = font35.getStringWidth(text) + 8 - if (mouseButton == 0 && mouseX in minX..maxX && mouseY in yPos + 15..yPos + 21 || sliderValueHeld == value) { - val slider1Pos = - minX + ((slider1 - value.minimum).toFloat() / (value.maximum - value.minimum)) * (maxX - minX) - val slider2Pos = - minX + ((slider2 - value.minimum).toFloat() / (value.maximum - value.minimum)) * (maxX - minX) + val startX = minX + 4 + val startY = yPos + 14 + val width = moduleElement.settingsWidth - 12 + + val endX = startX + width + + val currSlider = value.lastChosenSlider + + if (mouseButton == 0 && mouseX in startX..endX && mouseY in startY - 2..startY + 7 || sliderValueHeld == value) { + val leftSliderPos = + startX + (slider1 - value.minimum).toFloat() / (value.maximum - value.minimum) * (endX - startX) + val rightSliderPos = + startX + (slider2 - value.minimum).toFloat() / (value.maximum - value.minimum) * (endX - startX) - val distToSlider1 = mouseX - slider1Pos - val distToSlider2 = mouseX - slider2Pos + val distToSlider1 = mouseX - leftSliderPos + val distToSlider2 = mouseX - rightSliderPos - val percentage = (mouseX - minX - 4F) / (maxX - minX - 8F) + val closerToLeft = abs(distToSlider1) < abs(distToSlider2) - if (abs(distToSlider1) <= abs(distToSlider2) && distToSlider2 <= 0) { + val isOnLeftSlider = + (mouseX.toFloat() in startX.toFloat()..leftSliderPos || closerToLeft) && rightSliderPos > startX + val isOnRightSlider = + (mouseX.toFloat() in rightSliderPos..endX.toFloat() || !closerToLeft) && leftSliderPos < endX + + val percentage = (mouseX.toFloat() - startX) / (endX - startX) + + if (isOnLeftSlider && currSlider == null || currSlider == RangeSlider.LEFT) { withDelayedSave { - value.setFirst(value.lerpWith(percentage).coerceIn(value.minimum, slider2), false) + value.setFirst( + value.lerpWith(percentage).coerceIn(value.minimum, slider2), + false + ) } - } else { + } + + if (isOnRightSlider && currSlider == null || currSlider == RangeSlider.RIGHT) { withDelayedSave { - value.setLast(value.lerpWith(percentage).coerceIn(slider1, value.maximum), false) + value.setLast( + value.lerpWith(percentage).coerceIn(slider1, value.maximum), + false + ) } } @@ -297,7 +320,14 @@ object LiquidBounceStyle : Style() { sliderValueHeld = value // Stop rendering and interacting only when this event was triggered by a mouse click. - if (mouseButton == 0) return true + if (mouseButton == 0) { + value.lastChosenSlider = when { + isOnLeftSlider -> RangeSlider.LEFT + isOnRightSlider -> RangeSlider.RIGHT + else -> null + } + return true + } } drawRect(minX + 4, yPos + 18, maxX - 4, yPos + 19, Int.MAX_VALUE) @@ -323,27 +353,50 @@ object LiquidBounceStyle : Style() { val slider2 = value.get().endInclusive val text = - "${value.name}§f: §c${round(slider1)} §f- §c${round(slider2)} §8${suffix}§c (Beta)" + "${value.name}§f: §c${round(slider1)} §f- §c${round(slider2)} §8${suffix}" moduleElement.settingsWidth = font35.getStringWidth(text) + 8 - if (mouseButton == 0 && mouseX in minX..maxX && mouseY in yPos + 15..yPos + 21 || sliderValueHeld == value) { - val slider1Pos = - minX + (slider1 - value.minimum) / (value.maximum - value.minimum) * (maxX - minX) - val slider2Pos = - minX + ((slider2 - value.minimum) / (value.maximum - value.minimum)) * (maxX - minX) + val startX = minX + 4 + val startY = yPos + 14 + val width = moduleElement.settingsWidth - 12 + + val endX = startX + width + + val currSlider = value.lastChosenSlider + + if (mouseButton == 0 && mouseX in startX..endX && mouseY in startY - 2..startY + 7 || sliderValueHeld == value) { + val leftSliderPos = + startX + (slider1 - value.minimum) / (value.maximum - value.minimum) * (endX - startX) + val rightSliderPos = + startX + (slider2 - value.minimum) / (value.maximum - value.minimum) * (endX - startX) - val distToSlider1 = mouseX - slider1Pos - val distToSlider2 = mouseX - slider2Pos + val distToSlider1 = mouseX - leftSliderPos + val distToSlider2 = mouseX - rightSliderPos - val percentage = (mouseX - minX - 4F) / (maxX - minX - 8F) + val closerToLeft = abs(distToSlider1) < abs(distToSlider2) - if (abs(distToSlider1) <= abs(distToSlider2) && distToSlider2 <= 0) { + val isOnLeftSlider = + (mouseX.toFloat() in startX.toFloat()..leftSliderPos || closerToLeft) && rightSliderPos > startX + val isOnRightSlider = + (mouseX.toFloat() in rightSliderPos..endX.toFloat() || !closerToLeft) && leftSliderPos < endX + + val percentage = (mouseX.toFloat() - startX) / (endX - startX) + + if (isOnLeftSlider && currSlider == null || currSlider == RangeSlider.LEFT) { withDelayedSave { - value.setFirst(value.lerpWith(percentage).coerceIn(value.minimum, slider2), false) + value.setFirst( + value.lerpWith(percentage).coerceIn(value.minimum, slider2), + false + ) } - } else { + } + + if (isOnRightSlider && currSlider == null || currSlider == RangeSlider.RIGHT) { withDelayedSave { - value.setLast(value.lerpWith(percentage).coerceIn(slider1, value.maximum), false) + value.setLast( + value.lerpWith(percentage).coerceIn(slider1, value.maximum), + false + ) } } @@ -351,7 +404,14 @@ object LiquidBounceStyle : Style() { sliderValueHeld = value // Stop rendering and interacting only when this event was triggered by a mouse click. - if (mouseButton == 0) return true + if (mouseButton == 0) { + value.lastChosenSlider = when { + isOnLeftSlider -> RangeSlider.LEFT + isOnRightSlider -> RangeSlider.RIGHT + else -> null + } + return true + } } drawRect(minX + 4, yPos + 18, maxX - 4, yPos + 19, Int.MAX_VALUE) diff --git a/src/main/java/net/ccbluex/liquidbounce/ui/client/clickgui/style/styles/NullStyle.kt b/src/main/java/net/ccbluex/liquidbounce/ui/client/clickgui/style/styles/NullStyle.kt index 0322ca79843..33675affc7a 100644 --- a/src/main/java/net/ccbluex/liquidbounce/ui/client/clickgui/style/styles/NullStyle.kt +++ b/src/main/java/net/ccbluex/liquidbounce/ui/client/clickgui/style/styles/NullStyle.kt @@ -240,30 +240,49 @@ object NullStyle : Style() { val slider1 = value.get().first val slider2 = value.get().last - val text = "${value.name}§f: §c$slider1 §f- §c$slider2 §8${suffix}§c (Beta)" + val text = "${value.name}§f: §c$slider1 §f- §c$slider2 §8${suffix}" moduleElement.settingsWidth = font35.getStringWidth(text) + 8 - if (mouseButton == 0 && mouseX in minX..maxX && mouseY in yPos + 15..yPos + 21 || sliderValueHeld == value) { - val slider1Pos = - minX + ((slider1 - value.minimum).toFloat() / (value.maximum - value.minimum)) * (maxX - minX) - val slider2Pos = - minX + ((slider2 - value.minimum).toFloat() / (value.maximum - value.minimum)) * (maxX - minX) + val startX = minX + 4 + val startY = yPos + 14 + val width = moduleElement.settingsWidth - 12 + + val endX = startX + width + + val currSlider = value.lastChosenSlider + + if (mouseButton == 0 && mouseX in startX..endX && mouseY in startY - 2..startY + 7 || sliderValueHeld == value) { + val leftSliderPos = + startX + (slider1 - value.minimum).toFloat() / (value.maximum - value.minimum) * (endX - startX) + val rightSliderPos = + startX + (slider2 - value.minimum).toFloat() / (value.maximum - value.minimum) * (endX - startX) + + val distToSlider1 = mouseX - leftSliderPos + val distToSlider2 = mouseX - rightSliderPos + + val closerToLeft = abs(distToSlider1) < abs(distToSlider2) - val distToSlider1 = mouseX - slider1Pos - val distToSlider2 = mouseX - slider2Pos + val isOnLeftSlider = + (mouseX.toFloat() in startX.toFloat()..leftSliderPos || closerToLeft) && rightSliderPos > startX + val isOnRightSlider = + (mouseX.toFloat() in rightSliderPos..endX.toFloat() || !closerToLeft) && leftSliderPos < endX - val percentage = (mouseX - minX - 4F) / (maxX - minX - 8F) + val percentage = (mouseX.toFloat() - startX) / (endX - startX) - if (abs(distToSlider1) <= abs(distToSlider2) && distToSlider2 <= 0) { + if (isOnLeftSlider && currSlider == null || currSlider == RangeSlider.LEFT) { withDelayedSave { value.setFirst( - value.lerpWith(percentage).coerceIn(value.minimum, slider2), false + value.lerpWith(percentage).coerceIn(value.minimum, slider2), + false ) } - } else { + } + + if (isOnRightSlider && currSlider == null || currSlider == RangeSlider.RIGHT) { withDelayedSave { value.setLast( - value.lerpWith(percentage).coerceIn(slider1, value.maximum), false + value.lerpWith(percentage).coerceIn(slider1, value.maximum), + false ) } } @@ -272,7 +291,14 @@ object NullStyle : Style() { sliderValueHeld = value // Stop rendering and interacting only when this event was triggered by a mouse click. - if (mouseButton == 0) return true + if (mouseButton == 0) { + value.lastChosenSlider = when { + isOnLeftSlider -> RangeSlider.LEFT + isOnRightSlider -> RangeSlider.RIGHT + else -> null + } + return true + } } drawRect(minX + 4, yPos + 18, maxX - 4, yPos + 19, Int.MAX_VALUE) @@ -298,30 +324,49 @@ object NullStyle : Style() { val slider2 = value.get().endInclusive val text = - "${value.name}§f: §c${round(slider1)} §f- §c${round(slider2)} §8${suffix}§c (Beta)" + "${value.name}§f: §c${round(slider1)} §f- §c${round(slider2)} §8${suffix}" moduleElement.settingsWidth = font35.getStringWidth(text) + 8 - if (mouseButton == 0 && mouseX in minX..maxX && mouseY in yPos + 15..yPos + 21 || sliderValueHeld == value) { - val slider1Pos = - minX + ((slider1 - value.minimum) / (value.maximum - value.minimum)) * (maxX - minX) - val slider2Pos = - minX + ((slider2 - value.minimum) / (value.maximum - value.minimum)) * (maxX - minX) + val startX = minX + 4 + val startY = yPos + 14 + val width = moduleElement.settingsWidth - 12 + + val endX = startX + width + + val currSlider = value.lastChosenSlider + + if (mouseButton == 0 && mouseX in startX..endX && mouseY in startY - 2..startY + 7 || sliderValueHeld == value) { + val leftSliderPos = + startX + (slider1 - value.minimum) / (value.maximum - value.minimum) * (endX - startX) + val rightSliderPos = + startX + (slider2 - value.minimum) / (value.maximum - value.minimum) * (endX - startX) + + val distToSlider1 = mouseX - leftSliderPos + val distToSlider2 = mouseX - rightSliderPos + + val closerToLeft = abs(distToSlider1) < abs(distToSlider2) - val distToSlider1 = mouseX - slider1Pos - val distToSlider2 = mouseX - slider2Pos + val isOnLeftSlider = + (mouseX.toFloat() in startX.toFloat()..leftSliderPos || closerToLeft) && rightSliderPos > startX + val isOnRightSlider = + (mouseX.toFloat() in rightSliderPos..endX.toFloat() || !closerToLeft) && leftSliderPos < endX - val percentage = (mouseX - minX - 4F) / (maxX - minX - 8F) + val percentage = (mouseX.toFloat() - startX) / (endX - startX) - if (abs(distToSlider1) <= abs(distToSlider2) && distToSlider2 <= 0) { + if (isOnLeftSlider && currSlider == null || currSlider == RangeSlider.LEFT) { withDelayedSave { value.setFirst( - value.lerpWith(percentage).coerceIn(value.minimum, slider2), false + value.lerpWith(percentage).coerceIn(value.minimum, slider2), + false ) } - } else { + } + + if (isOnRightSlider && currSlider == null || currSlider == RangeSlider.RIGHT) { withDelayedSave { value.setLast( - value.lerpWith(percentage).coerceIn(slider1, value.maximum), false + value.lerpWith(percentage).coerceIn(slider1, value.maximum), + false ) } } @@ -330,7 +375,14 @@ object NullStyle : Style() { sliderValueHeld = value // Stop rendering and interacting only when this event was triggered by a mouse click. - if (mouseButton == 0) return true + if (mouseButton == 0) { + value.lastChosenSlider = when { + isOnLeftSlider -> RangeSlider.LEFT + isOnRightSlider -> RangeSlider.RIGHT + else -> null + } + return true + } } drawRect(minX + 4, yPos + 18, maxX - 4, yPos + 19, Int.MAX_VALUE) diff --git a/src/main/java/net/ccbluex/liquidbounce/ui/client/clickgui/style/styles/SlowlyStyle.kt b/src/main/java/net/ccbluex/liquidbounce/ui/client/clickgui/style/styles/SlowlyStyle.kt index cc59056ff43..a90f168ea2c 100644 --- a/src/main/java/net/ccbluex/liquidbounce/ui/client/clickgui/style/styles/SlowlyStyle.kt +++ b/src/main/java/net/ccbluex/liquidbounce/ui/client/clickgui/style/styles/SlowlyStyle.kt @@ -305,33 +305,45 @@ object SlowlyStyle : Style() { val slider1 = value.get().first val slider2 = value.get().last - val text = "${value.name}§f: $slider1 - $slider2 §7$suffix§f (Beta)" + val text = "${value.name}§f: $slider1 - $slider2 §7$suffix" moduleElement.settingsWidth = font35.getStringWidth(text) + 8 val x = minX + 4 val y = yPos + 14 val width = moduleElement.settingsWidth - 12 val color = Color(7, 152, 252) + val endX = x + width - if (mouseButton == 0 && mouseX in x..x + width && mouseY in y - 2..y + 5 || sliderValueHeld == value) { - val slider1Pos = - minX + ((slider1 - value.minimum).toFloat() / (value.maximum - value.minimum)) * (maxX - minX) - val slider2Pos = - minX + ((slider2 - value.minimum).toFloat() / (value.maximum - value.minimum)) * (maxX - minX) + val currSlider = value.lastChosenSlider + + if (mouseButton == 0 && mouseX in x..endX && mouseY in y - 2..y + 5 || sliderValueHeld == value) { + val leftSliderPos = + x + (slider1 - value.minimum).toFloat() / (value.maximum - value.minimum) * (endX - x) + val rightSliderPos = + x + (slider2 - value.minimum).toFloat() / (value.maximum - value.minimum) * (endX - x) + + val distToSlider1 = mouseX - leftSliderPos + val distToSlider2 = mouseX - rightSliderPos - val distToSlider1 = mouseX - slider1Pos - val distToSlider2 = mouseX - slider2Pos + val closerToLeft = abs(distToSlider1) < abs(distToSlider2) - val percentage = (mouseX - minX - 4F) / (maxX - minX - 8F) + val isOnLeftSlider = + (mouseX.toFloat() in x.toFloat()..leftSliderPos || closerToLeft) && rightSliderPos > x + val isOnRightSlider = + (mouseX.toFloat() in rightSliderPos..endX.toFloat() || !closerToLeft) && leftSliderPos < endX - if (abs(distToSlider1) <= abs(distToSlider2) && distToSlider2 <= 0) { + val percentage = (mouseX.toFloat() - x) / (endX - x) + + if (isOnLeftSlider && currSlider == null || currSlider == RangeSlider.LEFT) { withDelayedSave { value.setFirst( value.lerpWith(percentage).coerceIn(value.minimum, slider2), false ) } - } else { + } + + if (isOnRightSlider && currSlider == null || currSlider == RangeSlider.RIGHT) { withDelayedSave { value.setLast( value.lerpWith(percentage).coerceIn(slider1, value.maximum), @@ -344,16 +356,18 @@ object SlowlyStyle : Style() { sliderValueHeld = value // Stop rendering and interacting only when this event was triggered by a mouse click. - if (mouseButton == 0) return true + if (mouseButton == 0) { + value.lastChosenSlider = when { + isOnLeftSlider -> RangeSlider.LEFT + isOnRightSlider -> RangeSlider.RIGHT + else -> null + } + return true + } } - val displayValue1 = value.get().first - val displayValue2 = value.get().last - - val sliderValue1 = - x + width * (displayValue1 - value.minimum) / (value.maximum - value.minimum) - val sliderValue2 = - x + width * (displayValue2 - value.minimum) / (value.maximum - value.minimum) + val sliderValue1 = x + width * (slider1 - value.minimum) / (value.maximum - value.minimum) + val sliderValue2 = x + width * (slider2 - value.minimum) / (value.maximum - value.minimum) drawRect(x, y, x + width, y + 2, Int.MAX_VALUE) drawRect(sliderValue1, y, sliderValue2, y + 2, color.rgb) @@ -369,32 +383,45 @@ object SlowlyStyle : Style() { val slider1 = value.get().start val slider2 = value.get().endInclusive - val text = "${value.name}§f: ${round(slider1)} - ${round(slider2)} §7$suffix§f (Beta)" + val text = "${value.name}§f: ${round(slider1)} - ${round(slider2)} §7$suffix" moduleElement.settingsWidth = font35.getStringWidth(text) + 8 val x = minX + 4 val y = yPos + 14 val width = moduleElement.settingsWidth - 12 - if (mouseButton == 0 && mouseX in x..x + width && mouseY in y - 2..y + 5 || sliderValueHeld == value) { - val slider1Pos = - minX + ((slider1 - value.minimum) / (value.maximum - value.minimum)) * (maxX - minX) - val slider2Pos = - minX + ((slider2 - value.minimum) / (value.maximum - value.minimum)) * (maxX - minX) + val endX = x + width + + val currSlider = value.lastChosenSlider + + if (mouseButton == 0 && mouseX in x..endX && mouseY in y - 2..y + 5 || sliderValueHeld == value) { + val leftSliderPos = + x + (slider1 - value.minimum) / (value.maximum - value.minimum) * (endX - x) + val rightSliderPos = + x + (slider2 - value.minimum) / (value.maximum - value.minimum) * (endX - x) - val distToSlider1 = mouseX - slider1Pos - val distToSlider2 = mouseX - slider2Pos + val distToSlider1 = mouseX - leftSliderPos + val distToSlider2 = mouseX - rightSliderPos - val percentage = (mouseX - minX - 4F) / (maxX - minX - 8F) + val closerToLeft = abs(distToSlider1) < abs(distToSlider2) - if (abs(distToSlider1) <= abs(distToSlider2) && distToSlider2 <= 0) { + val isOnLeftSlider = + (mouseX.toFloat() in x.toFloat()..leftSliderPos || closerToLeft) && rightSliderPos > x + val isOnRightSlider = + (mouseX.toFloat() in rightSliderPos..endX.toFloat() || !closerToLeft) && leftSliderPos < endX + + val percentage = (mouseX.toFloat() - x) / (endX - x) + + if (isOnLeftSlider && currSlider == null || currSlider == RangeSlider.LEFT) { withDelayedSave { value.setFirst( value.lerpWith(percentage).coerceIn(value.minimum, slider2), false ) } - } else { + } + + if (isOnRightSlider && currSlider == null || currSlider == RangeSlider.RIGHT) { withDelayedSave { value.setLast( value.lerpWith(percentage).coerceIn(slider1, value.maximum), @@ -407,16 +434,20 @@ object SlowlyStyle : Style() { sliderValueHeld = value // Stop rendering and interacting only when this event was triggered by a mouse click. - if (mouseButton == 0) return true + if (mouseButton == 0) { + value.lastChosenSlider = when { + isOnLeftSlider -> RangeSlider.LEFT + isOnRightSlider -> RangeSlider.RIGHT + else -> null + } + return true + } } - val displayValue1 = value.get().start - val displayValue2 = value.get().endInclusive - val sliderValue1 = - x + width * (displayValue1 - value.minimum) / (value.maximum - value.minimum) + x + width * (slider1 - value.minimum) / (value.maximum - value.minimum) val sliderValue2 = - x + width * (displayValue2 - value.minimum) / (value.maximum - value.minimum) + x + width * (slider2 - value.minimum) / (value.maximum - value.minimum) drawRect(x, y, x + width, y + 2, Int.MAX_VALUE) drawRect(sliderValue1, y.toFloat(), sliderValue2, y + 2f, backgroundColor.rgb) diff --git a/src/main/java/net/ccbluex/liquidbounce/ui/client/hud/designer/EditorPanel.kt b/src/main/java/net/ccbluex/liquidbounce/ui/client/hud/designer/EditorPanel.kt index b8f820ecf08..45b8d9350a1 100644 --- a/src/main/java/net/ccbluex/liquidbounce/ui/client/hud/designer/EditorPanel.kt +++ b/src/main/java/net/ccbluex/liquidbounce/ui/client/hud/designer/EditorPanel.kt @@ -7,6 +7,8 @@ package net.ccbluex.liquidbounce.ui.client.hud.designer import net.ccbluex.liquidbounce.config.* import net.ccbluex.liquidbounce.features.module.modules.render.ClickGUI.guiColor +import net.ccbluex.liquidbounce.file.FileManager.saveConfig +import net.ccbluex.liquidbounce.file.FileManager.valuesConfig import net.ccbluex.liquidbounce.ui.client.clickgui.ClickGui import net.ccbluex.liquidbounce.ui.client.hud.HUD import net.ccbluex.liquidbounce.ui.client.hud.HUD.ELEMENTS @@ -25,6 +27,7 @@ import net.ccbluex.liquidbounce.utils.render.RenderUtils.drawRect import net.ccbluex.liquidbounce.utils.render.RenderUtils.drawTexture import net.ccbluex.liquidbounce.utils.render.RenderUtils.makeScissorBox import net.ccbluex.liquidbounce.utils.render.RenderUtils.updateTextureCache +import net.ccbluex.liquidbounce.utils.timing.WaitTickUtils import net.minecraft.client.gui.ScaledResolution import net.minecraft.util.MathHelper import org.lwjgl.input.Mouse @@ -730,7 +733,13 @@ class EditorPanel(private val hudDesigner: GuiHudDesigner, var x: Int, var y: In finalColor = finalColor.withAlpha((value.opacitySliderY * 255).roundToInt()) - value.set(finalColor) + value.changeValue(finalColor) + + if (!WaitTickUtils.hasScheduled(this)) { + WaitTickUtils.conditionalSchedule(this, 10) { + (value.lastChosenSlider == null).also { if (it) saveConfig(valuesConfig) } + } + } if (leftClickPressed) { value.lastChosenSlider = when {