X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.model.editor%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Feditor%2Fhandles%2FWireHandle.java;h=839c2b5b733532991232ced408242bfc03513222;hb=8bed58cd47f4e53a0a83e066d38864aa6875502f;hp=0e6c455557a8aa6e67b89344718dfc9e45701149;hpb=657f9c901e20c7b2efe53e0daa4b56c8082854b9;p=Mograsim.git diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WireHandle.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WireHandle.java index 0e6c4555..839c2b5b 100644 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WireHandle.java +++ b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WireHandle.java @@ -9,22 +9,26 @@ import net.haspamelodica.swt.helper.gcs.GeneralGC; import net.haspamelodica.swt.helper.swtobjectwrappers.Point; import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; import net.mograsim.logic.model.editor.states.EditorState; -import net.mograsim.logic.model.model.wires.GUIWire; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.wires.ModelWire; public class WireHandle extends Handle { private boolean selected = false; private final static double WIDTH = 2.0; private final static double WIDTH_SQUARED = WIDTH * WIDTH; - public final GUIWire parent; + private final LogicModelModifiable model; + public final ModelWire parent; - public WireHandle(GUIWire parent) + public WireHandle(LogicModelModifiable model, ModelWire parent) { + super(5); + this.model = model; this.parent = parent; parent.addPathChangedListener(c -> updateBounds()); updateBounds(); } - + @Override void destroy() { @@ -38,18 +42,18 @@ public class WireHandle extends Handle moveTo(r.x, r.y); setSize(r.width, r.height); } - + @Override public void render(GeneralGC gc) { - if(selected) + if (selected) { gc.setLineWidth(WIDTH); gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_YELLOW)); gc.drawPolyline(parent.getEffectivePath()); } } - + @Override public void onSelect() { @@ -63,43 +67,46 @@ public class WireHandle extends Handle selected = false; callRedrawListeners(); } - + @Override public void reqDelete() { - parent.destroy(); + // this wire could already be removed implicitly when removing a selection containing both wires and components + if (model.getWireByName(parent.name) != null) + model.destroyWire(parent); } - + @Override public boolean contains(double x, double y) { return click(parent, x, y).isPresent(); } - + @Override public boolean click(double x, double y, int stateMask, EditorState state) { Optional op = click(parent, x, y); - if(op.isEmpty()) + if (op.isEmpty()) return false; WireClickData data = op.get(); return state.clickedHandle(new WireHandleClickInfo(this, data.segment, data.pos, stateMask)); } - + public static class WireHandleClickInfo extends HandleClickInfo { public final int segment; public final Point posOnWire; + WireHandleClickInfo(WireHandle clicked, int segment, Point posOnWire, int stateMask) { super(clicked, stateMask); this.segment = segment; this.posOnWire = posOnWire; } - + } - - private static Optional click(GUIWire w, double x, double y) + + private static Optional click(ModelWire w, double x, double y) { Rectangle modifiedBounds = w.getBounds(); modifiedBounds.x -= WIDTH; @@ -111,8 +118,8 @@ public class WireHandle extends Handle double[] effectivePath = w.getEffectivePath(); for (int i = 3; i < effectivePath.length; i += 2) { - double a1 = effectivePath[i - 3], a2 = effectivePath[i - 2], b1 = effectivePath[i - 1], - b2 = effectivePath[i], r1 = b2 - a2, r2 = a1 - b1; + double a1 = effectivePath[i - 3], a2 = effectivePath[i - 2], b1 = effectivePath[i - 1], b2 = effectivePath[i], r1 = b2 - a2, + r2 = a1 - b1; double f = ((x - a1) * r2 + (a2 - y) * r1) / (-r2 * r2 - r1 * r1); if (f >= 0 && f <= 1) @@ -145,7 +152,7 @@ public class WireHandle extends Handle */ public final int segment; } - + @Override public HandleType getType() {