/*******************************************************************************
* Copyright 2014 Rafael Garcia Moreno.
*
* 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 com.bladecoder.engineeditor.scneditor;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Container;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.scenes.scene2d.utils.Drawable;
import com.badlogic.gdx.utils.Array;
import com.bladecoder.engine.util.Config;
import com.bladecoder.engine.util.DPIUtils;
import com.bladecoder.engineeditor.Ctx;
import com.bladecoder.engineeditor.common.EditorLogger;
import com.bladecoder.engineeditor.common.I18NUtils;
import com.bladecoder.engineeditor.common.ImageUtils;
import com.bladecoder.engineeditor.common.Message;
import com.bladecoder.engineeditor.common.ModelTools;
import com.bladecoder.engineeditor.common.RunProccess;
import com.bladecoder.engineeditor.model.Project;
import com.kotcrab.vis.ui.widget.file.FileChooser;
import com.kotcrab.vis.ui.widget.file.FileChooser.Mode;
import com.kotcrab.vis.ui.widget.file.FileChooser.SelectionMode;
import com.kotcrab.vis.ui.widget.file.FileChooser.ViewMode;
import com.kotcrab.vis.ui.widget.file.FileChooserListener;
public class ToolsWindow extends Container<Table> {
ScnWidget scnWidget;
com.bladecoder.engine.model.BaseActor actor;
public ToolsWindow(Skin skin, ScnWidget sw) {
scnWidget = sw;
Table table = new Table(skin);
TextButton tmpButton = new TextButton("Temporal tool", skin, "no-toggled");
TextButton testOnAndroidButton = new TextButton("Test on Android device", skin, "no-toggled");
TextButton testOnIphoneEmulatorButton = new TextButton("Test on Iphone emulator", skin, "no-toggled");
TextButton testOnIpadEmulatorButton = new TextButton("Test on Ipad emulator", skin, "no-toggled");
TextButton testOnIOSDeviceButton = new TextButton("Test on IOS device", skin, "no-toggled");
TextButton exportTSVButton = new TextButton("I18N - Export texts as .tsv", skin, "no-toggled");
TextButton importTSVButton = new TextButton("I18N - Import.tsv file", skin, "no-toggled");
TextButton exportUIImages = new TextButton("Export UI Images", skin, "no-toggled");
TextButton createUIAtlas = new TextButton("Create UI Atlas", skin, "no-toggled");
TextButton particleEditor = new TextButton("Particle Editor", skin, "no-toggled");
table.defaults().left().expandX();
table.top().pad(DPIUtils.getSpacing() / 2);
table.add(new Label("Tools", skin, "big")).center();
Drawable drawable = skin.getDrawable("trans");
setBackground(drawable);
table.row();
table.add(testOnAndroidButton).expandX().fill();
table.row();
table.add(testOnIphoneEmulatorButton).expandX().fill();
table.row();
table.add(testOnIpadEmulatorButton).expandX().fill();
table.row();
table.add(testOnIOSDeviceButton).expandX().fill();
// disable if not mac
if (!System.getProperty("os.name").toLowerCase().contains("mac")) {
testOnIphoneEmulatorButton.setDisabled(true);
testOnIpadEmulatorButton.setDisabled(true);
testOnIOSDeviceButton.setDisabled(true);
}
table.row();
table.add(exportTSVButton).expandX().fill();
table.row();
table.add(importTSVButton).expandX().fill();
table.row();
table.add(exportUIImages).expandX().fill();
table.row();
table.add(createUIAtlas).expandX().fill();
table.row();
table.add(particleEditor).expandX().fill();
// table.row();
// table.add(tmpButton).expandX().fill();
// ADD CUTMODE FOR VERBS THAT ONLY HAVE A LOOKAT OR SAY ACTION
tmpButton.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
ModelTools.fixSaySubtitleActor();
Message.showMsg(getStage(), "TOOL PROCESSED", 4);
}
});
// TEST ON ANDROID DEVICE
testOnAndroidButton.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
testOnAndroid();
}
});
testOnIphoneEmulatorButton.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
testOnIphoneEmulator();
}
});
testOnIpadEmulatorButton.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
testOnIpadEmulator();
}
});
testOnIOSDeviceButton.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
testOnIOSDevice();
}
});
exportTSVButton.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
exportTSV();
}
});
importTSVButton.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
importTSV();
}
});
exportUIImages.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
exportUIImages();
}
});
createUIAtlas.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
createUIAtlas();
}
});
particleEditor.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
particleEditor();
}
});
table.pack();
setActor(table);
prefSize(table.getWidth(), Math.max(200, table.getHeight()));
setSize(table.getWidth(), Math.max(200, table.getHeight()));
}
protected void createUIAtlas() {
FileChooser fileChooser = new FileChooser(Mode.OPEN);
fileChooser.setSize(Gdx.graphics.getWidth() * 0.7f, Gdx.graphics.getHeight() * 0.7f);
fileChooser.setViewMode(ViewMode.LIST);
fileChooser.setSelectionMode(SelectionMode.DIRECTORIES);
getStage().addActor(fileChooser);
fileChooser.setListener(new FileChooserListener() {
@Override
public void selected(Array<FileHandle> files) {
// fileChooser.setTitle("Select the file to export the project
// texts");
// ImageUtils.createAtlas(files.get(0).file().getAbsolutePath(),
// Ctx.project.getProjectPath() + "/" + Project.UI_PATH + "/1/",
// "ui", 1, TextureFilter.Linear,
// TextureFilter.Nearest);
List<String> res = Ctx.project.getResolutions();
for (String r : res) {
float scale = Float.parseFloat(r);
try {
ImageUtils.createAtlas(files.get(0).file().getAbsolutePath(),
Ctx.project.getProjectPath() + "/" + Project.UI_PATH + "/" + r, "ui" + ".atlas", scale,
TextureFilter.Linear, TextureFilter.Nearest);
} catch (IOException e) {
EditorLogger.error(e.getMessage());
Message.showMsgDialog(getStage(), "Error creating atlas", e.getMessage());
return;
}
}
Message.showMsg(getStage(), "UI Atlas created sucessfully.", 4);
}
@Override
public void canceled() {
}
});
}
protected void exportUIImages() {
FileChooser fileChooser = new FileChooser(Mode.OPEN);
fileChooser.setSize(Gdx.graphics.getWidth() * 0.7f, Gdx.graphics.getHeight() * 0.7f);
fileChooser.setViewMode(ViewMode.LIST);
fileChooser.setSelectionMode(SelectionMode.DIRECTORIES);
getStage().addActor(fileChooser);
fileChooser.setListener(new FileChooserListener() {
@Override
public void selected(Array<FileHandle> files) {
try {
// fileChooser.setTitle("Select the file to export the
// project texts");
ImageUtils.unpackAtlas(
new File(Ctx.project.getProjectPath() + "/" + Project.UI_PATH + "/1/ui.atlas"),
files.get(0).file());
Message.showMsg(getStage(), "UI Atlas images exported sucessfully.", 4);
} catch (Exception e) {
Message.showMsg(getStage(), "There was a problem exporting images from UI Atlas.", 4);
EditorLogger.printStackTrace(e);
}
}
@Override
public void canceled() {
}
});
}
private void exportTSV() {
FileChooser fileChooser = new FileChooser(Mode.SAVE);
fileChooser.setSize(Gdx.graphics.getWidth() * 0.7f, Gdx.graphics.getHeight() * 0.7f);
fileChooser.setViewMode(ViewMode.LIST);
fileChooser.setSelectionMode(SelectionMode.FILES);
getStage().addActor(fileChooser);
fileChooser.setListener(new FileChooserListener() {
@Override
public void selected(Array<FileHandle> files) {
try {
// fileChooser.setTitle("Select the file to export the
// project texts");
I18NUtils.exportTSV(Ctx.project.getProjectDir().getAbsolutePath(),
files.get(0).file().getAbsolutePath(), Ctx.project.getChapter().getId(), "default");
Message.showMsg(getStage(), files.get(0).file().getName() + " exported sucessfully.", 4);
} catch (IOException e) {
Message.showMsg(getStage(), "There was a problem generating the .tsv file.", 4);
EditorLogger.printStackTrace(e);
}
}
@Override
public void canceled() {
}
});
}
private void importTSV() {
FileChooser fileChooser = new FileChooser(Mode.OPEN);
fileChooser.setSize(Gdx.graphics.getWidth() * 0.7f, Gdx.graphics.getHeight() * 0.7f);
fileChooser.setViewMode(ViewMode.LIST);
fileChooser.setSelectionMode(SelectionMode.FILES);
getStage().addActor(fileChooser);
fileChooser.setListener(new FileChooserListener() {
@Override
public void selected(Array<FileHandle> files) {
try {
// chooser.setTitle("Select the .tsv file to import");
I18NUtils.importTSV(Ctx.project.getProjectDir().getAbsolutePath(),
files.get(0).file().getAbsolutePath(), Ctx.project.getChapter().getId(), "default");
// Reload texts
Ctx.project.getI18N().load(Ctx.project.getChapter().getId());
Message.showMsg(getStage(), files.get(0).file().getName() + " imported sucessfully.", 4);
} catch (IOException e) {
Message.showMsg(getStage(), "There was a problem importing the .tsv file.", 4);
EditorLogger.printStackTrace(e);
}
}
@Override
public void canceled() {
}
});
}
private void testOnAndroid() {
if (Ctx.project.getSelectedScene() == null) {
String msg = "There are no scenes in this chapter.";
Message.showMsg(getStage(), msg, 3);
return;
}
Ctx.project.getProjectConfig().setProperty(Config.CHAPTER_PROP, Ctx.project.getChapter().getId());
Ctx.project.getProjectConfig().setProperty(Config.TEST_SCENE_PROP, Ctx.project.getSelectedScene().getId());
Ctx.project.setModified();
try {
Ctx.project.saveProject();
} catch (Exception ex) {
String msg = "Something went wrong while saving the project.\n\n" + ex.getClass().getSimpleName() + " - "
+ ex.getMessage();
Message.showMsgDialog(getStage(), "Error", msg);
return;
}
new Thread(new Runnable() {
Stage stage = getStage();
@Override
public void run() {
Message.showMsg(stage, "Running scene on Android device...", 5);
if (!RunProccess.runGradle(Ctx.project.getProjectDir(),
"android:uninstallDebug android:installDebug android:run")) {
Message.showMsg(stage, "There was a problem running the project", 4);
}
Ctx.project.getProjectConfig().remove(Config.CHAPTER_PROP);
Ctx.project.getProjectConfig().remove(Config.TEST_SCENE_PROP);
Ctx.project.setModified();
try {
Ctx.project.saveProject();
} catch (Exception ex) {
String msg = "Something went wrong while saving the project.\n\n" + ex.getClass().getSimpleName()
+ " - " + ex.getMessage();
EditorLogger.error(msg);
return;
}
}
}).start();
}
private void testOnIphoneEmulator() {
if (Ctx.project.getSelectedScene() == null) {
String msg = "There are no scenes in this chapter.";
Message.showMsg(getStage(), msg, 3);
return;
}
Ctx.project.getProjectConfig().setProperty(Config.CHAPTER_PROP, Ctx.project.getChapter().getId());
Ctx.project.getProjectConfig().setProperty(Config.TEST_SCENE_PROP, Ctx.project.getSelectedScene().getId());
Ctx.project.setModified();
try {
Ctx.project.saveProject();
} catch (Exception ex) {
String msg = "Something went wrong while saving the project.\n\n" + ex.getClass().getSimpleName() + " - "
+ ex.getMessage();
Message.showMsgDialog(getStage(), "Error", msg);
return;
}
new Thread(new Runnable() {
Stage stage = getStage();
@Override
public void run() {
Message.showMsg(stage, "Running scene on Iphone emulator...", 5);
if (!RunProccess.runGradle(Ctx.project.getProjectDir(), "ios:launchIPhoneSimulator")) {
Message.showMsg(stage, "There was a problem running the project", 4);
}
Ctx.project.getProjectConfig().remove(Config.CHAPTER_PROP);
Ctx.project.getProjectConfig().remove(Config.TEST_SCENE_PROP);
Ctx.project.setModified();
try {
Ctx.project.saveProject();
} catch (Exception ex) {
String msg = "Something went wrong while saving the project.\n\n" + ex.getClass().getSimpleName()
+ " - " + ex.getMessage();
EditorLogger.error(msg);
return;
}
}
}).start();
}
private void testOnIpadEmulator() {
if (Ctx.project.getSelectedScene() == null) {
String msg = "There are no scenes in this chapter.";
Message.showMsg(getStage(), msg, 3);
return;
}
Ctx.project.getProjectConfig().setProperty(Config.CHAPTER_PROP, Ctx.project.getChapter().getId());
Ctx.project.getProjectConfig().setProperty(Config.TEST_SCENE_PROP, Ctx.project.getSelectedScene().getId());
Ctx.project.setModified();
try {
Ctx.project.saveProject();
} catch (Exception ex) {
String msg = "Something went wrong while saving the project.\n\n" + ex.getClass().getSimpleName() + " - "
+ ex.getMessage();
Message.showMsgDialog(getStage(), "Error", msg);
return;
}
new Thread(new Runnable() {
Stage stage = getStage();
@Override
public void run() {
Message.showMsg(stage, "Running scene on Ipad simulator...", 5);
if (!RunProccess.runGradle(Ctx.project.getProjectDir(), "ios:launchIPadSimulator")) {
Message.showMsg(stage, "There was a problem running the project", 4);
}
Ctx.project.getProjectConfig().remove(Config.CHAPTER_PROP);
Ctx.project.getProjectConfig().remove(Config.TEST_SCENE_PROP);
Ctx.project.setModified();
try {
Ctx.project.saveProject();
} catch (Exception ex) {
String msg = "Something went wrong while saving the project.\n\n" + ex.getClass().getSimpleName()
+ " - " + ex.getMessage();
EditorLogger.error(msg);
return;
}
}
}).start();
}
private void testOnIOSDevice() {
if (Ctx.project.getSelectedScene() == null) {
String msg = "There are no scenes in this chapter.";
Message.showMsg(getStage(), msg, 3);
return;
}
Ctx.project.getProjectConfig().setProperty(Config.CHAPTER_PROP, Ctx.project.getChapter().getId());
Ctx.project.getProjectConfig().setProperty(Config.TEST_SCENE_PROP, Ctx.project.getSelectedScene().getId());
Ctx.project.setModified();
try {
Ctx.project.saveProject();
} catch (Exception ex) {
String msg = "Something went wrong while saving the project.\n\n" + ex.getClass().getSimpleName() + " - "
+ ex.getMessage();
Message.showMsgDialog(getStage(), "Error", msg);
return;
}
new Thread(new Runnable() {
Stage stage = getStage();
@Override
public void run() {
Message.showMsg(stage, "Running scene on IOS device...", 5);
if (!RunProccess.runGradle(Ctx.project.getProjectDir(), "ios:launchIOSDevice")) {
Message.showMsg(stage, "There was a problem running the project", 4);
}
Ctx.project.getProjectConfig().remove(Config.CHAPTER_PROP);
Ctx.project.getProjectConfig().remove(Config.TEST_SCENE_PROP);
Ctx.project.setModified();
try {
Ctx.project.saveProject();
} catch (Exception ex) {
String msg = "Something went wrong while saving the project.\n\n" + ex.getClass().getSimpleName()
+ " - " + ex.getMessage();
EditorLogger.error(msg);
return;
}
}
}).start();
}
private void particleEditor() {
// Open the particle editor
List<String> cp = new ArrayList<String>();
cp.add(System.getProperty("java.class.path"));
try {
RunProccess.runJavaProccess("com.badlogic.gdx.tools.particleeditor.ParticleEditor", cp, null);
} catch (IOException e) {
Message.showMsgDialog(getStage(), "Error", "Error launching Particle Editor.");
EditorLogger.printStackTrace(e);
}
}
}