scrollable thingy

This commit is contained in:
2025-03-17 18:39:57 +01:00
parent 8e53ed7292
commit 0dcf8585e4
12 changed files with 138 additions and 13 deletions
@@ -1,6 +1,7 @@
package org.saturnclient.saturnclient; package org.saturnclient.saturnclient;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.util.math.ColorHelper; import net.minecraft.util.math.ColorHelper;
import org.saturnclient.saturnclient.cloaks.Cloaks; 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 String MOD_ID = "saturnclient";
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
public static int COLOR = ColorHelper.getArgb(255, 251, 60, 79); public static int COLOR = ColorHelper.getArgb(255, 251, 60, 79);
public static TextRenderer textRenderer = null;
@Override @Override
public void onInitialize() { public void onInitialize() {
@@ -1,5 +1,6 @@
package org.saturnclient.saturnclient.menus; package org.saturnclient.saturnclient.menus;
import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.ui.SaturnUi; import org.saturnclient.ui.SaturnUi;
import org.saturnclient.ui.Textures; import org.saturnclient.ui.Textures;
import org.saturnclient.ui.animations.FadeIn; 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.SaturnImageButton;
import org.saturnclient.ui.widgets.SaturnImage; import org.saturnclient.ui.widgets.SaturnImage;
import net.minecraft.client.MinecraftClient;
import net.minecraft.text.Text; import net.minecraft.text.Text;
public class MainMenu extends SaturnUi { public class MainMenu extends SaturnUi {
@@ -17,6 +19,8 @@ public class MainMenu extends SaturnUi {
@Override @Override
protected void init() { protected void init() {
SaturnClient.textRenderer = MinecraftClient.getInstance().textRenderer;
int buttonWidth = 96; int buttonWidth = 96;
int buttonHeight = 25; int buttonHeight = 25;
@@ -4,6 +4,7 @@ import org.saturnclient.ui.SaturnUi;
import org.saturnclient.ui.Textures; import org.saturnclient.ui.Textures;
import org.saturnclient.ui.animations.FadeIn; import org.saturnclient.ui.animations.FadeIn;
import org.saturnclient.ui.widgets.SaturnClickableImage; import org.saturnclient.ui.widgets.SaturnClickableImage;
import org.saturnclient.ui.widgets.SaturnScroll;
import org.saturnclient.ui.widgets.SaturnSprite; import org.saturnclient.ui.widgets.SaturnSprite;
import net.minecraft.text.Text; import net.minecraft.text.Text;
@@ -66,12 +67,14 @@ public class SettingsMenu extends SaturnUi {
.setHeight(tabSize) .setHeight(tabSize)
.setAnimations(new FadeIn(1))); .setAnimations(new FadeIn(1)));
int modX = modsX + 15; int modX = 0;
int modY = modsY + 10; int modY = 0;
int col = 0; int col = 0;
for (int i = 0; i < 20; i++) { SaturnScroll modsScroll = new SaturnScroll();
draw(new SaturnClickableImage(Textures.MOD, (m) -> {
for (int i = 0; i < 30; i++) {
modsScroll.draw(new SaturnClickableImage(Textures.MOD, (m) -> {
}) })
.setX(modX) .setX(modX)
.setY(modY) .setY(modY)
@@ -81,12 +84,14 @@ public class SettingsMenu extends SaturnUi {
col++; col++;
if (col < 3) { if (col < 3) {
modX += 86 + 15; modX += 86 + 18;
} else { } else {
modX = modsX + 15; modX = 0;
modY += 20 + 20; modY += 20 + 20;
col = 0; col = 0;
} }
} }
draw(modsScroll.setX(modsX + 17).setY(modsY + 10).setWidth(rectWidth - 17).setHeight(rectHeight - 10));
} }
} }
@@ -19,6 +19,7 @@ public class SaturnUi extends Screen {
public void draw(SaturnWidget widget) { public void draw(SaturnWidget widget) {
synchronized (widgets) { synchronized (widgets) {
widget.init();
widgets.add(widget); widgets.add(widget);
} }
} }
@@ -63,7 +64,7 @@ public class SaturnUi extends Screen {
boolean isMouseInside = widget.x < mouseX && widget.x + widget.width > mouseX boolean isMouseInside = widget.x < mouseX && widget.x + widget.width > mouseX
&& widget.y < mouseY && widget.y + widget.height > mouseY; && widget.y < mouseY && widget.y + widget.height > mouseY;
if (isMouseInside) { 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); 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) { private char getCharFromKey(int keyCode, int modifiers) {
boolean shift = (modifiers & GLFW.GLFW_MOD_SHIFT) != 0; boolean shift = (modifiers & GLFW.GLFW_MOD_SHIFT) != 0;
@@ -11,10 +11,13 @@ public class SaturnWidget {
public SaturnAnimation[] animations = null; public SaturnAnimation[] animations = null;
public boolean visible = true; public boolean visible = true;
public void init() {
}
public void render(DrawContext context, boolean hovering, int mouseX, int mouseY) { 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) { public void keyPressed(int keyCode, int scanCode, int modifiers) {
@@ -23,6 +26,10 @@ public class SaturnWidget {
public void charTyped(char typedChar) { public void charTyped(char typedChar) {
} }
public void mouseScrolled(int mouseX, int mouseY, double horizontalAmount,
double verticalAmount) {
}
public SaturnWidget setX(int x) { public SaturnWidget setX(int x) {
this.x = x; this.x = x;
return this; return this;
@@ -58,7 +58,7 @@ public class SaturnButton extends SaturnWidget {
} }
@Override @Override
public void click() { public void click(int mouseX, int mouseY) {
this.onPress.accept(this); this.onPress.accept(this);
} }
} }
@@ -36,7 +36,7 @@ public class SaturnClickableImage extends SaturnWidget {
} }
@Override @Override
public void click() { public void click(int mouseX, int mouseY) {
this.onPress.accept(this); this.onPress.accept(this);
} }
@@ -37,7 +37,7 @@ public class SaturnClickableSprite extends SaturnWidget {
} }
@Override @Override
public void click() { public void click(int mouseX, int mouseY) {
this.onPress.accept(this); this.onPress.accept(this);
} }
@@ -40,7 +40,7 @@ public class SaturnImageButton extends SaturnButton {
} }
@Override @Override
public void click() { public void click(int mouseX, int mouseY) {
this.onPress.accept(this); this.onPress.accept(this);
} }
@@ -26,7 +26,7 @@ public class SaturnInputBox extends SaturnWidget {
} }
@Override @Override
public void click() { public void click(int mouseX, int mouseY) {
focused = true; focused = true;
} }
@@ -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<SaturnWidget> 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;
}
}
@@ -1,5 +1,6 @@
package org.saturnclient.ui.widgets; package org.saturnclient.ui.widgets;
import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.ui.SaturnWidget; import org.saturnclient.ui.SaturnWidget;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.DrawContext;
@@ -10,6 +11,8 @@ public class SaturnText extends SaturnWidget {
public SaturnText(String text) { public SaturnText(String text) {
this.text = text; this.text = text;
this.width = SaturnClient.textRenderer.getWidth(text);
this.height = SaturnClient.textRenderer.fontHeight;
} }
@Override @Override