X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.logic.model%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2FLogicUICanvas.java;h=fe6c14cc5edf31983090c137f5c9d198ca73d258;hb=c356c613955c3ea57d2379fb76f9bd07f1e30170;hp=50e6471ad3f522c5442e1ec0db32a8f8041a4fc0;hpb=4c2b7a2100e55b5e4bf59666b9684d5a996bd0fb;p=Mograsim.git diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java index 50e6471a..fe6c14cc 100644 --- a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java @@ -1,9 +1,10 @@ package net.mograsim.logic.model; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import org.eclipse.swt.SWT; @@ -53,7 +54,11 @@ public class LogicUICanvas extends ZoomableCanvas setBackground(background);// this.setBackground, not gc.setBackground to have the background fill the canvas renderer.render(gc, new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom)); }); - model.setRedrawHandler(this::redrawThreadsafe); + model.setRedrawHandler(() -> + { + if (!isDisposed()) + redrawThreadsafe(); + }); addListener(SWT.MouseDown, this::mouseDown); @@ -63,7 +68,7 @@ public class LogicUICanvas extends ZoomableCanvas private void mouseDown(Event e) { - if (e.button == 1) + if (e.button == Preferences.current().getInt("net.mograsim.logic.model.button.action")) { Point click = canvasToWorldCoords(e.x, e.y); for (ModelComponent component : model.getComponentsByName().values()) @@ -85,17 +90,19 @@ public class LogicUICanvas extends ZoomableCanvas List componentsByItemIndex = new ArrayList<>(); List models = new ArrayList<>(); AtomicBoolean recalculateQueued = new AtomicBoolean(); - AtomicReference> compAdded = new AtomicReference<>(); - AtomicReference> compRemoved = new AtomicReference<>(); - compAdded.set(c -> compsChanged(compAdded.get(), compRemoved.get(), c, models, componentsByItemIndex, componentSelector, model, - recalculateQueued, true)); - compRemoved.set(c -> compsChanged(compAdded.get(), compRemoved.get(), c, models, componentsByItemIndex, componentSelector, model, - recalculateQueued, false)); - iterateModelTree(compAdded.get(), compRemoved.get(), model, models, true); + @SuppressWarnings("unchecked") + Consumer[] compAdded = new Consumer[1]; + @SuppressWarnings("unchecked") + Consumer[] compRemoved = new Consumer[1]; + compAdded[0] = c -> compsChanged(compAdded[0], compRemoved[0], c, models, componentsByItemIndex, componentSelector, model, + recalculateQueued, true); + compRemoved[0] = c -> compsChanged(compAdded[0], compRemoved[0], c, models, componentsByItemIndex, componentSelector, model, + recalculateQueued, false); + iterateModelTree(compAdded[0], compRemoved[0], model, models, true); debugShell.addListener(SWT.Dispose, e -> models.forEach(m -> { - m.removeComponentAddedListener(compAdded.get()); - m.removeComponentRemovedListener(compRemoved.get()); + m.removeComponentAddedListener(compAdded[0]); + m.removeComponentRemovedListener(compRemoved[0]); })); queueRecalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model); new Label(debugShell, SWT.NONE).setText("Target state ID: "); @@ -117,8 +124,12 @@ public class LogicUICanvas extends ZoomableCanvas valueText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); Button send = new Button(debugShell, SWT.PUSH); send.setText("Send!"); + Button addListener = new Button(debugShell, SWT.PUSH); + addListener.setText("Add sysout listener"); Button get = new Button(debugShell, SWT.PUSH); get.setText("Get!"); + Button removeListener = new Button(debugShell, SWT.PUSH); + removeListener.setText("Remove sysout listener"); Text output = new Text(debugShell, SWT.READ_ONLY); output.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); Listener sendAction = e -> @@ -163,7 +174,55 @@ public class LogicUICanvas extends ZoomableCanvas valueText.addListener(SWT.DefaultSelection, sendAction); get.addListener(SWT.Selection, getAction); stateIDText.addListener(SWT.DefaultSelection, getAction); + Map>> sysoutListenersPerHLSPerTarget = new HashMap<>(); + addListener.addListener(SWT.Selection, e -> + { + try + { + int componentIndex = componentSelector.getSelectionIndex(); + if (componentIndex < 0 || componentIndex >= componentsByItemIndex.size()) + throw new RuntimeException("No component selected"); + ModelComponent target = componentsByItemIndex.get(componentIndex); + Map> sysoutListenersPerHLS = sysoutListenersPerHLSPerTarget.computeIfAbsent(target, + k -> new HashMap<>()); + String stateIDString = stateIDText.getText(); + if (sysoutListenersPerHLS.containsKey(stateIDString)) + throw new RuntimeException("Listener already registered"); + Consumer sysoutListener = v -> System.out.println(stateIDString + ": " + v); + target.addHighLevelStateListener(stateIDString, sysoutListener); + sysoutListenersPerHLS.put(stateIDString, sysoutListener); + output.setText("Success!"); + } + catch (Exception x) + { + output.setText(x.getClass().getSimpleName() + (x.getMessage() == null ? "" : ": " + x.getMessage())); + } + }); + removeListener.addListener(SWT.Selection, e -> + { + try + { + int componentIndex = componentSelector.getSelectionIndex(); + if (componentIndex < 0 || componentIndex >= componentsByItemIndex.size()) + throw new RuntimeException("No component selected"); + ModelComponent target = componentsByItemIndex.get(componentIndex); + Map> sysoutListenersPerHLS = sysoutListenersPerHLSPerTarget.get(target); + if (sysoutListenersPerHLS == null) + throw new RuntimeException("Listener not registered"); + String stateIDString = stateIDText.getText(); + Consumer sysoutListener = sysoutListenersPerHLS.remove(stateIDString); + if (sysoutListener == null) + throw new RuntimeException("Listener not registered"); + target.removeHighLevelStateListener(stateIDString, sysoutListener); + output.setText("Success!"); + } + catch (Exception x) + { + output.setText(x.getClass().getSimpleName() + (x.getMessage() == null ? "" : ": " + x.getMessage())); + } + }); debugShell.open(); + addDisposeListener(e -> debugShell.dispose()); } private void compsChanged(Consumer compAdded, Consumer compRemoved, ModelComponent c, @@ -216,7 +275,7 @@ public class LogicUICanvas extends ZoomableCanvas componentsByItemIndex.clear(); componentSelector.setItems(); addComponentSelectorItems(componentsByItemIndex, "", componentSelector, model, - Preferences.current().getInt("net.mograsim.logic.model.debug.hlsshelldepth")); + Preferences.current().getInt("net.mograsim.logic.model.debug.hlsshelldepth") - 1); } private void addComponentSelectorItems(List componentsByItemIndex, String base, Combo componentSelector,