d6b32d77d20613fb44779ed27695ec6cc9948cfb
[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 \r
33                 addZoomedRenderer(gc ->\r
34                 {\r
35                         Rectangle visibleRegion = new Rectangle(offX, offY, gW / zoom, gH / zoom);\r
36                         model.getComponents().forEach(c -> drawComponent(gc, c, visibleRegion));\r
37                 });\r
38                 addZoomedRenderer(gc -> model.getWires().forEach(w -> w.render(gc)));\r
39                 addListener(SWT.MouseDown, this::mouseDown);\r
40         }\r
41 \r
42         private void drawComponent(GeneralGC gc, GUIComponent component, Rectangle visibleRegion)\r
43         {\r
44                 component.render(gc, visibleRegion);\r
45                 gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_CYAN));\r
46                 for (Pin p : component.getPins())\r
47                 {\r
48                         Point pos = p.getPos();\r
49                         gc.fillOval(pos.x - 1, pos.y - 1, 2, 2);\r
50                 }\r
51         }\r
52 \r
53         private void mouseDown(Event e)\r
54         {\r
55                 if (e.button == 1)\r
56                 {\r
57                         Point click = displayToWorldCoords(e.x, e.y);\r
58                         for (GUIComponent component : model.getComponents())\r
59                                 if (component.getBounds().contains(click) && component.clicked(click.x, click.y))\r
60                                 {\r
61                                         redraw();\r
62                                         break;\r
63                                 }\r
64                 }\r
65         }\r
66 }