package net.alcuria.umbracraft.editor.modules;
import net.alcuria.umbracraft.definitions.skill.SkillDefinition;
import net.alcuria.umbracraft.definitions.skill.actions.SkillActionDefinition;
import net.alcuria.umbracraft.definitions.skill.actions.SkillActionDefinition.SkillActionType;
import net.alcuria.umbracraft.editor.Editor;
import net.alcuria.umbracraft.editor.widget.SkillTargetingWidget;
import net.alcuria.umbracraft.editor.widget.WidgetUtils;
import net.alcuria.umbracraft.listeners.TypeListener;
import net.alcuria.umbracraft.util.FileUtils;
import net.alcuria.umbracraft.util.StringUtils;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.ObjectMap;
import com.kotcrab.vis.ui.widget.VisLabel;
import com.kotcrab.vis.ui.widget.VisSelectBox;
import com.kotcrab.vis.ui.widget.VisTextButton;
public class SkillListModule extends ListModule<SkillDefinition> {
private Table actionDropdownTable, actionTable, iconTable, listCommandTable;
private SkillDefinition definition;
@Override
public void addListItem() {
final SkillDefinition skill = new SkillDefinition();
skill.actions = new Array<SkillActionDefinition>();
skill.name = "Skill " + rootDefinition.size();
rootDefinition.add(skill);
}
@Override
public void create(final SkillDefinition definition, Table content) {
this.definition = definition;
populate(content, SkillDefinition.class, definition, skillConfig());
content.defaults().pad(20);
content.add(new Table() {
{
add(new Table() {
{
add(new VisLabel("Skill Icon:")).row();
add(iconTable = new Table()).row();
updateSkillIcon();
WidgetUtils.divider(this, "yellow");
add(new SkillTargetingWidget(definition).getActor()).row();
}
});
add(new Table() {
{
defaults().pad(20);
add(listCommandTable = new Table()).row();
add(actionTable = new Table()).row();
add(actionDropdownTable = new Table()).row();
}
});
}
});
updateActions();
}
@Override
public String getTitle() {
return "Skills";
}
private PopulateConfig skillActionConfig() {
return new PopulateConfig() {
{
labelWidth = 80;
cols = 2;
textFieldWidth = 80;
suggestions = new ObjectMap<String, Array<String>>();
suggestions.put("sound", FileUtils.getFilesAt(Editor.db().config().projectPath + Editor.db().config().soundPath, false));
}
};
}
private PopulateConfig skillConfig() {
return new PopulateConfig() {
{
textFieldWidth = 200;
cols = 1;
suggestions = new ObjectMap<String, Array<String>>();
suggestions.put("iconId", FileUtils.getFilesAt(Editor.db().config().projectPath + Editor.db().config().iconPath, false));
listener = new TypeListener<String>() {
@Override
public void invoke(String type) {
if (type.equals("iconId")) {
updateSkillIcon();
}
}
};
}
};
}
private void updateActions() {
listCommandTable.clear();
listCommandTable.add(new Table() {
{
defaults().pad(20);
final VisTextButton copyButton = new VisTextButton("Copy Actions");
copyButton.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
super.clicked(event, x, y);
Editor.clipboard().skillActions = definition.actions;
}
});
final VisTextButton pasteButton = new VisTextButton("Paste Actions") {
@Override
public void act(float delta) {
setDisabled(Editor.clipboard().skillActions == null);
};
};
pasteButton.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
super.clicked(event, x, y);
if (definition.actions == null) {
definition.actions = new Array<SkillActionDefinition>();
} else {
definition.actions.clear();
}
for (SkillActionDefinition act : Editor.clipboard().skillActions) {
definition.actions.add(act.cpy());
}
updateActions();
}
});
add(copyButton);
add(pasteButton);
}
});
actionTable.clear();
actionTable.add(new Table() {
{
if (definition.actions != null) {
for (int i = 0; i < definition.actions.size; i++) {
final SkillActionDefinition action = definition.actions.get(i);
final int idx = i;
defaults().expandX().fill();
add(new VisLabel(StringUtils.formatName(action.getClass().getSimpleName()), Color.YELLOW)).row();
add(new Table() {
{
defaults().expandX().fillX().pad(5);
add(new Table() {
{
if (idx > 0) {
add(new VisTextButton("^") {
{
addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
definition.actions.insert(idx - 1, definition.actions.removeIndex(idx));
updateActions();
};
});
}
}).row();
}
if (idx < definition.actions.size - 1) {
add(new VisTextButton("v") {
{
addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
definition.actions.insert(idx + 1, definition.actions.removeIndex(idx));
updateActions();
};
});
}
}).row();
}
}
}).expand(false, false).left();
// populate component information
populate(this, action.getClass(), action, skillActionConfig());
add(new VisTextButton("X") {
{
addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
definition.actions.removeValue(action, true);
updateActions();
};
});
}
}).width(20).expandX().right();
}
}).width(500).row();
WidgetUtils.divider(this, "blue");
}
}
}
});
actionDropdownTable.clear();
actionDropdownTable.add(new Table() {
{
final VisSelectBox<SkillActionType> list = new VisSelectBox<SkillActionType>();
list.setItems(SkillActionType.values());
final VisTextButton button = new VisTextButton("Add Action");
button.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
super.clicked(event, x, y);
try {
if (definition.actions == null) {
definition.actions = new Array<SkillActionDefinition>();
}
definition.actions.add(list.getSelected().clazz.newInstance());
updateActions();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
}
});
add(list);
add(button).padLeft(20);
}
});
}
private void updateSkillIcon() {
iconTable.clear();
String path = Editor.db().config().projectPath + Editor.db().config().iconPath + definition.iconId + ".png";
if (Gdx.files.absolute(path).exists()) {
final Texture texture = new Texture(Gdx.files.absolute(path));
iconTable.add(new Image(texture)).size(texture.getWidth() * 2, texture.getHeight() * 2);
}
}
}