From 5bcc2b82ca26a37aaecb91238563aa4bf683bafa Mon Sep 17 00:00:00 2001 From: Ralty <78720179+Raltyro@users.noreply.github.com> Date: Mon, 28 Jul 2025 18:54:34 +0700 Subject: [PATCH] Complete Slider and Mouse Control on Sliders --- source/funkin/menus/ui/Slider.hx | 24 ++++++++++----------- source/funkin/options/TreeMenuScreen.hx | 18 +++++++++++++--- source/funkin/options/type/SliderOption.hx | 25 +++++++++++++++++++--- 3 files changed, 49 insertions(+), 18 deletions(-) diff --git a/source/funkin/menus/ui/Slider.hx b/source/funkin/menus/ui/Slider.hx index 68eba451..c55d9724 100644 --- a/source/funkin/menus/ui/Slider.hx +++ b/source/funkin/menus/ui/Slider.hx @@ -99,7 +99,7 @@ class Slider extends FlxSprite { if (showSlider) { _frame.prepareMatrix(_matrix, ANGLE_0, __flipX != camera.flipX, __flipY != camera.flipY); - prepareDrawMatrix(camera, -_frame.sourceSize.x * 0.5 + __valueWidth, -(_frame.sourceSize.y - barHeight) * 0.5); + prepareDrawMatrix(camera, -_frame.sourceSize.x * 0.5 + (__flipX ? barWidth - __valueWidth : __valueWidth), -(_frame.sourceSize.y - barHeight) * 0.5); forceDrawFrame(camera, _frame); } } @@ -151,11 +151,11 @@ class Slider extends FlxSprite { anim = getBarAnim(1, true); frame = frames.frames[anim.frames[__frameTime % anim.numFrames]]; - if (!flip != !__flipX) __barClipRect.set(0, 0, __valueWidth - x, frame.sourceSize.y); - else __barClipRect.set(__cornerWidth - __valueWidth + x, 0, __valueWidth - x, frame.sourceSize.y); + if (flip) __barClipRect.set(__cornerWidth - __valueWidth + x, 0, __valueWidth - x, frame.sourceSize.y); + else __barClipRect.set(0, 0, __valueWidth - x, frame.sourceSize.y); __barFrame = frame.clipTo(__barClipRect, __barFrame); - __barFrame.prepareMatrix(_matrix, ANGLE_0, flip != camera.flipX, __flipY != camera.flipY); - prepareDrawMatrix(camera, x, 0); + __barFrame.prepareMatrix(_matrix, ANGLE_0, flip != __flipX != camera.flipX, __flipY != camera.flipY); + prepareDrawMatrix(camera, __flipX ? barWidth - x - frame.sourceSize.x : x, 0); forceDrawFrame(camera, __barFrame); } @@ -163,11 +163,11 @@ class Slider extends FlxSprite { anim = getBarAnim(1, false); frame = frames.frames[anim.frames[__frameTime % anim.numFrames]]; - if (flip != __flipX) __barClipRect.set(0, 0, __cornerWidth - __valueWidth + x, frame.sourceSize.y); + if (flip) __barClipRect.set(0, 0, __cornerWidth - __valueWidth + x, frame.sourceSize.y); else __barClipRect.set(__valueWidth - x, 0, __cornerWidth - __valueWidth + x, frame.sourceSize.y); __barFrame = frame.clipTo(__barClipRect, __barFrame); - __barFrame.prepareMatrix(_matrix, ANGLE_0, flip != camera.flipX, __flipY != camera.flipY); - prepareDrawMatrix(camera, x, 0); + __barFrame.prepareMatrix(_matrix, ANGLE_0, flip != __flipX != camera.flipX, __flipY != camera.flipY); + prepareDrawMatrix(camera, __flipX ? barWidth - x - frame.sourceSize.x : x, 0); forceDrawFrame(camera, __barFrame); } @@ -187,7 +187,7 @@ class Slider extends FlxSprite { __barFrame = frame.clipTo(__barClipRect, __barFrame); __barFrame.prepareMatrix(_matrix, ANGLE_0, __flipX != camera.flipX, __flipY != camera.flipY); _matrix.scale(s, 1); - prepareDrawMatrix(camera, x, 0); + prepareDrawMatrix(camera, __flipX ? barWidth - x - width : x, 0); forceDrawFrame(camera, __barFrame); } @@ -200,7 +200,7 @@ class Slider extends FlxSprite { __barFrame = frame.clipTo(__barClipRect, __barFrame); __barFrame.prepareMatrix(_matrix, ANGLE_0, __flipX != camera.flipX, __flipY != camera.flipY); _matrix.scale(s, 1); - prepareDrawMatrix(camera, x, 0); + prepareDrawMatrix(camera, __flipX ? barWidth - x - width : x, 0); forceDrawFrame(camera, __barFrame); } @@ -218,7 +218,7 @@ class Slider extends FlxSprite { __barClipRect.set(offset, 0, __valueWidth - x, frame.sourceSize.y); __barFrame = frame.clipTo(__barClipRect, __barFrame); __barFrame.prepareMatrix(_matrix, ANGLE_0, __flipX != camera.flipX, __flipY != camera.flipY); - prepareDrawMatrix(camera, x, 0); + prepareDrawMatrix(camera, __flipX ? barWidth - x - width : x, 0); forceDrawFrame(camera, __barFrame); } @@ -229,7 +229,7 @@ class Slider extends FlxSprite { __barClipRect.set(__valueWidth - x + offset, 0, __segmentWidth - offset - __valueWidth + x, frame.sourceSize.y); __barFrame = frame.clipTo(__barClipRect, __barFrame); __barFrame.prepareMatrix(_matrix, ANGLE_0, __flipX != camera.flipX, __flipY != camera.flipY); - prepareDrawMatrix(camera, x, 0); + prepareDrawMatrix(camera, __flipX ? barWidth - x - width : x, 0); forceDrawFrame(camera, __barFrame); } diff --git a/source/funkin/options/TreeMenuScreen.hx b/source/funkin/options/TreeMenuScreen.hx index 3bec7899..33883fc0 100644 --- a/source/funkin/options/TreeMenuScreen.hx +++ b/source/funkin/options/TreeMenuScreen.hx @@ -93,10 +93,20 @@ class TreeMenuScreen extends FlxSpriteGroup { if (inputEnabled) { for (basic in turboBasics) basic.update(elapsed); - changeSelection((upTurboControl.activated ? -1 : 0) + (downTurboControl.activated ? 1 : 0) - FlxG.mouse.wheel); + + var change = (upTurboControl.activated ? -1 : 0) + (downTurboControl.activated ? 1 : 0) - FlxG.mouse.wheel, mouseControl = false; + if (FlxG.mouse.justPressed) { + for (i in CoolUtil.maxInt(curSelected - 3, 0)...CoolUtil.minInt(curSelected + 4, length)) + if (i != curSelected && members[i] != null && mouseOverlaps(members[i])) { + change = i - curSelected; + mouseControl = true; + break; + } + } + changeSelection(change); if (length > 0 && curOption != null) { - if (controls.ACCEPT || (FlxG.mouse.justPressed && FlxG.mouse.overlaps(members[curSelected]))) curOption.select(); + if (controls.ACCEPT || (!mouseControl && FlxG.mouse.justPressed && mouseOverlaps(members[curSelected]))) curOption.select(); if (curFloatOption != null) { if (controls.LEFT) curFloatOption.changeValue(-elapsed); if (controls.RIGHT) curFloatOption.changeValue(elapsed); @@ -172,9 +182,11 @@ class TreeMenuScreen extends FlxSpriteGroup { if (parent != null) parent.updateDesc(customTxt); } + function mouseOverlaps(sprite:FlxSprite):Bool + return sprite.overlapsPoint(FlxG.mouse.getPosition(@:privateAccess flixel.input.FlxPointer._cachedPoint), true); + override function destroy() { super.destroy(); - for (basic in turboBasics) basic.destroy(); } } \ No newline at end of file diff --git a/source/funkin/options/type/SliderOption.hx b/source/funkin/options/type/SliderOption.hx index 1cdfc3a0..7ecb4a84 100644 --- a/source/funkin/options/type/SliderOption.hx +++ b/source/funkin/options/type/SliderOption.hx @@ -16,16 +16,20 @@ class SliderOption extends TextOption implements ITreeFloatOption { public var optionName:String; public var slider:Slider; + public var dynamicWidth:Bool; + + var __mouseControl:Bool; function getValue():Float return (currentValue - min) / (max - min); override function set_text(v:String) { super.set_text(v); slider.x = __text.x + __text.width + 30; + if (dynamicWidth) slider.barWidth = 1100 - __text.width; return v; } - public function new(text:String, desc:String, min:Float, max:Float, step:Float, ?segments:Int, optionName:String, barWidth = 600.0, + public function new(text:String, desc:String, min:Float, max:Float, step:Float, ?segments:Int, optionName:String, barWidth = -1, ?changedCallback:Float->Void = null, ?parent:Dynamic) { this.changedCallback = changedCallback; @@ -37,7 +41,7 @@ class SliderOption extends TextOption implements ITreeFloatOption { if (Reflect.field(parent, optionName) != null) currentValue = Reflect.field(parent, optionName); - slider = new Slider(12, 0, getValue(), barWidth, segments); + slider = new Slider(12, 0, getValue(), (dynamicWidth = barWidth < 0) ? 600 : barWidth, segments); slider.scale.set(0.75, 0.75); slider.updateHitbox(); @@ -47,7 +51,22 @@ class SliderOption extends TextOption implements ITreeFloatOption { } override function update(elapsed:Float) { - slider.selected = selected && !locked; + if (slider.selected = selected && !locked) { + if (__mouseControl && FlxG.mouse.justReleased) __mouseControl = false; + else if (FlxG.mouse.justPressed) __mouseControl = slider.overlapsPoint(FlxG.mouse.getPosition(@:privateAccess flixel.input.FlxPointer._cachedPoint), true); + + if (__mouseControl) { + var p = @:privateAccess flixel.input.FlxPointer._cachedPoint; + if (!FlxG.mouse.justPressed) FlxG.mouse.getPosition(p); + p.subtractPoint(camera.scroll); + + slider.getScreenPosition(_point, camera); + changeValue((FlxMath.remapToRange(p.x - _point.x, 0, slider.width, min, max) - currentValue) / step); + } + } + else + __mouseControl = false; + slider.value = getValue(); //__text.x = slider.x + slider.width + 30;