2465e4699e33f4d9949ac37cf3260c5f099fe3ca
[Mograsim.git] / net.mograsim.logic.ui / src / net / mograsim / logic / ui / LogicUICanvas.java
1 package net.mograsim.logic.ui;
2
3 import org.eclipse.swt.SWT;
4 import org.eclipse.swt.widgets.Composite;
5 import org.eclipse.swt.widgets.Event;
6
7 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
8 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
9 import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas;
10 import net.mograsim.logic.ui.model.ViewModel;
11 import net.mograsim.logic.ui.model.components.GUIComponent;
12
13 /**
14  * Simulation visualizer canvas.
15  * 
16  * @author Daniel Kirschten
17  */
18 public class LogicUICanvas extends ZoomableCanvas
19 {
20         private final ViewModel model;
21
22         public LogicUICanvas(Composite parent, int style, ViewModel model)
23         {
24                 super(parent, style);
25
26                 this.model = model;
27
28                 LogicUIRenderer renderer = new LogicUIRenderer(model);
29                 addZoomedRenderer(gc -> renderer.render(gc, new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom)));
30                 model.addRedrawListener(this::redrawThreadsafe);
31
32                 addListener(SWT.MouseDown, this::mouseDown);
33         }
34
35         private void mouseDown(Event e)
36         {
37                 if (e.button == 1)
38                 {
39                         Point click = displayToWorldCoords(e.x, e.y);
40                         for (GUIComponent component : model.getComponents())
41                                 if (component.getBounds().contains(click) && component.clicked(click.x, click.y))
42                                 {
43                                         redraw();
44                                         break;
45                                 }
46                 }
47         }
48 }