diff --git a/res/objecttypes - Copy.xml b/res/objecttypes - Copy.xml new file mode 100644 index 0000000..93b9ada --- /dev/null +++ b/res/objecttypes - Copy.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/events/EntityDrawboxChangedEvent.java b/src/events/EntityDrawboxChangedEvent.java new file mode 100644 index 0000000..3005332 --- /dev/null +++ b/src/events/EntityDrawboxChangedEvent.java @@ -0,0 +1,5 @@ +package events; + +public class EntityDrawboxChangedEvent { + +} diff --git a/src/events/EntityDrawboxChangedListener.java b/src/events/EntityDrawboxChangedListener.java new file mode 100644 index 0000000..6ffbb5b --- /dev/null +++ b/src/events/EntityDrawboxChangedListener.java @@ -0,0 +1,5 @@ +package events; + +public interface EntityDrawboxChangedListener { + +} diff --git a/src/gui/DrawboxEditor.java b/src/gui/DrawboxEditor.java index b4b589c..ba96deb 100644 --- a/src/gui/DrawboxEditor.java +++ b/src/gui/DrawboxEditor.java @@ -4,6 +4,7 @@ import java.awt.Color; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.MouseEvent; +import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -27,8 +28,6 @@ public class DrawboxEditor extends Editable { logger.setLevel(Level.CONFIG); } - - @Override public void drawing(Graphics2D g) { Drawbox drawbox = entity.getDrawbox(); @@ -71,7 +70,9 @@ public class DrawboxEditor extends Editable { } @Override - public void saveDataInEntity() { } + public void saveDataInEntity() { + entity.setDrawbox(new Drawbox(drawboxPoints)); + } @Override @@ -92,6 +93,8 @@ public class DrawboxEditor extends Editable { } basePoints.add(baseStart); basePoints.add(baseEnd); + + saveDataInEntity(); } } } @@ -103,6 +106,9 @@ public class DrawboxEditor extends Editable { repaint(); } + + // эта штука очищает точки при нажатии универскальной кнопки очистки в Main GUI. Это следует рефакторнуть и вместо передачи события сюда, + // обрабатывать его прямо в Main GUI(лямбдой) вызывая отсюда только метод в духе clearPoints() @Override public void actionPerformed(ActionEvent e) { JTabbedPane parent = (JTabbedPane) getParent(); diff --git a/src/gui/Editable.java b/src/gui/Editable.java index ef9f6f2..8f91557 100644 --- a/src/gui/Editable.java +++ b/src/gui/Editable.java @@ -22,7 +22,7 @@ public abstract class Editable extends JPanel implements MouseListener, MouseMot protected ListGUI listGUI; protected Entity entity; - protected String name; + protected String selectedEntityName; protected BufferedImage image; JPanel drawPanel; @@ -51,11 +51,11 @@ public abstract class Editable extends JPanel implements MouseListener, MouseMot //get,set для name public String getName() { - return name; + return selectedEntityName; } public void setName(String name) { - this.name = name; + this.selectedEntityName = name; } //заполнить текущую сущность по имени. @@ -96,13 +96,13 @@ public abstract class Editable extends JPanel implements MouseListener, MouseMot //TODO: надо бы элегантнее пробросить сюда ListGUI - просто передача его в аргументах немножко громоздкая // как-то обыграть это через события? // ps. попытки обратиться к eventSource проваливаются - ListGUI это панель, уже внутри которой лежит JList - name = listGUI.getSelectedName(); + selectedEntityName = listGUI.getSelectedName(); try { - entity = Project.getInstance().getEntityByName(name); + entity = Project.getInstance().getEntityByName(selectedEntityName); } catch (Exception e1) { - logger.severe("Entity with name '"+name+"' was not found! Cannot display it on panel!"); + logger.severe("Entity with name '"+selectedEntityName+"' was not found! Cannot display it on panel!"); } - image = Project.getInstance().loadImageByName(name); + image = Project.getInstance().loadImageByName(selectedEntityName); //TODO: if(image == null) вызов FileChooser'a и выбор изображения this.repaint(); diff --git a/src/gui/MainGUI.java b/src/gui/MainGUI.java index 692362c..b4c256c 100644 --- a/src/gui/MainGUI.java +++ b/src/gui/MainGUI.java @@ -16,6 +16,7 @@ import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import listeners.OpenXMLFileButtonListener; +import repository.Project; public class MainGUI extends JFrame{ ListGUI list; @@ -67,7 +68,7 @@ public class MainGUI extends JFrame{ OpenXMLFileButtonListener = new OpenXMLFileButtonListener(list); openXMLJButton = createButton("XML",5,5, OpenXMLFileButtonListener,"res/xml.png"); - saveXMLJButton = createButton("Save",80,5,null,"res/download.png"); + saveXMLJButton = createButton("Save",80,5,(e)-> Project.getInstance().printXMlToConsole(),"res/download.png"); clearLinesJButton = createButton("Clear lines",155,5,null,"res/destroy.png"); clearLinesJButton.addActionListener(drawBoxPanel); diff --git a/src/launch/Launcher.java b/src/launch/Launcher.java index e0874af..679dd5d 100644 --- a/src/launch/Launcher.java +++ b/src/launch/Launcher.java @@ -13,6 +13,8 @@ import org.xml.sax.SAXException; import gui.MainGUI; public class Launcher { + + private static MainGUI mainGUI; public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException { // Настройка системы логгирования @@ -31,7 +33,12 @@ public class Launcher { rootLogger.info("Root Handler Logging level is "+lv.getName()); MainGUI gui = new MainGUI(); + mainGUI = gui; gui.setVisible(true); } + + public static MainGUI getMainGUI() { + return mainGUI; + } } diff --git a/src/listeners/OpenXMLFileButtonListener.java b/src/listeners/OpenXMLFileButtonListener.java index 2be82bc..604aa22 100644 --- a/src/listeners/OpenXMLFileButtonListener.java +++ b/src/listeners/OpenXMLFileButtonListener.java @@ -2,21 +2,25 @@ package listeners; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.File; + import javax.swing.JFileChooser; import javax.swing.filechooser.FileNameExtensionFilter; import gui.ListGUI; +import launch.Launcher; import repository.Project; public class OpenXMLFileButtonListener extends JFileChooser implements ActionListener { - //public String directory = "C:\\Users\\sivan\\Desktop\\Диплом\\GUI-Collision&Drawing-Metadata-Editor\\res\\"; public String directory = "res/"; public String file = "objecttypes.xml"; ListGUI listGUI; public OpenXMLFileButtonListener(ListGUI listGUI) { + super(Project.getInstance().getXMLPath() + + Project.getInstance().getXMLFileName());// Create file chooser at the current project file directory this.listGUI = listGUI; } @@ -30,11 +34,11 @@ public class OpenXMLFileButtonListener extends JFileChooser implements ActionLis int result = this.showOpenDialog(OpenXMLFileButtonListener.this); if (result == JFileChooser.APPROVE_OPTION ) { - directory = this.getCurrentDirectory().toString()+'/'; + directory = this.getCurrentDirectory().toString()+File.separator; file = this.getName(getSelectedFile()).toString(); Project.getInstance().load(directory, file); listGUI.updateList(); - + //Debug System.out.println(directory + file); } diff --git a/src/model/Entity.java b/src/model/Entity.java index 192b88d..c7fbb0a 100644 --- a/src/model/Entity.java +++ b/src/model/Entity.java @@ -4,8 +4,6 @@ public class Entity { private String thisName; private Drawbox thisDrawbox; private Hitbox thisHitbox; - private Formatter formaterHitbox; - private Formatter formaterDrawbox; private String type; public Entity(String name,String drawbox,String hitbox) { @@ -40,14 +38,6 @@ public class Entity { thisHitbox = outHitbox; }; - public void setFormaterHitbox(Formatter outFormaterHitbox) { - formaterHitbox = outFormaterHitbox; - }; - - public void setFormaterDrawbox(Formatter outFormaterDrawbox) { - formaterDrawbox = outFormaterDrawbox; - }; - public String getName() { return thisName; }; @@ -60,13 +50,6 @@ public class Entity { return thisHitbox; }; - public Formatter getFormaterHitbox() { - return formaterHitbox; - }; - - public Formatter getFormaterDrawbox() { - return formaterDrawbox; - }; public void PrintEntity() { System.out.println("---------------------"); System.out.println("Name: "+thisName); diff --git a/src/model/Formatter.java b/src/model/Formatter.java deleted file mode 100644 index edc4086..0000000 --- a/src/model/Formatter.java +++ /dev/null @@ -1,5 +0,0 @@ -package model; - -public interface Formatter { - -} diff --git a/src/model/FormatterCircle.java b/src/model/FormatterCircle.java deleted file mode 100644 index 6c0553a..0000000 --- a/src/model/FormatterCircle.java +++ /dev/null @@ -1,5 +0,0 @@ -package model; - -public class FormatterCircle implements Formatter { - -} diff --git a/src/model/FormatterRectangle.java b/src/model/FormatterRectangle.java deleted file mode 100644 index ea3854e..0000000 --- a/src/model/FormatterRectangle.java +++ /dev/null @@ -1,5 +0,0 @@ -package model; - -public class FormatterRectangle implements Formatter { - -} diff --git a/src/model/IsometricCoordsConverter.java b/src/model/IsometricCoordsConverter.java new file mode 100644 index 0000000..c7838f0 --- /dev/null +++ b/src/model/IsometricCoordsConverter.java @@ -0,0 +1,25 @@ +package model; + +public class IsometricCoordsConverter { + + /** + * @param result - Point object to store the result + * @return x and y converted to isometic coords + * */ + public static Point cartesianToIsometric(float cartX, float cartY, Point result) { + result.x = cartX - cartY; + result.y = (cartX + cartY) / 2; + return result; + } + + /** + * @param result - Point object to store the result + * @return x and y converted to cartesian coords + * */ + public static Point isometricToCartesian(float x, float y, Point result) { + result.x = (2 * y + x) / 2; + result.y = (2 * y - x) / 2; + return result; + } + +} diff --git a/src/repository/Project.java b/src/repository/Project.java index a025478..f38fed3 100644 --- a/src/repository/Project.java +++ b/src/repository/Project.java @@ -29,14 +29,12 @@ import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import exception.DuplicateEntryException; +import launch.Launcher; import model.Entity; /** * Класс данных, который оперирует их сохранением, загрузкой, и хранением в памяти. - * Он нужен для отделения Модели от Представления (см. MVC), чтобы их можно было менять независимо друг от друга. - * Например, при добавлении новой кнопки данные можно будет получить через существующий интерфейс класса не меняя код. - * * ВАЖНО: данный класс хранит так же актуальную копию XML-представления файла * */ public class Project implements Iterable { @@ -133,6 +131,8 @@ public class Project implements Iterable { factory = DocumentBuilderFactory.newInstance(); builder = factory.newDocumentBuilder(); document = builder.parse(new File(path+fileName)); + if(Launcher.getMainGUI() != null) // at the first program launch, main gui creates list gui before static link to main gui is set + Launcher.getMainGUI().setTitle("Hitbox/Drawbox Editor: " + path + fileName); // Получение списка всех элементов objecttype внутри корневого элемента (getDocumentElement возвращает ROOT элемент XML файла). NodeList objecttypeElements = document.getDocumentElement().getElementsByTagName("objecttype"); for(int i = 0; i < objecttypeElements.getLength(); i++) {