From 7aa114efb15029cc1babfbf51f6954ee3ca4ddf7 Mon Sep 17 00:00:00 2001 From: iobyte Date: Sat, 12 Nov 2022 17:21:54 +0000 Subject: [PATCH] trackeditor: update object map data table when object map file changes --- .../gui/properties/TerrainProperties.java | 186 ++++++++++++++---- .../utils/circuit/ObjShapeObject.java | 2 + 2 files changed, 155 insertions(+), 33 deletions(-) diff --git a/src/tools/trackeditor/gui/properties/TerrainProperties.java b/src/tools/trackeditor/gui/properties/TerrainProperties.java index 9c2214a6f..2dafc12fc 100644 --- a/src/tools/trackeditor/gui/properties/TerrainProperties.java +++ b/src/tools/trackeditor/gui/properties/TerrainProperties.java @@ -23,6 +23,7 @@ package gui.properties; import java.awt.Color; import java.awt.Component; import java.awt.GridLayout; +import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Arrays; @@ -31,6 +32,7 @@ import java.util.Iterator; import java.util.Set; import java.util.Vector; +import javax.imageio.ImageIO; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JComboBox; @@ -530,6 +532,29 @@ public class TerrainProperties extends PropertyPanel private JButton objectMapButton = null; private ObjectTablePanel objectTablePanel = null; + public class Data + { + String name; + Integer color; + Integer x; + Integer y; + + Data(String name, Integer color, Integer x, Integer y) + { + this.name = name; + this.color = color; + this.x = x; + this.y = y; + } + } + + private Vector data = new Vector(); + + public Vector getData() + { + return data; + } + /** * */ @@ -598,15 +623,72 @@ public class TerrainProperties extends PropertyPanel UIManager.put("FileChooser.readOnly", old); if (result == JFileChooser.APPROVE_OPTION) { - String fileName = fc.getSelectedFile().toString(); - int index = fileName.lastIndexOf(sep); - String pathToFile = fileName.substring(0, index); + String selectedFile = fc.getSelectedFile().toString(); + String fileName = selectedFile; + int index = selectedFile.lastIndexOf(sep); + String pathToFile = selectedFile.substring(0, index); if (pathToFile.equals(Editor.getProperties().getPath())) - fileName = fileName.substring(index + 1); + fileName = selectedFile.substring(index + 1); objectMapTextField.setText(fileName); + + // update table with new data + try + { + getDataFromImage(selectedFile); + objectTablePanel.dataChanged(); + } + catch (IOException e) + { + } } } + public void getDataFromImage(String fileName) throws IOException + { + data.clear(); + + File file = new File(fileName); + + if (file.exists()) + { + BufferedImage image = ImageIO.read(file); + int imageWidth = image.getWidth(); + int imageHeight = image.getHeight(); + + for (int x = 0; x < imageWidth; x++) + { + for (int y = 0; y < imageHeight; y++) + { + int rgb = image.getRGB(x, y) & 0x00ffffff; + + if (rgb != 0x0) + { + String name = getEditorFrame().getObjectColorName(rgb); + + if (name == null) + { + name = new String("Unknown"); + } + + data.add(new Data(name, rgb, x, y)); + } + } + } + } + } + + public void getDataFromObjectMap(ObjectMap objectMap) + { + data.clear(); + + for (int i = 0; i < objectMap.getObjects().size(); i++) + { + ObjShapeObject object = objectMap.getObjects().get(i); + + data.add(new Data(new String(object.getName()), object.getRGB(), object.getImageX(), object.getImageY())); + } + } + private ObjectTablePanel getObjectTablePanel(ObjectMap objectMap) { if (objectTablePanel == null) @@ -656,33 +738,11 @@ public class TerrainProperties extends PropertyPanel { Integer.class, String.class, Integer.class, Integer.class, Integer.class }; - class Data - { - String name; - Integer color; - Integer x; - Integer y; - Data(String name, Integer color, Integer x, Integer y) - { - this.name = name; - this.color = color; - this.x = x; - this.y = y; - } - } - - private Vector data = new Vector(); - - ObjectTableModel(ObjectMap objectMap) + ObjectTableModel(ObjectMap objectMap) { - for (int i = 0; i < objectMap.getObjects().size(); i++) - { - ObjShapeObject object = objectMap.getObjects().get(i); - - data.add(new Data(new String(object.getName()), object.getRGB(), object.getImageX(), object.getImageY())); - } - } + getDataFromObjectMap(objectMap); + } public int getRowCount() { @@ -724,7 +784,7 @@ public class TerrainProperties extends PropertyPanel case 0: return rowIndex + 1; case 1: - return getEditorFrame().getObjectColorName(datum.color); + return datum.name; case 2: return String.format("0x%06X", datum.color); case 3: @@ -780,12 +840,17 @@ public class TerrainProperties extends PropertyPanel class ObjectTablePanel extends JPanel { - public ObjectTablePanel(ObjectMap objectMap) + JTable table = null; + JScrollPane scrollPane = null; + ObjectTableModel model = null; + + public ObjectTablePanel(ObjectMap objectMap) { super(new GridLayout(1,0)); - JTable table = new JTable(new ObjectTableModel(objectMap)); - JScrollPane scrollPane = new JScrollPane(table); + model = new ObjectTableModel(objectMap); + table = new JTable(model); + scrollPane = new JScrollPane(table); table.getColumnModel().getColumn(0).setPreferredWidth(25); table.setDefaultRenderer(Integer.class, new ColorRenderer()); @@ -795,6 +860,11 @@ public class TerrainProperties extends PropertyPanel add(scrollPane); } + + void dataChanged() + { + model.fireTableDataChanged(); + } } } @@ -924,6 +994,56 @@ public class TerrainProperties extends PropertyPanel } getEditorFrame().documentIsModified = true; } + + Vector data = panel.getData(); + Vector objects = objectMap.getObjects(); + int minDataCount = Math.min(data.size(), objects.size()); + + if (data.size() != objects.size()) + { + getEditorFrame().documentIsModified = true; + } + for (int j = 0; j < minDataCount; j++) + { + ObjectMapPanel.Data datum = data.get(j); + ObjShapeObject object = objects.get(j); + + if (!datum.color.equals(object.getRGB())) + { + object.setRGB(datum.color); + getEditorFrame().documentIsModified = true; + } + + if (!datum.x.equals(object.getImageX())) + { + object.setImageX(datum.x); + getEditorFrame().documentIsModified = true; + } + + if (!datum.y.equals(object.getImageY())) + { + object.setImageY(datum.y); + getEditorFrame().documentIsModified = true; + } + } + if (data.size() < objects.size()) + { + // need to trim objects + while (objects.size() > data.size()) + { + objects.remove(objects.size() - 1); + } + } + else if (objects.size() < data.size()) + { + // need to add to objects + while (objects.size() < data.size()) + { + ObjectMapPanel.Data datum = data.get(objects.size()); + + objects.add(new ObjShapeObject(datum.color, datum.x, datum.y)); + } + } } if (objectMaps.size() > tabbedPane.getTabCount()) { diff --git a/src/tools/trackeditor/utils/circuit/ObjShapeObject.java b/src/tools/trackeditor/utils/circuit/ObjShapeObject.java index 06155f26f..217f275e0 100644 --- a/src/tools/trackeditor/utils/circuit/ObjShapeObject.java +++ b/src/tools/trackeditor/utils/circuit/ObjShapeObject.java @@ -35,6 +35,7 @@ public class ObjShapeObject extends Segment public void setRGB(int rgb) { this.rgb = rgb; + this.color = new Color((rgb >> 16) & 0xff, (rgb >> 8) & 0xff, rgb & 0xff); } public Color getColor() { @@ -43,6 +44,7 @@ public class ObjShapeObject extends Segment public void setColor(Color color) { this.color = color; + this.rgb = color.getRGB(); } public int getImageX() {