package joshie.progression.gui.filters; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import joshie.progression.api.criteria.IFilterProvider; import joshie.progression.api.criteria.IFilterType; import joshie.progression.api.gui.Position; import joshie.progression.gui.core.FeatureAbstract; import net.minecraft.client.renderer.GlStateManager; import org.lwjgl.opengl.GL11; import java.util.ArrayList; import java.util.concurrent.Callable; import static joshie.progression.gui.core.GuiList.*; public class FeatureItemPreview extends FeatureAbstract { private IFilterType filter = FilterTypeItem.INSTANCE; private ArrayList<Object> sorted; private int position; public FeatureItemPreview() {} public void select(IFilterType filter) { this.filter = filter; updateSearch(); } @Override public boolean scroll(int mouseX, int mouseY, boolean scrolledDown) { if (ITEM_EDITOR.isVisible()) return false; mouseY -= 95; if (mouseY >= 40 && mouseY <= 110) { if (scrolledDown) position = Math.min(sorted.size() - filter.getChange(), position + filter.getChange()); else position = Math.max(0, position - filter.getChange()); return true; } return false; } private static Cache<Object, ArrayList<Object>> cacheList = CacheBuilder.newBuilder().maximumSize(64).build(); public ArrayList<Object> getAllItems() { try { return cacheList.get(filter, new Callable<ArrayList<Object>>() { @Override public ArrayList<Object> call() throws Exception { return (ArrayList<Object>) filter.getAllItems(); } }); } catch (Exception e) { return (ArrayList<Object>) filter.getAllItems(); } } public void updateSearch() { int size1 = sorted != null ? sorted.size() : 0; position = 0; //Reset the position on update if (FILTER_EDITOR.get() == null) return; //NO UPDATES!!! sorted = new ArrayList(); for (Object stack: getAllItems()) { for (IFilterProvider filter: FILTER_EDITOR.get().getFilters()) { if (filter.getProvided().matches(stack)) { sorted.add(stack); } } } if (sorted.size() < size1) { //GuiCore.GROUP_EDITOR.offsetX = 0; //Reset the offset on update CORE.resetX(); } } @Override public void drawFeature(int mouseX, int mouseY) { if (ITEM_EDITOR.isVisible()) return; GlStateManager.clear(GL11.GL_DEPTH_BUFFER_BIT); if (sorted == null) { updateSearch(); } mouseY -= 95; int width = (int) ((double) (screenWidth - 10) / filter.getScale()); int j = 0; int k = 0; for (int i = position; i < position + (width * 4); i++) { if (i >= 0 && i < sorted.size()) { filter.draw(offset, sorted.get(i), 0, j, Position.BOTTOM.yOffset, k, mouseX, mouseY); j++; if (j >= width) { j = 0; k++; } } } } @Override public boolean isOverlay() { return false; } }