package mekanism.client.gui.element; import java.util.ArrayList; import java.util.List; import mekanism.client.gui.IGuiWrapper; import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils.ResourceType; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; import codechicken.lib.vec.Rectangle4i; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class GuiScrollList extends GuiElement { public int xSize; public int size; public int xPosition; public int yPosition; public List<String> textEntries = new ArrayList<String>(); public int dragOffset = 0; public int selected = -1; public float scroll; public boolean isDragging; public GuiScrollList(IGuiWrapper gui, ResourceLocation def, int x, int y, int sizeX, int sizeY) { super(MekanismUtils.getResource(ResourceType.GUI_ELEMENT, "GuiScrollList.png"), gui, def); xPosition = x; yPosition = y; xSize = sizeX; size = sizeY; } public boolean hasSelection() { return selected != -1; } public int getSelection() { return selected; } public void setText(List<String> text) { if(text == null) { textEntries.clear(); return; } if(selected > text.size()-1) { selected = -1; } textEntries = text; if(textEntries.size()<=size) { scroll = 0; } } @Override public Rectangle4i getBounds(int guiWidth, int guiHeight) { return new Rectangle4i(guiWidth + xPosition, guiHeight + yPosition, xSize, size*10); } @Override public void renderBackground(int xAxis, int yAxis, int guiWidth, int guiHeight) { mc.renderEngine.bindTexture(RESOURCE); drawBlack(guiWidth, guiHeight); drawSelected(guiWidth, guiHeight, selected); mc.renderEngine.bindTexture(defaultLocation); } public void drawBlack(int guiWidth, int guiHeight) { int xDisplays = xSize/10 + (xSize%10 > 0 ? 1 : 0); for(int yIter = 0; yIter < size; yIter++) { for(int xIter = 0; xIter < xDisplays; xIter++) { int width = (xSize%10 > 0 && xIter == xDisplays ? xSize%10 : 10); guiObj.drawTexturedRect(guiWidth + xPosition + (xIter*10), guiHeight + yPosition + (yIter*10), 0, 0, width, 10); } } } public void drawSelected(int guiWidth, int guiHeight, int index) { int scroll = getScrollIndex(); if(selected != -1 && index >= scroll && index <= scroll+size-1) { int xDisplays = xSize/10 + (xSize%10 > 0 ? 1 : 0); for(int xIter = 0; xIter < xDisplays; xIter++) { int width = (xSize%10 > 0 && xIter == xDisplays ? xSize%10 : 10); guiObj.drawTexturedRect(guiWidth + xPosition + (xIter*10), guiHeight + yPosition + (index-scroll)*10, 0, 10, width, 10); } } } public void drawScroll() { GL11.glColor4f(1, 1, 1, 1); int xStart = xPosition + xSize - 6; int yStart = yPosition; for(int i = 0; i < size; i++) { guiObj.drawTexturedRect(xStart, yStart+(i*10), 10, 1, 6, 10); } guiObj.drawTexturedRect(xStart, yStart, 10, 0, 6, 1); guiObj.drawTexturedRect(xStart, yStart+(size*10)-1, 10, 0, 6, 1); guiObj.drawTexturedRect(xStart+1, yStart+1+getScroll(), 16, 0, 4, 4); } public int getMaxScroll() { return (size*10)-2; } public int getScroll() { return Math.max(Math.min((int)(scroll*(getMaxScroll()-4)), (getMaxScroll()-4)), 0); } public int getScrollIndex() { if(textEntries.size() <= size) { return 0; } return (int)((textEntries.size()*scroll) - (((float)size/(float)textEntries.size()))*scroll); } @Override public void renderForeground(int xAxis, int yAxis) { if(!textEntries.isEmpty()) { for(int i = 0; i < size; i++) { int index = getScrollIndex() + i; if(index <= textEntries.size()-1) { renderScaledText(textEntries.get(index), xPosition + 1, yPosition + 1 + (10*i), 0x00CD00, xSize-6); } } } mc.renderEngine.bindTexture(RESOURCE); drawScroll(); mc.renderEngine.bindTexture(defaultLocation); } @Override public void preMouseClicked(int xAxis, int yAxis, int button) {} @Override public void mouseClicked(int xAxis, int yAxis, int button) { if(button == 0) { int xStart = xPosition + xSize - 5; if(xAxis >= xStart && xAxis <= xStart+4 && yAxis >= getScroll()+yPosition+1 && yAxis <= getScroll()+4+yPosition+1) { if(textEntries.size()>size) { dragOffset = yAxis - (getScroll()+yPosition+1); isDragging = true; } } else if(xAxis >= xPosition && xAxis <= xPosition + xSize-6 && yAxis >= yPosition && yAxis <= yPosition+size*10) { int index = getScrollIndex(); selected = -1; for(int i = 0; i < size; i++) { if(index+i <= textEntries.size()-1) { if(yAxis >= (yPosition + i*10) && yAxis <= (yPosition + i*10 + 10)) { selected = index+i; break; } } } } } } @Override public void mouseClickMove(int xAxis, int yAxis, int button, long ticks) { super.mouseClickMove(xAxis, yAxis, button, ticks); if(isDragging) { scroll = Math.min(Math.max((float)(yAxis-(yPosition+1)-dragOffset)/(float)(getMaxScroll()-4), 0), 1); } } @Override public void mouseMovedOrUp(int xAxis, int yAxis, int type) { super.mouseMovedOrUp(xAxis, yAxis, type); if(type == 0) { if(isDragging) { dragOffset = 0; isDragging = false; } } } }