diff options
author | Falkreon <falkreon@gmail.com> | 2019-08-25 23:04:12 -0500 |
---|---|---|
committer | Falkreon <falkreon@gmail.com> | 2019-08-25 23:04:12 -0500 |
commit | c4fe40d1daee84662c6c269f53dd68a2c2a136f1 (patch) | |
tree | 3a00fa41b1ed4fe5cfddfc8646f9daaf42e1d79d | |
parent | c365433e34bdd95e83740a5af6a3338444a3540a (diff) | |
download | LibGui-c4fe40d1daee84662c6c269f53dd68a2c2a136f1.tar.gz LibGui-c4fe40d1daee84662c6c269f53dd68a2c2a136f1.tar.bz2 LibGui-c4fe40d1daee84662c6c269f53dd68a2c2a136f1.zip |
More responsive scrollbar. Still glitchy though.
3 files changed, 42 insertions, 13 deletions
diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/client/TestClientGui.java b/GuiTest/src/main/java/io/github/cottonmc/test/client/TestClientGui.java index 4b914f8..bf4ef07 100644 --- a/GuiTest/src/main/java/io/github/cottonmc/test/client/TestClientGui.java +++ b/GuiTest/src/main/java/io/github/cottonmc/test/client/TestClientGui.java @@ -33,7 +33,7 @@ public class TestClientGui extends LightweightGuiDescription { label.setText(new LiteralText(s)); }; WListPanel<String, WLabel> list = new WListPanel<String, WLabel>(data, WLabel.class, ()->new WLabel(""), configurator); - root.add(list, 0, 2, 8, 8); + root.add(list, 0, 2, 7, 8); root.validate(this); } diff --git a/src/main/java/io/github/cottonmc/cotton/gui/widget/WListPanel.java b/src/main/java/io/github/cottonmc/cotton/gui/widget/WListPanel.java index 21bff58..de3c7ed 100644 --- a/src/main/java/io/github/cottonmc/cotton/gui/widget/WListPanel.java +++ b/src/main/java/io/github/cottonmc/cotton/gui/widget/WListPanel.java @@ -29,6 +29,7 @@ public class WListPanel<D, W extends WWidget> extends WPanel { protected int margin = 4; protected WScrollBar scrollBar = new WScrollBar(Axis.VERTICAL); + int lastScroll = -1; public WListPanel(List<D> data, Class<W> listItemClass, Supplier<W> supplier, BiConsumer<D, W> configurator) { this.data = data; @@ -46,6 +47,11 @@ public class WListPanel<D, W extends WWidget> extends WPanel { ScreenDrawing.drawBeveledPanel(x, y, width, height); } + if (scrollBar.getValue()!=lastScroll) { + layout(); + lastScroll = scrollBar.getValue(); + } + for(WWidget child : children) { child.paintBackground(x + child.getX(), y + child.getY()); } @@ -53,9 +59,7 @@ public class WListPanel<D, W extends WWidget> extends WPanel { @Override public void layout() { - super.layout(); - - int scrollOffset = scrollBar.value; + //super.layout(); System.out.println("Validating"); @@ -79,16 +83,22 @@ public class WListPanel<D, W extends WWidget> extends WPanel { int layoutHeight = this.getHeight()-(margin*2); int cellsHigh = layoutHeight / cellHeight; - int presentCells = Math.min(data.size()-scrollOffset, cellsHigh); + System.out.println("Adding children..."); this.children.clear(); this.children.add(scrollBar); - scrollBar.setLocation(this.width-4, 0); - scrollBar.setSize(4, this.height); + scrollBar.setLocation(this.width-scrollBar.getWidth(), 0); + scrollBar.setSize(8, this.height); + + //Fix up the scrollbar handle and track metrics scrollBar.window = cellsHigh; scrollBar.setMaxValue(data.size()); + int scrollOffset = scrollBar.value; + System.out.println(scrollOffset); + + int presentCells = Math.min(data.size()-scrollOffset, cellsHigh); if (presentCells>0) { for(int i=0; i<presentCells; i++) { @@ -102,6 +112,7 @@ public class WListPanel<D, W extends WWidget> extends WPanel { w = unconfigured.remove(0); } configurator.accept(d, w); + configured.put(d, w); } //At this point, w is nonnull and configured by d diff --git a/src/main/java/io/github/cottonmc/cotton/gui/widget/WScrollBar.java b/src/main/java/io/github/cottonmc/cotton/gui/widget/WScrollBar.java index 6eb6359..f84342c 100644 --- a/src/main/java/io/github/cottonmc/cotton/gui/widget/WScrollBar.java +++ b/src/main/java/io/github/cottonmc/cotton/gui/widget/WScrollBar.java @@ -9,6 +9,7 @@ public class WScrollBar extends WWidget { protected int window = 16; protected int anchor = -1; + protected int anchorValue = -1; public WScrollBar() { } @@ -19,7 +20,7 @@ public class WScrollBar extends WWidget { @Override public void paintBackground(int x, int y) { - ScreenDrawing.drawBeveledPanel(x, y, width, height, 0xFFFFFFFF, 0xFF8b8b8b, 0xFF373737); + ScreenDrawing.drawBeveledPanel(x, y, width, height, 0xFF373737, 0xFF_000000, 0xFFFFFFFF); if (maxValue<=0) return; int color = 0xFF_FFFFFF; @@ -30,11 +31,21 @@ public class WScrollBar extends WWidget { } } + @Override + public void paintForeground(int x, int y, int mouseX, int mouseY) { + super.paintForeground(x, y, mouseX, mouseY); + + //Sneakily update bar position + if (anchor!=-1) { + onMouseDown(mouseX+x, mouseY+y, 0); + } + } + /** * Gets the on-axis size of the scrollbar handle in gui pixels */ public int getHandleSize() { - float percentage = (window>maxValue) ? 1f : window / (float)maxValue; + float percentage = (window>=maxValue) ? 1f : window / (float)maxValue; int bar = (axis==Axis.HORIZONTAL) ? width-2 : height-2; return (int)(percentage*bar); } @@ -45,8 +56,9 @@ public class WScrollBar extends WWidget { public int getMovableDistance() { int logicalDistance = maxValue-window; if (logicalDistance<0) logicalDistance = 0; - float percentage = logicalDistance / maxValue; + float percentage = logicalDistance / (float)maxValue; + //System.out.println("MovableDistance! maxValue: "+maxValue+", window: "+window+", logicalDistance: "+logicalDistance+", percentage: "+percentage); return (int) ( (axis==Axis.HORIZONTAL) ? (width-2)*percentage : (height-2)*percentage); } @@ -69,10 +81,11 @@ public class WScrollBar extends WWidget { if (axis==Axis.HORIZONTAL) { anchor = x; + anchorValue = value; } else { anchor = y; + anchorValue = value; } - System.out.println("Anchor set to "+anchor); return this; } @@ -87,7 +100,12 @@ public class WScrollBar extends WWidget { float percentMoved = (delta / (float)getMovableDistance()); int valueDelta = (int)(percentMoved * maxValue); - //System.out.println("Anchor: "+anchor+", Delta: "+delta+", ValueDelta: "+valueDelta); + int valueNew = anchorValue + valueDelta; + if (valueNew>getMaxScrollValue()) valueNew = getMaxScrollValue(); + if (valueNew<0) valueNew = 0; + this.value = valueNew; + + //System.out.println("Anchor: "+anchor+", Delta: "+delta+", PercentMoved: "+percentMoved+", ValueDelta: "+valueDelta); super.onMouseDrag(x, y, button); } @@ -95,8 +113,8 @@ public class WScrollBar extends WWidget { @Override public WWidget onMouseUp(int x, int y, int button) { //TODO: Clicking before or after the handle should jump instead of scrolling - System.out.println("Anchor released."); anchor = -1; + anchorValue = -1; return this; } |