Added destroy for GUIComponent and GUIWire
[Mograsim.git] / LogicUI / src / era / mi / gui / LogicUICanvas.java
1 package era.mi.gui;\r
2 \r
3 import org.eclipse.swt.SWT;\r
4 import org.eclipse.swt.widgets.Composite;\r
5 import org.eclipse.swt.widgets.Event;\r
6 \r
7 import era.mi.gui.model.ViewModel;\r
8 import era.mi.gui.model.components.GUIComponent;\r
9 import era.mi.gui.model.wires.Pin;\r
10 import net.haspamelodica.swt.helper.gcs.GeneralGC;\r
11 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;\r
12 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;\r
13 import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas;\r
14 \r
15 /**\r
16  * Simulation visualizer canvas.\r
17  * \r
18  * @author Daniel Kirschten\r
19  */\r
20 public class LogicUICanvas extends ZoomableCanvas\r
21 {\r
22         private final ViewModel model;\r
23 \r
24         public LogicUICanvas(Composite parent, int style, ViewModel model)\r
25         {\r
26                 super(parent, style);\r
27 \r
28                 this.model = model;\r
29 \r
30                 model.addComponentAddedListener(c -> redrawThreadsafe());\r
31                 model.addWireAddedListener(c -> redrawThreadsafe());\r
32                 model.addComponentRemovedListener(c -> redrawThreadsafe());\r
33                 model.addWireRemovedListener(c -> redrawThreadsafe());\r
34 \r
35                 addZoomedRenderer(gc ->\r
36                 {\r
37                         Rectangle visibleRegion = new Rectangle(offX, offY, gW / zoom, gH / zoom);\r
38                         model.getComponents().forEach(c -> drawComponent(gc, c, visibleRegion));\r
39                 });\r
40                 addZoomedRenderer(gc -> model.getWires().forEach(w -> w.render(gc)));\r
41                 addListener(SWT.MouseDown, this::mouseDown);\r
42         }\r
43 \r
44         private void drawComponent(GeneralGC gc, GUIComponent component, Rectangle visibleRegion)\r
45         {\r
46                 component.render(gc, visibleRegion);\r
47                 gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_CYAN));\r
48                 for (Pin p : component.getPins())\r
49                 {\r
50                         Point pos = p.getPos();\r
51                         gc.fillOval(pos.x - 1, pos.y - 1, 2, 2);\r
52                 }\r
53         }\r
54 \r
55         private void mouseDown(Event e)\r
56         {\r
57                 if (e.button == 1)\r
58                 {\r
59                         Point click = displayToWorldCoords(e.x, e.y);\r
60                         for (GUIComponent component : model.getComponents())\r
61                                 if (component.getBounds().contains(click) && component.clicked(click.x, click.y))\r
62                                 {\r
63                                         redraw();\r
64                                         break;\r
65                                 }\r
66                 }\r
67         }\r
68 }