diff --git a/src/main/java/org/saturnclient/saturnclient/SaturnClient.java b/src/main/java/org/saturnclient/saturnclient/SaturnClient.java index 2ec685a..8012dea 100644 --- a/src/main/java/org/saturnclient/saturnclient/SaturnClient.java +++ b/src/main/java/org/saturnclient/saturnclient/SaturnClient.java @@ -1,6 +1,7 @@ package org.saturnclient.saturnclient; import net.fabricmc.api.ModInitializer; +import net.minecraft.client.font.TextRenderer; import net.minecraft.util.math.ColorHelper; import org.saturnclient.saturnclient.cloaks.Cloaks; @@ -17,6 +18,7 @@ public class SaturnClient implements ModInitializer { public static final String MOD_ID = "saturnclient"; public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); public static int COLOR = ColorHelper.getArgb(255, 251, 60, 79); + public static TextRenderer textRenderer = null; @Override public void onInitialize() { diff --git a/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java b/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java index 02f4acb..132f2bd 100644 --- a/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java +++ b/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java @@ -1,5 +1,6 @@ package org.saturnclient.saturnclient.menus; +import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.ui.SaturnUi; import org.saturnclient.ui.Textures; import org.saturnclient.ui.animations.FadeIn; @@ -8,6 +9,7 @@ import org.saturnclient.ui.widgets.SaturnButton; import org.saturnclient.ui.widgets.SaturnImageButton; import org.saturnclient.ui.widgets.SaturnImage; +import net.minecraft.client.MinecraftClient; import net.minecraft.text.Text; public class MainMenu extends SaturnUi { @@ -17,6 +19,8 @@ public class MainMenu extends SaturnUi { @Override protected void init() { + SaturnClient.textRenderer = MinecraftClient.getInstance().textRenderer; + int buttonWidth = 96; int buttonHeight = 25; diff --git a/src/main/java/org/saturnclient/saturnclient/menus/SettingsMenu.java b/src/main/java/org/saturnclient/saturnclient/menus/SettingsMenu.java index 0d49420..3da5fc0 100644 --- a/src/main/java/org/saturnclient/saturnclient/menus/SettingsMenu.java +++ b/src/main/java/org/saturnclient/saturnclient/menus/SettingsMenu.java @@ -4,6 +4,7 @@ import org.saturnclient.ui.SaturnUi; import org.saturnclient.ui.Textures; import org.saturnclient.ui.animations.FadeIn; import org.saturnclient.ui.widgets.SaturnClickableImage; +import org.saturnclient.ui.widgets.SaturnScroll; import org.saturnclient.ui.widgets.SaturnSprite; import net.minecraft.text.Text; @@ -66,12 +67,14 @@ public class SettingsMenu extends SaturnUi { .setHeight(tabSize) .setAnimations(new FadeIn(1))); - int modX = modsX + 15; - int modY = modsY + 10; + int modX = 0; + int modY = 0; int col = 0; - for (int i = 0; i < 20; i++) { - draw(new SaturnClickableImage(Textures.MOD, (m) -> { + SaturnScroll modsScroll = new SaturnScroll(); + + for (int i = 0; i < 30; i++) { + modsScroll.draw(new SaturnClickableImage(Textures.MOD, (m) -> { }) .setX(modX) .setY(modY) @@ -81,12 +84,14 @@ public class SettingsMenu extends SaturnUi { col++; if (col < 3) { - modX += 86 + 15; + modX += 86 + 18; } else { - modX = modsX + 15; + modX = 0; modY += 20 + 20; col = 0; } } + + draw(modsScroll.setX(modsX + 17).setY(modsY + 10).setWidth(rectWidth - 17).setHeight(rectHeight - 10)); } } \ No newline at end of file diff --git a/src/main/java/org/saturnclient/ui/SaturnUi.java b/src/main/java/org/saturnclient/ui/SaturnUi.java index 8dfb7d6..1392dec 100644 --- a/src/main/java/org/saturnclient/ui/SaturnUi.java +++ b/src/main/java/org/saturnclient/ui/SaturnUi.java @@ -19,6 +19,7 @@ public class SaturnUi extends Screen { public void draw(SaturnWidget widget) { synchronized (widgets) { + widget.init(); widgets.add(widget); } } @@ -63,7 +64,7 @@ public class SaturnUi extends Screen { boolean isMouseInside = widget.x < mouseX && widget.x + widget.width > mouseX && widget.y < mouseY && widget.y + widget.height > mouseY; if (isMouseInside) { - widget.click(); + widget.click((int) mouseX, (int) mouseY); } } } @@ -88,6 +89,20 @@ public class SaturnUi extends Screen { return super.keyPressed(keyCode, scanCode, modifiers); } + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { + for (SaturnWidget widget : new ArrayList<>(widgets)) { + boolean isMouseInside = widget.x < mouseX && widget.x + widget.width > mouseX + && widget.y < mouseY && widget.y + widget.height > mouseY; + + if (isMouseInside) { + widget.mouseScrolled((int) mouseX, (int) mouseY, horizontalAmount, verticalAmount); + } + } + + return super.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount); + } + private char getCharFromKey(int keyCode, int modifiers) { boolean shift = (modifiers & GLFW.GLFW_MOD_SHIFT) != 0; diff --git a/src/main/java/org/saturnclient/ui/SaturnWidget.java b/src/main/java/org/saturnclient/ui/SaturnWidget.java index c4a21ab..12a42ae 100644 --- a/src/main/java/org/saturnclient/ui/SaturnWidget.java +++ b/src/main/java/org/saturnclient/ui/SaturnWidget.java @@ -11,10 +11,13 @@ public class SaturnWidget { public SaturnAnimation[] animations = null; public boolean visible = true; + public void init() { + } + public void render(DrawContext context, boolean hovering, int mouseX, int mouseY) { } - public void click() { + public void click(int mouseX, int mouseY) { } public void keyPressed(int keyCode, int scanCode, int modifiers) { @@ -23,6 +26,10 @@ public class SaturnWidget { public void charTyped(char typedChar) { } + public void mouseScrolled(int mouseX, int mouseY, double horizontalAmount, + double verticalAmount) { + } + public SaturnWidget setX(int x) { this.x = x; return this; diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnButton.java b/src/main/java/org/saturnclient/ui/widgets/SaturnButton.java index 89a4dbf..35c3b98 100644 --- a/src/main/java/org/saturnclient/ui/widgets/SaturnButton.java +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnButton.java @@ -58,7 +58,7 @@ public class SaturnButton extends SaturnWidget { } @Override - public void click() { + public void click(int mouseX, int mouseY) { this.onPress.accept(this); } } diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnClickableImage.java b/src/main/java/org/saturnclient/ui/widgets/SaturnClickableImage.java index 339aa75..390761c 100644 --- a/src/main/java/org/saturnclient/ui/widgets/SaturnClickableImage.java +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnClickableImage.java @@ -36,7 +36,7 @@ public class SaturnClickableImage extends SaturnWidget { } @Override - public void click() { + public void click(int mouseX, int mouseY) { this.onPress.accept(this); } diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnClickableSprite.java b/src/main/java/org/saturnclient/ui/widgets/SaturnClickableSprite.java index 417f7f7..0b25af9 100644 --- a/src/main/java/org/saturnclient/ui/widgets/SaturnClickableSprite.java +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnClickableSprite.java @@ -37,7 +37,7 @@ public class SaturnClickableSprite extends SaturnWidget { } @Override - public void click() { + public void click(int mouseX, int mouseY) { this.onPress.accept(this); } diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnImageButton.java b/src/main/java/org/saturnclient/ui/widgets/SaturnImageButton.java index d10f2b1..4e53197 100644 --- a/src/main/java/org/saturnclient/ui/widgets/SaturnImageButton.java +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnImageButton.java @@ -40,7 +40,7 @@ public class SaturnImageButton extends SaturnButton { } @Override - public void click() { + public void click(int mouseX, int mouseY) { this.onPress.accept(this); } diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnInputBox.java b/src/main/java/org/saturnclient/ui/widgets/SaturnInputBox.java index e904639..afd5efd 100644 --- a/src/main/java/org/saturnclient/ui/widgets/SaturnInputBox.java +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnInputBox.java @@ -26,7 +26,7 @@ public class SaturnInputBox extends SaturnWidget { } @Override - public void click() { + public void click(int mouseX, int mouseY) { focused = true; } diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnScroll.java b/src/main/java/org/saturnclient/ui/widgets/SaturnScroll.java new file mode 100644 index 0000000..136c755 --- /dev/null +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnScroll.java @@ -0,0 +1,89 @@ +package org.saturnclient.ui.widgets; + +import java.util.ArrayList; +import java.util.List; + +import org.saturnclient.ui.SaturnWidget; + +import net.minecraft.client.gui.DrawContext; + +public class SaturnScroll extends SaturnWidget { + private int scroll = 0; + private int maxScroll = 0; + private List children = new ArrayList<>(); + + @Override + public void mouseScrolled(int mouseX, int mouseY, double horizontalAmount, + double verticalAmount) { + if (scroll - verticalAmount <= 0) { + scroll = 0; + } else if (scroll - verticalAmount >= maxScroll) { + scroll = maxScroll; + } else { + scroll -= verticalAmount; + } + } + + @Override + public void render(DrawContext context, boolean hovering, int mouseX, int mouseY) { + context.enableScissor(x, y, x + width, y + height); + + for (SaturnWidget child : children) { + int xx = child.x; + int yy = child.y; + + child.x += x; + child.y += y - scroll; + + boolean isMouseInside = child.x < mouseX && child.x + child.width > mouseX + && child.y < mouseY && child.y + child.height > mouseY; + + if (child.y < y + height && child.y + child.height > y) { + child.render(context, isMouseInside, mouseX, mouseY); + } + + child.x = xx; + child.y = yy; + } + + context.disableScissor(); + } + + @Override + public void click(int mouseX, int mouseY) { + for (SaturnWidget child : children) { + boolean isMouseInside = child.x < mouseX && child.x + child.width > mouseX + && child.y < mouseY && child.y + child.height > mouseY; + + if (isMouseInside) { + child.click(mouseX, mouseY); + return; + } + } + } + + @Override + public void init() { + if (isScrollable()) { + for (SaturnWidget child : children) { + maxScroll = Math.max(maxScroll, child.y - height); + } + } + } + + public void draw(SaturnWidget widget) { + synchronized (children) { + widget.init(); + children.add(widget); + } + } + + public boolean isScrollable() { + for (SaturnWidget child : children) { + if (child.y + child.height > height) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnText.java b/src/main/java/org/saturnclient/ui/widgets/SaturnText.java index fbaaff7..70f6d4b 100644 --- a/src/main/java/org/saturnclient/ui/widgets/SaturnText.java +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnText.java @@ -1,5 +1,6 @@ package org.saturnclient.ui.widgets; +import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.ui.SaturnWidget; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; @@ -10,6 +11,8 @@ public class SaturnText extends SaturnWidget { public SaturnText(String text) { this.text = text; + this.width = SaturnClient.textRenderer.getWidth(text); + this.height = SaturnClient.textRenderer.fontHeight; } @Override