/**
* 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.Resources;
import cn.academy.core.event.ConfigModifyEvent;
import cn.lambdalib.cgui.gui.Widget;
import cn.lambdalib.cgui.gui.component.Component;
import cn.lambdalib.cgui.gui.component.DrawTexture;
import cn.lambdalib.cgui.gui.component.TextBox;
import cn.lambdalib.cgui.gui.event.*;
import cn.lambdalib.util.helper.Color;
import cn.lambdalib.util.key.KeyManager;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.config.Configuration;
import net.minecraftforge.common.config.Property;
import org.lwjgl.input.Keyboard;
public class PropertyElements {
public static IPropertyElement CHECKBOX = new IPropertyElement<UIProperty.Config>() {
final ResourceLocation
CHECK_TRUE = Resources.getTexture("guis/check_true"),
CHECK_FALSE = Resources.getTexture("guis/check_false");
@Override
public Widget getWidget(UIProperty.Config prop) {
Configuration cfg = getConfig();
Property p = cfg.get(prop.category, prop.id, (boolean) prop.defValue);
Widget ret = SettingsUI.document.getWidget("t_checkbox").copy();
TextBox.get(ret.getWidget("text")).setContent(prop.getDisplayID());
Widget check = ret.getWidget("box");
DrawTexture.get(check).setTex(p.getBoolean() ? CHECK_TRUE : CHECK_FALSE);
check.listen(LeftClickEvent.class, (w, e) -> {
boolean b = !p.getBoolean();
p.set(b);
DrawTexture.get(check).setTex(b ? CHECK_TRUE : CHECK_FALSE);
MinecraftForge.EVENT_BUS.post(new ConfigModifyEvent(p));
});
return ret;
}
},
KEY = new IPropertyElement<UIProperty.Config>() {
@Override
public Widget getWidget(UIProperty.Config prop) {
Configuration cfg = getConfig();
Property p = cfg.get(prop.category, prop.id, (int) prop.defValue);
Widget ret = SettingsUI.document.getWidget("t_key").copy();
TextBox.get(ret.getWidget("text")).setContent(prop.getDisplayID());
Widget key = ret.getWidget("key");
key.addComponent(new EditKey(p));
return ret;
}
},
CALLBACK = new IPropertyElement<UIProperty.Callback>() {
@Override
public Widget getWidget(UIProperty.Callback prop) {
Widget ret = SettingsUI.document.getWidget("t_callback").copy();
TextBox.get(ret.getWidget("text")).setContent(prop.getDisplayID());
ret.getWidget("button").listen(LeftClickEvent.class, (w, e) -> prop.action.run());
return ret;
}
};
private static class EditKey extends Component {
static final Color
CRL_NORMAL = new Color().setColor4i(200, 200, 200, 200),
CRL_EDIT = new Color().setColor4i(251, 133, 37, 200);
IGuiEventHandler<MouseClickEvent> gMouseHandler;
final Property prop;
public boolean editing;
TextBox textBox;
public EditKey(Property _prop) {
super("EditKey");
prop = _prop;
listen(KeyEvent.class, (w, event) ->
{
if(editing) {
endEditing(event.keyCode);
}
});
listen(GainFocusEvent.class, (w, e) ->
{
startEditing();
});
}
@Override
public void onAdded() {
super.onAdded();
textBox = TextBox.get(widget);
widget.transform.doesListenKey = true;
updateKeyName();
}
private void updateKeyName() {
textBox.setContent(KeyManager.getKeyName(prop.getInt()));
}
private void startEditing() {
editing = true;
textBox.setContent("PRESS");
textBox.option.color = CRL_EDIT;
widget.getGui().eventBus.listen(MouseClickEvent.class,
gMouseHandler = (w, event) -> {
endEditing(event.button - 100);
});
}
private void endEditing(int key) {
editing = false;
textBox.option.color = CRL_NORMAL;
widget.getGui().removeFocus();
if(key == Keyboard.KEY_ESCAPE) {
;
} else {
prop.set(key);
}
updateKeyName();
widget.getGui().eventBus.unlisten(MouseClickEvent.class, gMouseHandler);
MinecraftForge.EVENT_BUS.post(new ConfigModifyEvent(prop));
}
}
}