Major refactoring of code completed! This will make future UI expansion much easier. Also, fixed the redraw logic when switching platforms. Many bugs still remain but this is on-par (both features and bugs-wise) with the last revision checked in.

This commit is contained in:
Brendan Robert 2014-05-25 00:22:26 -05:00
parent 2f4eb4843c
commit fecfb0a477
26 changed files with 470 additions and 305 deletions

View File

@ -8,8 +8,8 @@ import javafx.scene.canvas.Canvas;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import static org.badvision.outlaweditor.UIAction.*;
import org.badvision.outlaweditor.data.xml.GameData;
import org.badvision.outlaweditor.ui.ApplicationUIController;
/**
*
@ -20,10 +20,18 @@ public class Application extends javafx.application.Application {
public static GameData gameData = new GameData();
public static Platform currentPlatform = Platform.AppleII;
static Application instance;
public Stage primaryStage;
ApplicationUIControllerImpl controller;
public static Application getInstance() {
return instance;
}
private ApplicationUIController controller;
public ApplicationUIController getController() {
return controller;
}
public static Stage getPrimaryStage() {
public Stage primaryStage;
public static Stage getPrimaryStage() {
return instance.primaryStage;
}

View File

@ -3,6 +3,7 @@ package org.badvision.outlaweditor;
import javafx.scene.layout.AnchorPane;
import org.badvision.outlaweditor.data.DataObserver;
import org.badvision.outlaweditor.data.DataProducer;
import org.badvision.outlaweditor.data.xml.Script;
/**
* Extremely generic editor abstraction -- useful for uniform edit features across application
@ -52,5 +53,10 @@ public abstract class Editor<T,D> implements DataObserver<T> {
}
return selectInfo;
};
public void addScript(Script script) {
throw new UnsupportedOperationException("Not supported yet.");
}
abstract public void redraw();
}

View File

@ -60,6 +60,10 @@ public class MapEditor extends Editor<Map, MapEditor.DrawMode> implements EventH
super.setEntity(t);
currentMap = new TileMap(t);
}
public TileMap getCurrentMap() {
return currentMap;
}
EventHandler<ScrollEvent> scrollHandler = new EventHandler<ScrollEvent>() {
@Override
public void handle(ScrollEvent t) {
@ -125,6 +129,14 @@ public class MapEditor extends Editor<Map, MapEditor.DrawMode> implements EventH
anchorPane.getChildren().add(0, drawCanvas);
}
@Override
public void addScript(Script script) {
if (getCurrentMap().getBackingMap().getScripts() == null) {
getCurrentMap().getBackingMap().setScripts(new Map.Scripts());
}
getCurrentMap().getBackingMap().getScripts().getScript().add(script);
}
public void assignScript(Script script, double x, double y) {
System.out.println("Dropped " + script.getName() + " at " + x + "," + y);
}

View File

@ -23,6 +23,8 @@ import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.badvision.outlaweditor.data.xml.Block;
import org.badvision.outlaweditor.data.xml.Script;
import org.badvision.outlaweditor.ui.ApplicationUIController;
import org.badvision.outlaweditor.ui.MythosScriptEditorController;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
@ -135,6 +137,6 @@ public class MythosEditor {
}
script.setName(name);
System.out.println("Function title changed! >> "+name);
Application.instance.controller.mapController.redrawMapScripts();
ApplicationUIController.getController().redrawScripts();
}
}

View File

@ -22,7 +22,7 @@ import org.badvision.outlaweditor.Application;
import org.badvision.outlaweditor.FileUtils;
import org.badvision.outlaweditor.ImageEditor;
import org.badvision.outlaweditor.Platform;
import org.badvision.outlaweditor.UIAction;
import org.badvision.outlaweditor.ui.UIAction;
import org.badvision.outlaweditor.data.DataObserver;
import org.badvision.outlaweditor.data.TileMap;
import org.badvision.outlaweditor.data.xml.Image;

View File

@ -80,13 +80,14 @@ public class AppleTileEditor extends TileEditor {
}
int lastActionX = -1;
int lastActionY = -1;
public void performDragAction(int x, int y) {
performAction(false, x, y);
}
private void performAction(boolean alt, int x, int y) {
y = Math.min(Math.max(y,0), 15);
x = Math.min(Math.max(x,0), 13);
y = Math.min(Math.max(y, 0), 15);
x = Math.min(Math.max(x, 0), 13);
if (lastActionX == x && lastActionY == y) {
return;
}
@ -108,8 +109,10 @@ public class AppleTileEditor extends TileEditor {
}
break;
case Pencil3px:
for (int xx = x-1; xx <= x+1; xx++) {
if (xx < 0 || xx >= 14) continue;
for (int xx = x - 1; xx <= x + 1; xx++) {
if (xx < 0 || xx >= 14) {
continue;
}
pat = currentPattern.getBytePattern()[y * 4 + (xx / 7)];
set((pat & (1 << (xx % 7))) != 0, xx, y);
if (currentPattern.hiBitMatters) {
@ -168,7 +171,7 @@ public class AppleTileEditor extends TileEditor {
byte[] data = TileUtils.getPlatformData(getEntity(), Platform.AppleII);
data[y * 2 + (x / 7)] ^= 128;
TileUtils.setPlatformData(getEntity(), Platform.AppleII, data);
TileUtils.redrawTile(getEntity());
redraw();
}
public void setHiBit(boolean on, int x, int y) {
@ -179,14 +182,14 @@ public class AppleTileEditor extends TileEditor {
data[y * 2 + (x / 7)] &= 127;
}
TileUtils.setPlatformData(getEntity(), Platform.AppleII, data);
TileUtils.redrawTile(getEntity());
redraw();
}
public void toggle(int x, int y) {
byte[] data = TileUtils.getPlatformData(getEntity(), Platform.AppleII);
data[y * 2 + (x / 7)] ^= (1 << (x % 7));
TileUtils.setPlatformData(getEntity(), Platform.AppleII, data);
TileUtils.redrawTile(getEntity());
redraw();
}
public void set(boolean on, int x, int y) {
@ -196,7 +199,7 @@ public class AppleTileEditor extends TileEditor {
data[y * 2 + (x / 7)] ^= (1 << (x % 7));
}
TileUtils.setPlatformData(getEntity(), Platform.AppleII, data);
TileUtils.redrawTile(getEntity());
redraw();
}
public void recolorGrid(byte[] spriteData, Shape[][] grid, WritableImage img) {
@ -235,4 +238,11 @@ public class AppleTileEditor extends TileEditor {
public void selectNone() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void redraw() {
if (getEntity() != null) {
TileUtils.redrawTile(getEntity());
}
}
}

View File

@ -171,7 +171,7 @@ public class AppleDHGRTileEditor extends TileEditor {
byte[] data = TileUtils.getPlatformData(getEntity(), Platform.AppleII_DHGR);
data[y * 4 + (x / 7)] ^= 128;
TileUtils.setPlatformData(getEntity(), Platform.AppleII_DHGR, data);
TileUtils.redrawTile(getEntity());
redraw();
}
public void setHiBit(boolean on, int x, int y) {
@ -182,14 +182,14 @@ public class AppleDHGRTileEditor extends TileEditor {
data[y * 4 + (x / 7)] &= 127;
}
TileUtils.setPlatformData(getEntity(), Platform.AppleII_DHGR, data);
TileUtils.redrawTile(getEntity());
redraw();
}
public void toggle(int x, int y) {
byte[] data = TileUtils.getPlatformData(getEntity(), Platform.AppleII_DHGR);
data[y * 4 + (x / 7)] ^= (1 << (x % 7));
TileUtils.setPlatformData(getEntity(), Platform.AppleII_DHGR, data);
TileUtils.redrawTile(getEntity());
redraw();
}
public void set(boolean on, int x, int y) {
@ -199,7 +199,7 @@ public class AppleDHGRTileEditor extends TileEditor {
data[y * 4 + (x / 7)] ^= (1 << (x % 7));
}
TileUtils.setPlatformData(getEntity(), Platform.AppleII_DHGR, data);
TileUtils.redrawTile(getEntity());
redraw();
}
public void recolorGrid(byte[] spriteData, Shape[][] grid, WritableImage img) {
@ -245,4 +245,11 @@ public class AppleDHGRTileEditor extends TileEditor {
public void selectNone() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void redraw() {
if (getEntity() != null) {
TileUtils.redrawTile(getEntity());
}
}
}

View File

@ -20,7 +20,7 @@ import javafx.beans.property.adapter.JavaBeanIntegerProperty;
import javafx.beans.property.adapter.JavaBeanIntegerPropertyBuilder;
import javafx.beans.property.adapter.JavaBeanStringProperty;
import javafx.beans.property.adapter.JavaBeanStringPropertyBuilder;
import org.badvision.outlaweditor.ApplicationUIController;
import org.badvision.outlaweditor.ui.ApplicationUIController;
/**
*

View File

@ -10,7 +10,7 @@ import javafx.scene.image.WritableImage;
import javax.swing.JOptionPane;
import javax.xml.bind.JAXBElement;
import org.badvision.outlaweditor.Application;
import org.badvision.outlaweditor.UIAction;
import org.badvision.outlaweditor.ui.UIAction;
import org.badvision.outlaweditor.data.xml.Map;
import org.badvision.outlaweditor.data.xml.Map.Chunk;
import org.badvision.outlaweditor.data.xml.ObjectFactory;

View File

@ -1,4 +1,4 @@
package org.badvision.outlaweditor;
package org.badvision.outlaweditor.ui;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;

View File

@ -0,0 +1,56 @@
package org.badvision.outlaweditor.ui;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.Event;
import javafx.fxml.FXML;
import org.badvision.outlaweditor.Application;
import org.badvision.outlaweditor.Editor;
public abstract class ApplicationUIController {
public static ApplicationUIController getController() {
return Application.getInstance().getController();
}
abstract public void rebuildTileSelectors();
abstract public void rebuildMapSelectors();
abstract public void rebuildImageSelectors();
public abstract Editor getVisibleEditor();
@FXML // ResourceBundle that was given to the FXMLLoader
protected ResourceBundle resources;
@FXML
protected ApplicationMenuController menuController;
@FXML
protected TileEditorTabController tileController;
@FXML
protected MapEditorTabController mapController;
@FXML
protected ImageEditorTabController imageController;
@FXML // URL location of the FXML file that was given to the FXMLLoader
protected URL location;
abstract public void platformChange();
@FXML
abstract public void tileTabActivated(Event event);
@FXML
abstract public void mapTabActivated(Event event);
@FXML
abstract public void imageTabActivated(Event event);
@FXML // This method is called by the FXMLLoader when initialization is complete
public void initialize() {
}
abstract public void completeInflightOperations();
abstract public void clearData();
abstract public void updateSelectors();
abstract public void redrawScripts();
}

View File

@ -1,39 +1,20 @@
package org.badvision.outlaweditor;
package org.badvision.outlaweditor.ui;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Menu;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import org.badvision.outlaweditor.Editor;
import org.badvision.outlaweditor.data.xml.Image;
public abstract class ApplicationUIController {
/**
*
* @author blurry
*/
public abstract class ImageEditorTabController {
public static ApplicationUIController getController() {
return Application.instance.controller;
}
abstract void rebuildTileSelectors();
abstract void rebuildImageSelector();
abstract Editor getVisibleEditor();
@FXML // ResourceBundle that was given to the FXMLLoader
protected ResourceBundle resources;
@FXML
ApplicationMenuController menuController;
@FXML
TileEditorTabController tileController;
@FXML
MapEditorTabController mapController;
@FXML // URL location of the FXML file that was given to the FXMLLoader
protected URL location;
@FXML // fx:id="imageCategoryField"
protected TextField imageCategoryField; // Value injected by FXMLLoader
@FXML // fx:id="imageEditorAnchorPane"
@ -50,6 +31,19 @@ public abstract class ApplicationUIController {
protected TextField imageWidthField; // Value injected by FXMLLoader
// Handler for MenuItem[javafx.scene.control.MenuItem@3a4bc91a] onAction
@FXML
public void initalize() {
assert imageCategoryField != null : "fx:id=\"imageCategoryField\" was not injected: check your FXML file 'ApplicationUI.fxml'.";
assert imageEditorAnchorPane != null : "fx:id=\"imageEditorAnchorPane\" was not injected: check your FXML file 'ApplicationUI.fxml'.";
assert imageHeightField != null : "fx:id=\"imageHeightField\" was not injected: check your FXML file 'ApplicationUI.fxml'.";
assert imageNameField != null : "fx:id=\"imageNameField\" was not injected: check your FXML file 'ApplicationUI.fxml'.";
assert imagePatternMenu != null : "fx:id=\"imagePatternMenu\" was not injected: check your FXML file 'ApplicationUI.fxml'.";
assert imageSelector != null : "fx:id=\"imageSelector\" was not injected: check your FXML file 'ApplicationUI.fxml'.";
assert imageWidthField != null : "fx:id=\"imageWidthField\" was not injected: check your FXML file 'ApplicationUI.fxml'.";
}
abstract public void rebuildImageSelector();
@FXML
abstract public void imageBitMode(ActionEvent event);
@ -101,8 +95,6 @@ public abstract class ApplicationUIController {
@FXML
abstract public void onImageSelected(ActionEvent event);
abstract public void platformChange();
// Handler for Button[Button[id=null, styleClass=button moveButton]] onAction
@FXML
abstract public void scrollImageDown(ActionEvent event);
@ -122,27 +114,5 @@ public abstract class ApplicationUIController {
@FXML
abstract public void imageDraw5BitMode(ActionEvent event);
@FXML
abstract public void tileTabActivated(Event event);
@FXML
abstract public void mapTabActivated(Event event);
@FXML
abstract public void imageTabActivated(Event event);
@FXML // This method is called by the FXMLLoader when initialization is complete
public void initialize() {
assert imageCategoryField != null : "fx:id=\"imageCategoryField\" was not injected: check your FXML file 'ApplicationUI.fxml'.";
assert imageEditorAnchorPane != null : "fx:id=\"imageEditorAnchorPane\" was not injected: check your FXML file 'ApplicationUI.fxml'.";
assert imageHeightField != null : "fx:id=\"imageHeightField\" was not injected: check your FXML file 'ApplicationUI.fxml'.";
assert imageNameField != null : "fx:id=\"imageNameField\" was not injected: check your FXML file 'ApplicationUI.fxml'.";
assert imagePatternMenu != null : "fx:id=\"imagePatternMenu\" was not injected: check your FXML file 'ApplicationUI.fxml'.";
assert imageSelector != null : "fx:id=\"imageSelector\" was not injected: check your FXML file 'ApplicationUI.fxml'.";
assert imageWidthField != null : "fx:id=\"imageWidthField\" was not injected: check your FXML file 'ApplicationUI.fxml'.";
// Initialize your logic here: all @FXML variables will have been injected
}
abstract void completeInflightOperations();
abstract public Editor getCurrentEditor();
}

View File

@ -1,4 +1,4 @@
package org.badvision.outlaweditor;
package org.badvision.outlaweditor.ui;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
@ -8,6 +8,7 @@ import javafx.scene.control.ListView;
import javafx.scene.control.Menu;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import org.badvision.outlaweditor.MapEditor;
import org.badvision.outlaweditor.data.xml.Map;
import org.badvision.outlaweditor.data.xml.Script;
@ -130,5 +131,9 @@ public abstract class MapEditorTabController {
assert mapWrapAround != null : "fx:id=\"mapWrapAround\" was not injected: check your FXML file 'mapEditorTab.fxml'.";
}
abstract void rebuildTileSelectors();
abstract public void rebuildTileSelectors();
public void completeInflightOperations() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}

View File

@ -1,4 +1,4 @@
package org.badvision.outlaweditor;
package org.badvision.outlaweditor.ui;
import java.net.URL;
import java.util.ListResourceBundle;
@ -14,6 +14,7 @@ import javafx.fxml.Initializable;
import javafx.scene.control.MenuItem;
import javafx.scene.web.WebView;
import netscape.javascript.JSObject;
import org.badvision.outlaweditor.MythosEditor;
public class MythosScriptEditorController
implements Initializable {

View File

@ -4,7 +4,7 @@
* and open the template in the editor.
*/
package org.badvision.outlaweditor;
package org.badvision.outlaweditor.ui;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
@ -13,6 +13,7 @@ import javafx.scene.control.ComboBox;
import javafx.scene.control.Menu;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import org.badvision.outlaweditor.TileEditor;
import org.badvision.outlaweditor.data.xml.Tile;
/**

View File

@ -2,7 +2,7 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.badvision.outlaweditor;
package org.badvision.outlaweditor.ui;
import java.io.File;
import java.io.IOException;
@ -28,9 +28,11 @@ import javafx.scene.text.Text;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javax.xml.bind.JAXB;
import org.badvision.outlaweditor.Application;
import org.badvision.outlaweditor.FileUtils;
import org.badvision.outlaweditor.MythosEditor;
import org.badvision.outlaweditor.data.TilesetUtils;
import org.badvision.outlaweditor.data.xml.GameData;
import org.badvision.outlaweditor.data.xml.Map;
import org.badvision.outlaweditor.data.xml.Script;
/**
@ -81,12 +83,10 @@ public class UIAction {
}
currentSaveFile = f;
GameData newData = JAXB.unmarshal(currentSaveFile, GameData.class);
Application.instance.controller.mapController.setCurrentMap(null);
Application.instance.controller.tileController.setCurrentTile(null);
ApplicationUIController.getController().clearData();
TilesetUtils.clear();
Application.gameData = newData;
Application.instance.controller.rebuildTileSelectors();
Application.instance.controller.mapController.rebuildMapSelectors();
ApplicationUIController.getController().updateSelectors();
break;
case Quit:
quit();
@ -201,10 +201,7 @@ public class UIAction {
public static Script createAndEditScript() {
Script script = new Script();
script.setName("New Script");
if (Application.instance.controller.mapController.getCurrentMap().getScripts() == null) {
Application.instance.controller.mapController.getCurrentMap().setScripts(new Map.Scripts());
}
Application.instance.controller.mapController.getCurrentMap().getScripts().getScript().add(script);
ApplicationUIController.getController().getVisibleEditor().addScript(script);
return editScript(script);
}

View File

@ -1,10 +1,15 @@
package org.badvision.outlaweditor;
package org.badvision.outlaweditor.ui.impl;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.event.ActionEvent;
import org.badvision.outlaweditor.Application;
import org.badvision.outlaweditor.Platform;
import org.badvision.outlaweditor.apple.AppleTileRenderer;
import org.badvision.outlaweditor.ui.ApplicationMenuController;
import org.badvision.outlaweditor.ui.ApplicationUIController;
import org.badvision.outlaweditor.ui.UIAction;
/**
*
@ -74,8 +79,8 @@ public class ApplicationMenuControllerImpl extends ApplicationMenuController {
ApplicationUIController mainController = ApplicationUIController.getController();
try {
UIAction.actionPerformed(UIAction.MAIN_ACTIONS.Load);
mainController.rebuildImageSelector();
mainController.mapController.rebuildMapSelectors();
mainController.rebuildImageSelectors();
mainController.rebuildMapSelectors();
mainController.rebuildTileSelectors();
} catch (IOException ex) {
Logger.getLogger(ApplicationUIControllerImpl.class.getName()).log(Level.SEVERE, null, ex);

View File

@ -0,0 +1,182 @@
package org.badvision.outlaweditor.ui.impl;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.event.Event;
import javafx.scene.control.ListCell;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.ComboBoxListCell;
import javafx.scene.input.DataFormat;
import org.badvision.outlaweditor.Application;
import org.badvision.outlaweditor.Editor;
import static org.badvision.outlaweditor.data.PropertyHelper.*;
import org.badvision.outlaweditor.data.TileUtils;
import org.badvision.outlaweditor.data.TilesetUtils;
import org.badvision.outlaweditor.data.xml.Tile;
import org.badvision.outlaweditor.ui.ApplicationUIController;
/**
* Actual implementation of Application UI, isolated from auto-generated code
*
* @author brobert
*/
public class ApplicationUIControllerImpl extends ApplicationUIController {
@Override
public void initialize() {
super.initialize();
TilesetUtils.addObserver(new org.badvision.outlaweditor.data.DataObserver() {
@Override
public void observedObjectChanged(Object object) {
rebuildTileSelectors();
}
});
}
@Override
public void platformChange() {
for (Tile t : Application.gameData.getTile()) {
TileUtils.redrawTile(t);
}
Tile tile = tileController.getCurrentTile();
rebuildTileSelectors();
tileController.setCurrentTile(tile);
rebuildImageSelectors();
redrawAllTabs();
}
public void redrawAllTabs() {
if (mapController.getCurrentEditor() != null) {
mapController.getCurrentEditor().redraw();
}
if (imageController.getCurrentEditor() != null) {
imageController.getCurrentEditor().redraw();
}
}
@Override
public void updateSelectors() {
rebuildImageSelectors();
rebuildMapSelectors();
rebuildTileSelectors();
redrawScripts();
}
@Override
public void rebuildTileSelectors() {
tileController.rebuildTileSelectors();
mapController.rebuildTileSelectors();
}
@Override
public void redrawScripts() {
mapController.redrawMapScripts();
}
@Override
public void rebuildMapSelectors() {
mapController.rebuildMapSelectors();
}
@Override
public void rebuildImageSelectors() {
imageController.rebuildImageSelector();
}
@Override
public void completeInflightOperations() {
mapController.completeInflightOperations();
}
public static enum TABS {
image, map, tile
};
TABS currentTab;
@Override
public void imageTabActivated(Event event) {
currentTab = TABS.image;
}
@Override
public void mapTabActivated(Event event) {
currentTab = TABS.map;
}
@Override
public void tileTabActivated(Event event) {
currentTab = TABS.tile;
}
@Override
public Editor getVisibleEditor() {
switch (currentTab) {
case image:
return imageController.getCurrentEditor();
case map:
return mapController.getCurrentEditor();
case tile:
return tileController.getCurrentTileEditor();
}
return null;
}
public static final DataFormat SCRIPT_DATA_FORMAT = new DataFormat("MythosScript");
abstract public static class EntitySelectorCell<T> extends ComboBoxListCell<T> {
static Map<TextField, Object> lastSelected = new HashMap<>();
TextField nameField;
public EntitySelectorCell(TextField tileNameField) {
super.setPrefWidth(125);
nameField = tileNameField;
}
@Override
public void updateSelected(boolean sel) {
if (sel) {
Object o = lastSelected.get(nameField);
if (o != null && !o.equals(getItem())) {
((ListCell) o).updateSelected(false);
}
textProperty().unbind();
textProperty().bind(nameField.textProperty());
lastSelected.put(nameField, this);
} else {
updateItem(getItem(), false);
}
}
@Override
public void updateItem(T item, boolean empty) {
textProperty().unbind();
super.updateItem(item, empty);
if (item != null && !(item instanceof String)) {
try {
textProperty().bind(stringProp(item, "name"));
} catch (NoSuchMethodException ex) {
Logger.getLogger(ApplicationUIControllerImpl.class.getName()).log(Level.SEVERE, null, ex);
}
finishUpdate(item);
} else {
setText(null);
}
}
public void finishUpdate(T item) {
}
};
@Override
public void clearData() {
tileController.setCurrentTile(null);
mapController.setCurrentMap(null);
tileController.setCurrentTile(null);
}
}

View File

@ -1,46 +1,37 @@
package org.badvision.outlaweditor;
package org.badvision.outlaweditor.ui.impl;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.ComboBoxListCell;
import javafx.scene.input.DataFormat;
import javafx.util.Callback;
import org.badvision.outlaweditor.Application;
import org.badvision.outlaweditor.Editor;
import org.badvision.outlaweditor.ImageEditor;
import static org.badvision.outlaweditor.Application.currentPlatform;
import static org.badvision.outlaweditor.UIAction.*;
import static org.badvision.outlaweditor.data.PropertyHelper.*;
import org.badvision.outlaweditor.data.TileUtils;
import org.badvision.outlaweditor.data.TilesetUtils;
import static org.badvision.outlaweditor.ui.UIAction.confirm;
import static org.badvision.outlaweditor.data.PropertyHelper.bind;
import static org.badvision.outlaweditor.data.PropertyHelper.categoryProp;
import static org.badvision.outlaweditor.data.PropertyHelper.stringProp;
import org.badvision.outlaweditor.data.xml.Image;
import org.badvision.outlaweditor.data.xml.Tile;
import org.badvision.outlaweditor.ui.ImageEditorTabController;
/**
* Actual implementation of Application UI, isolated from auto-generated code
* FXML Controller class
*
* @author brobert
* @author blurry
*/
public class ApplicationUIControllerImpl extends ApplicationUIController {
public class ImageEditorTabControllerImpl extends ImageEditorTabController {
public Image currentImage = null;
public ImageEditor currentImageEditor = null;
@Override
/**
* Initializes the controller class.
*/
public void initialize() {
super.initialize();
TilesetUtils.addObserver(new org.badvision.outlaweditor.data.DataObserver() {
@Override
public void observedObjectChanged(Object object) {
rebuildTileSelectors();
}
});
super.initalize();
imageSelector.setButtonCell(new ComboBoxListCell<Image>() {
{
super.setPrefWidth(125);
@ -60,13 +51,18 @@ public class ApplicationUIControllerImpl extends ApplicationUIController {
imageSelector.setCellFactory(new Callback<ListView<Image>, ListCell<Image>>() {
@Override
public ListCell<Image> call(ListView<Image> param) {
return new EntitySelectorCell<Image>(imageNameField) {
return new ApplicationUIControllerImpl.EntitySelectorCell<Image>(imageNameField) {
@Override
public void finishUpdate(Image item) {
}
};
}
});
}
@Override
public Editor getCurrentEditor() {
return currentImageEditor;
}
@Override
@ -174,20 +170,7 @@ public class ApplicationUIControllerImpl extends ApplicationUIController {
setCurrentImage(imageSelector.getSelectionModel().getSelectedItem());
}
@Override
public void platformChange() {
for (Tile t : Application.gameData.getTile()) {
TileUtils.redrawTile(t);
}
Tile tile = tileController.getCurrentTile();
rebuildTileSelectors();
tileController.setCurrentTile(tile);
if (mapController.getCurrentEditor() != null) {
mapController.getCurrentEditor().redraw();
}
rebuildImageSelector();
}
@Override
public void scrollImageDown(ActionEvent event) {
if (currentImageEditor != null) {
@ -215,13 +198,6 @@ public class ApplicationUIControllerImpl extends ApplicationUIController {
currentImageEditor.scrollBy(0, -1);
}
}
@Override
public void rebuildTileSelectors() {
tileController.rebuildTileSelectors();
mapController.rebuildTileSelectors();
}
private void setCurrentImage(Image i) {
if (currentImage != null && currentImage.equals(i)) {
return;
@ -277,93 +253,4 @@ public class ApplicationUIControllerImpl extends ApplicationUIController {
imageSelector.getItems().addAll(Application.gameData.getImage());
imageSelector.getSelectionModel().select(i);
}
@Override
public void completeInflightOperations() {
if (mapController.getCurrentEditor() != null) {
mapController.getCurrentEditor().currentMap.updateBackingMap();
}
}
public static enum TABS {
image, map, tile
};
TABS currentTab;
@Override
public void imageTabActivated(Event event) {
currentTab = TABS.image;
}
@Override
public void mapTabActivated(Event event) {
currentTab = TABS.map;
}
@Override
public void tileTabActivated(Event event) {
currentTab = TABS.tile;
}
@Override
public Editor getVisibleEditor() {
switch (currentTab) {
case image:
return currentImageEditor;
case map:
return mapController.getCurrentEditor();
case tile:
return tileController.getCurrentTileEditor();
}
return null;
}
public static final DataFormat SCRIPT_DATA_FORMAT = new DataFormat("MythosScript");
abstract public static class EntitySelectorCell<T> extends ComboBoxListCell<T> {
static Map<TextField, Object> lastSelected = new HashMap<>();
TextField nameField;
public EntitySelectorCell(TextField tileNameField) {
super.setPrefWidth(125);
nameField = tileNameField;
}
@Override
public void updateSelected(boolean sel) {
if (sel) {
Object o = lastSelected.get(nameField);
if (o != null && !o.equals(getItem())) {
((ListCell) o).updateSelected(false);
}
textProperty().unbind();
textProperty().bind(nameField.textProperty());
lastSelected.put(nameField, this);
} else {
updateItem(getItem(), false);
}
}
@Override
public void updateItem(T item, boolean empty) {
textProperty().unbind();
super.updateItem(item, empty);
if (item != null && !(item instanceof String)) {
try {
textProperty().bind(stringProp(item, "name"));
} catch (NoSuchMethodException ex) {
Logger.getLogger(ApplicationUIControllerImpl.class.getName()).log(Level.SEVERE, null, ex);
}
finishUpdate(item);
} else {
setText(null);
}
}
public void finishUpdate(T item) {
}
};
}

View File

@ -1,4 +1,4 @@
package org.badvision.outlaweditor;
package org.badvision.outlaweditor.ui.impl;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -11,16 +11,21 @@ import javafx.scene.control.cell.ComboBoxListCell;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.util.Callback;
import org.badvision.outlaweditor.Application;
import org.badvision.outlaweditor.MapEditor;
import org.badvision.outlaweditor.TransferHelper;
import static org.badvision.outlaweditor.Application.currentPlatform;
import static org.badvision.outlaweditor.Application.gameData;
import static org.badvision.outlaweditor.UIAction.confirm;
import static org.badvision.outlaweditor.UIAction.createAndEditScript;
import static org.badvision.outlaweditor.ui.UIAction.confirm;
import static org.badvision.outlaweditor.ui.UIAction.createAndEditScript;
import static org.badvision.outlaweditor.data.PropertyHelper.bind;
import static org.badvision.outlaweditor.data.PropertyHelper.stringProp;
import org.badvision.outlaweditor.data.TileUtils;
import org.badvision.outlaweditor.data.xml.Script;
import org.badvision.outlaweditor.data.xml.Tile;
import org.badvision.outlaweditor.data.xml.Map;
import org.badvision.outlaweditor.ui.MapEditorTabController;
import org.badvision.outlaweditor.ui.UIAction;
/**
*
@ -176,10 +181,16 @@ public class MapEditorTabControllerImpl extends MapEditorTabController {
if (getCurrentEditor() == null) {
return null;
} else {
return getCurrentEditor().currentMap.getBackingMap();
return getCurrentEditor().getCurrentMap().getBackingMap();
}
}
public void completeInflightOperations() {
if (getCurrentEditor() != null) {
getCurrentEditor().getCurrentMap().updateBackingMap();
}
}
@Override
public void setCurrentMap(Map m) {
if (getCurrentMap() != null && getCurrentMap().equals(m)) {
@ -268,7 +279,7 @@ public class MapEditorTabControllerImpl extends MapEditorTabController {
}
@Override
void rebuildTileSelectors() {
public void rebuildTileSelectors() {
mapSelectTile.getItems().clear();
for (final Tile t : Application.gameData.getTile()) {
WritableImage img = TileUtils.getImage(t, currentPlatform);

View File

@ -1,4 +1,4 @@
package org.badvision.outlaweditor;
package org.badvision.outlaweditor.ui.impl;
import java.util.Arrays;
import java.util.logging.Level;
@ -9,7 +9,9 @@ import javafx.scene.control.ListView;
import javafx.scene.control.cell.ComboBoxListCell;
import javafx.scene.image.ImageView;
import javafx.util.Callback;
import static org.badvision.outlaweditor.UIAction.confirm;
import org.badvision.outlaweditor.Application;
import org.badvision.outlaweditor.TileEditor;
import static org.badvision.outlaweditor.ui.UIAction.confirm;
import static org.badvision.outlaweditor.data.PropertyHelper.bind;
import static org.badvision.outlaweditor.data.PropertyHelper.boolProp;
import static org.badvision.outlaweditor.data.PropertyHelper.categoryProp;
@ -18,6 +20,8 @@ import org.badvision.outlaweditor.data.TileUtils;
import org.badvision.outlaweditor.data.TilesetUtils;
import org.badvision.outlaweditor.data.xml.PlatformData;
import org.badvision.outlaweditor.data.xml.Tile;
import org.badvision.outlaweditor.ui.ApplicationUIController;
import org.badvision.outlaweditor.ui.TileEditorTabController;
/**
* FXML Controller class for tile editor tab

View File

@ -6,7 +6,7 @@
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" prefHeight="575.0" prefWidth="1000.0" styleClass="outlawApp" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.badvision.outlaweditor.ApplicationUIControllerImpl">
<AnchorPane id="AnchorPane" prefHeight="575.0" prefWidth="1000.0" styleClass="outlawApp" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.badvision.outlaweditor.ui.impl.ApplicationUIControllerImpl">
<children>
<VBox prefHeight="500.0" prefWidth="800.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
@ -25,74 +25,7 @@
</Tab>
<Tab onSelectionChanged="#imageTabActivated" text="Images">
<content>
<AnchorPane id="tilesTab" minHeight="0.0" minWidth="0.0" prefHeight="420.0" prefWidth="677.0">
<children>
<VBox prefHeight="420.0000999999975" prefWidth="677.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
<ToolBar prefWidth="686.0">
<items>
<Label text="Image:" />
<ComboBox id="tileSelect" fx:id="imageSelector" onAction="#onImageSelected">
<items>
<FXCollections fx:factory="observableArrayList">
<String fx:value="Item 1" />
<String fx:value="Item 2" />
<String fx:value="Item 3" />
</FXCollections>
</items>
</ComboBox>
<Button mnemonicParsing="false" onAction="#onImageCreatePressed" text="Create new" />
<Button mnemonicParsing="false" onAction="#onImageClonePressed" text="Clone" />
<Button mnemonicParsing="false" onAction="#onImageExportPressed" text="Export" />
<Button mnemonicParsing="false" onAction="#onImageDeletePressed" text="Delete" />
<MenuButton mnemonicParsing="false" text="Tools">
<items>
<Menu fx:id="imagePatternMenu" mnemonicParsing="false" text="Pattern" />
<Menu mnemonicParsing="false" text="Draw mode">
<items>
<MenuItem mnemonicParsing="false" onAction="#imageBitMode" text="Bit Toggle mode" />
<MenuItem mnemonicParsing="false" onAction="#imageDraw1BitMode" text="1 bit-wide" />
<MenuItem mnemonicParsing="false" onAction="#imageDraw3BitMode" text="3 bit wide" />
<MenuItem mnemonicParsing="false" onAction="#imageDraw5BitMode" text="5 bit wide" />
<MenuItem mnemonicParsing="false" onAction="#imageDrawFilledRectMode" text="Filled Rectangle" />
</items>
</Menu>
<MenuItem mnemonicParsing="false" onAction="#imageTogglePanZoom" text="Toggle pan/zoom controls" />
<MenuItem mnemonicParsing="false" onAction="#imageShift" text="Shift..." />
</items>
</MenuButton>
</items>
</ToolBar>
<HBox prefHeight="387.0" prefWidth="677.0" VBox.vgrow="ALWAYS">
<children>
<AnchorPane id="imageDetailsPane" prefHeight="200.0" prefWidth="200.0">
<children>
<Label layoutX="4.0" layoutY="14.0" text="Name" />
<TextField id="" fx:id="imageNameField" layoutX="53.0" layoutY="11.0" prefWidth="147.0" />
<Label layoutX="4.0" layoutY="36.0" text="Category" />
<TextField id="tileCategoryField" fx:id="imageCategoryField" layoutX="74.0" layoutY="33.0" prefWidth="126.0" />
<TextField fx:id="imageWidthField" layoutY="55.0" prefWidth="145.0" AnchorPane.leftAnchor="53.0" AnchorPane.rightAnchor="0.0" />
<Label layoutX="4.0" layoutY="58.0" text="Width" />
<TextField id="imageWidthField" fx:id="imageHeightField" layoutX="53.0" layoutY="77.0" prefWidth="147.0" />
<Label layoutX="4.0" layoutY="83.0" text="Height" />
</children>
</AnchorPane>
<AnchorPane id="mapEditorAnchorPane" fx:id="imageEditorAnchorPane" prefHeight="389.0" prefWidth="477.0" HBox.hgrow="ALWAYS">
<children>
<Button layoutX="236.0" mnemonicParsing="false" onAction="#scrollImageUp" styleClass="moveButton" text="Up" AnchorPane.topAnchor="5.0" />
<Button layoutY="185.0" mnemonicParsing="false" onAction="#scrollImageLeft" rotate="270.0" styleClass="moveButton" text="Left" AnchorPane.leftAnchor="-20.0" />
<Button layoutX="236.0" mnemonicParsing="false" onAction="#scrollImageDown" rotate="180.0" styleClass="moveButton" text="Down" AnchorPane.bottomAnchor="5.0" />
<Button layoutY="175.0" mnemonicParsing="false" onAction="#scrollImageRight" rotate="90.0" styleClass="moveButton" text="Right" AnchorPane.rightAnchor="-15.0" />
<Button mnemonicParsing="false" onAction="#imageZoomIn" styleClass="zoomInButton" text="+" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="5.0" />
<Button mnemonicParsing="false" onAction="#imageZoomOut" prefHeight="23.999908447265625" styleClass="zoomOutButton" text="-" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="30.0" />
</children>
</AnchorPane>
</children>
</HBox>
</children>
</VBox>
</children>
</AnchorPane>
<fx:include fx:id="image" source="imageEditorTab.fxml"/>
</content>
</Tab>
</tabs>

View File

@ -6,7 +6,7 @@
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<MenuBar styleClass="menu" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.badvision.outlaweditor.ApplicationMenuControllerImpl">
<MenuBar styleClass="menu" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.badvision.outlaweditor.ui.impl.ApplicationMenuControllerImpl">
<menus>
<Menu mnemonicParsing="false" text="File">
<items>

View File

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="tilesTab" minHeight="0.0" minWidth="0.0" prefHeight="420.0" prefWidth="677.0" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.badvision.outlaweditor.ui.impl.ImageEditorTabControllerImpl">
<children>
<VBox prefHeight="420.0000999999975" prefWidth="677.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
<ToolBar prefWidth="686.0">
<items>
<Label text="Image:" />
<ComboBox id="tileSelect" fx:id="imageSelector" onAction="#onImageSelected"/>
<Button mnemonicParsing="false" onAction="#onImageCreatePressed" text="Create new" />
<Button mnemonicParsing="false" onAction="#onImageClonePressed" text="Clone" />
<Button mnemonicParsing="false" onAction="#onImageExportPressed" text="Export" />
<Button mnemonicParsing="false" onAction="#onImageDeletePressed" text="Delete" />
<MenuButton mnemonicParsing="false" text="Tools">
<items>
<Menu fx:id="imagePatternMenu" mnemonicParsing="false" text="Pattern" />
<Menu mnemonicParsing="false" text="Draw mode">
<items>
<MenuItem mnemonicParsing="false" onAction="#imageBitMode" text="Bit Toggle mode" />
<MenuItem mnemonicParsing="false" onAction="#imageDraw1BitMode" text="1 bit-wide" />
<MenuItem mnemonicParsing="false" onAction="#imageDraw3BitMode" text="3 bit wide" />
<MenuItem mnemonicParsing="false" onAction="#imageDraw5BitMode" text="5 bit wide" />
<MenuItem mnemonicParsing="false" onAction="#imageDrawFilledRectMode" text="Filled Rectangle" />
</items>
</Menu>
<MenuItem mnemonicParsing="false" onAction="#imageTogglePanZoom" text="Toggle pan/zoom controls" />
<MenuItem mnemonicParsing="false" onAction="#imageShift" text="Shift..." />
</items>
</MenuButton>
</items>
</ToolBar>
<HBox prefHeight="387.0" prefWidth="677.0" VBox.vgrow="ALWAYS">
<children>
<AnchorPane id="imageDetailsPane" prefHeight="200.0" prefWidth="200.0">
<children>
<Label layoutX="4.0" layoutY="14.0" text="Name" />
<TextField id="" fx:id="imageNameField" layoutX="53.0" layoutY="11.0" prefWidth="147.0" />
<Label layoutX="4.0" layoutY="36.0" text="Category" />
<TextField id="tileCategoryField" fx:id="imageCategoryField" layoutX="74.0" layoutY="33.0" prefWidth="126.0" />
<TextField fx:id="imageWidthField" layoutY="55.0" prefWidth="145.0" AnchorPane.leftAnchor="53.0" AnchorPane.rightAnchor="0.0" />
<Label layoutX="4.0" layoutY="58.0" text="Width" />
<TextField id="imageWidthField" fx:id="imageHeightField" layoutX="53.0" layoutY="77.0" prefWidth="147.0" />
<Label layoutX="4.0" layoutY="83.0" text="Height" />
</children>
</AnchorPane>
<AnchorPane id="mapEditorAnchorPane" fx:id="imageEditorAnchorPane" prefHeight="389.0" prefWidth="477.0" HBox.hgrow="ALWAYS">
<children>
<Button layoutX="236.0" mnemonicParsing="false" onAction="#scrollImageUp" styleClass="moveButton" text="Up" AnchorPane.topAnchor="5.0" />
<Button layoutY="185.0" mnemonicParsing="false" onAction="#scrollImageLeft" rotate="270.0" styleClass="moveButton" text="Left" AnchorPane.leftAnchor="-20.0" />
<Button layoutX="236.0" mnemonicParsing="false" onAction="#scrollImageDown" rotate="180.0" styleClass="moveButton" text="Down" AnchorPane.bottomAnchor="5.0" />
<Button layoutY="175.0" mnemonicParsing="false" onAction="#scrollImageRight" rotate="90.0" styleClass="moveButton" text="Right" AnchorPane.rightAnchor="-15.0" />
<Button mnemonicParsing="false" onAction="#imageZoomIn" styleClass="zoomInButton" text="+" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="5.0" />
<Button mnemonicParsing="false" onAction="#imageZoomOut" prefHeight="23.999908447265625" styleClass="zoomOutButton" text="-" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="30.0" />
</children>
</AnchorPane>
</children>
</HBox>
</children>
</VBox>
</children>
</AnchorPane>

View File

@ -6,7 +6,7 @@
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="mapsTab" minHeight="0.0" minWidth="0.0" prefHeight="420.0000999999975" prefWidth="677.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.badvision.outlaweditor.MapEditorTabControllerImpl">
<AnchorPane id="mapsTab" minHeight="0.0" minWidth="0.0" prefHeight="420.0000999999975" prefWidth="677.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.badvision.outlaweditor.ui.impl.MapEditorTabControllerImpl">
<children>
<VBox prefHeight="200.0" prefWidth="100.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>

View File

@ -6,7 +6,7 @@
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="tilesTab" minHeight="0.0" minWidth="0.0" prefHeight="420.0000999999975" prefWidth="677.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.badvision.outlaweditor.TileEditorTabControllerImpl">
<AnchorPane id="tilesTab" minHeight="0.0" minWidth="0.0" prefHeight="420.0000999999975" prefWidth="677.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.badvision.outlaweditor.ui.impl.TileEditorTabControllerImpl">
<children>
<VBox prefHeight="420.0000999999975" prefWidth="677.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>