/******************************************************************************* * 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.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.IOException; import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.math.Polygon; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.ui.Button; import com.badlogic.gdx.scenes.scene2d.ui.ButtonGroup; import com.badlogic.gdx.scenes.scene2d.ui.Dialog; 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.bladecoder.engine.polygonalpathfinder.PolygonalNavGraph; import com.bladecoder.engine.util.Config; import com.bladecoder.engineeditor.Ctx; import com.bladecoder.engineeditor.common.EditorLogger; import com.bladecoder.engineeditor.common.Message; import com.bladecoder.engineeditor.common.RunProccess; import com.bladecoder.engineeditor.model.Project; public class ScnEditor extends Table { private static final String DELETE_WALK_ZONE_TEXT = "Delete Walk Zone"; private static final String CREATE_WALK_ZONE_TEXT = "Create Walk Zone"; private ScnWidget scnWidget; private TextButton testButton; private ButtonGroup<Button> buttonGroup; private TextButton walkZoneButton; private TextButton toolsButton; private TextButton viewButton; private ToolsWindow toolsWindow; private ViewWindow viewWindow; public ScnEditor(Skin skin) { super(skin); scnWidget = new ScnWidget(skin); testButton = new TextButton("Test", skin, "no-toggled"); buttonGroup = new ButtonGroup<Button>(); buttonGroup.setMaxCheckCount(1); buttonGroup.setMinCheckCount(0); buttonGroup.setUncheckLast(true); walkZoneButton = new TextButton(CREATE_WALK_ZONE_TEXT, skin, "no-toggled"); toolsButton = new TextButton("Tools", skin); viewButton = new TextButton("View", skin); buttonGroup.add(toolsButton); buttonGroup.add(viewButton); viewWindow = new ViewWindow(skin, scnWidget); toolsWindow = new ToolsWindow(skin, scnWidget); add(scnWidget).expand().fill(); row(); Table bottomTable = new Table(skin); Drawable drawable = skin.getDrawable("background"); bottomTable.setBackground(drawable); bottomTable.left(); add(bottomTable).fill(); bottomTable.add(viewButton); bottomTable.add(toolsButton); bottomTable.add(testButton); bottomTable.add(walkZoneButton).right().expandX(); walkZoneButton.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { if (scnWidget.getScene().getPolygonalNavGraph() == null) { float[] verts = new float[8]; float width = scnWidget.getScene().getCamera().getScrollingWidth(); float height = scnWidget.getScene().getCamera().getScrollingHeight(); verts[3] = height; verts[4] = width; verts[5] = height; verts[6] = width; Polygon poly = new Polygon(verts); PolygonalNavGraph pf = new PolygonalNavGraph(); pf.setWalkZone(poly); scnWidget.getScene().setPolygonalNavGraph(pf); Ctx.project.setModified(); walkZoneButton.setText(DELETE_WALK_ZONE_TEXT); viewWindow.showWalkZone(); } else { new Dialog("Delete Walk Zone", getSkin()) { protected void result(Object object) { if (((Boolean) object).booleanValue()) { walkZoneButton.setText(CREATE_WALK_ZONE_TEXT); scnWidget.getScene().setPolygonalNavGraph(null); Ctx.project.setModified(); } } }.text("Are you sure you want to delete the Walk Zone?").button("Yes", true).button("No", false).key(Keys.ENTER, true) .key(Keys.ESCAPE, false).show(getStage()); } } }); toolsButton.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, com.badlogic.gdx.scenes.scene2d.Actor actor) { if (toolsButton.isChecked()) { scnWidget.getParent().addActor(toolsWindow); toolsWindow.setPosition(getScnWidget().getX() + 5, getScnWidget().getY() + 5); toolsWindow.invalidate(); } else { scnWidget.getParent().removeActor(toolsWindow); } } }); viewButton.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, com.badlogic.gdx.scenes.scene2d.Actor actor) { if (viewButton.isChecked()) { scnWidget.getParent().addActor(viewWindow); viewWindow.setPosition(getScnWidget().getX() + 5, getScnWidget().getY() + 5); viewWindow.invalidate(); } else { scnWidget.getParent().removeActor(viewWindow); } } }); testButton.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, com.badlogic.gdx.scenes.scene2d.Actor actor) { test(); } }); Ctx.project.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent e) { EditorLogger.debug("ScnWidget Listener: " + e.getPropertyName()); if (e.getPropertyName().equals(Project.NOTIFY_SCENE_SELECTED)) { if (Ctx.project.getSelectedScene() == null) return; if (Ctx.project.getSelectedScene().getPolygonalNavGraph() != null) { walkZoneButton.setText(DELETE_WALK_ZONE_TEXT); } else { walkZoneButton.setText(CREATE_WALK_ZONE_TEXT); } } } }); } public ScnWidget getScnWidget() { return scnWidget; } private void test() { if (Ctx.project.getSelectedScene() == null) { String msg = "There are no scenes in this chapter."; Message.showMsg(getStage(), msg, 3); return; } Ctx.project.getProjectConfig().remove(Config.CHAPTER_PROP); Ctx.project.getProjectConfig().remove(Config.TEST_SCENE_PROP); 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...", 5); try { if (!RunProccess.runBladeEngine(Ctx.project.getProjectDir(), Ctx.project.getChapter().getId(), Ctx.project.getSelectedScene().getId())) Message.showMsg(stage, "There was a problem running the scene", 4); } catch (IOException e) { Message.showMsgDialog(stage, "Error", "There was a problem running the scene: " + e.getMessage()); } } }).start(); } public void dispose() { scnWidget.dispose(); } }