import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
import net.mograsim.logic.model.editor.Editor;
import net.mograsim.logic.model.editor.states.EditorState;
+import net.mograsim.logic.model.editor.util.PrioritySet;
import net.mograsim.logic.model.model.ViewModelModifiable;
import net.mograsim.logic.model.model.components.GUIComponent;
import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
private final Editor editor;
private boolean initialized = false;
- private CornerHandle cornerHandle;
-
public HandleManager(Editor editor)
{
this.editor = editor;
handlePerInterfacePin = new HashMap<>();
pointHandlesPerWire = new HashMap<>();
handlePerComp = new HashMap<>();
- handles = new HashSet<>();
+ handles = new PrioritySet<>((a, b) -> Integer.compare(a.getPriority(), b.getPriority()));
wirePointHandles = new HashSet<>();
handlePerWire = new HashMap<>();
comps.forEach(c -> registerComponent(c));
model.getWiresByName().values().forEach(w -> registerWire(w));
- addHandle(cornerHandle = new CornerHandle(editor.toBeEdited));
+ addHandle(new CornerHandle(editor.toBeEdited));
}
}
{
Point[] newPath = w.getPath();
int newLength = newPath == null ? 0 : newPath.length;
- int diff = oldLength.getAndSet(newLength) - newLength;
+ int diff = newLength - oldLength.getAndSet(newLength);
if (diff != 0)
{
if (diff > 0)
void destroyWirePointHandle(GUIWire owner, WirePointHandle h)
{
- List<WirePointHandle> handles = pointHandlesPerWire.get(owner);
- int pointIndex = handles.indexOf(h);
- handles.remove(pointIndex);
- removeHandle(h);
- owner.removePathPoint(pointIndex);
+ if (pointHandlesPerWire.containsKey(owner))
+ {
+ List<WirePointHandle> handles = pointHandlesPerWire.get(owner);
+ int pointIndex = handles.indexOf(h);
+ handles.remove(pointIndex);
+ removeHandle(h);
+ owner.removePathPoint(pointIndex);
+ }
}
private void removeWirePointHandles(GUIWire owner)
public void click(Point clicked, int stateMask)
{
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);
+ // TODO: As soon as wires connected to a component being removed also are removed, change priority)
+ if (!click(handles, clicked, entryState, stateMask))
+ entryState.clickedEmpty(clicked, stateMask);
entryState.clicked(clicked, stateMask);
}