From fab4d99cc8ff422a699e337dc3a1b9fadc29ccf0 Mon Sep 17 00:00:00 2001 From: hneemann Date: Thu, 17 Mar 2016 17:05:24 +0100 Subject: [PATCH] interaction is possible --- .../neemann/digital/core/HighZException.java | 4 +- .../neemann/digital/core/ObservableValue.java | 4 +- .../java/de/neemann/digital/gui/Main.java | 5 +- .../gui/components/CircuitComponent.java | 68 +++++++++++++++++-- .../digital/gui/draw/graphics/Style.java | 2 +- .../gui/draw/model/ModelDescription.java | 16 ++--- .../digital/gui/draw/model/ModelEntry.java | 19 +++--- .../digital/gui/draw/parts/Circuit.java | 6 +- .../neemann/digital/gui/draw/parts/State.java | 24 +++++++ .../digital/gui/draw/parts/VisualPart.java | 31 +++++++-- .../neemann/digital/gui/draw/parts/Wire.java | 2 +- .../digital/gui/draw/shapes/Drawable.java | 9 ++- .../digital/gui/draw/shapes/GenericShape.java | 10 ++- .../digital/gui/draw/shapes/InputShape.java | 40 ++++++++++- .../digital/gui/draw/shapes/Interactor.java | 12 ++++ .../digital/gui/draw/shapes/OutputShape.java | 28 +++++++- .../digital/gui/draw/shapes/Shape.java | 15 +++- .../digital/gui/draw/shapes/StateMonitor.java | 7 ++ 18 files changed, 255 insertions(+), 47 deletions(-) create mode 100644 src/main/java/de/neemann/digital/gui/draw/parts/State.java create mode 100644 src/main/java/de/neemann/digital/gui/draw/shapes/Interactor.java create mode 100644 src/main/java/de/neemann/digital/gui/draw/shapes/StateMonitor.java diff --git a/src/main/java/de/neemann/digital/core/HighZException.java b/src/main/java/de/neemann/digital/core/HighZException.java index 0e7c719fd..48bcf12dd 100644 --- a/src/main/java/de/neemann/digital/core/HighZException.java +++ b/src/main/java/de/neemann/digital/core/HighZException.java @@ -3,9 +3,9 @@ package de.neemann.digital.core; /** * @author hneemann */ -public class HighZException extends NodeException { +public class HighZException extends RuntimeException { public HighZException(ObservableValue... causedObservable) { - super("readOfHighZ", causedObservable); + super("readOfHighZ"); } } diff --git a/src/main/java/de/neemann/digital/core/ObservableValue.java b/src/main/java/de/neemann/digital/core/ObservableValue.java index 69ca782d0..73633136f 100644 --- a/src/main/java/de/neemann/digital/core/ObservableValue.java +++ b/src/main/java/de/neemann/digital/core/ObservableValue.java @@ -38,7 +38,7 @@ public class ObservableValue extends Value { return bits; } - public long getValue() throws NodeException { + public long getValue() { if (highZ) throw new HighZException(this); return value; @@ -52,7 +52,7 @@ public class ObservableValue extends Value { } } - public long getValueBits() throws NodeException { + public long getValueBits() { return getValueBits(getValue()); } diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 8fb53ddca..5a8fa3951 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -68,8 +68,9 @@ public class Main extends JFrame { public void actionPerformed(ActionEvent e) { try { ModelDescription m = new ModelDescription(cr); - Model model = m.create(); - System.out.println(model); + Model model = m.create(circuitComponent); + model.init(true); + circuitComponent.setMode(CircuitComponent.Mode.running); } catch (Exception e1) { new ErrorMessage("error creating model").addCause(e1).show(Main.this); } diff --git a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java index 5c20297b6..f4ec99761 100644 --- a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java +++ b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java @@ -1,5 +1,6 @@ package de.neemann.digital.gui.components; +import de.neemann.digital.core.Listener; import de.neemann.digital.gui.draw.graphics.*; import de.neemann.digital.gui.draw.graphics.Polygon; import de.neemann.digital.gui.draw.parts.Circuit; @@ -19,7 +20,7 @@ import java.util.ArrayList; /** * @author hneemann */ -public class CircuitComponent extends JComponent { +public class CircuitComponent extends JComponent implements Listener { private static final String delAction = "myDelAction"; private final Circuit circuit; @@ -57,7 +58,7 @@ public class CircuitComponent extends JComponent { switch (mode) { case part: listener = new PartMouseListener(); - setCursor(new Cursor(Cursor.HAND_CURSOR)); + setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); break; case wire: listener = new WireMouseListener(); @@ -67,6 +68,10 @@ public class CircuitComponent extends JComponent { listener = new SelectMouseListener(); setCursor(new Cursor(Cursor.MOVE_CURSOR)); break; + case running: + listener = new RunningMouseListener(); + setCursor(new Cursor(Cursor.HAND_CURSOR)); + break; } addMouseMotionListener(listener); addMouseListener(listener); @@ -86,7 +91,7 @@ public class CircuitComponent extends JComponent { g.fillRect(0, 0, getWidth(), getHeight()); GraphicSwing gr = new GraphicSwing((Graphics2D) g); - circuit.drawTo(gr); + circuit.drawTo(gr, null); listener.drawTo(gr); } @@ -96,7 +101,12 @@ public class CircuitComponent extends JComponent { ((pos.y + GenericShape.SIZE2) / GenericShape.SIZE) * GenericShape.SIZE); } - public enum Mode {part, wire, select} + @Override + public void needsUpdate() { + repaint(); + } + + public enum Mode {part, wire, running, select} private interface Mouse extends MouseMotionListener, MouseListener { void drawTo(Graphic gr); @@ -156,7 +166,7 @@ public class CircuitComponent extends JComponent { @Override public void drawTo(Graphic gr) { if (wire != null) - wire.drawTo(gr); + wire.drawTo(gr, null); } } @@ -232,7 +242,7 @@ public class CircuitComponent extends JComponent { @Override public void drawTo(Graphic gr) { if (partToInsert != null) - partToInsert.drawTo(gr); + partToInsert.drawTo(gr, null); } } @@ -320,4 +330,50 @@ public class CircuitComponent extends JComponent { } } + private class RunningMouseListener implements Mouse { + @Override + public void drawTo(Graphic gr) { + + } + + @Override + public void mouseClicked(MouseEvent e) { + Vector pos = new Vector(e.getX(), e.getY()); + for (VisualPart vp : circuit.getParts()) + if (vp.matches(pos)) { + vp.clicked(CircuitComponent.this, pos); + } + + } + + @Override + public void mousePressed(MouseEvent e) { + + } + + @Override + public void mouseReleased(MouseEvent e) { + + } + + @Override + public void mouseEntered(MouseEvent e) { + + } + + @Override + public void mouseExited(MouseEvent e) { + + } + + @Override + public void mouseDragged(MouseEvent e) { + + } + + @Override + public void mouseMoved(MouseEvent e) { + + } + } } diff --git a/src/main/java/de/neemann/digital/gui/draw/graphics/Style.java b/src/main/java/de/neemann/digital/gui/draw/graphics/Style.java index 1fd5eee11..786865be7 100644 --- a/src/main/java/de/neemann/digital/gui/draw/graphics/Style.java +++ b/src/main/java/de/neemann/digital/gui/draw/graphics/Style.java @@ -8,9 +8,9 @@ import java.awt.*; public class Style { public static final Style NORMAL = new Style(2, false, Color.BLACK); public static final Style WIRE = new Style(2, true, Color.BLUE); + public static final Style WIRE_HIGH = new Style(2, true, new Color(0, 153, 255)); public static final Style FILLED = new Style(2, true, Color.BLACK); public static final Style THIN = new Style(1, false, Color.BLACK); - ; private final int thickness; private final boolean filled; diff --git a/src/main/java/de/neemann/digital/gui/draw/model/ModelDescription.java b/src/main/java/de/neemann/digital/gui/draw/model/ModelDescription.java index d50200b83..6d3f9afd8 100644 --- a/src/main/java/de/neemann/digital/gui/draw/model/ModelDescription.java +++ b/src/main/java/de/neemann/digital/gui/draw/model/ModelDescription.java @@ -1,9 +1,6 @@ package de.neemann.digital.gui.draw.model; -import de.neemann.digital.core.Model; -import de.neemann.digital.core.NodeException; -import de.neemann.digital.core.Part; -import de.neemann.digital.core.PartDescription; +import de.neemann.digital.core.*; import de.neemann.digital.gui.draw.parts.*; import java.util.ArrayList; @@ -27,20 +24,21 @@ public class ModelDescription { Part part = partDescription.create(); pins.setOutputs(part.getOutputs()); - entries.add(new ModelEntry(part, pins, partDescription.getInputNames())); + entries.add(new ModelEntry(part, pins, vp)); for (Pin p : pins) netList.add(p); } } - public Model create() throws PinException, NodeException { + public Model create(Listener listener) throws PinException, NodeException { for (Net n : netList) n.interconnect(); - for (ModelEntry e : entries) - e.applyInputs(); - Model m = new Model(); + + for (ModelEntry e : entries) + e.applyInputs(listener, m); + for (ModelEntry e : entries) e.getPart().registerNodes(m); diff --git a/src/main/java/de/neemann/digital/gui/draw/model/ModelEntry.java b/src/main/java/de/neemann/digital/gui/draw/model/ModelEntry.java index 31700fa82..a8d533979 100644 --- a/src/main/java/de/neemann/digital/gui/draw/model/ModelEntry.java +++ b/src/main/java/de/neemann/digital/gui/draw/model/ModelEntry.java @@ -1,11 +1,7 @@ package de.neemann.digital.gui.draw.model; -import de.neemann.digital.core.NodeException; -import de.neemann.digital.core.ObservableValue; -import de.neemann.digital.core.Part; -import de.neemann.digital.gui.draw.parts.Pin; -import de.neemann.digital.gui.draw.parts.PinException; -import de.neemann.digital.gui.draw.parts.Pins; +import de.neemann.digital.core.*; +import de.neemann.digital.gui.draw.parts.*; import java.util.HashMap; @@ -16,18 +12,20 @@ public class ModelEntry { private final Part part; private final Pins pins; private final String[] names; + private final VisualPart visualPart; - public ModelEntry(Part part, Pins pins, String[] names) { + public ModelEntry(Part part, Pins pins, VisualPart visualPart) { this.part = part; this.pins = pins; - this.names = names; + this.visualPart = visualPart; + this.names = visualPart.getPartDescription().getInputNames(); } - public void applyInputs() throws PinException, NodeException { + public void applyInputs(Listener listener, Model model) throws PinException, NodeException { HashMap ins = pins.getInputs(); + ObservableValue[] inputs = new ObservableValue[names.length]; if (names.length > 0) { - ObservableValue[] inputs = new ObservableValue[names.length]; for (int i = 0; i < names.length; i++) { Pin pin = ins.get(names[i]); if (pin == null) @@ -41,6 +39,7 @@ public class ModelEntry { } part.setInputs(inputs); } + visualPart.setState(new State(inputs, part.getOutputs()), listener, model); } public Part getPart() { diff --git a/src/main/java/de/neemann/digital/gui/draw/parts/Circuit.java b/src/main/java/de/neemann/digital/gui/draw/parts/Circuit.java index 7f92f69e6..056733699 100644 --- a/src/main/java/de/neemann/digital/gui/draw/parts/Circuit.java +++ b/src/main/java/de/neemann/digital/gui/draw/parts/Circuit.java @@ -24,13 +24,13 @@ public class Circuit implements Drawable { } @Override - public void drawTo(Graphic graphic) { + public void drawTo(Graphic graphic, State state) { for (Wire w : wires) - w.drawTo(graphic); + w.drawTo(graphic, state); for (Vector d : dots) graphic.drawCircle(d.sub(RAD), d.add(RAD), Style.WIRE); for (VisualPart p : visualParts) - p.drawTo(graphic); + p.drawTo(graphic, state); } public void add(VisualPart visualPart) { diff --git a/src/main/java/de/neemann/digital/gui/draw/parts/State.java b/src/main/java/de/neemann/digital/gui/draw/parts/State.java new file mode 100644 index 000000000..a1568fd74 --- /dev/null +++ b/src/main/java/de/neemann/digital/gui/draw/parts/State.java @@ -0,0 +1,24 @@ +package de.neemann.digital.gui.draw.parts; + +import de.neemann.digital.core.ObservableValue; + +/** + * @author hneemann + */ +public class State { + private final ObservableValue[] inputs; + private final ObservableValue[] outputs; + + public State(ObservableValue[] inputs, ObservableValue[] outputs) { + this.inputs = inputs; + this.outputs = outputs; + } + + public ObservableValue getInput(int i) { + return inputs[i]; + } + + public ObservableValue getOutput(int i) { + return outputs[i]; + } +} diff --git a/src/main/java/de/neemann/digital/gui/draw/parts/VisualPart.java b/src/main/java/de/neemann/digital/gui/draw/parts/VisualPart.java index 98fc5c7f6..a5f9b70ce 100644 --- a/src/main/java/de/neemann/digital/gui/draw/parts/VisualPart.java +++ b/src/main/java/de/neemann/digital/gui/draw/parts/VisualPart.java @@ -1,8 +1,12 @@ package de.neemann.digital.gui.draw.parts; +import de.neemann.digital.core.Listener; +import de.neemann.digital.core.Model; import de.neemann.digital.core.PartDescription; +import de.neemann.digital.gui.components.CircuitComponent; import de.neemann.digital.gui.draw.graphics.*; import de.neemann.digital.gui.draw.shapes.Drawable; +import de.neemann.digital.gui.draw.shapes.Interactor; import de.neemann.digital.gui.draw.shapes.Shape; import javax.swing.*; @@ -18,6 +22,8 @@ public class VisualPart implements Drawable, Moveable { private transient GraphicMinMax minMax; private Vector pos; private int rotate; + private State state; + private Interactor interactor; public VisualPart(PartDescription partDescription) { this.partDescription = partDescription; @@ -61,10 +67,10 @@ public class VisualPart implements Drawable, Moveable { } @Override - public void drawTo(Graphic graphic) { + public void drawTo(Graphic graphic, State state) { Graphic gr = new GraphicTransform(graphic, createTransform()); Shape shape = partDescription.getShape(); - shape.drawTo(gr); + shape.drawTo(gr, this.state); for (Pin p : shape.getPins(partDescription)) gr.drawCircle(p.getPos().add(-PIN, -PIN), p.getPos().add(PIN, PIN), p.getDirection() == Pin.Direction.input ? Style.NORMAL : Style.FILLED); } @@ -76,7 +82,7 @@ public class VisualPart implements Drawable, Moveable { public GraphicMinMax getMinMax() { if (minMax == null) { minMax = new GraphicMinMax(); - drawTo(minMax); + drawTo(minMax, state); } return minMax; } @@ -99,7 +105,7 @@ public class VisualPart implements Drawable, Moveable { gr.fillRect(0, 0, bi.getWidth(), bi.getHeight()); gr.translate(-mm.getMin().x, -mm.getMin().y); GraphicSwing grs = new GraphicSwing(gr); - drawTo(grs); + drawTo(grs, state); return new ImageIcon(bi); } @@ -116,4 +122,21 @@ public class VisualPart implements Drawable, Moveable { transformed.add(new Pin(tr.transform(p.getPos()), p)); return transformed; } + + /** + * Sets the state of the parts inputs and outputs + * + * @param state actual state + * @param listener + * @param model + */ + public void setState(State state, Listener listener, Model model) { + this.state = state; + interactor = partDescription.getShape().applyStateMonitor(state, listener, model); + } + + public void clicked(CircuitComponent cc, Vector pos) { + if (interactor != null) + interactor.interact(cc, pos, state); + } } \ No newline at end of file diff --git a/src/main/java/de/neemann/digital/gui/draw/parts/Wire.java b/src/main/java/de/neemann/digital/gui/draw/parts/Wire.java index f681ab7b3..e814eb758 100644 --- a/src/main/java/de/neemann/digital/gui/draw/parts/Wire.java +++ b/src/main/java/de/neemann/digital/gui/draw/parts/Wire.java @@ -19,7 +19,7 @@ public class Wire implements Drawable, Moveable { } @Override - public void drawTo(Graphic graphic) { + public void drawTo(Graphic graphic, State state) { graphic.drawLine(p1, p2, Style.WIRE); } diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/Drawable.java b/src/main/java/de/neemann/digital/gui/draw/shapes/Drawable.java index 41272000b..e87241ed8 100644 --- a/src/main/java/de/neemann/digital/gui/draw/shapes/Drawable.java +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/Drawable.java @@ -1,10 +1,17 @@ package de.neemann.digital.gui.draw.shapes; import de.neemann.digital.gui.draw.graphics.Graphic; +import de.neemann.digital.gui.draw.parts.State; /** * @author hneemann */ public interface Drawable { - void drawTo(Graphic graphic); + /** + * Draws a part depending on its state + * + * @param graphic + * @param state maybe null + */ + void drawTo(Graphic graphic, State state); } diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/GenericShape.java b/src/main/java/de/neemann/digital/gui/draw/shapes/GenericShape.java index 2beda69ed..cf2606623 100644 --- a/src/main/java/de/neemann/digital/gui/draw/shapes/GenericShape.java +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/GenericShape.java @@ -1,5 +1,7 @@ package de.neemann.digital.gui.draw.shapes; +import de.neemann.digital.core.Listener; +import de.neemann.digital.core.Model; import de.neemann.digital.core.ObservableValue; import de.neemann.digital.core.PartDescription; import de.neemann.digital.gui.draw.graphics.Graphic; @@ -8,6 +10,7 @@ import de.neemann.digital.gui.draw.graphics.Style; import de.neemann.digital.gui.draw.graphics.Vector; import de.neemann.digital.gui.draw.parts.Pin; import de.neemann.digital.gui.draw.parts.Pins; +import de.neemann.digital.gui.draw.parts.State; /** * @author hneemann @@ -72,7 +75,12 @@ public class GenericShape implements Shape { } @Override - public void drawTo(Graphic graphic) { + public Interactor applyStateMonitor(State state, Listener listener, Model model) { + return null; + } + + @Override + public void drawTo(Graphic graphic, State state) { int max = Math.max(inputs, outputs); int height = (max - 1) * SIZE + SIZE2; diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/InputShape.java b/src/main/java/de/neemann/digital/gui/draw/shapes/InputShape.java index 9f3a3d835..d476aa9c6 100644 --- a/src/main/java/de/neemann/digital/gui/draw/shapes/InputShape.java +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/InputShape.java @@ -1,12 +1,17 @@ package de.neemann.digital.gui.draw.shapes; +import de.neemann.digital.core.Listener; +import de.neemann.digital.core.Model; +import de.neemann.digital.core.NodeException; import de.neemann.digital.core.PartDescription; +import de.neemann.digital.gui.components.CircuitComponent; import de.neemann.digital.gui.draw.graphics.Graphic; import de.neemann.digital.gui.draw.graphics.Polygon; import de.neemann.digital.gui.draw.graphics.Style; import de.neemann.digital.gui.draw.graphics.Vector; import de.neemann.digital.gui.draw.parts.Pin; import de.neemann.digital.gui.draw.parts.Pins; +import de.neemann.digital.gui.draw.parts.State; import static de.neemann.digital.gui.draw.shapes.OutputShape.SIZE; @@ -16,6 +21,7 @@ import static de.neemann.digital.gui.draw.shapes.OutputShape.SIZE; public class InputShape implements Shape { private final int bits; + private long lastValue = 0; public InputShape(int bits) { this.bits = bits; @@ -27,7 +33,37 @@ public class InputShape implements Shape { } @Override - public void drawTo(Graphic graphic) { - graphic.drawPolygon(new Polygon(true).add(-SIZE * 2 - 2, -SIZE).add(-2, -SIZE).add(-2, SIZE).add(-SIZE * 2 - 2, SIZE), Style.NORMAL); + public Interactor applyStateMonitor(State state, Listener listener, Model model) { + state.getOutput(0).addListener(new Listener() { + @Override + public void needsUpdate() { + long value = state.getOutput(0).getValue(); + if (lastValue != value) { + lastValue = value; + listener.needsUpdate(); + } + } + }); + return new Interactor() { + @Override + public void interact(CircuitComponent cc, Vector pos, State state) { + long v = state.getOutput(0).getValue(); + state.getOutput(0).setValue(1 - v); + try { + model.doStep(); + } catch (NodeException e) { + e.printStackTrace(); + } + } + }; + } + + @Override + public void drawTo(Graphic graphic, State state) { + Style style = Style.WIRE; + if (state != null && state.getOutput(0).getValue() != 0) + style = Style.WIRE_HIGH; + + graphic.drawPolygon(new Polygon(true).add(-SIZE * 2 - 2, -SIZE).add(-2, -SIZE).add(-2, SIZE).add(-SIZE * 2 - 2, SIZE), style); } } diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/Interactor.java b/src/main/java/de/neemann/digital/gui/draw/shapes/Interactor.java new file mode 100644 index 000000000..91667c088 --- /dev/null +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/Interactor.java @@ -0,0 +1,12 @@ +package de.neemann.digital.gui.draw.shapes; + +import de.neemann.digital.gui.components.CircuitComponent; +import de.neemann.digital.gui.draw.graphics.Vector; +import de.neemann.digital.gui.draw.parts.State; + +/** + * @author hneemann + */ +public interface Interactor { + void interact(CircuitComponent cc, Vector pos, State state); +} diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/OutputShape.java b/src/main/java/de/neemann/digital/gui/draw/shapes/OutputShape.java index dbaea25d0..9d9c14601 100644 --- a/src/main/java/de/neemann/digital/gui/draw/shapes/OutputShape.java +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/OutputShape.java @@ -1,11 +1,14 @@ package de.neemann.digital.gui.draw.shapes; +import de.neemann.digital.core.Listener; +import de.neemann.digital.core.Model; import de.neemann.digital.core.PartDescription; import de.neemann.digital.gui.draw.graphics.Graphic; import de.neemann.digital.gui.draw.graphics.Style; import de.neemann.digital.gui.draw.graphics.Vector; import de.neemann.digital.gui.draw.parts.Pin; import de.neemann.digital.gui.draw.parts.Pins; +import de.neemann.digital.gui.draw.parts.State; /** * @author hneemann @@ -24,7 +27,28 @@ public class OutputShape implements Shape { } @Override - public void drawTo(Graphic graphic) { - graphic.drawCircle(new Vector(2 + SIZE * 2, -SIZE), new Vector(2, SIZE), Style.NORMAL); + public Interactor applyStateMonitor(State state, Listener listener, Model model) { + state.getInput(0).addListener(new Listener() { + public long lastValue = 0; + + @Override + public void needsUpdate() { + long value = state.getInput(0).getValue(); + if (lastValue != value) { + lastValue = value; + listener.needsUpdate(); + } + } + }); + return null; + } + + @Override + public void drawTo(Graphic graphic, State state) { + Style style = Style.WIRE; + if (state != null && state.getInput(0).getValue() != 0) + style = Style.WIRE_HIGH; + + graphic.drawCircle(new Vector(2 + SIZE * 2, -SIZE), new Vector(2, SIZE), style); } } diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/Shape.java b/src/main/java/de/neemann/digital/gui/draw/shapes/Shape.java index d1ca0f5e5..4df11b7df 100644 --- a/src/main/java/de/neemann/digital/gui/draw/shapes/Shape.java +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/Shape.java @@ -1,7 +1,10 @@ package de.neemann.digital.gui.draw.shapes; +import de.neemann.digital.core.Listener; +import de.neemann.digital.core.Model; import de.neemann.digital.core.PartDescription; import de.neemann.digital.gui.draw.parts.Pins; +import de.neemann.digital.gui.draw.parts.State; /** * @author hneemann @@ -11,9 +14,19 @@ public interface Shape extends Drawable { /** * Puts the pins name and the pins x-y-position together! * - * @param partDescription + * @param partDescription the description of the part * @return the pins */ Pins getPins(PartDescription partDescription); + /** + * If the look of the shape depends on an input or output state, the + * shape can register a state monitor to the state. + * If the monitor decides to update the GUI it can call listener.needsUpdate. + * Caution: Don't store state in the shape itself! + * + * @param state the state + */ + Interactor applyStateMonitor(State state, Listener listener, Model model); + } diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/StateMonitor.java b/src/main/java/de/neemann/digital/gui/draw/shapes/StateMonitor.java new file mode 100644 index 000000000..e80e6175c --- /dev/null +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/StateMonitor.java @@ -0,0 +1,7 @@ +package de.neemann.digital.gui.draw.shapes; + +/** + * @author hneemann + */ +public interface StateMonitor { +}