CanvasController.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package holeg.ui.controller;
  2. import holeg.model.*;
  3. import holeg.ui.model.GuiSettings;
  4. import holeg.model.Model;
  5. import holeg.utility.math.vector.Vec2f;
  6. import holeg.utility.math.vector.Vec2i;
  7. import java.util.Collection;
  8. import java.util.HashSet;
  9. import java.util.Set;
  10. import java.util.stream.Collectors;
  11. /**
  12. * Controller for the Canvas.
  13. *
  14. * @author Gruppe14
  15. */
  16. public class CanvasController {
  17. private final Control control;
  18. /**
  19. * Constructor.
  20. *
  21. * @param control the Controller
  22. *
  23. */
  24. public CanvasController(Control control) {
  25. this.control = control;
  26. }
  27. /**
  28. * Add an CpsObject to the model and notify the ObjectListener for update.
  29. *
  30. * @param object CpsObject to be added.
  31. */
  32. public void addObject(GroupNode groupNode, AbstractCanvasObject object) {
  33. groupNode.add(object);
  34. }
  35. /**
  36. * Deletes an CpsObject on the Canvas and its connections.
  37. *
  38. * @param obj AbstractCpsObject
  39. */
  40. public void deleteObject(AbstractCanvasObject obj) {
  41. if(obj instanceof GroupNode groupNode) {
  42. deleteAllObjectsInGroupNode(groupNode);
  43. control.OnRemoveGroupNode.broadcast(groupNode);
  44. }else{
  45. removeAllConnectionsFromObject(obj);
  46. }
  47. obj.getGroupNode().ifPresent(groupNode -> groupNode.remove(obj));
  48. }
  49. public void deleteObjects(Collection<AbstractCanvasObject> objects) {
  50. objects.forEach(this::deleteObject);
  51. }
  52. /**
  53. * Replaces {@code toBeReplaced} by {@code by} on the canvas
  54. *
  55. * @param toBeReplaced the object that will be replaced
  56. * @param by the object that will replace it
  57. */
  58. public void replaceObject(AbstractCanvasObject toBeReplaced, AbstractCanvasObject by) {
  59. //Replace edges
  60. for (Edge edge : control.getModel().getEdgesOnCanvas()) {
  61. if (edge.getA() == toBeReplaced && edge.getB() != by) {
  62. if(control.doesEdgeExist(new Edge(by, edge.getB(), 0))){
  63. continue;
  64. }
  65. edge.setA(by);
  66. } else if (edge.getB() == toBeReplaced && edge.getA() != by) {
  67. if(control.doesEdgeExist(new Edge(edge.getA(), by, 0))){
  68. continue;
  69. }
  70. edge.setB(by);
  71. }
  72. }
  73. // set Position of by to exactly toBeReplaced
  74. by.setPosition(toBeReplaced.getPosition());
  75. deleteObject(toBeReplaced);
  76. }
  77. /**
  78. * Add an edge to the Canvas.
  79. *
  80. * @param edge the edge
  81. */
  82. public void addEdgeOnCanvas(Edge edge) {
  83. control.getModel().getEdgesOnCanvas().add(edge);
  84. }
  85. /**
  86. * Removes an Edge from the Canvas.
  87. *
  88. * @param edge the edge to remove
  89. */
  90. public void removeEdgesOnCanvas(Edge edge) {
  91. control.getModel().getEdgesOnCanvas().remove(edge);
  92. }
  93. /**
  94. * Some cleaning Algorithm which traverses the UpperNode through BFS Can be
  95. * extended with other cleaning stuff No need for coloring since there tree
  96. * is only directed in one direction
  97. */
  98. public void deleteAllObjectsInGroupNode(GroupNode node) {
  99. Set<AbstractCanvasObject> objectsInGroupNode = node.getAllObjectsRecursive().collect(Collectors.toSet());
  100. control.getModel().getEdgesOnCanvas().removeIf(edge -> objectsInGroupNode.contains(edge.getA()) || objectsInGroupNode.contains(edge.getB()));
  101. }
  102. public void removeAllConnectionsFromObject(AbstractCanvasObject obj) {
  103. control.getModel().getEdgesOnCanvas().removeIf(edge -> edge.getA() == obj || edge.getB() == obj);
  104. }
  105. public void group(Set<AbstractCanvasObject> objects) {
  106. if(objects.isEmpty()){
  107. return;
  108. }
  109. final GroupNode groupNode = new GroupNode("GroupNode");
  110. groupNode.setPosition(GroupNode.calculateMiddlePosition(objects));
  111. objects.stream().findFirst().flatMap(AbstractCanvasObject::getGroupNode)
  112. .ifPresent(parentGroupNode -> parentGroupNode.add(groupNode));
  113. objects.forEach(object -> object.getGroupNode().ifPresent(old -> old.remove(object)));
  114. groupNode.addAll(objects);
  115. }
  116. public void ungroup(Set<AbstractCanvasObject> objects) {
  117. for(AbstractCanvasObject obj : objects){
  118. if(obj instanceof GroupNode groupNode){
  119. Vec2i middle = GroupNode.calculateMiddlePosition(groupNode.getObjectsInThisLayer().collect(Collectors.toList()));
  120. groupNode.getObjectsInThisLayer().forEach(child -> {child.setPosition(groupNode.getPosition().subtract(middle).add(child.getPosition()));
  121. child.getPosition().clampX(0, GuiSettings.canvasSize.getX());
  122. child.getPosition().clampY(0, GuiSettings.canvasSize.getY());});
  123. groupNode.ungroup();
  124. control.OnRemoveGroupNode.broadcast(groupNode);
  125. }
  126. }
  127. }
  128. }