From 421535c322e30427c90e62c8dd03a740a309f329 Mon Sep 17 00:00:00 2001 From: Fabian Stemmler Date: Fri, 12 Jul 2019 18:32:02 +0200 Subject: [PATCH] Added methods to modify a Wires path and a PathChangedListener --- .../logic/ui/model/wires/GUIWire.java | 87 ++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/GUIWire.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/GUIWire.java index 6f6147ad..2e36c617 100644 --- a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/GUIWire.java +++ b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/GUIWire.java @@ -2,7 +2,9 @@ package net.mograsim.logic.ui.model.wires; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.eclipse.swt.SWT; @@ -25,6 +27,9 @@ import net.mograsim.preferences.ColorManager; */ public class GUIWire { + + private final Set pathChangedListeners; + /** * The model this wire is a part of. */ @@ -54,7 +59,7 @@ public class GUIWire /** * The effective path of this wire, including automatic interpolation and the position of both {@link Pin}s. Is never null. */ - private double[] effectivePath; + protected double[] effectivePath; private final List redrawListeners; @@ -96,6 +101,7 @@ public class GUIWire */ GUIWire(ViewModelModifiable model, Pin pin1, Pin pin2, Point... path) { + pathChangedListeners = new HashSet<>(); logicObs = (i) -> callRedrawListeners(); this.model = model; this.logicWidth = pin1.logicWidth; @@ -304,6 +310,24 @@ public class GUIWire public void removeRedrawListener(Runnable listener) {redrawListeners .remove(listener);} private void callRedrawListeners() {redrawListeners.forEach(l -> l.run());} + + public void addPathChangedListener(PathChangedListener l) { pathChangedListeners.add(l); } + + public void removePathChangedListener(PathChangedListener l) { pathChangedListeners.remove(l); } + + public void callPathChangedListeners(int diff) { pathChangedListeners.forEach(l -> l.pathChanged(this, diff)); } + + @FunctionalInterface + public static interface PathChangedListener + { + /** + * Called whenever the {@link Wire}'s path changes + * + * @param wire The wire which had its path changed + * @param diff The length difference between before and after the path change. + */ + public void pathChanged(GUIWire wire, int diff); + } // @formatter:on @Override @@ -311,4 +335,65 @@ public class GUIWire { return "GUIWire [" + pin1 + "---" + pin2 + ", value=" + (end == null ? "null" : end.getValues()) + "]"; } + + public void setPath(Point[] path) + { + int diff = (path == null ? 0 : path.length) - (this.path == null ? 0 : this.path.length); + this.path = path == null ? null : path.clone(); + recalculateEffectivePath(); + callPathChangedListeners(diff); + callRedrawListeners(); + } + + public void setPathPoint(Point p, int index) + { + path[index] = p; + recalculateEffectivePath(); + callPathChangedListeners(0); + callRedrawListeners(); + } + + public void insertPathPoint(Point p, int index) + { + Point[] path = getPath(); + if (path == null) + setPath(new Point[] { p }); + else + { + Point[] newPath = new Point[path.length + 1]; + System.arraycopy(path, 0, newPath, 0, index); + if (index < path.length) + System.arraycopy(path, index, newPath, index + 1, path.length - index); + newPath[index] = p; + setPath(newPath); + } + } + + public void removePathPoint(int index) + { + Point[] path = getPath(); + Point[] newPath = new Point[path.length - 1]; + System.arraycopy(path, 0, newPath, 0, index); + if (index < path.length - 1) + System.arraycopy(path, index + 1, newPath, index, path.length - index - 1); + setPath(newPath); + } + + /** + * @throws IndexOutOfBoundsException + */ + public Point getPathPoint(int index) + { + return path[index]; + } + + public int getPathLength() + { + return path.length; + } + + public double[] getEffectivePath() + { + return effectivePath.clone(); + } } \ No newline at end of file -- 2.17.1