CanvasController.java 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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.Vec2i;
  6. import java.util.Collection;
  7. import java.util.HashSet;
  8. import java.util.Set;
  9. import java.util.stream.Collectors;
  10. /**
  11. * Controller for the Canvas.
  12. *
  13. * @author Gruppe14
  14. */
  15. public class CanvasController {
  16. private final Control control;
  17. /**
  18. * Constructor.
  19. *
  20. * @param control the Controller
  21. *
  22. */
  23. public CanvasController(Control control) {
  24. this.control = control;
  25. }
  26. /**
  27. * Add an CpsObject to the model and notify the ObjectListener for update.
  28. *
  29. * @param object CpsObject to be added.
  30. */
  31. public void addObject(GroupNode groupNode, AbstractCanvasObject object) {
  32. groupNode.add(object);
  33. }
  34. /**
  35. * Deletes an CpsObject on the Canvas and its connections.
  36. *
  37. * @param obj AbstractCpsObject
  38. */
  39. public void deleteObject(AbstractCanvasObject obj) {
  40. if(obj instanceof GroupNode groupNode) {
  41. deleteAllObjectsInGroupNode(groupNode);
  42. }else{
  43. removeAllConnectionsFromObject(obj);
  44. }
  45. obj.getGroupNode().ifPresent(groupNode -> groupNode.remove(obj));
  46. }
  47. public void deleteObjects(Collection<AbstractCanvasObject> objects) {
  48. objects.forEach(this::deleteObject);
  49. }
  50. /**
  51. * Replaces {@code toBeReplaced} by {@code by} on the canvas
  52. *
  53. * @param toBeReplaced the object that will be replaced
  54. * @param by the object that will replace it
  55. */
  56. public void replaceObject(AbstractCanvasObject toBeReplaced, AbstractCanvasObject by) {
  57. //Replace edges
  58. for (Edge edge : control.getModel().getEdgesOnCanvas()) {
  59. if (edge.getA() == toBeReplaced && edge.getB() != by) {
  60. edge.setA(by);
  61. } else if (edge.getB() == toBeReplaced && edge.getA() != by) {
  62. edge.setB(by);
  63. }
  64. }
  65. // set Position of by to exactly toBeReplaced
  66. by.setPosition(toBeReplaced.getPosition());
  67. deleteObject(toBeReplaced);
  68. }
  69. /**
  70. * Add an edge to the Canvas.
  71. *
  72. * @param edge the edge
  73. */
  74. public void addEdgeOnCanvas(Edge edge) {
  75. control.getModel().getEdgesOnCanvas().add(edge);
  76. }
  77. /**
  78. * Removes an Edge from the Canvas.
  79. *
  80. * @param edge the edge to remove
  81. */
  82. public void removeEdgesOnCanvas(Edge edge) {
  83. control.getModel().getEdgesOnCanvas().remove(edge);
  84. }
  85. /**
  86. * Paste all Selected Objects.
  87. */
  88. public void pasteObjects(Vec2i p) {
  89. //TODO(Tom2022-01-27): paste
  90. GuiSettings.getSelectedObjects().clear();
  91. }
  92. /**
  93. * Cut all Selected Objects.
  94. */
  95. public void cutObjects() {
  96. GuiSettings.setClipboardObjects(new HashSet<>(GuiSettings.getSelectedObjects()));
  97. for (AbstractCanvasObject cps : GuiSettings.getClipboardObjects()) {
  98. deleteObject(cps);
  99. }
  100. GuiSettings.getSelectedObjects().clear();
  101. }
  102. /**
  103. * Some cleaning Algorithm which traverses the UpperNode through BFS Can be
  104. * extended with other cleaning stuff No need for coloring since there tree
  105. * is only directed in one direction
  106. */
  107. public void deleteAllObjectsInGroupNode(GroupNode node) {
  108. Set<AbstractCanvasObject> objectsInGroupNode = node.getAllObjectsRecursive().collect(Collectors.toSet());
  109. control.getModel().getEdgesOnCanvas().removeIf(edge -> objectsInGroupNode.contains(edge.getA()) || objectsInGroupNode.contains(edge.getB()));
  110. }
  111. public void removeAllConnectionsFromObject(AbstractCanvasObject obj) {
  112. control.getModel().getEdgesOnCanvas().removeIf(edge -> edge.getA() == obj || edge.getB() == obj);
  113. }
  114. public void addGroupNode(GroupNode groupNode, Set<AbstractCanvasObject> toGroup) {
  115. //TODO(Tom2022-01-27):
  116. }
  117. }