Make storage overlay scrollbar draggable

This commit is contained in:
Linnea Gräf
2024-10-02 16:44:25 +02:00
parent a4eac70118
commit 67dd2f68d6
4 changed files with 554 additions and 504 deletions

View File

@@ -166,4 +166,22 @@ public class PatchHandledScreen<T extends ScreenHandler> extends Screen implemen
}
return original.call(instance, mouseX, mouseY, button);
}
@Inject(method = "mouseDragged", at = @At("HEAD"), cancellable = true)
public void overrideMouseDrags(double mouseX, double mouseY, int button, double deltaX, double deltaY, CallbackInfoReturnable<Boolean> cir) {
if (override != null) {
if (override.mouseDragged(mouseX, mouseY, button, deltaX, deltaY))
cir.setReturnValue(true);
}
}
@Inject(
method = "mouseReleased",
at = @At("HEAD"), cancellable = true)
public void overrideMouseReleases(double mouseX, double mouseY, int button, CallbackInfoReturnable<Boolean> cir) {
if (override != null) {
if (override.mouseReleased(mouseX, mouseY, button))
cir.setReturnValue(true);
}
}
}

View File

@@ -1,4 +1,3 @@
package moe.nea.firmament.features.inventory.storageoverlay
import me.shedaniel.math.Point
@@ -59,6 +58,14 @@ class StorageOverlayCustom(
return false
}
override fun mouseReleased(mouseX: Double, mouseY: Double, button: Int): Boolean {
return overview.mouseReleased(mouseX, mouseY, button)
}
override fun mouseDragged(mouseX: Double, mouseY: Double, button: Int, deltaX: Double, deltaY: Double): Boolean {
return overview.mouseDragged(mouseX, mouseY, button, deltaX, deltaY)
}
override fun mouseClick(mouseX: Double, mouseY: Double, button: Int): Boolean {
return overview.mouseClicked(mouseX, mouseY, button, (handler as? StorageBackingHandle.Page)?.storagePageSlot)
}

View File

@@ -1,4 +1,3 @@
package moe.nea.firmament.features.inventory.storageoverlay
import me.shedaniel.math.Point
@@ -8,10 +7,7 @@ import net.minecraft.client.gui.screen.Screen
import net.minecraft.screen.slot.Slot
import net.minecraft.text.Text
import net.minecraft.util.Identifier
import moe.nea.firmament.annotations.Subscribe
import moe.nea.firmament.events.CommandEvent
import moe.nea.firmament.util.MC
import moe.nea.firmament.util.ScreenUtil
import moe.nea.firmament.util.assertTrueOr
class StorageOverlayScreen : Screen(Text.literal("")) {
@@ -56,6 +52,7 @@ class StorageOverlayScreen : Screen(Text.literal("")) {
.coerceAtMost((width - PADDING) / (PAGE_WIDTH + PADDING))
.coerceAtLeast(1)
measurements = Measurements()
scroll = scroll.coerceAtMost(getMaxScroll()).coerceAtLeast(0F)
}
override fun mouseScrolled(
@@ -185,10 +182,31 @@ class StorageOverlayScreen : Screen(Text.literal("")) {
context.disableScissor()
}
var knobGrabbed = false
override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
return mouseClicked(mouseX, mouseY, button, null)
}
override fun mouseReleased(mouseX: Double, mouseY: Double, button: Int): Boolean {
if (knobGrabbed) {
knobGrabbed = false
return true
}
return super.mouseReleased(mouseX, mouseY, button)
}
override fun mouseDragged(mouseX: Double, mouseY: Double, button: Int, deltaX: Double, deltaY: Double): Boolean {
if (knobGrabbed) {
val sbRect = getScrollBarRect()
val percentage = (mouseY - sbRect.getY()) / sbRect.getHeight()
scroll = (getMaxScroll() * percentage).toFloat()
mouseScrolled(0.0, 0.0, 0.0, 0.0)
return true
}
return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY)
}
fun mouseClicked(mouseX: Double, mouseY: Double, button: Int, activePage: StoragePageSlot?): Boolean {
if (getScrollPanelInner().contains(mouseX, mouseY)) {
val data = StorageOverlay.Data.data ?: StorageData()
@@ -202,10 +220,10 @@ class StorageOverlayScreen : Screen(Text.literal("")) {
}
val sbRect = getScrollBarRect()
if (sbRect.contains(mouseX, mouseY)) {
// TODO: support dragging of the mouse and such
val percentage = (mouseY - sbRect.getY()) / sbRect.getHeight()
scroll = (getMaxScroll() * percentage).toFloat()
mouseScrolled(0.0, 0.0, 0.0, 0.0)
knobGrabbed = true
return true
}
return false

View File

@@ -1,4 +1,3 @@
package moe.nea.firmament.util.customgui
import me.shedaniel.math.Rectangle
@@ -69,4 +68,12 @@ abstract class CustomGui {
open fun onVoluntaryExit(): Boolean {
return true
}
open fun mouseReleased(mouseX: Double, mouseY: Double, button: Int): Boolean {
return false
}
open fun mouseDragged(mouseX: Double, mouseY: Double, button: Int, deltaX: Double, deltaY: Double): Boolean {
return false
}
}