package codechicken.core.gui; import org.lwjgl.input.Keyboard; import java.awt.*; public abstract class GuiScrollSlot extends GuiScrollPane { protected String actionCommand; public boolean focused; protected ClickCounter<Integer> click = new ClickCounter<Integer>(); public boolean smoothScroll = true; public GuiScrollSlot(int x, int y, int width, int height) { super(x, y, width, height); setMargins(3, 2, 3, 2); } public GuiScrollSlot setActionCommand(String s) { actionCommand = s; return this; } public void setSmoothScroll(boolean b) { smoothScroll = b; } public abstract int getSlotHeight(int slot); protected abstract int getNumSlots(); public void selectNext() { } public void selectPrev() { } /** * Coordinates are relative to slot area */ protected abstract void slotClicked(int slot, int button, int mx, int my, int count); protected abstract void drawSlot(int slot, int x, int y, int mx, int my, float frame); protected void unfocus() { } public void setFocused(boolean focus) { focused = focus; if (!focused) { unfocus(); } } @Override public int contentHeight() { return getSlotY(getNumSlots()); } public int getSlotY(int slot) { int h = 0; for (int i = 0; i < slot; i++) { h += getSlotHeight(i); } return h; } public int getSlot(int my) { if (my < 0) { return -1; } int y = 0; for (int i = 0; i < getNumSlots(); i++) { int h = getSlotHeight(i); if (my >= y && my < y + h) { return i; } y += h; } return -1; } public int getClickedSlot(int my) { return getSlot(my - windowBounds().y + scrolledPixels()); } @Override public int scrolledPixels() { int scrolled = super.scrolledPixels(); if (!smoothScroll) { int slot = getSlot(scrolled); int sloty = getSlotY(slot); int sloth = getSlotHeight(slot); scrolled = sloty + (int) ((scrolled - sloty) / (double) sloth + 0.5) * sloth; } return scrolled; } /** * @return -1 for left, 1 for right */ public int scrollbarAlignment() { return 1; } @Override public int scrollbarGuideAlignment() { return scrollbarAlignment(); } @Override public Rectangle scrollbarBounds() { Rectangle r = super.scrollbarBounds(); if (scrollbarAlignment() == -1) { r.x = x; } return r; } public void showSlot(int slot) { showSlot(getSlotY(slot), getSlotHeight(slot)); } @Override public void slotDown(int mx, int my, int button) { int slot = getSlot(my); click.mouseDown(slot >= 0 ? slot : null, button); } @Override public void slotUp(int mx, int my, int button) { int slot = getSlot(my); int c = click.mouseUp(slot >= 0 ? slot : null, button); if (c > 0 && slot >= 0) { slotClicked(slot, button, mx, my - getSlotY(slot), c); } } @Override public void keyTyped(char c, int keycode) { if (!focused) { return; } if (keycode == Keyboard.KEY_UP) { selectPrev(); } if (keycode == Keyboard.KEY_DOWN) { selectNext(); } if (keycode == Keyboard.KEY_RETURN && actionCommand != null) { sendAction(actionCommand); } } @Override public void drawContent(int mx, int my, float frame) { int scrolled = scrolledPixels(); Rectangle w = windowBounds(); int y = 0; for (int slot = 0; slot < getNumSlots(); slot++) { int h = getSlotHeight(slot); if (y + h > scrolled && y < scrolled + w.height) { drawSlot(slot, w.x, w.y + y - scrolledPixels(), mx, my - y, frame); } y += h; } } }