/*
* Copyright 2012 Benjamin Glatzel <benjamin.glatzel@me.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.terasology.rendering.gui.menus;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.vecmath.Vector2f;
import org.lwjgl.opengl.Display;
import org.spout.api.Spout;
import org.terasology.game.CoreRegistry;
import org.terasology.game.TerasologyEngine;
import org.terasology.game.modes.StateSinglePlayer;
import org.terasology.logic.manager.AssetManager;
import org.terasology.logic.manager.Config;
import org.terasology.logic.manager.GUIManager;
import org.terasology.logic.manager.PathManager;
import org.terasology.logic.world.WorldInfo;
import org.terasology.logic.world.WorldUtil;
import org.terasology.rendering.gui.components.UIButton;
import org.terasology.rendering.gui.components.UIImageOverlay;
import org.terasology.rendering.gui.components.UIInput;
import org.terasology.rendering.gui.components.UIList;
import org.terasology.rendering.gui.dialogs.UIDialogCreateNewWorld;
import org.terasology.rendering.gui.framework.IClickListener;
import org.terasology.rendering.gui.framework.UIDisplayElement;
import org.terasology.rendering.gui.framework.UIDisplayWindow;
/**
* Select world menu screen.
*
* @author Anton Kireev <adeon.k87@gmail.com>
*/
public class UISelectWorldMenu extends UIDisplayWindow {
private Logger logger = Logger.getLogger(getClass().getName());
final UIImageOverlay _overlay;
final UIList _list;
final UIButton _goToBack;
final UIButton _createNewWorld;
final UIButton _loadFromList;
final UIButton _deleteFromList;
final UIDialogCreateNewWorld _window;
public UISelectWorldMenu() {
maximize();
_overlay = new UIImageOverlay(AssetManager.loadTexture("engine:menuBackground"));
_overlay.setVisible(true);
_window = new UIDialogCreateNewWorld("Create new world", new Vector2f(512f, 256f));
_window.center();
_window.setModal(true);
GUIManager.getInstance().addWindow(_window, "generate_world");
_list = new UIList(new Vector2f(512f, 256f));
_list.setVisible(true);
_list.addDoubleClickListener(new IClickListener() {
public void clicked(UIDisplayElement element) {
loadSelectedWorld();
}
});
_goToBack = new UIButton(new Vector2f(256f, 32f));
_goToBack.getLabel().setText("Go back");
_goToBack.setVisible(true);
_loadFromList = new UIButton(new Vector2f(128f, 32f));
_loadFromList.getLabel().setText("Load");
_loadFromList.setVisible(true);
_createNewWorld = new UIButton(new Vector2f(192f, 32f));
_createNewWorld.getLabel().setText("Create new world");
_createNewWorld.setVisible(true);
_deleteFromList = new UIButton(new Vector2f(128f, 32f));
_deleteFromList.getLabel().setText("Delete");
_deleteFromList.setVisible(true);
_createNewWorld.addClickListener(new IClickListener() {
public void clicked(UIDisplayElement element) {
GUIManager.getInstance().setFocusedWindow(_window);
_window.clearInputControls();
UIInput inputWorldName = (UIInput) _window.getElementById("inputWorldTitle");
inputWorldName.setValue(_window.getWorldName());
}
});
_deleteFromList.addClickListener(new IClickListener() {
public void clicked(UIDisplayElement element) {
if (_list.getSelectedItem() == null) {
GUIManager.getInstance().showMessage("Error", "Please choose a world first.");
return;
}
try {
WorldInfo worldInfo = (WorldInfo) _list.getSelectedItem().getValue();
File world = PathManager.getInstance().getWorldSavePath(worldInfo.getTitle());
WorldUtil.deleteWorld(world);
_list.removeSelectedItem();
} catch (Exception e) {
GUIManager.getInstance().showMessage("Error", "Failed deleting world data object. Sorry.");
}
}
});
_loadFromList.addClickListener(new IClickListener() {
public void clicked(UIDisplayElement element) {
loadSelectedWorld();
}
});
fillList();
addDisplayElement(_overlay);
addDisplayElement(_list, "list");
addDisplayElement(_loadFromList, "loadFromListButton");
addDisplayElement(_goToBack, "goToBackButton");
addDisplayElement(_createNewWorld, "createWorldButton");
addDisplayElement(_deleteFromList, "deleteFromListButton");
update();
}
@Override
public void update() {
super.update();
_list.centerHorizontally();
_list.getPosition().y = 230f;
_createNewWorld.getPosition().x = _list.getPosition().x;
_createNewWorld.getPosition().y = _list.getPosition().y + _list.getSize().y + 32f;
_loadFromList.getPosition().x = _createNewWorld.getPosition().x + _createNewWorld.getSize().x + 15f;
_loadFromList.getPosition().y = _createNewWorld.getPosition().y;
_deleteFromList.getPosition().x = _loadFromList.getPosition().x + _loadFromList.getSize().x + 15f;
_deleteFromList.getPosition().y = _loadFromList.getPosition().y;
_goToBack.centerHorizontally();
_goToBack.getPosition().y = Display.getHeight() - _goToBack.getSize().y - 32f;
}
private void loadSelectedWorld() {
if (_list.size() < 1) {
GUIManager.getInstance().showMessage("Error", "You did not create a world yet!");
return;
}
if (_list.getSelectedItem() == null) {
GUIManager.getInstance().showMessage("Error", "Please choose a world!");
return;
}
try {
WorldInfo info = (WorldInfo) _list.getSelectedItem().getValue();
Config.getInstance().setDefaultSeed(info.getSeed());
Config.getInstance().setWorldTitle(info.getTitle());
// TODO: Need to load time too. Maybe just pass through WorldInfo?
CoreRegistry.get(TerasologyEngine.class).changeState(new StateSinglePlayer((TerasologyEngine) Spout.getEngine()));
} catch (Exception e) {
GUIManager.getInstance().showMessage("Error", "Failed reading world data object. Sorry.");
}
}
public void fillList() {
_list.removeAll();
File worldCatalog = PathManager.getInstance().getWorldPath();
for (File file : worldCatalog.listFiles(new FileFilter() {
public boolean accept(File file) {
if (file.isDirectory()) {
return true;
} else {
return false;
}
}
})) {
File worldManifest = new File(file, WorldInfo.DEFAULT_FILE_NAME);
if (!worldManifest.exists())
continue;
try {
WorldInfo info = WorldInfo.load(worldManifest);
if (!info.getTitle().isEmpty()) {
_list.addItem(info.getTitle(), info);
}
} catch (IOException e) {
logger.log(Level.SEVERE, "Failed reading world data object. Sorry.", e);
}
}
}
}