/* * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod * Copyright (C) 2021 cyoung06 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package kr.syeyoung.dungeonsguide.gui.elements; import com.google.common.base.Function; import kr.syeyoung.dungeonsguide.gui.MPanel; import kr.syeyoung.dungeonsguide.utils.RenderUtils; import lombok.Getter; import lombok.Setter; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.Gui; import net.minecraft.client.renderer.GlStateManager; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL14; import java.awt.*; import java.util.*; import java.util.List; public class MNavigatingPane extends MPanel { private final Map pages = new HashMap(); private final List bookMarks = new ArrayList(); @Getter @Setter private Function pageGenerator; @Getter private String currentPage = ""; public void setCurrentPage(String currentPage) { this.history.push(this.currentPage); this.currentPage = currentPage; } @Getter private Color background2; private final Stack history = new Stack(); private final MButton back = new MButton(); public MNavigatingPane() { back.setText("<"); back.setOnActionPerformed(new Runnable() { @Override public void run() { if (history.size() > 0) currentPage = history.pop(); } }); back.setBackgroundColor(Color.darkGray); back.setBounds(new Rectangle(3,18,12,12)); add(back); } public void setBackground2(Color background2) { this.background2 = background2; for (MPanel value : pages.values()) { value.setBackgroundColor(background2); } } @Override public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks, Rectangle scissor) { Gui.drawRect(0, 15, getBounds().width, getBounds().height, 0xFF444444); Gui.drawRect(1, 16, getBounds().width-1, getBounds().height-1, background2 != null ? background2.getRGB() : 0); FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; GlStateManager.enableBlend(); GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); fr.drawString(currentPage.replace(".", " > "), 20, 20, 0xFFFFFFFF); } public void addBookmark(String name, String addr) { FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; MTabButton button = new MTabButton(this, name, addr); int totalX = 0; for (MTabButton button1:bookMarks) totalX += button1.getBounds().width; button.setBounds(new Rectangle(totalX, 0, Math.max(25, fr.getStringWidth(name) + 6), 15)); bookMarks.add(button); if (currentPage.isEmpty()) currentPage = addr; } public void addBookmarkRunnable(String name, final Runnable toRun) { FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; MTabButton button = new MTabButton(this, name, null) { @Override public void mouseClicked(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int mouseButton) { if (lastAbsClip.contains(absMouseX, absMouseY)) { toRun.run(); } } }; int totalX = 0; for (MTabButton button1:bookMarks) totalX += button1.getBounds().width; button.setBounds(new Rectangle(totalX, 0, Math.max(25, fr.getStringWidth(name) + 6), 15)); bookMarks.add(button); } @Override public List getChildComponents() { ArrayList dynamic = new ArrayList(bookMarks); if (!pages.containsKey(currentPage)) { MPanel panel = pageGenerator.apply(currentPage); MPanel panel2 = new MPanel() ; if (panel != null) panel2.add(panel); panel2.setBackgroundColor(background2); pages.put(currentPage, panel2); panel2.setBounds(new Rectangle(1,30,getBounds().width-2, getBounds().height-31)); panel2.setParent(this); } dynamic.add(pages.get(currentPage)); dynamic.add(back); return dynamic; } @Override public void resize(int parentWidth, int parentHeight) { this.setBounds(new Rectangle(0,0,parentWidth, parentHeight)); for (MPanel ma:pages.values()) ma.setBounds(new Rectangle(1,30,getBounds().width-2, getBounds().height-31)); } @Override public void setBounds(Rectangle bounds) { if (bounds == null) return; this.bounds.x = bounds.x; this.bounds.y = bounds.y; this.bounds.width = bounds.width; this.bounds.height = bounds.height; } @Getter @Setter public static class MTabButton extends MPanel { private String text; private String address; private Color foreground = Color.white; private Color hover = new Color(154, 154, 154, 255); private Color clicked = new Color(88, 88, 88,255); private Color selected = new Color(111, 111, 111,255); private Color disabled = new Color(0,0,0); private boolean enabled = true; private MNavigatingPane tabbedPane; public MTabButton(MNavigatingPane tabbedPane, String key, String address) { this.tabbedPane = tabbedPane; this.text = key; this.address = address; } @Override public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks, Rectangle clip) { Dimension bounds = getSize(); Color bg = null; if (!enabled) { bg = disabled; } else if (tabbedPane.getCurrentPage().equals(address)) { bg = selected; } else if (new Rectangle(new Point(0,0),bounds).contains(relMousex0, relMousey0)) { bg = hover; } Gui.drawRect(0, tabbedPane.getCurrentPage().equals(address) ? 0 : 2, getBounds().width, getBounds().height, 0xFF444444); if (bg != null) Gui.drawRect(1,tabbedPane.getCurrentPage().equals(address) ? 1 : 3,getBounds().width - 1, getBounds().height, bg.getRGB()); FontRenderer renderer = Minecraft.getMinecraft().fontRendererObj; int width = renderer.getStringWidth(text); int x = (getBounds().width - width) / 2; int y = (getBounds().height - 3 - renderer.FONT_HEIGHT) / 2 + 3; GlStateManager.enableBlend(); GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); renderer.drawString(text, x,y, foreground.getRGB()); } @Override public void mouseClicked(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int mouseButton) { if (lastAbsClip.contains(absMouseX, absMouseY)) { tabbedPane.setCurrentPage(address); } } } }