Improved listener system
[Mograsim.git] / LogicUI / src / era / mi / gui / model / wires / Pin.java
1 package era.mi.gui.model.wires;
2
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.function.Consumer;
6
7 import era.mi.gui.model.components.GUIComponent;
8 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
9 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
10
11 public class Pin
12 {
13         public final GUIComponent component;
14         protected double relX;
15         protected double relY;
16
17         private final List<Consumer<Pin>> pinMovedListeners;
18
19         public Pin(GUIComponent component, double relX, double relY)
20         {
21                 this.component = component;
22                 this.relX = relX;
23                 this.relY = relY;
24
25                 this.pinMovedListeners = new ArrayList<>();
26
27                 component.addComponentMovedListener(c -> callPinMovedListeners());
28         }
29
30         public double getRelX()
31         {
32                 return relX;
33         }
34
35         public double getRelY()
36         {
37                 return relY;
38         }
39
40         public Point getRelPos()
41         {
42                 return new Point(relX, relY);
43         }
44
45         public Point getPos()
46         {
47                 Rectangle componentBounds = component.getBounds();
48                 return new Point(relX + componentBounds.x, relY + componentBounds.y);
49         }
50
51         // @formatter:off
52         public void addPinMovedListener   (Consumer<Pin> listener){pinMovedListeners.add   (listener);}
53
54         public void removePinMovedListener(Consumer<Pin> listener){pinMovedListeners.remove(listener);}
55
56         private void callPinMovedListeners() {pinMovedListeners.forEach(l -> l.accept(this));}
57         // @formatter:on
58
59         protected void setRelPos(double relX, double relY)
60         {
61                 this.relX = relX;
62                 this.relY = relY;
63                 callPinMovedListeners();
64         }
65 }