From e8e95e2e345f4d9c5927aa78f5c0fb607d352a97 Mon Sep 17 00:00:00 2001 From: Daniel Kirschten Date: Thu, 18 Jul 2019 15:59:11 +0200 Subject: [PATCH] Speedup by changing redraw listener system --- .../model/am2900/TestableAm2901Impl.java | 2 +- .../mograsim/logic/model/LogicUICanvas.java | 2 +- .../mograsim/logic/model/model/ViewModel.java | 37 +++++++++++-------- .../model/model/components/GUIComponent.java | 29 ++------------- .../components/atomic/GUIBitDisplay.java | 2 +- .../components/atomic/GUIManualSwitch.java | 2 +- .../submodels/SubmodelComponent.java | 8 ++-- .../logic/model/model/wires/GUIWire.java | 13 ++----- .../model/model/wires/WireCrossPoint.java | 2 +- .../DeserializedSubmodelComponent.java | 1 - 10 files changed, 38 insertions(+), 60 deletions(-) diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/TestableAm2901Impl.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/TestableAm2901Impl.java index 3d5ce860..2b27ae6b 100644 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/TestableAm2901Impl.java +++ b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/TestableAm2901Impl.java @@ -153,7 +153,7 @@ public class TestableAm2901Impl implements TestableAm2901 if (comp instanceof SubmodelComponent) modelsToIterate.offer(((SubmodelComponent) comp).submodel); } - wiresIncludingSubmodels.forEach(w -> w.addRedrawListener(() -> + viewModel.setRedrawHandler(() -> wiresIncludingSubmodels.forEach(w -> { if (debugWires) { diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java index 2c82d133..11e46345 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java @@ -53,7 +53,7 @@ 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.addRedrawListener(this::redrawThreadsafe); + model.setRedrawHandler(this::redrawThreadsafe); addListener(SWT.MouseDown, this::mouseDown); diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/ViewModel.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/ViewModel.java index 68cc489f..c60de3ed 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/ViewModel.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/ViewModel.java @@ -21,9 +21,8 @@ public class ViewModel private final List> componentRemovedListeners; private final List> wireAddedListeners; private final List> wireRemovedListeners; - private final List redrawListeners; - private final Runnable redrawListenerForSubcomponents; + private Runnable redrawHandler; protected ViewModel() { @@ -36,9 +35,6 @@ public class ViewModel componentRemovedListeners = new ArrayList<>(); wireAddedListeners = new ArrayList<>(); wireRemovedListeners = new ArrayList<>(); - redrawListeners = new ArrayList<>(); - - redrawListenerForSubcomponents = this::callRedrawListeners; } /** @@ -51,8 +47,7 @@ public class ViewModel throw new IllegalStateException("Don't add the same component twice!"); components.put(component.name, component); callComponentAddedListeners(component); - component.addRedrawListener(redrawListenerForSubcomponents); - callRedrawListeners(); + requestRedraw(); } /** @@ -65,8 +60,7 @@ public class ViewModel throw new IllegalStateException("Don't remove the same component twice!"); components.remove(component.name); callComponentRemovedListeners(component); - component.removeRedrawListener(redrawListenerForSubcomponents); - callRedrawListeners(); + requestRedraw(); } /** @@ -79,8 +73,7 @@ public class ViewModel throw new IllegalStateException("Don't add the same wire twice!"); wires.put(wire.name, wire); callWireAddedListeners(wire); - wire.addRedrawListener(redrawListenerForSubcomponents); - callRedrawListeners(); + requestRedraw(); } /** @@ -93,8 +86,7 @@ public class ViewModel throw new IllegalStateException("Don't remove the same wire twice!"); wires.remove(wire.name); callWireRemovedListeners(wire); - wire.removeRedrawListener(redrawListenerForSubcomponents); - callRedrawListeners(); + requestRedraw(); } public Map getComponentsByName() @@ -112,18 +104,31 @@ public class ViewModel public void addComponentRemovedListener (Consumer listener) {componentRemovedListeners.add (listener);} public void addWireAddedListener (Consumer listener) {wireAddedListeners .add (listener);} public void addWireRemovedListener (Consumer listener) {wireRemovedListeners .add (listener);} - public void addRedrawListener (Runnable listener) {redrawListeners .add (listener);} public void removeComponentAddedListener (Consumer listener) {componentAddedListeners .remove(listener);} public void removeComponentRemovedListener(Consumer listener) {componentRemovedListeners.remove(listener);} public void removeWireAddedListener (Consumer listener) {wireAddedListeners .remove(listener);} public void removeWireRemovedListener (Consumer listener) {wireRemovedListeners .remove(listener);} - public void removeRedrawListener (Runnable listener) {redrawListeners .remove(listener);} private void callComponentAddedListeners (GUIComponent c) {componentAddedListeners .forEach(l -> l.accept(c));} private void callComponentRemovedListeners(GUIComponent c) {componentRemovedListeners.forEach(l -> l.accept(c));} private void callWireAddedListeners (GUIWire w ) {wireAddedListeners .forEach(l -> l.accept(w));} private void callWireRemovedListeners (GUIWire w ) {wireRemovedListeners .forEach(l -> l.accept(w));} - private void callRedrawListeners ( ) {redrawListeners .forEach(l -> l.run( ));} // @formatter:on + + public void setRedrawHandler(Runnable handler) + { + this.redrawHandler = handler; + } + + public Runnable getRedrawHandler() + { + return redrawHandler; + } + + public void requestRedraw() + { + if (redrawHandler != null) + redrawHandler.run(); + } } \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/GUIComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/GUIComponent.java index 2ffe890f..60e8fb2a 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/GUIComponent.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/GUIComponent.java @@ -50,9 +50,6 @@ public abstract class GUIComponent implements JSONSerializable private final List> componentResizedListeners; private final List> pinAddedListeners; private final List> pinRemovedListeners; - private final List redrawListeners; - - private final Runnable redrawListenerForSubcomponents; private HighLevelStateHandler highLevelStateHandler; @@ -70,9 +67,6 @@ public abstract class GUIComponent implements JSONSerializable this.componentResizedListeners = new ArrayList<>(); this.pinAddedListeners = new ArrayList<>(); this.pinRemovedListeners = new ArrayList<>(); - this.redrawListeners = new ArrayList<>(); - - redrawListenerForSubcomponents = this::requestRedraw; // TODO this will crash the high level state debug shell because submodel is not yet set. // The same problem exists in ViewModelModifiable.getDefaultComponentName; see there @@ -109,8 +103,7 @@ public abstract class GUIComponent implements JSONSerializable throw new IllegalArgumentException("Duplicate pin name: " + pin.name); pinsByName.put(pin.name, pin); callPinAddedListeners(pin); - pin.addRedrawListener(redrawListenerForSubcomponents); - requestRedraw(); + model.requestRedraw(); } /** @@ -124,8 +117,7 @@ public abstract class GUIComponent implements JSONSerializable { Pin pin = pinsByName.remove(name); callPinRemovedListeners(pin); - pin.removeRedrawListener(redrawListenerForSubcomponents); - requestRedraw(); + model.requestRedraw(); } /** @@ -208,7 +200,7 @@ public abstract class GUIComponent implements JSONSerializable bounds.x = x; bounds.y = y; callComponentMovedListeners(); - requestRedraw(); + model.requestRedraw(); } /** @@ -221,7 +213,7 @@ public abstract class GUIComponent implements JSONSerializable bounds.width = width; bounds.height = height; callComponentResizedListener(); - requestRedraw(); + model.requestRedraw(); } /** @@ -304,33 +296,20 @@ public abstract class GUIComponent implements JSONSerializable // listeners - /** - * Calls redraw listeners. - * - * @author Daniel Kirschten - */ - protected void requestRedraw() - { - callRedrawListeners(); - } - // @formatter:off public void addComponentMovedListener (Consumer listener) {componentMovedListeners .add (listener);} public void addComponentResizedListener (Consumer listener) {componentResizedListeners.add (listener);} public void addPinAddedListener (Consumer listener) {pinAddedListeners .add (listener);} public void addPinRemovedListener (Consumer listener) {pinRemovedListeners .add (listener);} - public void addRedrawListener (Runnable listener) {redrawListeners .add (listener);} public void removeComponentMovedListener (Consumer listener) {componentMovedListeners .remove(listener);} public void removeComponentResizedListener (Consumer listener) {componentResizedListeners.remove(listener);} public void removePinAddedListener (Consumer listener) {pinAddedListeners .remove(listener);} public void removePinRemovedListener (Consumer listener) {pinRemovedListeners .remove(listener);} - public void removeRedrawListener (Runnable listener) {redrawListeners .remove(listener);} private void callComponentMovedListeners ( ) {componentMovedListeners .forEach(l -> l.accept(this));} private void callComponentResizedListener( ) {componentResizedListeners.forEach(l -> l.accept(this));} private void callPinAddedListeners (Pin p) {pinAddedListeners .forEach(l -> l.accept(p ));} private void callPinRemovedListeners (Pin p) {pinRemovedListeners .forEach(l -> l.accept(p ));} - private void callRedrawListeners ( ) {redrawListeners .forEach(l -> l.run( ));} // @formatter:on } \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIBitDisplay.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIBitDisplay.java index 2c541f8b..c837fd44 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIBitDisplay.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIBitDisplay.java @@ -36,7 +36,7 @@ public class GUIBitDisplay extends GUIComponent public GUIBitDisplay(ViewModelModifiable model, String name) { super(model, name); - logicObs = (i) -> requestRedraw(); + logicObs = (i) -> model.requestRedraw(); setSize(width, height); addPin(this.inputPin = new Pin(this, "", 1, 0, height / 2)); diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIManualSwitch.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIManualSwitch.java index e4c18331..611d3410 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIManualSwitch.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIManualSwitch.java @@ -40,7 +40,7 @@ public class GUIManualSwitch extends GUIComponent public GUIManualSwitch(ViewModelModifiable model, String name) { super(model, name); - logicObs = (i) -> requestRedraw(); + logicObs = (i) -> model.requestRedraw(); setSize(width, height); addPin(this.outputPin = new Pin(this, "", 1, width, height / 2)); diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java index 45c36bfb..51e74ddf 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java @@ -110,7 +110,7 @@ public abstract class SubmodelComponent extends GUIComponent this.minVisibleRegionFillRatioForAlpha1 = 0.8; this.renderer = new LogicUIRenderer(submodelModifiable); - submodelModifiable.addRedrawListener(this::requestRedraw); + submodelModifiable.setRedrawHandler(model.getRedrawHandler()); } // pins @@ -266,7 +266,7 @@ public abstract class SubmodelComponent extends GUIComponent for (Entry e : supermodelPins.entrySet()) getSubmodelMovablePin(e.getKey()).setRelPos(e.getValue().getRelX() * submodelScale, e.getValue().getRelY() * submodelScale); - requestRedraw();// needed if there is no submodel interface pin + model.requestRedraw();// needed if there is no submodel interface pin } /** @@ -287,7 +287,7 @@ public abstract class SubmodelComponent extends GUIComponent protected void setSymbolRenderer(Renderer symbolRenderer) { this.symbolRenderer = symbolRenderer; - requestRedraw(); + model.requestRedraw(); } /** @@ -308,7 +308,7 @@ public abstract class SubmodelComponent extends GUIComponent protected void setOutlineRenderer(Renderer outlineRenderer) { this.outlineRenderer = outlineRenderer; - requestRedraw(); + model.requestRedraw(); } /** diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/GUIWire.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/GUIWire.java index 144a1a38..c8f6217c 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/GUIWire.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/GUIWire.java @@ -61,7 +61,6 @@ public class GUIWire */ private double[] effectivePath; - private final List redrawListeners; private final List> pathChangedListeners; /** @@ -244,10 +243,9 @@ public class GUIWire this.path = path == null ? null : Arrays.copyOf(path, path.length); this.bounds = new Rectangle(0, 0, -1, -1); - redrawListeners = new ArrayList<>(); pathChangedListeners = new ArrayList<>(); - logicObs = (i) -> callRedrawListeners(); + logicObs = (i) -> model.requestRedraw(); pin1.addPinMovedListener(p -> pinMoved()); pin2.addPinMovedListener(p -> pinMoved()); @@ -298,7 +296,7 @@ public class GUIWire private void pinMoved() { recalculateEffectivePath(); - callRedrawListeners(); + model.requestRedraw(); } // "graphical" operations @@ -392,7 +390,7 @@ public class GUIWire this.path = deepPathCopy(path); recalculateEffectivePath(); callPathChangedListeners(); - callRedrawListeners(); + model.requestRedraw(); } public Point getPathPoint(int index) @@ -405,7 +403,7 @@ public class GUIWire path[index] = pointCopy(p); recalculateEffectivePath(); callPathChangedListeners(); - callRedrawListeners(); + model.requestRedraw(); } public void insertPathPoint(Point p, int index) @@ -514,13 +512,10 @@ public class GUIWire // listeners // @formatter:off - public void addRedrawListener (Runnable listener) {redrawListeners .add (listener);} public void addPathChangedListener (Consumer listener) {pathChangedListeners.add (listener);} - public void removeRedrawListener (Runnable listener) {redrawListeners .remove(listener);} public void removePathChangedListener(Consumer listener) {pathChangedListeners.remove(listener);} - private void callRedrawListeners () {redrawListeners .forEach(l -> l.run ( ));} private void callPathChangedListeners() {pathChangedListeners.forEach(l -> l.accept(this));} // @formatter:on diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/WireCrossPoint.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/WireCrossPoint.java index 49faee9c..ddd34934 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/WireCrossPoint.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/WireCrossPoint.java @@ -53,7 +53,7 @@ public class WireCrossPoint extends GUIComponent public WireCrossPoint(ViewModelModifiable model, int logicWidth, String name) { super(model, name); - logicObs = (i) -> requestRedraw(); + logicObs = (i) -> model.requestRedraw(); setSize(CIRCLE_DIAM, CIRCLE_DIAM); addPin(this.pin = new Pin(this, "", logicWidth, CIRCLE_RADIUS, CIRCLE_RADIUS)); diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java index f765afba..b23ab483 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java @@ -43,7 +43,6 @@ public class DeserializedSubmodelComponent extends SubmodelComponent public void setOutlineRenderer(Renderer outlineRenderer) { super.setOutlineRenderer(outlineRenderer); - requestRedraw(); } @Override -- 2.17.1