From e618fa725540dd5f92ccf0ed7d65acdc8eb83f93 Mon Sep 17 00:00:00 2001 From: Daniel Kirschten Date: Tue, 28 May 2019 23:39:07 +0200 Subject: [PATCH] Improvements in GUIWire and WireCrossPoint redrawing: -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 | 91 +++++++++++++++++++ LogicUI/src/era/mi/gui/LogicUICanvas.java | 12 ++- .../mi/gui/model/components/GUIComponent.java | 10 +- .../src/era/mi/gui/model/wires/GUIWire.java | 57 +++++------- .../mi/gui/model/wires/WireCrossPoint.java | 18 ++-- 5 files changed, 136 insertions(+), 52 deletions(-) create mode 100644 LogicUI/src/era/mi/gui/ColorHelper.java diff --git a/LogicUI/src/era/mi/gui/ColorHelper.java b/LogicUI/src/era/mi/gui/ColorHelper.java new file mode 100644 index 00000000..ff6a4950 --- /dev/null +++ b/LogicUI/src/era/mi/gui/ColorHelper.java @@ -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 getColor, Consumer 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 diff --git a/LogicUI/src/era/mi/gui/LogicUICanvas.java b/LogicUI/src/era/mi/gui/LogicUICanvas.java index 0e2a606b..2115e7b1 100644 --- a/LogicUI/src/era/mi/gui/LogicUICanvas.java +++ b/LogicUI/src/era/mi/gui/LogicUICanvas.java @@ -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 -> { diff --git a/LogicUI/src/era/mi/gui/model/components/GUIComponent.java b/LogicUI/src/era/mi/gui/model/components/GUIComponent.java index 9b8aa032..dc064617 100644 --- a/LogicUI/src/era/mi/gui/model/components/GUIComponent.java +++ b/LogicUI/src/era/mi/gui/model/components/GUIComponent.java @@ -86,11 +86,11 @@ public abstract class GUIComponent public void removePinAddedListener (Consumer listener) {pinAddedListeners .remove(listener);} public void removePinRemovedListener (Consumer 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. diff --git a/LogicUI/src/era/mi/gui/model/wires/GUIWire.java b/LogicUI/src/era/mi/gui/model/wires/GUIWire.java index 8ecf1c45..c2f03ee5 100644 --- a/LogicUI/src/era/mi/gui/model/wires/GUIWire.java +++ b/LogicUI/src/era/mi/gui/model/wires/GUIWire.java @@ -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> 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 listener) {wireChangedListeners.add (listener);} + + public void removeWireChangedListener(Consumer 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 diff --git a/LogicUI/src/era/mi/gui/model/wires/WireCrossPoint.java b/LogicUI/src/era/mi/gui/model/wires/WireCrossPoint.java index 84179fad..ebe30c30 100644 --- a/LogicUI/src/era/mi/gui/model/wires/WireCrossPoint.java +++ b/LogicUI/src/era/mi/gui/model/wires/WireCrossPoint.java @@ -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 -- 2.17.1