Improved scroll

This commit is contained in:
2026-02-21 20:09:19 +01:00
parent a49212ca64
commit 3ba6202b43
@@ -27,17 +27,31 @@ public class Scroll extends Element {
@Override @Override
public void render(RenderScope renderScope, ElementContext ctx) { public void render(RenderScope renderScope, ElementContext ctx) {
renderScope.drawRoundedRectangle(0, 0, width, height, Theme.BG_RADIUS.value, Theme.BACKGROUND.value); calculateMaxScroll();
renderScope.drawRoundedRectangle(0, 0, width, height,
Theme.BG_RADIUS.value, Theme.BACKGROUND.value);
renderScope.enableScissor(padding, padding, width - padding, height - padding); renderScope.enableScissor(padding, padding, width - padding, height - padding);
renderScope.matrices.push(); renderScope.matrices.push();
renderScope.matrices.translate(padding, (-scroll) + padding, 0); renderScope.matrices.translate(padding, -scroll + padding, 0);
ElementRenderer.render(children, renderScope, ctx.mouseX - padding, ctx.mouseY - padding + scroll);
ElementRenderer.render(children, renderScope,
ctx.mouseX - padding,
ctx.mouseY - padding + scroll);
renderScope.matrices.pop(); renderScope.matrices.pop();
renderScope.disableScissor(); renderScope.disableScissor();
renderScope.drawRoundedRectangle(width - scrollBarWidth.value - scrollBarPadding.value, calculateScrollBarY(), if (maxScroll > 0) {
scrollBarWidth.value, calculateScrollBarHeight(), scrollBarRadius.value, Theme.SCROLL.value); renderScope.drawRoundedRectangle(
width - scrollBarWidth.value - scrollBarPadding.value,
calculateScrollBarY(),
scrollBarWidth.value,
calculateScrollBarHeight(),
scrollBarRadius.value,
Theme.SCROLL.value);
}
} }
@Override @Override
@@ -61,9 +75,13 @@ public class Scroll extends Element {
@Override @Override
public Element dimensions(int width, int height) { public Element dimensions(int width, int height) {
maxScroll = 0;
for (Element element : children) { for (Element element : children) {
maxScroll = Math.max(maxScroll, element.y + element.height - height); maxScroll = Math.max(maxScroll, element.y + element.height - height);
} }
maxScroll = Math.max(0, maxScroll); // never negative
return super.dimensions(width, height); return super.dimensions(width, height);
} }
@@ -80,6 +98,21 @@ public class Scroll extends Element {
return (scroll * (height - scrollBarHeight)) / maxScroll + scrollBarPadding.value; return (scroll * (height - scrollBarHeight)) / maxScroll + scrollBarPadding.value;
} }
private void calculateMaxScroll() {
maxScroll = 0;
for (Element element : children) {
int bottom = element.y + element.height;
maxScroll = Math.max(maxScroll, bottom - height + padding);
}
if (maxScroll > 0) {
maxScroll = maxScroll + 10;
} else {
maxScroll = 0;
}
}
@Override @Override
public void keyPressed(int keyCode, int scanCode, int modifiers) { public void keyPressed(int keyCode, int scanCode, int modifiers) {
ElementRenderer.keyPressed(children, keyCode, scanCode, modifiers); ElementRenderer.keyPressed(children, keyCode, scanCode, modifiers);