package net.alcuria.umbracraft.editor.widget;
import net.alcuria.umbracraft.definitions.area.AreaNodeDefinition;
import net.alcuria.umbracraft.definitions.map.TeleportDefinition;
import net.alcuria.umbracraft.definitions.map.TeleportDefinition.TeleportDirection;
import net.alcuria.umbracraft.listeners.Listener;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
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;
/** A widget for displaying and adding teleport locations to an
* {@link AreaNodeDefinition}.
* @author Andrew Keturi */
public class TeleportSelectorWidget {
private final AreaNodeDefinition node;
private final Table root = new Table();
private final ObjectMap<String, SuggestionWidget> suggestionWidgets = new ObjectMap<>();
/** Initializes the member variables only. Call
* {@link TeleportSelectorWidget#getActor()} to return the actor.
* @param node the {@link AreaNodeDefinition} */
public TeleportSelectorWidget(AreaNodeDefinition node) {
this.node = node;
}
/** Adds a direction to the list of all available
* @param selectBox the dropdown
* @param textField the suggestion textField
* @return */
private Listener addDirectionListener(final VisSelectBox<TeleportDirection> selectBox, final SuggestionWidget textField) {
return new Listener() {
@Override
public void invoke() {
node.teleport.adjacentMaps.put(selectBox.getSelected().toString(), textField.getTextField().getText());
update();
}
};
}
/** @param direction the {@link TeleportDefinition} to delete
* @return the listener to invoke when a row is deleted. */
private Listener deleteListener(final String direction) {
return new Listener() {
@Override
public void invoke() {
suggestionWidgets.remove(direction);
node.teleport.adjacentMaps.remove(direction.toString());
update();
}
};
}
/** Creates the widget.
* @return a {@link Table} containing the widget. */
public Table getActor() {
update();
return root;
}
private Listener saveListener(final String direction) {
return new Listener() {
@Override
public void invoke() {
node.teleport.adjacentMaps.put(direction, suggestionWidgets.get(direction).getTextField().getText());
}
};
}
/** @return All suggestions (map names) */
private Array<String> suggestions() {
Array<String> suggestions = new Array<>();
if (node.children != null) {
for (AreaNodeDefinition areaNodeDefinition : node.children) {
suggestions.add(areaNodeDefinition.name);
}
}
return suggestions;
}
/** Updates the widget, clearing and rebuilding the rows. */
public void update() {
root.clear();
root.add(new Table() {
{
for (final String direction : node.teleport.adjacentMaps.keys()) {
add(new Table() {
{
// [direction label] [textfield] [close x]
defaults().padLeft(10).padRight(10);
add(new VisLabel(direction.toString())).width(80);
if (!suggestionWidgets.containsKey(direction)) {
final SuggestionWidget suggestion = new SuggestionWidget(suggestions(), 200, true);
suggestionWidgets.put(direction, suggestion);
}
add(suggestionWidgets.get(direction).getActor());
suggestionWidgets.get(direction).setGenericPopulate(saveListener(direction));
suggestionWidgets.get(direction).addSelectListener(saveListener(direction));
if (node.teleport.adjacentMaps.get(direction.toString()) != null) {
suggestionWidgets.get(direction).getTextField().setText(node.teleport.adjacentMaps.get(direction.toString()));
}
add(WidgetUtils.button("X", deleteListener(direction)));
}
}).row();
}
add().expand().fill().row();
// get all available directions that we haven't already used
final Array<TeleportDirection> availableDirections = new Array<>();
for (final TeleportDirection direction : TeleportDirection.values()) {
if (!node.teleport.adjacentMaps.containsKey(direction.toString())) {
availableDirections.add(direction);
}
}
// [direction dropdown] [textfield] [add]
if (availableDirections.size > 0) {
add(new Table() {
{
defaults().padLeft(10).padRight(10);
final VisSelectBox<TeleportDirection> selectBox = new VisSelectBox<TeleportDirection>();
selectBox.setItems(availableDirections);
add(selectBox);
final SuggestionWidget addSuggestion = new SuggestionWidget(suggestions(), 200, true);
add(addSuggestion.getActor());
addSuggestion.setGenericPopulate(null);
add(WidgetUtils.button("Add", addDirectionListener(selectBox, addSuggestion)));
}
}).row();
}
}
}).pad(10).minHeight(110);
}
}