X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.model.editor%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Feditor%2Fhandles%2FHandleManager.java;h=f3ef9a88f1df491ec37253d0539e4ad6136724c2;hb=53e2bb4363368cc84b12da42bdd228d69b2aca9b;hp=91b0e3b07630d2ce32903a04edcab2b835a5ff3a;hpb=d4f83fccf116789abf1a95a6486e53557b6f795e;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 91b0e3b0..f3ef9a88 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; @@ -16,6 +17,7 @@ import net.mograsim.logic.model.editor.Editor; import net.mograsim.logic.model.editor.states.EditorState; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.GUIComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; import net.mograsim.logic.model.model.wires.GUIWire; import net.mograsim.logic.model.model.wires.MovablePin; import net.mograsim.logic.model.model.wires.Pin; @@ -85,12 +87,12 @@ public class HandleManager ViewModelModifiable model = editor.getSubmodel(); Map compsByName = model.getComponentsByName(); Set comps = new HashSet<>(compsByName.values()); - GUIComponent interfaceComp = compsByName.get("_submodelinterface"); + GUIComponent interfaceComp = compsByName.get(SubmodelComponent.SUBMODEL_INTERFACE_NAME); comps.remove(interfaceComp); registerInterfaceComponent(interfaceComp); comps.forEach(c -> registerComponent(c)); - - model.getWires().forEach(w -> registerWire(w)); + + model.getWiresByName().values().forEach(w -> registerWire(w)); addHandle(cornerHandle = new CornerHandle(editor.toBeEdited)); } } @@ -114,19 +116,24 @@ 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 -> { - if(diff != 0) + Point[] newPath = w.getPath(); + int newLength = newPath == null ? 0 : newPath.length; + int diff = newLength - oldLength.getAndSet(newLength); + if (diff != 0) { - if(diff > 0) + if (diff > 0) { - for(int i = 0; i < diff; i++) + for (int i = 0; i < diff; i++) addWirePointHandle(w); } - + List wpHandles = pointHandlesPerWire.get(w); int size = wpHandles.size(); - for(int i = 0; i < size; i++) + for (int i = 0; i < size; i++) { wpHandles.get(i).setIndex(i); } @@ -134,9 +141,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); } @@ -176,8 +183,8 @@ public class HandleManager private void addInterfacePinHandle(Pin p) { - //The following is not an alternative to the cast, because the new pin is not yet in the map, when the listener is called - //editor.toBeEdited.getSubmodelMovablePins().get(p.name); + // The following is not an alternative to the cast, because the new pin is not yet in the map, when the listener is called + // editor.toBeEdited.getSubmodelMovablePins().get(p.name); MovablePin pM = (MovablePin) p; InterfacePinHandle h = new InterfacePinHandle(pM, editor.toBeEdited); handlePerInterfacePin.put(pM, h); @@ -207,19 +214,22 @@ public class HandleManager this.wirePointHandles.add(h); addHandle(h); } - + void destroyWirePointHandle(GUIWire owner, WirePointHandle h) { - List handles = pointHandlesPerWire.get(owner); - int pointIndex = handles.indexOf(h); - handles.remove(pointIndex); - removeHandle(h); - owner.removePathPoint(pointIndex); + if (pointHandlesPerWire.containsKey(owner)) + { + List handles = pointHandlesPerWire.get(owner); + int pointIndex = handles.indexOf(h); + handles.remove(pointIndex); + removeHandle(h); + owner.removePathPoint(pointIndex); + } } private void removeWirePointHandles(GUIWire owner) { - if(!pointHandlesPerWire.containsKey(owner)) + if (!pointHandlesPerWire.containsKey(owner)) return; pointHandlesPerWire.get(owner).forEach(h -> { @@ -270,7 +280,7 @@ public class HandleManager { return handlePerWire.get(parent); } - + public Handle getInterfacePinHandle(Pin p) { return handlePerInterfacePin.get(p); @@ -299,7 +309,7 @@ public class HandleManager { return Collections.unmodifiableCollection(handlePerPin.values()); } - + /** * @return An unmodifiable view of all registered {@link InterfacePinHandle}s */ @@ -336,17 +346,18 @@ public class HandleManager { EditorState entryState = editor.stateManager.getState(); + // TODO: As soon as wires connected to a component being removed also are removed, change priority if (!cornerHandle.click(clicked.x, clicked.y, stateMask, entryState)) if (!click(handlePerPin.values(), clicked, entryState, stateMask)) if (!click(handlePerInterfacePin.values(), clicked, entryState, stateMask)) if (!click(getWirePointHandles(), clicked, entryState, stateMask)) if (!click(getWireHandles(), clicked, entryState, stateMask)) if (!click(handlePerComp.values(), clicked, entryState, stateMask)) - entryState.clickedEmpty(clicked, stateMask); + entryState.clickedEmpty(clicked, stateMask); entryState.clicked(clicked, stateMask); } - private boolean click(Collection handles, Point clicked, EditorState state, int stateMask) + private static boolean click(Collection handles, Point clicked, EditorState state, int stateMask) { for (Handle h : handles) if (h.click(clicked.x, clicked.y, stateMask, state))