/** * 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.terminal.app.settings; import cn.academy.core.AcademyCraft; 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.ElementList; import cn.lambdalib.cgui.gui.component.TextBox; import cn.lambdalib.cgui.gui.component.VerticalDragBar; import cn.lambdalib.cgui.gui.component.VerticalDragBar.DraggedEvent; 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 net.minecraft.util.StatCollector; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; /** * @author WeAthFolD */ @Registrant @SideOnly(Side.CLIENT) public class SettingsUI extends CGuiScreen { static WidgetContainer document; private static Map<String, List<UIProperty>> properties = new HashMap<>(); static { addProperty(PropertyElements.CHECKBOX, "generic", "attackPlayer", true, true); addProperty(PropertyElements.CHECKBOX, "generic", "destroyBlocks", true, true); addProperty(PropertyElements.CHECKBOX, "generic", "headsOrTails", false, false); } @RegInitCallback private static void __init() { document = CGUIDocument.panicRead(new ResourceLocation("academy:guis/settings.xml")); } public static void addProperty(IPropertyElement elem, String cat, String id, Object defValue, boolean singlePlayer) { add(cat, new UIProperty.Config(elem, cat, id, defValue, singlePlayer)); } public static void addCallback(String id, String cat, Runnable callback, boolean singlePlayer) { add(cat, new UIProperty.Callback(PropertyElements.CALLBACK, id, callback, singlePlayer)); } private static void add(String cat, UIProperty prop) { List<UIProperty> list = properties.get(cat); if(list == null) properties.put(cat, list = new ArrayList<>()); list.add(prop); } public SettingsUI() { initPages(); } @Override public void onGuiClosed() { AcademyCraft.config.save(); super.onGuiClosed(); } private void initPages() { Widget main = document.getWidget("main").copy(); Widget area = main.getWidget("area"); boolean singlePlayer = Minecraft.getMinecraft().isSingleplayer(); ElementList list = new ElementList(); { for(Entry<String, List<UIProperty>> entry : properties.entrySet()) { Widget head = document.getWidget("t_cathead").copy(); TextBox.get(head.getWidget("text")).setContent(local("cat." + entry.getKey())); list.addWidget(head); for(UIProperty prop : entry.getValue()) { if(!prop.singlePlayer || singlePlayer) list.addWidget(prop.element.getWidget(prop)); } Widget placeholder = new Widget(); placeholder.transform.setSize(10, 20); list.addWidget(placeholder); } } area.addComponent(list); Widget bar = main.getWidget("scrollbar"); bar.listen(DraggedEvent.class, (w, e) -> { list.setProgress((int) (list.getMaxProgress() * VerticalDragBar.get(w).getProgress())); }); gui.addWidget(main); } private String local(String id) { return StatCollector.translateToLocal("ac.settings." + id); } }