/**
* 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.HashMap;
import java.util.Map;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
import cn.liutils.cgui.client.CGUILang;
import cn.liutils.cgui.gui.Widget;
import cn.liutils.cgui.gui.component.DrawTexture;
import cn.liutils.cgui.gui.component.ElementList;
import cn.liutils.cgui.gui.component.ElementList.ProgressChangeHandler;
import cn.liutils.cgui.gui.component.ElementList.ProgressChangedEvent;
import cn.liutils.cgui.gui.component.TextBox;
import cn.liutils.cgui.gui.component.Tint;
import cn.liutils.cgui.gui.component.VerticalDragBar;
import cn.liutils.cgui.gui.component.VerticalDragBar.DraggedEvent;
import cn.liutils.cgui.gui.component.VerticalDragBar.DraggedHandler;
import cn.liutils.cgui.gui.event.ChangeContentEvent;
import cn.liutils.cgui.gui.event.ChangeContentEvent.ChangeContentHandler;
import cn.liutils.cgui.gui.event.ConfirmInputEvent;
import cn.liutils.cgui.gui.event.ConfirmInputEvent.ConfirmInputHandler;
import cn.liutils.cgui.gui.event.FrameEvent;
import cn.liutils.cgui.gui.event.FrameEvent.FrameEventHandler;
import cn.liutils.cgui.gui.event.GainFocusEvent;
import cn.liutils.cgui.gui.event.GainFocusEvent.GainFocusHandler;
import cn.liutils.cgui.gui.event.MouseDownEvent;
import cn.liutils.cgui.gui.event.MouseDownEvent.MouseDownHandler;
import cn.liutils.cgui.loader.ui.event.AddTargetEvent;
import cn.liutils.cgui.loader.ui.event.AddTargetEvent.AddTargetHandler;
import cn.liutils.util.client.HudUtils;
import cn.liutils.util.helper.Font;
import cn.liutils.util.helper.Font.Align;
/**
* @author WeAthFolD
*
*/
public class Hierarchy extends Window {
Widget hList, dragbar;
public Hierarchy(GuiEdit _guiEdit) {
super(_guiEdit, CGUILang.guiHierarchy(), true, new double[] { 150, 80 });
transform.width = 100;
transform.height = 120;
}
@Override
public void onAdded() {
super.onAdded();
regEventHandler(new FrameEventHandler() {
@Override
public void handleEvent(Widget w, FrameEvent event) {
drawSplitLine(30);
}
});
buildHierarchy();
addButtons();
getGui().regEventHandler(new AddTargetHandler() {
@Override
public void handleEvent(Widget w, AddTargetEvent event) {
buildHierarchy();
}
});
}
Widget getAccessTarget() {
return guiEdit.toEdit.getFocus();
}
private void addButtons() {
Widget tmp;
tmp = setupButton(0, "arrow_left", CGUILang.butDechild());
tmp.regEventHandler(new MouseDownHandler() {
@Override
public void handleEvent(Widget w, MouseDownEvent event) {
if(getAccessTarget() != null) {
getAccessTarget().moveLeft();
buildHierarchy();
}
}
});
tmp = setupButton(1, "arrow_right", CGUILang.butChild());
tmp.regEventHandler(new MouseDownHandler() {
@Override
public void handleEvent(Widget w, MouseDownEvent event) {
if(getAccessTarget() != null) {
getAccessTarget().moveRight();
buildHierarchy();
}
}
});
tmp = setupButton(2, "arrow_up", CGUILang.butMoveUp());
tmp.regEventHandler(new MouseDownHandler() {
@Override
public void handleEvent(Widget w, MouseDownEvent event) {
if(getAccessTarget() != null) {
getAccessTarget().moveUp();
buildHierarchy();
}
}
});
tmp = setupButton(3, "arrow_down", CGUILang.butMoveDown());
tmp.regEventHandler(new MouseDownHandler() {
@Override
public void handleEvent(Widget w, MouseDownEvent event) {
if(getAccessTarget() != null) {
getAccessTarget().moveDown();
buildHierarchy();
}
}
});
// tmp = setupButton(4, "rename", CGUILang.butRename());
// tmp.regEventHandler(new MouseDownHandler() {
// @Override
// public void handleEvent(Widget w, MouseDownEvent event) {
// if(getAccessTarget() != null) {
// TextBox box = handlers.get(getAccessTarget()).box;
// box.allowEdit = true;
// handlers.get(getAccessTarget()).transform.doesListenKey = true;
// System.out.println("Rename callback");
// }
// }
// });
tmp = setupButton(4, "remove", CGUILang.butRemove());
tmp.regEventHandler(new MouseDownHandler() {
@Override
public void handleEvent(Widget w, MouseDownEvent event) {
if(getAccessTarget() != null) {
getAccessTarget().dispose();
buildHierarchy();
}
}
});
tmp = setupButton(5, "duplicate", CGUILang.butDuplicate());
tmp.regEventHandler(new MouseDownHandler() {
@Override
public void handleEvent(Widget w, MouseDownEvent event) {
if(getAccessTarget() != null) {
getAccessTarget().getAbstractParent().addWidget(getAccessTarget().copy());
buildHierarchy();
}
}
});
tmp = setupButton(6, "up", "Move Up");
tmp.transform.setPos(90, 30);
tmp.regEventHandler(new MouseDownHandler() {
@Override
public void handleEvent(Widget w, MouseDownEvent event) {
if(hList != null) {
ElementList list = ElementList.get(hList);
list.progressLast();
}
}
});
tmp = setupButton(7, "down", "Move Down");
tmp.transform.setPos(90, 110);
tmp.regEventHandler(new MouseDownHandler() {
@Override
public void handleEvent(Widget w, MouseDownEvent event) {
if(hList != null) {
ElementList list = ElementList.get(hList);
list.progressNext();
}
}
});
{
tmp = new Widget();
tmp.transform.setSize(10, 10);
tmp.transform.setPos(90, 40);
final VerticalDragBar bar = new VerticalDragBar();
bar.setArea(40, 100);
tmp.addComponent(bar);
DrawTexture dt = new DrawTexture().setTex(null).setColor4i(200, 200, 255, 200);
tmp.addComponent(dt);
tmp.regEventHandler(new DraggedHandler() {
@Override
public void handleEvent(Widget w, DraggedEvent event) {
double p = bar.getProgress();
if(hList != null) {
ElementList list = ElementList.get(hList);
list.setProgress((int) Math.round(p * list.getMaxProgress()));
}
}
});
addWidget(tmp);
dragbar = tmp;
}
}
Map<Widget, SingleWidget> handlers = new HashMap();
private void buildHierarchy() {
if(hList != null)
hList.dispose();
handlers.clear();
hList = new Widget();
hList.transform.x = 2;
hList.transform.y = 32;
hList.transform.width = 80;
hList.transform.height = 86;
final ElementList el = new ElementList();
for(Widget w : guiEdit.toEdit.getDrawList()) {
if(!w.disposed)
hierarchyAdd(el, w);
}
hList.addComponent(el);
hList.regEventHandler(new ProgressChangeHandler() {
@Override
public void handleEvent(Widget w, ProgressChangedEvent event) {
double p = (double)el.getProgress() / el.getMaxProgress();
VerticalDragBar.get(dragbar).setProgress(dragbar, p);
}
});
addWidget(hList);
}
private void hierarchyAdd(ElementList list, Widget w) {
SingleWidget sw;
list.addWidget(sw = new SingleWidget(w));
handlers.put(w, sw);
for(Widget ww : w.getDrawList()) {
if(!ww.disposed)
hierarchyAdd(list, ww);
}
}
private Widget setupButton(int count, final String name, final String desc) {
final double size = 10;
Widget w = new Widget();
final Tint tint = new Tint();
w.addComponent(tint);
w.addComponent(new DrawTexture().setTex(GuiEdit.tex(name)));
w.transform.setSize(size, size).setPos(2 + count * 12, 11);
w.regEventHandler(new FrameEventHandler() {
@Override
public void handleEvent(Widget w, FrameEvent event) {
Widget target = getAccessTarget();
tint.enabled = target != null && target.visible;
if(event.hovering) {
Font.font.draw(desc, size / 2, size, 10, 0xffffff, Align.CENTER);
}
}
});
addWidget(w);
return w;
}
private class SingleWidget extends Widget {
int hierLevel;
Widget target;
boolean modified = false;
boolean on = true;
final ResourceLocation
vis_on = GuiEdit.tex("vis_on"),
vis_off = GuiEdit.tex("vis_off");
TextBox box;
public SingleWidget(Widget w) {
transform.width = 80;
transform.height = 12;
hierLevel = w.getHierarchyLevel();
target = w;
regEventHandler(new FrameEventHandler() {
@Override
public void handleEvent(Widget w, FrameEvent event) {
double r = 1, g = 1, b = 1;
double brightness = event.hovering ? .5 : .3;
if(target.isFocused()) {
brightness *= 1.6;
r = b = .6;
}
if(modified) {
r = g = 1;
b = 0;
}
GL11.glColor4d(r, g, b, brightness);
HudUtils.colorRect(0, 0, w.transform.width, w.transform.height);
}
});
regEventHandler(new MouseDownHandler() {
@Override
public void handleEvent(Widget w, MouseDownEvent event) {
guiEdit.toEdit.gainFocus(target);
}
});
{
Widget eye = new Widget();
eye.transform.setSize(10, 10).setPos(1, 1);
eye.addComponent(new Tint());
eye.addComponent(new DrawTexture().setTex(vis_on));
eye.regEventHandler(new MouseDownHandler() {
@Override
public void handleEvent(Widget w, MouseDownEvent event) {
on = !on;
target.visible = on;
DrawTexture.get(w).setTex(on ? vis_on : vis_off);
}
});
addWidget(eye);
}
addWidget(new Name());
}
private class Name extends Widget {
public Name() {
box = new TextBox().setSize(10);
box.content = target.getName();
transform.x = 14 + hierLevel * 6;
transform.setSize(70, 10);
}
@Override
public void onAdded() {
regEventHandler(new FrameEventHandler() {
int slowdown = 0;
@Override
public void handleEvent(Widget w, FrameEvent event) {
if(++slowdown == 100) {
slowdown = 0;
transform.x = 14 + hierLevel * 6;
w.dirty = true;
}
}
});
regEventHandler(new ConfirmInputHandler() {
@Override
public void handleEvent(Widget w, ConfirmInputEvent event) {
if(target.rename(box.content)) {
modified = false;
}
}
});
regEventHandler(new ChangeContentHandler() {
@Override
public void handleEvent(Widget w, ChangeContentEvent event) {
modified = true;
}
});
regEventHandler(new GainFocusHandler() {
@Override
public void handleEvent(Widget w, GainFocusEvent event) {
SingleWidget.this.postEvent(new MouseDownEvent(0, 0));
}
});
addComponent(box);
}
}
}
}