package net.alcuria.umbracraft.editor.modules;
import net.alcuria.umbracraft.definitions.npc.ScriptDefinition;
import net.alcuria.umbracraft.definitions.npc.ScriptPageDefinition;
import net.alcuria.umbracraft.definitions.npc.ScriptPageDefinition.ScriptTrigger;
import net.alcuria.umbracraft.editor.widget.ScriptPagePropertiesWidget;
import net.alcuria.umbracraft.editor.widget.ScriptPageWidget;
import net.alcuria.umbracraft.editor.widget.WidgetUtils;
import net.alcuria.umbracraft.engine.scripts.EmptyCommand;
import net.alcuria.umbracraft.listeners.Listener;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.utils.Array;
/** A module for displaying and editing scripts.
* @author Andrew Keturi */
public class ScriptListModule extends ListModule<ScriptDefinition> {
private final ScriptPageWidget commandsWidget = new ScriptPageWidget();
private ScriptPageDefinition currentPage;
private final Table headerTable = new Table(), preconditionsTable = new Table(), commandsTable = new Table();
private final ScriptPagePropertiesWidget propertiesWidget = new ScriptPagePropertiesWidget();
private ScriptDefinition script;
@Override
public void addListItem() {
final ScriptDefinition script = new ScriptDefinition();
script.name = "Script " + rootDefinition.size();
script.pages = new Array<ScriptPageDefinition>();
final ScriptPageDefinition page = new ScriptPageDefinition();
page.trigger = ScriptTrigger.ON_INTERACTION;
page.name = "Untitled";
page.command = new EmptyCommand();
script.pages.add(page);
rootDefinition.add(script);
}
private Listener addPageListener() {
return new Listener() {
@Override
public void invoke() {
final ScriptPageDefinition page = new ScriptPageDefinition();
page.command = new EmptyCommand();
page.trigger = ScriptTrigger.ON_INTERACTION;
page.name = "Untitled " + (script.pages.size + 1);
script.pages.add(page);
updateHeader();
}
};
}
@Override
public void create(final ScriptDefinition definition, Table content) {
script = definition;
currentPage = script.pages.first();
content.add(new Table() {
{
populate(this, ScriptDefinition.class, definition, new PopulateConfig());
}
}).row();
content.add(headerTable).expandX().row();
content.add(new Table() {
{
add(preconditionsTable).width(300).expand().fillX().top();
add(commandsTable).width(600).expand().top().left();
}
}).expand().fill().minHeight(400);
updateHeader();
updatePreconditions();
updateCommands();
}
@Override
public String getTitle() {
return "Scripts";
}
private Listener removePageListener() {
return new Listener() {
@Override
public void invoke() {
if (script.pages.size > 1) {
script.pages.removeValue(currentPage, true);
currentPage = script.pages.first();
updateHeader();
}
updateHeader();
}
};
}
private Listener setPageListener(final ScriptPageDefinition page) {
return new Listener() {
@Override
public void invoke() {
currentPage = page;
updateCommands();
updatePreconditions();
updateHeader();
}
};
}
private void updateCommands() {
commandsTable.clear();
commandsTable.add(commandsWidget.getActor()).expand().fill();
commandsWidget.setPage(currentPage);
}
private void updateHeader() {
headerTable.clear();
headerTable.defaults().pad(5);
for (final ScriptPageDefinition page : script.pages) {
final TextButton pageButton = WidgetUtils.button(page.name, setPageListener(page));
pageButton.getLabel().setColor(page == currentPage ? Color.YELLOW : Color.WHITE);
headerTable.add(pageButton);
}
headerTable.add(WidgetUtils.button("+", addPageListener()));
headerTable.add(WidgetUtils.button("-", removePageListener()));
}
private void updatePreconditions() {
preconditionsTable.clear();
preconditionsTable.add(propertiesWidget.getActor()).expandX().fill();
propertiesWidget.setPage(currentPage);
}
}