X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=net.mograsim.logic.model.editor%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Feditor%2Fhandles%2FHandleManager.java;h=c5e06a54cc7bb2d634903a9a647fafcb02b140dc;hb=cc6e329dc014542eb743833ef865b9d59047abbb;hp=f999c96a28324d690a23127c70596d6ee08ff46a;hpb=8b3e82a368d51751f2660e88a1b9fea9dfeb7e02;p=Mograsim.git diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/HandleManager.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/HandleManager.java index f999c96a..c5e06a54 100644 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/HandleManager.java +++ b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/HandleManager.java @@ -8,6 +8,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -114,8 +115,13 @@ public class HandleManager private void registerWire(GUIWire wire) { - wire.addPathChangedListener((w, diff) -> + Point[] path = wire.getPath(); + AtomicInteger oldLength = new AtomicInteger(path == null ? 0 : path.length); + wire.addPathChangedListener(w -> { + Point[] newPath = w.getPath(); + int newLength = newPath == null ? 0 : newPath.length; + int diff = oldLength.getAndSet(newLength) - newLength; if(diff != 0) { if(diff > 0) @@ -123,13 +129,6 @@ public class HandleManager for(int i = 0; i < diff; i++) addWirePointHandle(w); } - else - { - for(int i = 0; i > diff; i--) - { - removeLastWirePointHandle(wire); - } - } List wpHandles = pointHandlesPerWire.get(w); int size = wpHandles.size(); @@ -141,9 +140,9 @@ public class HandleManager pointHandlesPerWire.get(w).forEach(h -> h.updatePos()); }); addWireHandle(wire); - if (wire.getPath() == null) + if (path == null) return; - for (int i = 0; i < wire.getPath().length; i++) + for (int i = 0; i < path.length; i++) { addWirePointHandle(wire); } @@ -203,23 +202,25 @@ public class HandleManager List wireHandles = pointHandlesPerWire.get(w); WirePointHandle h; if (wireHandles != null) - wireHandles.add(h = new WirePointHandle(w, wireHandles.size())); + wireHandles.add(h = new WirePointHandle(this, w, wireHandles.size())); else { wireHandles = new ArrayList<>(); - h = new WirePointHandle(w, 0); + h = new WirePointHandle(this, w, 0); wireHandles.add(h); pointHandlesPerWire.put(h.parent, wireHandles); } this.wirePointHandles.add(h); addHandle(h); } - - private void removeLastWirePointHandle(GUIWire owner) + + void destroyWirePointHandle(GUIWire owner, WirePointHandle h) { - Handle h = pointHandlesPerWire.get(owner).remove(0); - wirePointHandles.remove(h); + List handles = pointHandlesPerWire.get(owner); + int pointIndex = handles.indexOf(h); + handles.remove(pointIndex); removeHandle(h); + owner.removePathPoint(pointIndex); } private void removeWirePointHandles(GUIWire owner) @@ -345,9 +346,9 @@ public class HandleManager if (!click(handlePerPin.values(), clicked, entryState, stateMask)) if (!click(handlePerInterfacePin.values(), clicked, entryState, stateMask)) if (!click(getWirePointHandles(), clicked, entryState, stateMask)) - if (!click(handlePerComp.values(), clicked, entryState, stateMask)) - if (!click(getWireHandles(), clicked, entryState, stateMask)) - entryState.clickedEmpty(clicked, stateMask); + if (!click(getWireHandles(), clicked, entryState, stateMask)) + if (!click(handlePerComp.values(), clicked, entryState, stateMask)) + entryState.clickedEmpty(clicked, stateMask); entryState.clicked(clicked, stateMask); }