package ttftcuts.physis.client.gui.journal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import net.minecraft.client.gui.GuiButton;
import org.lwjgl.opengl.GL11;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import ttftcuts.physis.client.ClientProxy;
import ttftcuts.physis.client.gui.GuiJournal;
import ttftcuts.physis.client.gui.button.GuiButtonInvisible;
import ttftcuts.physis.common.helper.PhysisRenderHelper;
import ttftcuts.physis.utils.NaturalOrderComparator;
public class JournalPageSubIndex extends JournalPage {
public static final int articlesPerPage = 24;
public static final int articlesPerRow = 4;
public static final int iconsize = 16; // fixed, or the shadow will be bork
public static final int shadowborder = 4;
public static final int iconspacing = 16;
public static final int iconsleft = 14;
public static final int iconstop = 7;
boolean setup = false;
PageDefs.Category category;
int offset;
List<JournalArticle> articles = new ArrayList<JournalArticle>();
public JournalPageSubIndex(PageDefs.Category category, int offset) {
this.category = category;
this.offset = offset;
}
@Override
@SideOnly(Side.CLIENT)
public void initGui(GuiJournal journal) {
if (!setup) {
setup = true;
articles.clear();
Set<JournalArticle> articleset = PageDefs.articleMap.get(this.category);
if(articleset == null || articleset.size() == 0) { return; }
articles.addAll(articleset);
Collections.sort(articles, new Comparator<JournalArticle>() {
NaturalOrderComparator comp = new NaturalOrderComparator();
@Override
public int compare(JournalArticle o1, JournalArticle o2) {
String t1 = o1.title;
String t2 = o2.title;
return comp.compare(t1, t2);
}
});
// and now trim to the page...
articles = articles.subList(offset * articlesPerPage, Math.min(articles.size(), (offset+1) * articlesPerPage));
}
}
@Override
@SideOnly(Side.CLIENT)
public void actionPerformed(GuiJournal journal, int id, GuiButton button) {
int bid = button.id - id;
JournalArticle article = articles.get(bid);
if (article != null) {
journal.mc.displayGuiScreen(new GuiJournal(article));
}
}
@Override
@SideOnly(Side.CLIENT)
public List<GuiButton> getNavButtonsForPage(int id, int x, int y) {
List<GuiButton> buttons = new ArrayList<GuiButton>();
for(int i=0; i<articles.size(); i++) {
int posx = i % articlesPerRow;
int posy = (int) Math.floor(i / articlesPerRow);
int iconx = x + iconsleft + posx * (iconspacing + iconsize);
int icony = y + iconstop + posy * (iconspacing + iconsize);
GuiButton button = new GuiButtonInvisible(id+i, iconx - 2, icony - 2, iconsize + 4, iconsize + 4);
if (!articles.get(i).canView()) {
button.enabled = false;
}
buttons.add(button);
}
return buttons;
}
@Override
@SideOnly(Side.CLIENT)
public void drawPage(GuiJournal journal, int x, int y, int mousex, int mousey) {
float jz = journal.getZLevel();
journal.setZLevel(jz+10);
for(int i=0; i<articles.size(); i++) {
JournalArticle article = articles.get(i);
boolean show = article.canView();
int posx = i % articlesPerRow;
int posy = (int) Math.floor(i / articlesPerRow);
int iconx = x + iconsleft + posx * (iconspacing + iconsize);
int icony = y + iconstop + posy * (iconspacing + iconsize);
if (mousex >= iconx - shadowborder && mousex < iconx + iconsize + shadowborder && mousey >= icony - shadowborder && mousey < icony + iconsize + shadowborder) {
journal.setTooltip(article.getTranslatedName());
if (!show) {
journal.setTooltipRenderer(ClientProxy.runeFontRenderer);
}
}
GL11.glColor4f(1F, 1F, 1F, 1F);
GL11.glDisable(GL11.GL_ALPHA_TEST);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
journal.mc.renderEngine.bindTexture(GuiJournal.bookTextureRight);
journal.drawTexturedModalRect(iconx-shadowborder, icony-shadowborder, 350,50, iconsize+shadowborder*2, iconsize+shadowborder*2);
GL11.glDisable(GL11.GL_BLEND);
if (show) {
if (article.iconstack != null) {
// render stack
PhysisRenderHelper.renderItemStack(article.iconstack, iconx, icony, true, false, false);
} else if (article.icontexture != null) {
// render texture icon
journal.mc.renderEngine.bindTexture(article.icontexture);
journal.drawTexturedModalRect(iconx, icony, 0,0, iconsize, iconsize);
} else {
// render default icon
}
} else {
GL11.glColor4f(1.0f, 0.85f, 0.5f, 1f);
if (article.iconstack != null) {
PhysisRenderHelper.renderItemStack(article.iconstack, iconx, icony, true, false, true);
}
GL11.glColor4f(1f, 1f, 1f, 1f);
}
GL11.glDisable(GL11.GL_ALPHA_TEST);
if (!show) {
//journal.silhouette(iconx-shadowborder-journal.left, icony-shadowborder - journal.top, iconsize+shadowborder*2, iconsize+shadowborder*2, false);
//journal.drawBGOverlay(iconx-shadowborder-journal.left, icony-shadowborder - journal.top, iconsize+shadowborder*2, iconsize+shadowborder*2, 0.55f, false);
journal.drawBGOverlay(iconx-shadowborder-journal.left, icony-shadowborder - journal.top, iconsize+shadowborder*2, iconsize+shadowborder*2, 0.55f);
}
GL11.glColor4f(1F, 1F, 1F, 1F);
GL11.glEnable(GL11.GL_ALPHA_TEST);
}
journal.setZLevel(jz);
}
}