Improved rendering:
[Mograsim.git] / net.mograsim.logic.ui / src / net / mograsim / logic / ui / model / wires / WireCrossPoint.java
1 package net.mograsim.logic.ui.model.wires;
2
3 import net.haspamelodica.swt.helper.gcs.GeneralGC;
4 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
5 import net.mograsim.logic.core.LogicObservable;
6 import net.mograsim.logic.core.LogicObserver;
7 import net.mograsim.logic.core.types.BitVectorFormatter;
8 import net.mograsim.logic.core.wires.Wire.ReadEnd;
9 import net.mograsim.logic.ui.ColorHelper;
10 import net.mograsim.logic.ui.model.ViewModel;
11 import net.mograsim.logic.ui.model.components.GUIComponent;
12
13 public class WireCrossPoint extends GUIComponent
14 {
15         private final Pin pin;
16         private final int logicWidth;
17
18         private final LogicObserver logicObs;
19         private ReadEnd end;
20
21         public WireCrossPoint(ViewModel model, int logicWidth)
22         {
23                 super(model);
24                 logicObs = (i) -> requestRedraw();
25
26                 this.logicWidth = logicWidth;
27                 setSize(0, 0);
28                 addPin(this.pin = new Pin(this, logicWidth, 0, 0));
29         }
30
31         @Override
32         public void render(GeneralGC gc, Rectangle visibleRegion)
33         {
34                 Rectangle bounds = getBounds();
35                 ColorHelper.executeWithDifferentBackground(gc, BitVectorFormatter.formatAsColor(end),
36                                 () -> gc.fillOval(bounds.x - 1, bounds.y - 1, 2, 2));
37         }
38
39         public void setLogicModelBinding(ReadEnd end)
40         {
41                 deregisterLogicObs(this.end);
42                 this.end = end;
43                 registerLogicObs(end);
44         }
45
46         private void registerLogicObs(LogicObservable observable)
47         {
48                 if (observable != null)
49                         observable.registerObserver(logicObs);
50         }
51
52         private void deregisterLogicObs(LogicObservable observable)
53         {
54                 if (observable != null)
55                         observable.deregisterObserver(logicObs);
56         }
57
58         public int getLogicWidth()
59         {
60                 return logicWidth;
61         }
62
63         public Pin getPin()
64         {
65                 return pin;
66         }
67 }