/** * Copyright (c) Lambda Innovation, 2013-2016 * This file is part of the AcademyCraft mod. * https://github.com/LambdaInnovation/AcademyCraft * Licensed under GPLv3, see project root for more information. */ package cn.academy.core.client.ui; import cn.academy.terminal.app.settings.SettingsUI; import cn.lambdalib.annoreg.core.Registrant; import cn.lambdalib.annoreg.mc.RegInitCallback; import cn.lambdalib.cgui.gui.CGuiScreen; import cn.lambdalib.cgui.gui.Widget; import cn.lambdalib.cgui.gui.WidgetContainer; import cn.lambdalib.cgui.gui.component.DrawTexture; import cn.lambdalib.cgui.gui.component.ElementList; import cn.lambdalib.cgui.gui.component.Outline; import cn.lambdalib.cgui.gui.component.TextBox; import cn.lambdalib.cgui.gui.component.TextBox.ConfirmInputEvent; import cn.lambdalib.cgui.gui.event.LeftClickEvent; import cn.lambdalib.cgui.xml.CGUIDocument; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; import net.minecraft.util.ResourceLocation; import java.util.function.Consumer; @Registrant @SideOnly(Side.CLIENT) public class CustomizeUI extends CGuiScreen { @RegInitCallback private static void init() { SettingsUI.addCallback("edit_ui", "misc", () -> { Minecraft.getMinecraft().displayGuiScreen(new CustomizeUI()); }, false); doc = CGUIDocument.panicRead(new ResourceLocation("academy:guis/ui_edit.xml")); } private static WidgetContainer doc; private Widget main; private Widget body; { main = doc.getWidget("main").copy(); body = main.getWidget("body"); ElementList list = new ElementList(); for (ACHud.Node n : ACHud.instance.getNodes()) { double[] pos = n.getPosition(); n.preview.pos(pos[0], pos[1]); gui.addWidget(n.preview); n.preview.removeComponent("Outline"); Widget elem = body.getWidget("template").copy(); elem.transform.doesDraw = true; TextBox textBox = TextBox.get(elem); textBox.localized = true; textBox.setContent("ac.gui.uiedit.elm." + n.name); elem.listen(LeftClickEvent.class, (w, evt) -> { changeEditFocus(w, n); }); list.addWidget(elem); } body.addComponent(list); gui.addWidget("main", main); } private ACHud.Node prevFocus; private Widget edit; private void changeEditFocus(Widget button, ACHud.Node node) { if (node == prevFocus) { return; } if (prevFocus != null) { prevFocus.preview.removeComponent("Outline"); edit.dispose(); } prevFocus = node; node.preview.addComponent(new Outline()); edit = doc.getWidget("editbox").copy(); double[] prevPos = node.getPosition(); wrapEdit(edit.getWidget("edit_x"), (value) -> { double[] pos = node.getPosition(); node.setPosition(value, pos[1]); node.preview.pos(value, pos[1]); node.preview.dirty = true; }, prevPos[0]); wrapEdit(edit.getWidget("edit_y"), (value) -> { double[] pos = node.getPosition(); node.setPosition(pos[0], value); node.preview.pos(pos[0], value); node.preview.dirty = true; }, prevPos[1]); edit.pos(button.x + button.transform.width*button.scale + 5, button.y + button.transform.height*button.scale/2 - edit.transform.height / 2); gui.addWidget(edit); } private void wrapEdit(Widget w, Consumer<Double> action, double defaultValue) { TextBox box = TextBox.get(w); DrawTexture tex = DrawTexture.get(w); box.content = String.valueOf(defaultValue); w.listen(ConfirmInputEvent.class, (w2, evt) -> { try { double x = Double.parseDouble(box.content); checkCoord(x); action.accept(x); tex.color.fromHexColor(0xff333333); } catch (NumberFormatException e) { tex.color.fromHexColor(0xffbb3333); } }); } private void checkCoord(double val) { if (val < -512 || val > 512) { throw new NumberFormatException(); } } }