Improvements in GUIWire and WireCrossPoint redrawing:
authorDaniel Kirschten <daniel.kirschten@gmx.de>
Tue, 28 May 2019 21:39:07 +0000 (23:39 +0200)
committerDaniel Kirschten <daniel.kirschten@gmx.de>
Tue, 28 May 2019 21:39:07 +0000 (23:39 +0200)
-GUIWire now supports ChangedListeners
-GUIWire and WireCrossPoint now call their ChangedListeners to request
redraws
-GUIWire and WireCrossPoint now use ColorHelper

LogicUI/src/era/mi/gui/ColorHelper.java [new file with mode: 0644]
LogicUI/src/era/mi/gui/LogicUICanvas.java
LogicUI/src/era/mi/gui/model/components/GUIComponent.java
LogicUI/src/era/mi/gui/model/wires/GUIWire.java
LogicUI/src/era/mi/gui/model/wires/WireCrossPoint.java

diff --git a/LogicUI/src/era/mi/gui/ColorHelper.java b/LogicUI/src/era/mi/gui/ColorHelper.java
new file mode 100644 (file)
index 0000000..ff6a495
--- /dev/null
@@ -0,0 +1,91 @@
+package era.mi.gui;
+
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Device;
+
+import era.mi.logic.types.ColorDefinition;
+import era.mi.logic.types.ColorDefinition.BuiltInColor;
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+
+//TODO replace with a proper ColorManager
+public class ColorHelper
+{
+       public static void executeWithDifferentForeground(GeneralGC gc, ColorDefinition col, Runnable exec)
+       {
+               executeWithDifferentColor(gc.getDevice(), col, gc::getForeground, gc::setForeground, exec);
+       }
+
+       public static void executeWithDifferentBackground(GeneralGC gc, ColorDefinition col, Runnable exec)
+       {
+               executeWithDifferentColor(gc.getDevice(), col, gc::getBackground, gc::setBackground, exec);
+       }
+
+       private static void executeWithDifferentColor(Device device, ColorDefinition col, Supplier<Color> getColor, Consumer<Color> setColor,
+                       Runnable exec)
+       {
+               Color oldColor = getColor.get();
+               boolean isNoSystemColor = col.builtInColor == null;
+               Color newColor;
+               if (isNoSystemColor)
+                       newColor = new Color(device, col.r, col.g, col.b);
+               else
+                       newColor = device.getSystemColor(ColorHelper.toSWTColorConstant(col.builtInColor));
+               setColor.accept(newColor);
+
+               exec.run();
+
+               setColor.accept(oldColor);
+               if (isNoSystemColor)
+                       newColor.dispose();
+       }
+
+       public static int toSWTColorConstant(BuiltInColor col)
+       {
+               switch (col)
+               {
+               case COLOR_BLACK:
+                       return SWT.COLOR_BLACK;
+               case COLOR_BLUE:
+                       return SWT.COLOR_BLUE;
+               case COLOR_CYAN:
+                       return SWT.COLOR_CYAN;
+               case COLOR_DARK_BLUE:
+                       return SWT.COLOR_DARK_BLUE;
+               case COLOR_DARK_CYAN:
+                       return SWT.COLOR_DARK_CYAN;
+               case COLOR_DARK_GRAY:
+                       return SWT.COLOR_DARK_GRAY;
+               case COLOR_DARK_GREEN:
+                       return SWT.COLOR_DARK_GREEN;
+               case COLOR_DARK_MAGENTA:
+                       return SWT.COLOR_DARK_MAGENTA;
+               case COLOR_DARK_RED:
+                       return SWT.COLOR_DARK_RED;
+               case COLOR_DARK_YELLOW:
+                       return SWT.COLOR_DARK_YELLOW;
+               case COLOR_GRAY:
+                       return SWT.COLOR_GRAY;
+               case COLOR_GREEN:
+                       return SWT.COLOR_GREEN;
+               case COLOR_MAGENTA:
+                       return SWT.COLOR_MAGENTA;
+               case COLOR_RED:
+                       return SWT.COLOR_RED;
+               case COLOR_WHITE:
+                       return SWT.COLOR_WHITE;
+               case COLOR_YELLOW:
+                       return SWT.COLOR_YELLOW;
+               default:
+                       throw new IllegalArgumentException("Unknown enum constant: " + col);
+               }
+       }
+
+       private ColorHelper()
+       {
+               throw new UnsupportedOperationException("No instances of ColorHelper");
+       }
+}
\ No newline at end of file
index 0e2a606..2115e7b 100644 (file)
@@ -56,8 +56,16 @@ public class LogicUICanvas extends ZoomableCanvas
                        c.removePinRemovedListener(pinRemovedListener);
                        redrawThreadsafe();
                });
