Fixed & cleaned up GUIWire:
[Mograsim.git] / net.mograsim.logic.model.editor / src / net / mograsim / logic / model / editor / handles / HandleManager.java
index f999c96..c5e06a5 100644 (file)
@@ -8,6 +8,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 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;
 
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
@@ -114,8 +115,13 @@ public class HandleManager
 
        private void registerWire(GUIWire wire)
        {
 
        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)
                        if(diff != 0)
                        {
                                if(diff > 0)
@@ -123,13 +129,6 @@ public class HandleManager
                                        for(int i = 0; i < diff; i++)
                                                addWirePointHandle(w);
                                }
                                        for(int i = 0; i < diff; i++)
                                                addWirePointHandle(w);
                                }
-                               else
-                               {
-                                       for(int i = 0; i > diff; i--)
-                                       {
-                                               removeLastWirePointHandle(wire);
-                                       }
-                               }
                                
                                List<WirePointHandle> wpHandles = pointHandlesPerWire.get(w);
                                int size = wpHandles.size();
                                
                                List<WirePointHandle> wpHandles = pointHandlesPerWire.get(w);
                                int size = wpHandles.size();
@@ -141,9 +140,9 @@ public class HandleManager
                        pointHandlesPerWire.get(w).forEach(h -> h.updatePos());
                });
                addWireHandle(wire);
                        pointHandlesPerWire.get(w).forEach(h -> h.updatePos());
                });
                addWireHandle(wire);
-               if (wire.getPath() == null)
+               if (path == null)
                        return;
                        return;
-               for (int i = 0; i < wire.getPath().length; i++)
+               for (int i = 0; i < path.length; i++)
                {
                        addWirePointHandle(wire);
                }
                {
                        addWirePointHandle(wire);
                }
@@ -203,23 +202,25 @@ public class HandleManager
                List<WirePointHandle> wireHandles = pointHandlesPerWire.get(w);
                WirePointHandle h;
                if (wireHandles != null)
                List<WirePointHandle> 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<>();
                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);
        }
                        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<WirePointHandle> handles = pointHandlesPerWire.get(owner);
+               int pointIndex = handles.indexOf(h);
+               handles.remove(pointIndex);
                removeHandle(h);
                removeHandle(h);
+               owner.removePathPoint(pointIndex);
        }
 
        private void removeWirePointHandles(GUIWire owner)
        }
 
        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(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);
        }
 
                entryState.clicked(clicked, stateMask);
        }