package net.mograsim.logic.ui.model.wires;
-import net.mograsim.logic.ui.ColorHelper;
-import net.mograsim.logic.ui.model.ViewModel;
-import net.mograsim.logic.ui.model.components.GUIComponent;
import net.haspamelodica.swt.helper.gcs.GeneralGC;
import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+import net.mograsim.logic.core.LogicObservable;
+import net.mograsim.logic.core.LogicObserver;
import net.mograsim.logic.core.types.BitVectorFormatter;
import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.ui.ColorHelper;
+import net.mograsim.logic.ui.model.ViewModelModifiable;
+import net.mograsim.logic.ui.model.components.GUIComponent;
public class WireCrossPoint extends GUIComponent
{
+ private static final int CIRCLE_RADIUS = 1;
+ private static final int CIRCLE_DIAM = CIRCLE_RADIUS * 2;
+
private final Pin pin;
+ private final int logicWidth;
+ private final LogicObserver logicObs;
private ReadEnd end;
- private final int logicWidth;
- public WireCrossPoint(ViewModel model, int logicWidth)
+ public WireCrossPoint(ViewModelModifiable model, int logicWidth)
{
super(model);
+ logicObs = (i) -> requestRedraw();
+
this.logicWidth = logicWidth;
- setSize(0, 0);
- addPin(this.pin = new Pin(this, logicWidth, 0, 0));
+ setSize(CIRCLE_DIAM, CIRCLE_DIAM);
+ addPin(this.pin = new Pin(this, logicWidth, CIRCLE_RADIUS, CIRCLE_RADIUS));
+ }
+
+ public void moveCenterTo(double x, double y)
+ {
+ moveTo(x - CIRCLE_RADIUS, y - CIRCLE_RADIUS);
}
@Override
{
Rectangle bounds = getBounds();
ColorHelper.executeWithDifferentBackground(gc, BitVectorFormatter.formatAsColor(end),
- () -> gc.fillOval(bounds.x - 1, bounds.y - 1, 2, 2));
+ () -> gc.fillOval(bounds.x, bounds.y, CIRCLE_DIAM, CIRCLE_DIAM));
}
public void setLogicModelBinding(ReadEnd end)
{
+ deregisterLogicObs(this.end);
this.end = end;
- end.addObserver((i, o) -> callComponentLookChangedListeners());
+ registerLogicObs(end);
+ }
+
+ private void registerLogicObs(LogicObservable observable)
+ {
+ if (observable != null)
+ observable.registerObserver(logicObs);
+ }
+
+ private void deregisterLogicObs(LogicObservable observable)
+ {
+ if (observable != null)
+ observable.deregisterObserver(logicObs);
}
public int getLogicWidth()