/*
* Copyright 2016 Nathan Howard
*
* This file is part of OpenGrave
*
* OpenGrave is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenGrave is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenGrave. If not, see <http://www.gnu.org/licenses/>.
*/
package com.opengrave.og.states;
import java.util.ArrayList;
import java.util.HashMap;
import com.opengrave.common.ModSession;
import com.opengrave.common.event.EventDispatcher;
import com.opengrave.common.event.EventHandler;
import com.opengrave.common.event.EventHandlerPriority;
import com.opengrave.common.event.EventListener;
import com.opengrave.common.inventory.ItemMaterial;
import com.opengrave.common.inventory.ItemType;
import com.opengrave.common.inventory.ItemTypePart;
import com.opengrave.common.inventory.ItemTypeParts;
import com.opengrave.og.MainThread;
import com.opengrave.og.gui.*;
import com.opengrave.og.gui.callback.CheckButtonPressedEvent;
import com.opengrave.og.gui.callback.StringRollerChangedEvent;
import com.opengrave.og.gui.callback.TextSelectedEvent;
import com.opengrave.og.resources.GUIXML;
import com.opengrave.og.util.Vector4f;
public class ModExplorerState extends BaseState implements EventListener {
public static enum View {
MAT, ITEM, NPC, PC, ITEMPART
};
HashMap<CheckButton, String> buttons = new HashMap<CheckButton, String>();
StringRoller roller;
Scrollable choices, contents;
private View currentView;
@Override
public void start() {
EventDispatcher.addHandler(this);
GUIXML mainMenuFile = new GUIXML("gui/explorer.xml");
screen = mainMenuFile.getGUI();
roller = (StringRoller) screen.getElementById("chooser");
choices = (Scrollable) screen.getElementById("choices");
contents = (Scrollable) screen.getElementById("contents");
setViewing(View.MAT);
}
@EventHandler(priority = EventHandlerPriority.LATE)
public void onViewSwitch(StringRollerChangedEvent event) {
if (!isActive()) {
return;
}
if (event.getRoller().equals(roller)) {
String s = event.getRoller().getString();
if (s.equals("Show Materials")) {
setViewing(View.MAT);
} else if (s.equals("Show Items")) {
setViewing(View.ITEM);
} else if (s.equals("Show Classes")) {
setViewing(View.NPC);
} else if (s.equals("Show Player Classes")) {
setViewing(View.PC);
} else if (s.equals("Show Item Parts")) {
setViewing(View.ITEMPART);
}
}
}
@EventHandler(priority = EventHandlerPriority.LATE)
public void onButton(CheckButtonPressedEvent event) {
if (!isActive()) {
return;
}
if (buttons.containsKey(event.getButton())) {
fillContents(currentView, event.getButton().getString());
}
}
@EventHandler(priority = EventHandlerPriority.LATE)
public void onLink(TextSelectedEvent event) {
if (!isActive()) {
return;
}
if (event.link == null) {
return;
}
String[] split = event.link.split(":", 2);
if (split.length < 2) {
return;
}
if (split[0].equalsIgnoreCase("ItemPart")) {
roller.setStringIndex(4);
fillContents(View.ITEMPART, split[1]);
}
}
private void fillContents(View currentView, String string) {
ModSession sess = MainThread.getSession();
contents.removeAllChildren();
TextArea ta = new TextArea(new ElementData(contents.getElementData()));
contents.addChildEnd(ta);
ta.setString("No data : " + currentView + " " + string);
StringBuilder sb = new StringBuilder();
if (currentView.equals(View.ITEM)) {
ItemType i = MainThread.getSession().getItemType(string);
sb.append(i.getItemName()).append(" : ").append(string).append("\n");
sb.append("\n");
sb.append("Mod : ").append(i.getModName()).append("\n");
if (i instanceof ItemTypeParts) {
sb.append("Type : Item made of Parts\n");
sb.append("\n");
sb.append("Parts:\n");
ItemTypeParts ip = (ItemTypeParts) i;
HashMap<String, ArrayList<ItemTypePart>> parts = ip.getPartsLists();
for (String key : parts.keySet()) {
sb.append(key).append(" : ");
for (ItemTypePart part : parts.get(key)) {
sb.append("#00f@<ItemPart:").append(i.getID()).append(":").append(key).append(":").append(part.getName()).append(">")
.append(part.getName()).append("@#000, ");
}
sb.append("\n");
}
} else {
sb.append("Type : Simple Item\n");
}
} else if (currentView.equals(View.MAT)) {
} else if (currentView.equals(View.NPC)) {
} else if (currentView.equals(View.PC)) {
} else if (currentView.equals(View.ITEMPART)) {
for (ItemType it : sess.getItemTypes()) {
if (it instanceof ItemTypeParts) {
ItemTypeParts itp = (ItemTypeParts) it;
for (String position : itp.getPartsLists().keySet()) {
for (ItemTypePart part : itp.getPartsLists().get(position)) {
String s = it.getID() + ":" + position + ":" + part.getName();
if (string.equals(s)) {
// We have it!
part.fill(sb);
}
}
}
}
}
}
ta.setString(sb.toString());
}
public void setViewing(View view) {
contents.removeAllChildren();
choices.removeAllChildren();
currentView = view;
ModSession sess = MainThread.getSession();
// Re-populate choices
if (view.equals(View.MAT)) {
ElementData ed = new ElementData(choices.getElementData());
CheckButtonGroupVertical group = new CheckButtonGroupVertical(ed);
choices.addChildEnd(group);
for (ItemMaterial iM : sess.getMaterials()) {
ElementData edB = new ElementData(ed);
float r = iM.getR() / 255f, g = iM.getG() / 255f, b = iM.getB() / 255f;
edB.defaultColour = new Vector4f(r, g, b, 1f);
edB.activeColour = edB.defaultColour;
edB.textColour = new Vector4f(1f - r, 1f - g, 1f - b, 1f);
edB.maximum_height = 24;
CheckButton button = new CheckButton(edB);
button.setString(iM.getName());
group.addChildEnd(button);
buttons.put(button, iM.getName());
}
} else if (view.equals(View.ITEM)) {
ElementData ed = new ElementData(choices.getElementData());
CheckButtonGroupVertical group = new CheckButtonGroupVertical(ed);
choices.addChildEnd(group);
for (ItemType it : sess.getItemTypes()) {
ElementData edB = new ElementData(ed);
edB.maximum_height = 24;
CheckButton button = new CheckButton(edB);
button.setString(it.getID());
group.addChildEnd(button);
buttons.put(button, it.getID());
}
} else if (view.equals(View.ITEMPART)) {
ElementData ed = new ElementData(choices.getElementData());
CheckButtonGroupVertical group = new CheckButtonGroupVertical(ed);
choices.addChildEnd(group);
ElementData edB = new ElementData(ed);
edB.maximum_height = 24;
for (ItemType it : sess.getItemTypes()) {
if (it instanceof ItemTypeParts) {
ItemTypeParts itp = (ItemTypeParts) it;
for (String position : itp.getPartsLists().keySet()) {
for (ItemTypePart part : itp.getPartsLists().get(position)) {
CheckButton button = new CheckButton(edB);
button.setString(it.getID() + ":" + position + ":" + part.getName());
group.addChildEnd(button);
buttons.put(button, it.getID());
}
}
}
}
}
((UIParent) screen).setAllChanged();
}
@Override
public void stop() {
}
@Override
public void update(float delta) {
}
}