Speedup by changing redraw listener system
authorDaniel Kirschten <daniel.kirschten@gmx.de>
Thu, 18 Jul 2019 13:59:11 +0000 (15:59 +0200)
committerDaniel Kirschten <daniel.kirschten@gmx.de>
Thu, 18 Jul 2019 13:59:11 +0000 (15:59 +0200)
net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/TestableAm2901Impl.java
net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java
net.mograsim.logic.model/src/net/mograsim/logic/model/model/ViewModel.java
net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/GUIComponent.java
net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIBitDisplay.java
net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIManualSwitch.java
net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java
net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/GUIWire.java
net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/WireCrossPoint.java
net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java

index 3d5ce86..2b27ae6 100644 (file)
@@ -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)
                        {
index 2c82d13..11e4634 100644 (file)
@@ -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);
 
index 68cc489..c60de3e 100644 (file)
@@ -21,9 +21,8 @@ public class ViewModel
        private final List<Consumer<? super GUIComponent>> componentRemovedListeners;
        private final List<Consumer<? super GUIWire>> wireAddedListeners;
        private final List<Consumer<? super GUIWire>> wireRemovedListeners;
-       private final List<Runnable> 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<String, GUIComponent> getComponentsByName()
@@ -112,18 +104,31 @@ public class ViewModel
        public void addComponentRemovedListener   (Consumer<? super GUIComponent> listener) {componentRemovedListeners.add   (listener);}
        public void addWireAddedListener          (Consumer<? super GUIWire     > listener) {wireAddedListeners       .add   (listener);}
        public void addWireRemovedListener        (Consumer<? super GUIWire     > listener) {wireRemovedListeners     .add   (listener);}
-       public void addRedrawListener             (Runnable                       listener) {redrawListeners          .add   (listener);}
 
        public void removeComponentAddedListener  (Consumer<? super GUIComponent> listener) {componentAddedListeners  .remove(listener);}
        public void removeComponentRemovedListener(Consumer<? super GUIComponent> listener) {componentRemovedListeners.remove(listener);}
        public void removeWireAddedListener       (Consumer<? super GUIWire     > listener) {wireAddedListeners       .remove(listener);}
        public void removeWireRemovedListener     (Consumer<? super GUIWire     > 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
index 2ffe890..60e8fb2 100644 (file)
@@ -50,9 +50,6 @@ public abstract class GUIComponent implements JSONSerializable
        private final List<Consumer<? super GUIComponent>> componentResizedListeners;
        private final List<Consumer<? super Pin>> pinAddedListeners;
        private final List<Consumer<? super Pin>> pinRemovedListeners;
-       private final List<Runnable> 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<? super GUIComponent> listener) {componentMovedListeners  .add   (listener);}
        public void addComponentResizedListener    (Consumer<? super GUIComponent> listener) {componentResizedListeners.add   (listener);}
        public void addPinAddedListener            (Consumer<? super Pin         > listener) {pinAddedListeners        .add   (listener);}
        public void addPinRemovedListener          (Consumer<? super Pin         > listener) {pinRemovedListeners      .add   (listener);}
-       public void addRedrawListener              (Runnable                       listener) {redrawListeners          .add   (listener);}
 
        public void removeComponentMovedListener   (Consumer<? super GUIComponent> listener) {componentMovedListeners  .remove(listener);}
        public void removeComponentResizedListener (Consumer<? super GUIComponent> listener) {componentResizedListeners.remove(listener);}
        public void removePinAddedListener         (Consumer<? super Pin         > listener) {pinAddedListeners        .remove(listener);}
        public void removePinRemovedListener       (Consumer<? super Pin         > 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
index 2c541f8..c837fd4 100644 (file)
@@ -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));
index e4c1833..611d341 100644 (file)
@@ -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));
index 45c36bf..51e74dd 100644 (file)
@@ -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<String, MovablePin> 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();
        }
 
        /**
index 144a1a3..c8f6217 100644 (file)
@@ -61,7 +61,6 @@ public class GUIWire
         */
        private double[] effectivePath;
 
-       private final List<Runnable> redrawListeners;
        private final List<Consumer<GUIWire>> 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<GUIWire> listener) {pathChangedListeners.add    (listener);}
 
-       public void removeRedrawListener     (Runnable          listener) {redrawListeners     .remove(listener);}
        public void removePathChangedListener(Consumer<GUIWire> listener) {pathChangedListeners.remove(listener);}
 
-       private void callRedrawListeners     () {redrawListeners     .forEach(l -> l.run   (    ));}
        private void callPathChangedListeners() {pathChangedListeners.forEach(l -> l.accept(this));}
        // @formatter:on
 
index 49faee9..ddd3493 100644 (file)
@@ -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));
index f765afb..b23ab48 100644 (file)
@@ -43,7 +43,6 @@ public class DeserializedSubmodelComponent extends SubmodelComponent
        public void setOutlineRenderer(Renderer outlineRenderer)
        {
                super.setOutlineRenderer(outlineRenderer);
-               requestRedraw();
        }
 
        @Override