package net.alcuria.umbracraft.editor.widget;
import net.alcuria.umbracraft.definitions.skill.SkillDefinition;
import net.alcuria.umbracraft.definitions.skill.SkillPositionDefinition;
import net.alcuria.umbracraft.editor.Drawables;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Event;
import com.badlogic.gdx.scenes.scene2d.EventListener;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener.ChangeEvent;
import com.badlogic.gdx.utils.Array;
import com.kotcrab.vis.ui.widget.VisCheckBox;
import com.kotcrab.vis.ui.widget.VisLabel;
/** Manages targeting of a {@link SkillDefinition}
* @author Andrew Keturi */
public class SkillTargetingWidget {
private static final int CENTER_OFFSET = 3;
private Table content;
private final SkillDefinition definition;
public SkillTargetingWidget(SkillDefinition definition) {
this.definition = definition;
}
public Actor getActor() {
if (content == null) {
content = new Table();
update();
}
return content;
}
private boolean isChecked(int x, int y) {
if (definition == null || definition.targets == null) {
return false;
}
for (SkillPositionDefinition position : definition.targets) {
if (position.x == x && position.y == y) {
return true;
}
}
return false;
}
private void setTarget(int x, int y, boolean checked) {
if (definition.targets == null) {
definition.targets = new Array<SkillPositionDefinition>();
}
SkillPositionDefinition target = null;
for (int i = 0; i < definition.targets.size; i++) {
final SkillPositionDefinition pos = definition.targets.get(i);
if (pos.x == x && pos.y == y && !checked) {
definition.targets.removeIndex(i);
return;
}
}
if (target == null && checked) {
definition.targets.add(new SkillPositionDefinition(x, y));
}
}
private void update() {
content.clear();
content.add(new Table() {
{
add(WidgetUtils.tooltip("The skill's range, relative to a centered target."));
add(new VisLabel("Targets"));
}
}).row();
content.add(new Table() {
{
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 7; j++) {
final int x = i - CENTER_OFFSET;
final int y = j - CENTER_OFFSET;
add(new VisCheckBox("", isChecked(x, y)) {
{
addListener(new EventListener() {
@Override
public boolean handle(Event event) {
if (event instanceof ChangeEvent) {
setTarget(x, y, isChecked());
return true;
}
return false;
}
});
if (x == 0 && y == 0) {
setDebug(true);
setColor(Color.YELLOW);
setBackground(Drawables.get("blue"));
}
}
});
}
row();
}
}
});
}
}