41dde7d9a3f2116a2e48128c24921e0293deaaba
[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.graphics.Color;
5 import org.eclipse.swt.widgets.Composite;
6 import org.eclipse.swt.widgets.Event;
7
8 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
9 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
10 import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas;
11 import net.mograsim.logic.ui.model.ViewModel;
12 import net.mograsim.logic.ui.model.components.GUIComponent;
13 import net.mograsim.preferences.Preferences;
14
15 /**
16  * Simulation visualizer canvas.
17  * 
18  * @author Daniel Kirschten
19  */
20 public class LogicUICanvas extends ZoomableCanvas
21 {
22         private final ViewModel model;
23
24         public LogicUICanvas(Composite parent, int style, ViewModel model)
25         {
26                 super(parent, style);
27
28                 this.model = model;
29
30                 LogicUIRenderer renderer = new LogicUIRenderer(model);
31                 addZoomedRenderer(gc ->
32                 {
33                         Color background = Preferences.current().getColor("net.mograsim.logic.ui.color.background");
34                         if (background != null)
35                                 setBackground(background);// this.setBackground, not gc.setBackground to have the background fill the canvas
36                         renderer.render(gc, new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom));
37                 });
38                 model.addRedrawListener(this::redrawThreadsafe);
39
40                 addListener(SWT.MouseDown, this::mouseDown);
41         }
42
43         private void mouseDown(Event e)
44         {
45                 if (e.button == 1)
46                 {
47                         Point click = displayToWorldCoords(e.x, e.y);
48                         for (GUIComponent component : model.getComponents())
49                                 if (component.getBounds().contains(click) && component.clicked(click.x, click.y))
50                                 {
51                                         redraw();
52                                         break;
53                                 }
54                 }
55         }
56 }