-               model.addWireAddedListener(c -> redrawThreadsafe());
-               model.addWireRemovedListener(c -> redrawThreadsafe());
+               model.addWireAddedListener(w ->
+               {
+                       w.addWireChangedListener(redrawConsumer);
+                       redrawThreadsafe();
+               });
+               model.addWireRemovedListener(w ->
+               {
+                       w.removeWireChangedListener(redrawConsumer);
+                       redrawThreadsafe();
+               });
 
                addZoomedRenderer(gc ->
                {
index 9b8aa03..dc06461 100644 (file)
@@ -86,11 +86,11 @@ public abstract class GUIComponent
        public void removePinAddedListener        (Consumer<? super Pin         > listener) {pinAddedListeners        .remove(listener);}
        public void removePinRemovedListener      (Consumer<? super Pin         > listener) {pinRemovedListeners      .remove(listener);}
 
-       private void callComponentChangedListeners(     ) {componentChangedListeners.forEach(l -> l.accept(this));}
-       private void callComponentMovedListeners  (     ) {componentMovedListeners  .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   ));}
-       // @formatter:on
+       protected void callComponentChangedListeners(     ) {componentChangedListeners.forEach(l -> l.accept(this));}
+       private   void callComponentMovedListeners  (     ) {componentMovedListeners  .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   ));}
+       // @form  atter:on
 
        /**
         * Render this component to the given gc.
index 8ecf1c4..c2f03ee 100644 (file)
@@ -1,11 +1,13 @@
 package era.mi.gui.model.wires;
 
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
 
+import era.mi.gui.ColorHelper;
 import era.mi.gui.model.ViewModel;
-import era.mi.logic.types.Bit;
-import era.mi.logic.wires.Wire;
+import era.mi.logic.types.BitVectorFormatter;
+import era.mi.logic.wires.Wire.ReadEnd;
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
 
@@ -16,7 +18,9 @@ public class GUIWire
        private Pin pin2;
        private double[] path;
 
-       private Wire wire;
+       private final List<Consumer<? super GUIWire>> wireChangedListeners;
+
+       private ReadEnd end;
 
        public GUIWire(ViewModel model, Pin pin1, Pin pin2, Point... path)
        {
@@ -31,6 +35,8 @@ public class GUIWire
                this.pin1 = pin1;
                this.pin2 = pin2;
 
+               wireChangedListeners = new ArrayList<>();
+
                pin1.addPinMovedListener(p -> pin1Moved());
                pin2.addPinMovedListener(p -> pin2Moved());
                pin1Moved();
@@ -60,40 +66,21 @@ public class GUIWire
 
        public void render(GeneralGC gc)
        {
-               Color oldFG = gc.getForeground();
-               gc.setForeground(gc.getDevice().getSystemColor(getSWTColorConstantForWire(wire)));
-               gc.drawPolyline(path);
-               gc.setForeground(oldFG);
+               ColorHelper.executeWithDifferentForeground(gc, BitVectorFormatter.formatAsColor(end), () -> gc.drawPolyline(path));
        }
 
-       public void setLogicModelWire(Wire wire)
+       public void setLogicModelBinding(ReadEnd end)
        {
-               this.wire = wire;
+               this.end = end;
+               end.addObserver((i, o) -> callWireChangedListeners());
        }
 
-       public static int getSWTColorConstantForWire(Wire wire)
-       {
-               if (wire != null && wire.length == 1)
-                       return getSWTColorConstantForBit(wire.getValue());
-               else
-                       return SWT.COLOR_BLACK;
-       }
+       // @formatter:off
+       public void addWireChangedListener   (Consumer<? super GUIWire> listener) {wireChangedListeners.add   (listener);}
+
+       public void removeWireChangedListener(Consumer<? super GUIWire> listener) {wireChangedListeners.remove(listener);}
+
+       private void callWireChangedListeners() {wireChangedListeners.forEach(l -> l.accept(this));}
+       // @formatter:on
 
-       public static int getSWTColorConstantForBit(Bit bit)
-       {
-               switch (bit)
-               {
-               case ONE:
-                       return SWT.COLOR_GREEN;
-               case ZERO:
-                       return SWT.COLOR_BLUE;
-               case Z:
-                       return SWT.COLOR_BLACK;
-               case U:
-               case X:
-                       return SWT.COLOR_RED;
-               default:
-                       throw new IllegalArgumentException("Unknown enum constant: " + bit);
-               }
-       }
 }
\ No newline at end of file
index 84179fa..ebe30c3 100644 (file)
@@ -1,16 +1,16 @@
 package era.mi.gui.model.wires;
 
-import org.eclipse.swt.graphics.Color;
-
+import era.mi.gui.ColorHelper;
 import era.mi.gui.model.ViewModel;
 import era.mi.gui.model.components.GUIComponent;
-import era.mi.logic.wires.Wire;
+import era.mi.logic.types.BitVectorFormatter;
+import era.mi.logic.wires.Wire.ReadEnd;
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 
 public class WireCrossPoint extends GUIComponent
 {
-       private Wire wire;
+       private ReadEnd end;
 
        public WireCrossPoint(ViewModel model)
        {
@@ -22,14 +22,12 @@ public class WireCrossPoint extends GUIComponent
        @Override
        public void render(GeneralGC gc, Rectangle visibleRegion)
        {
-               Color oldBG = gc.getBackground();
-               gc.setBackground(gc.getDevice().getSystemColor(GUIWire.getSWTColorConstantForWire(wire)));
-               gc.fillOval(-1, -1, 2, 2);
-               gc.setBackground(oldBG);
+               ColorHelper.executeWithDifferentBackground(gc, BitVectorFormatter.formatAsColor(end), () -> gc.fillOval(-1, -1, 2, 2));
        }
 
-       public void setLogicModelWire(Wire wire)
+       public void setLogicModelBinding(ReadEnd end)
        {
-               this.wire = wire;
+               this.end = end;
+               end.addObserver((i, o) -> callComponentChangedListeners());
        }
 }
\ No newline at end of file