package codechicken.nei.config;
import codechicken.lib.math.MathHelper;
import codechicken.nei.*;
import codechicken.nei.ItemSorter.SortEntry;
import codechicken.nei.LayoutManager;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.GlStateManager;
import java.awt.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static codechicken.lib.gui.GuiDraw.drawStringC;
import static codechicken.lib.gui.GuiDraw.getMousePosition;
public class GuiItemSorter extends GuiOptionPane
{
public class SortItem
{
public double ya;
public double y;
public SortEntry e;
public SortItem(SortEntry e) {
this.e = e;
y = slotY();
}
public int slotY() {
return GuiItemSorter.this.slotY(list.indexOf(e));
}
public void update(int my) {
ya = y;
if(dragging && this == dragged)
y = dragstarty+my-mouseclickedy;
else
y = MathHelper.approachExp(y, slotY(), 0.4, 20);
}
public boolean contains(int my) {
my -= drawBounds().y;
return my >= y && my < y+20;
}
}
public Option opt;
public List<SortItem> slots = new ArrayList<SortItem>();
public List<SortEntry> list;
boolean dragging;
public SortItem dragged;
public int mouseclickedy;
public double dragstarty;
public GuiItemSorter(Option opt) {
this.opt = opt;
list = ItemSorter.fromSaveString(opt.renderTag().getValue());
for(SortEntry e : list)
slots.add(new SortItem(e));
}
public int slotY(int slot) {
return 2+slot*24;
}
@Override
public int contentHeight() {
return slots.size()*24;
}
@Override
public void drawContent(int mx, int my, float frame) {
Rectangle w = drawBounds();
for(SortItem item : slots)
if(item != dragged)
drawItem(w, item, mx, my, frame);
if(dragged != null)
drawItem(w, dragged, mx, my, frame);
}
public void drawItem(Rectangle w, SortItem item, int mx, int my, float frame) {
double y = MathHelper.interpolate(item.ya, item.y, frame);
GlStateManager.translate(0, y, 0);
Rectangle b = new Rectangle(w.x, w.y, w.width, 20);
boolean mouseOver = itemAt(w.x+mx, w.y+my) == item;
GlStateManager.color(1, 1, 1, 1);
LayoutManager.drawButtonBackground(b.x, b.y, b.width, b.height, true, mouseOver ? 2 : 1);
drawStringC(item.e.getLocalisedName(), b.x, b.y, b.width, b.height, mouseOver ? 0xFFFFFFA0 : 0xFFE0E0E0);
GlStateManager.translate(0, -y, 0);
}
@Override
public String getTitle() {
return opt.translateN(opt.name);
}
@Override
public GuiScreen getParentScreen() {
return opt.slot.getGui();
}
@Override
public void updateScreen() {
super.updateScreen();
int my = getMousePosition().y;
for(SortItem item : slots)
item.update(my);
if(dragging) {
int nslot = (int)MathHelper.clip((dragged.y-(2-12))/24, 0, slots.size()-1);
if(nslot != list.indexOf(dragged.e)) {
list.remove(dragged.e);
list.add(nslot, dragged.e);
opt.getTag().setValue(ItemSorter.getSaveString(list));
if(opt.activeTag() == opt.getTag())
ItemSorter.list = new ArrayList<SortEntry>(list);
}
}
}
public SortItem itemAt(int mx, int my) {
if(!pane.windowBounds().contains(mx, my))
return null;
if(dragged != null && dragged.contains(my))
return dragged;
for(SortItem item : slots)
if(item.contains(my))
return item;
return null;
}
@Override
protected void mouseClicked(int x, int y, int button) throws IOException {
super.mouseClicked(x, y, button);
if(!dragging && button == 0) {
SortItem item = itemAt(x, y);
if(item != null) {
dragging = true;
dragged = item;
mouseclickedy = y;
dragstarty = item.y;
}
}
}
@Override
protected void mouseReleased(int x, int y, int button) {
if(button == 0)
dragging = false;
}
@Override
public List<String> handleTooltip(int mx, int my, List<String> tooltip) {
if(!dragging) {
SortItem item = itemAt(mx, my);
if(item != null && item.e.getTooltip() != null)
tooltip.add(item.e.getTooltip());
}
return tooltip;
}
}