/* * 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.features.text; import kr.syeyoung.dungeonsguide.config.types.AColor; import kr.syeyoung.dungeonsguide.gui.MPanel; import kr.syeyoung.dungeonsguide.gui.elements.MEditableAColor; import kr.syeyoung.dungeonsguide.gui.elements.MPanelScaledGUI; import kr.syeyoung.dungeonsguide.gui.elements.MScrollablePanel; import kr.syeyoung.dungeonsguide.gui.elements.MToggleButton; import kr.syeyoung.dungeonsguide.utils.RenderUtils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.GlStateManager; import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL14; import java.awt.*; import java.util.*; import java.util.List; public class PanelTextParameterConfig extends MPanel { private final StyledTextProvider feature; private final MEditableAColor currentColor; private final MEditableAColor backgroundColor; private final MToggleButton shadow; private MScrollablePanel mScrollablePanel; private MPanelScaledGUI rendering; @Override public void onBoundsUpdate() { } @Override public Dimension getPreferredSize() { return new Dimension(400, getPanelBound().height + 20); } public PanelTextParameterConfig(final StyledTextProvider feature) { this.feature = feature; setBackgroundColor(new Color(38, 38, 38, 255)); currentColor = new MEditableAColor(); currentColor.setColor(new AColor(0xff555555, true)); currentColor.setEnableEdit(false); currentColor.setSize(new Dimension(15, 10)); currentColor.setOnUpdate(new Runnable() { @Override public void run() { for (String se:selected) feature.getStylesMap().get(se).setColor(currentColor.getColor()); } }); add(currentColor); backgroundColor = new MEditableAColor(); backgroundColor.setColor(new AColor(0xff555555, true)); backgroundColor.setEnableEdit(false); backgroundColor.setSize(new Dimension(15, 10)); backgroundColor.setOnUpdate(new Runnable() { @Override public void run() { for (String se:selected) feature.getStylesMap().get(se).setBackground(backgroundColor.getColor()); } }); add(backgroundColor); shadow = new MToggleButton(); shadow.setSize(new Dimension(20, 10)); shadow.setOnToggle(new Runnable() { @Override public void run() { for (String se:selected) feature.getStylesMap().get(se).setShadow(shadow.isEnabled()); } }); add(shadow); mScrollablePanel = new MScrollablePanel(3); mScrollablePanel.setHideScrollBarWhenNotNecessary(true); add(mScrollablePanel); mScrollablePanel.add(rendering = new MPanelScaledGUI() { @Override public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks, Rectangle scissor) { super.render(absMousex, absMousey, relMousex0, relMousey0, partialTicks, scissor); List texts = feature.getDummyText(); Map styles = feature.getStylesMap(); List calc = StyledTextRenderer.drawTextWithStylesAssociated(texts, 0,0, getEffectiveDimension().width, styles, StyledTextRenderer.Alignment.LEFT); boolean bool =scissor.contains(absMousex, absMousey); for (StyledTextRenderer.StyleTextAssociated calc3: calc) { if (selected.contains(calc3.getStyledText().getGroup())) { Gui.drawRect(calc3.getRectangle().x, calc3.getRectangle().y, calc3.getRectangle().x + calc3.getRectangle().width, calc3.getRectangle().y + calc3.getRectangle().height, 0x4244A800); } else if (bool && calc3.getRectangle().contains(relMousex0, relMousey0)) { for (StyledTextRenderer.StyleTextAssociated calc2 : calc) { if (calc2.getStyledText().getGroup().equals(calc3.getStyledText().getGroup())) Gui.drawRect(calc2.getRectangle().x, calc2.getRectangle().y, calc2.getRectangle().x + calc2.getRectangle().width, calc2.getRectangle().y + calc2.getRectangle().height, 0x55777777); } } } } private int lastX; private int lastY; private boolean dragStart = false; @Override public void mouseClicked(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int mouseButton) { List texts = feature.getDummyText(); Map styles = feature.getStylesMap(); boolean existed = selected.isEmpty(); boolean found = false; List calc = StyledTextRenderer.calculate(texts, 0,0, styles); for (StyledTextRenderer.StyleTextAssociated calc3: calc) { if (calc3.getRectangle().contains(relMouseX, relMouseY)) { if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT)) { if (!selected.contains(calc3.getStyledText().getGroup())) selected.add(calc3.getStyledText().getGroup()); else selected.remove(calc3.getStyledText().getGroup()); } else { selected.clear(); selected.add(calc3.getStyledText().getGroup()); } found = true; } } if (!found && !(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT)) && parent.getLastAbsClip().contains(absMouseX * getScale(), absMouseY* getScale())) { selected.clear(); dragStart = true; lastX = absMouseX; lastY = absMouseY; } currentColor.setEnableEdit(selected.size() != 0); PanelTextParameterConfig.this.backgroundColor.setEnableEdit(selected.size() != 0); if (existed != selected.isEmpty()) { if (selected.size() != 0) { currentColor.setColor(styles.get(selected.iterator().next()).getColor()); PanelTextParameterConfig.this.backgroundColor.setColor(styles.get(selected.iterator().next()).getBackground()); shadow.setEnabled(styles.get(selected.iterator().next()).isShadow()); } else { currentColor.setColor(new AColor(0xff555555, true)); PanelTextParameterConfig.this.backgroundColor.setColor(new AColor(0xff555555, true)); shadow.setEnabled(false); } } if (selected.size() == 1) { currentColor.setColor(styles.get(selected.iterator().next()).getColor()); PanelTextParameterConfig.this.backgroundColor.setColor(styles.get(selected.iterator().next()).getBackground()); shadow.setEnabled(styles.get(selected.iterator().next()).isShadow()); } } @Override public void mouseReleased(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int state) { dragStart = false; } @Override public void mouseClickMove(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int clickedMouseButton, long timeSinceLastClick) { if (dragStart) { int dx= absMouseX - lastX; int dy= absMouseY - lastY; int actualOFFX = (int) (dx / getScale()); int actualOFFY = (int) (dy / getScale()); lastX =(int) (actualOFFX * getScale())+lastX; lastY =(int) (actualOFFY * getScale())+lastY; mScrollablePanel.getScrollBarX().addToCurrent(-actualOFFX); mScrollablePanel.getScrollBarY().addToCurrent(-actualOFFY); } } @Override public Dimension getPreferredSize() { List calc = StyledTextRenderer.calculate(feature.getDummyText(), 0,0, feature.getStylesMap()); int w = 0, h = 0; for (StyledTextRenderer.StyleTextAssociated styleTextAssociated : calc) { int endX = styleTextAssociated.getRectangle().x + styleTextAssociated.getRectangle().width; int endY = styleTextAssociated.getRectangle().y + styleTextAssociated.getRectangle().height; if (endX > w) w = endX; if (endY > h) h = endY; } return new Dimension((int) (w * getScale()),(int) (h * getScale())); } @Override public void resize(int parentWidth, int parentHeight) { setBounds(new Rectangle(new Point(0,0), getPreferredSize())); } @Override public void mouseScrolled(int absMouseX, int absMouseY, int relMouseX0, int relMouseY0, int scrollAmount) { if ( parent.getLastAbsClip().contains(absMouseX * getScale(), absMouseY* getScale())) { double scale = rendering.getScale(); if (scrollAmount > 0) { scale += 0.1; } else if (scrollAmount < 0) { scale -= 0.1; } if (scale < 0.1) scale = 0.1f; if (scale > 5) scale = 5.0f; rendering.setScale(scale); mScrollablePanel.setBounds(new Rectangle(new Point(5,5),getPanelBound())); } } }); } private final Set selected = new HashSet(); @Override public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks, Rectangle scissor) { GlStateManager.pushMatrix(); Dimension dim = getPanelBound(); int width = dim.width, height = dim.height; Gui.drawRect(0,0,getBounds().width, getBounds().height, RenderUtils.blendAlpha(0x141414, 0.12f)); Gui.drawRect(4,4,width+6, height+6, 0xFF222222); Gui.drawRect(5,5,width+5, height+5, RenderUtils.blendAlpha(0x141414, 0.15f)); GlStateManager.translate(5, height + 7, 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("Press Shift to multi-select", 0, 0, 0xFFBFBFBF); GlStateManager.popMatrix(); GlStateManager.pushMatrix(); GlStateManager.translate(width + 15, 5, 0); GlStateManager.pushMatrix(); fr.drawString("Selected Groups: "+selected, 0, 0, 0xFFBFBFBF); GlStateManager.popMatrix(); fr.drawString("Text Color: ", 0, 10, 0xFFFFFFFF); fr.drawString("Background Color: ", 0, 20, 0xFFFFFFFF); fr.drawString("Shadow: ", 0, 39, 0xFFFFFFFF); GlStateManager.popMatrix(); } private Dimension getPanelBound(){ // return new Dimension((getBounds().width-25)/2, 100); return new Dimension(150,100); } @Override public void setBounds(Rectangle bounds) { super.setBounds(bounds); Dimension dim = getPanelBound(); currentColor.setBounds(new Rectangle(75+dim.width , 14, 15, 10)); backgroundColor.setBounds(new Rectangle(110+dim.width , 24, 15, 10)); shadow.setBounds(new Rectangle(75+dim.width , 43, 30, 10)); mScrollablePanel.setBounds(new Rectangle(5,5,dim.width,dim.height)); } }