diff --git a/src/events/EntityDrawboxChangedEvent.java b/src/events/EntityDrawboxChangedEvent.java index 3005332..38da3d9 100644 --- a/src/events/EntityDrawboxChangedEvent.java +++ b/src/events/EntityDrawboxChangedEvent.java @@ -1,5 +1,11 @@ package events; -public class EntityDrawboxChangedEvent { +import model.Drawbox; +public class EntityDrawboxChangedEvent { + Drawbox drawbox; + public EntityDrawboxChangedEvent(Drawbox drawbox) { + // TODO Auto-generated constructor stub + this.drawbox = drawbox; + } } diff --git a/src/events/EntityDrawboxChangedListener.java b/src/events/EntityDrawboxChangedListener.java index 6ffbb5b..5e6b90b 100644 --- a/src/events/EntityDrawboxChangedListener.java +++ b/src/events/EntityDrawboxChangedListener.java @@ -1,5 +1,7 @@ package events; public interface EntityDrawboxChangedListener { - + + void getEvent(EntityDrawboxChangedEvent event); + } diff --git a/src/gui/DrawboxEditor.java b/src/gui/DrawboxEditor.java index ba96deb..3e77358 100644 --- a/src/gui/DrawboxEditor.java +++ b/src/gui/DrawboxEditor.java @@ -4,27 +4,33 @@ import java.awt.Color; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.Flow.Subscriber; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JTabbedPane; +import events.EntityDrawboxChangedEvent; +import events.EntityDrawboxChangedListener; import model.Drawbox; import model.Point; +import repository.Project; public class DrawboxEditor extends Editable { private List drawboxPoints; private List basePoints; Logger logger = Logger.getLogger("gui.DrawboxRectangleEditor"); - Point currentPoint = new Point(0, 0); + private List listeners = new ArrayList<>(); + DrawboxEditor(ListGUI listGUI) { super(listGUI); - logger.setLevel(Level.CONFIG); } @@ -95,17 +101,56 @@ public class DrawboxEditor extends Editable { basePoints.add(baseEnd); saveDataInEntity(); + //при выборе 4-й точки и формировании данных drawbox, уведомляем всех подписчит + if(listeners!=null) { + notifySubscribers(); + } + } } } - + /*Точки должны идти в определенном порядке: + * левая верхняя точка, правая верхняя, нижняя правая, нижняя левая; + * Обе нижние точки, т.е. 3 и 4 являются основанием - хардкод. + * P.s. возможно это не критично, и в сторе предусмотрено, что бы они сортировались, + * но на данном этапе на всякий случай стоит так поступить*/ + private void sortingDrawboxPoints() { + //окей, это написано плохо, но... Похуй, пляшем) + for(int i = 0; i<3; i++) { + Point leftTopPoint = drawboxPoints.get(i); + for(int j = i+1; j<4; j++) { + if((leftTopPoint.x>drawboxPoints.get(j).x)&&(leftTopPoint.y>drawboxPoints.get(j).y)) { + Collections.swap(drawboxPoints, 0, j); + + } + + } + } + + + } + @Override public void mouseMoved(MouseEvent e) { currentPoint.x = e.getX(); currentPoint.y = e.getY(); repaint(); } - + + + public void subscribe(EntityDrawboxChangedListener listener) { + listeners.add(listener); + } + + public void unsubscribe(EntityDrawboxChangedListener listener) { + listeners.remove(listener); + } + + private void notifySubscribers() { + for (EntityDrawboxChangedListener listener : listeners) { + listener.getEvent(new EntityDrawboxChangedEvent(entity.getDrawbox())); + } + } // эта штука очищает точки при нажатии универскальной кнопки очистки в Main GUI. Это следует рефакторнуть и вместо передачи события сюда, // обрабатывать его прямо в Main GUI(лямбдой) вызывая отсюда только метод в духе clearPoints() diff --git a/src/gui/MainGUI.java b/src/gui/MainGUI.java index b4c256c..b71aedb 100644 --- a/src/gui/MainGUI.java +++ b/src/gui/MainGUI.java @@ -87,6 +87,9 @@ public class MainGUI extends JFrame{ hitdrawPane.addTab(null, new ImageIcon("res/formless.png"),hitboxPoligonPanel, null); hitdrawPane.setTabPlacement(JTabbedPane.LEFT); + //Оформление подписок к издателям. + drawBoxPanel.subscribe(Project.getInstance()); // подписка: Project получит данные ввиде обьекта Event, содержащий аднные drawbox при отрисовке последней точки из 4-х. + } @Override public void paint(Graphics g){ diff --git a/src/model/Drawbox.java b/src/model/Drawbox.java index f7a699c..3fd6474 100644 --- a/src/model/Drawbox.java +++ b/src/model/Drawbox.java @@ -44,6 +44,15 @@ public class Drawbox { } } } + //Возвращает все точки дравбокса через пробел. + @Override + public String toString() { + String stringDrawbox=""; + for (Point point : drawboxlistPoints) { + stringDrawbox+=point.x+" "+point.y+" "; + } + return stringDrawbox; + } public List getDrawboxlistPoints() { return drawboxlistPoints; diff --git a/src/repository/Project.java b/src/repository/Project.java index f38fed3..cc46d9e 100644 --- a/src/repository/Project.java +++ b/src/repository/Project.java @@ -28,6 +28,8 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; +import events.EntityDrawboxChangedEvent; +import events.EntityDrawboxChangedListener; import exception.DuplicateEntryException; import launch.Launcher; import model.Entity; @@ -37,7 +39,7 @@ import model.Entity; * Класс данных, который оперирует их сохранением, загрузкой, и хранением в памяти. * ВАЖНО: данный класс хранит так же актуальную копию XML-представления файла * */ -public class Project implements Iterable { +public class Project implements Iterable, EntityDrawboxChangedListener { /** * Путь к XML по-умолчанию. @@ -331,6 +333,12 @@ public class Project implements Iterable { public List getListEntity() { return listEntity; } + + @Override + public void getEvent(EntityDrawboxChangedEvent event) { + // TODO Auto-generated method stub + + } } //в момент окончания рисования, в зависимости в какой мы рисуем вкладке хитбокса, //в зависимости от того в какой панельке(jpanel)и подклассе интерфейса Editable