/** * Copyright (c) Lambda Innovation, 2013-2015 * 本作品版权由Lambda Innovation所有。 * http://www.li-dev.cn/ * * This project is open-source, and it is distributed under * the terms of GNU General Public License. You can modify * and distribute freely as long as you follow the license. * 本项目是一个开源项目,且遵循GNU通用公共授权协议。 * 在遵照该协议的情况下,您可以自由传播和修改。 * http://www.gnu.org/licenses/gpl.html */ package cn.liutils.cgui.loader.ui; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; import cn.liutils.cgui.gui.Widget; import cn.liutils.cgui.gui.component.Component; import cn.liutils.cgui.gui.component.DrawTexture; import cn.liutils.cgui.gui.component.Tint; import cn.liutils.cgui.gui.event.FrameEvent; import cn.liutils.cgui.gui.event.FrameEvent.FrameEventHandler; import cn.liutils.cgui.gui.event.LostFocusEvent; import cn.liutils.cgui.gui.event.LostFocusEvent.LostFocusHandler; import cn.liutils.cgui.gui.event.MouseDownEvent; import cn.liutils.cgui.gui.event.MouseDownEvent.MouseDownHandler; import cn.liutils.cgui.loader.CGUIEditor; import cn.liutils.util.client.HudUtils; import cn.liutils.util.client.RenderUtils; import cn.liutils.util.helper.Font; import cn.liutils.util.helper.Font.Align; /** * @author WeAthFolD * */ public class SelectedWidgetBar extends Window { static final ResourceLocation TEX_REMOVE = GuiEdit.tex("remove"); final Widget target; static final double HT = 10; final GuiEdit guiEdit; public SelectedWidgetBar(GuiEdit _guiEdit, Widget _target) { super(_guiEdit, "Properties", false, new double[] { 220, 20 }); guiEdit = _guiEdit; target = _target; transform.width = 100; transform.height = HT; initWidgets(); initEvents(); guiEdit.changeSelectedEditor(this); } private List<Component> getCanAddList() { List<Component> ret = new ArrayList(CGUIEditor.getComponents()); Iterator<Component> iter = ret.iterator(); while(iter.hasNext()) { Component c = iter.next(); if(target.getComponent(c.name) != null) { iter.remove(); } } return ret; } private void initWidgets() { addWidget(new ComponentSelection()); } private void initEvents() { regEventHandler(new FrameEventHandler() { @Override public void handleEvent(Widget w, FrameEvent event) { if(target.disposed || target != guiEdit.toEdit.getFocus()) { w.dispose(); } } }); } private class ComponentSelection extends Window { Widget curEditor; boolean listSpawned = false; public ComponentSelection() { super(SelectedWidgetBar.this.guiEdit, "Components", false); transform.x = 0; transform.y = HT; transform.width = 100; transform.height = 24 + target.getComponentList().size() * 11; int i = 0; for(Component prop : target.getComponentList()) { if(prop.canEdit) addWidget(new ComponentButton(prop, i++)); } //SO SAD { Widget add = new Widget(); add.transform.setPos(0, 11 + i * 11); add.transform.setSize(100, 10); add.addComponent(new Tint()); add.regEventHandler(new FrameEventHandler() { ResourceLocation tex = GuiEdit.tex("toolbar/add"); @Override public void handleEvent(Widget w, FrameEvent event) { RenderUtils.loadTexture(tex); GL11.glColor4d(1, 1, 1, 1); HudUtils.rect(45, 0, 10, 10); } }); final int y = 11 * (i + 2); add.regEventHandler(new MouseDownHandler() { @Override public void handleEvent(Widget w, MouseDownEvent event) { if(listSpawned) return; listSpawned = true; //Setup background list Widget list = new Widget(); list.regEventHandler(new LostFocusHandler() { @Override public void handleEvent(Widget w, LostFocusEvent event) { w.dispose(); } }); list.addComponent(new DrawTexture().setTex(null).setColor4d(.8, .8, 1, 0.3)); Collection<Component> components = CGUIEditor.getComponents(); list.transform.setSize(80, 10 * components.size()); list.transform.setPos(10, y); //Use a loop to setup all the sub-components. int i = 0; for(final Component c : getCanAddList()) { Widget one = new Widget(); one.transform.y = (i++) * 10; one.transform.setSize(80, 10); one.addComponent(new Tint()); one.regEventHandler(new FrameEventHandler() { @Override public void handleEvent(Widget w, FrameEvent event) { String text = c.name; Font.font.draw(text, 40, 1, 8, 0xffffff, Align.CENTER); } }); one.regEventHandler(new MouseDownHandler() { @Override public void handleEvent(Widget w, MouseDownEvent event) { target.addComponent(c.copy()); //Rebuild the component selection GUI ComponentSelection.this.dispose(); SelectedWidgetBar.this.addWidget(new ComponentSelection()); } }); list.addWidget(one); } ComponentSelection.this.addWidget(list); //getGui().gainFocus(list); } }); addWidget(add); } } void setPropertyEditor(Widget ce) { if(curEditor != null) { curEditor.dispose(); } curEditor = ce; ce.transform.y = -10; addWidget(curEditor); } private class ComponentButton extends Widget { final Component c; public ComponentButton(Component _c, int n) { c = _c; transform.x = 0; transform.y = 11 + n * 11; transform.width = 100; transform.height = 10; addComponent(new Tint()); regEventHandler(new MouseDownHandler() { @Override public void handleEvent(Widget w, MouseDownEvent event) { setPropertyEditor(new ComponentEditor(guiEdit, target, c)); } }); regEventHandler(new FrameEventHandler() { @Override public void handleEvent(Widget w, FrameEvent event) { Font.font.draw(c.name, 50, 2, 7, 0xffffff, Align.CENTER); } }); addSubWidgets(); } private void addSubWidgets() { //Add the remove button, if needed to. if(c.name.equals("Transform")) return; Widget w = new Widget(); w.transform.setSize(10, 10).setPos(85, 0); w.addComponent(new DrawTexture().setTex(TEX_REMOVE)); w.addComponent(new Tint()); w.regEventHandler(new MouseDownHandler() { @Override public void handleEvent(Widget w, MouseDownEvent event) { target.removeComponent(c); ComponentSelection.this.dispose(); SelectedWidgetBar.this.addWidget(new ComponentSelection()); } }); addWidget(w); } } } }