Project get event modification drawbox.Preparation for new drawing for drawbox

This commit is contained in:
2024-09-12 05:43:17 +03:00
parent 2fab9b13d9
commit 7f7937c652
6 changed files with 80 additions and 7 deletions

View File

@ -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;
}
}

View File

@ -1,5 +1,7 @@
package events;
public interface EntityDrawboxChangedListener {
void getEvent(EntityDrawboxChangedEvent event);
}

View File

@ -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<Point> drawboxPoints;
private List<Point> basePoints;
Logger logger = Logger.getLogger("gui.DrawboxRectangleEditor");
Point currentPoint = new Point(0, 0);
private List<EntityDrawboxChangedListener> 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()

View File

@ -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){

View File

@ -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<Point> getDrawboxlistPoints() {
return drawboxlistPoints;

View File

@ -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<Entity> {
public class Project implements Iterable<Entity>, EntityDrawboxChangedListener {
/**
* Путь к XML по-умолчанию.
@ -331,6 +333,12 @@ public class Project implements Iterable<Entity> {
public List<Entity> getListEntity() {
return listEntity;
}
@Override
public void getEvent(EntityDrawboxChangedEvent event) {
// TODO Auto-generated method stub
}
}
//в момент окончания рисования, в зависимости в какой мы рисуем вкладке хитбокса,
//в зависимости от того в какой панельке(jpanel)и подклассе интерфейса Editable