removed the observer from the applyStateMonitor method

This commit is contained in:
hneemann 2020-04-09 22:12:33 +02:00
parent dfd9fb8ac7
commit 395c3dd47d
60 changed files with 101 additions and 226 deletions

View File

@ -333,7 +333,7 @@ public class VisualElement implements Drawable, Movable, AttributeListener {
interactor = null; interactor = null;
resetShape(); resetShape();
} else } else
interactor = getShape().applyStateMonitor(ioState, null); interactor = getShape().applyStateMonitor(ioState);
} }
/** /**
@ -344,13 +344,10 @@ public class VisualElement implements Drawable, Movable, AttributeListener {
* @param pos the position * @param pos the position
* @param posInComponent position in CircuitComponent * @param posInComponent position in CircuitComponent
* @param modelSync used to access the running model * @param modelSync used to access the running model
* @return true if model is changed
*/ */
public boolean elementClicked(CircuitComponent cc, Point pos, Vector posInComponent, SyncAccess modelSync) { public void elementClicked(CircuitComponent cc, Point pos, Vector posInComponent, SyncAccess modelSync) {
if (interactor != null) if (interactor != null)
return interactor.clicked(cc, pos, ioState, element, modelSync); interactor.clicked(cc, pos, ioState, element, modelSync);
else
return false;
} }
/** /**
@ -361,13 +358,10 @@ public class VisualElement implements Drawable, Movable, AttributeListener {
* @param pos the position * @param pos the position
* @param posInComponent position in CircuitComponent * @param posInComponent position in CircuitComponent
* @param modelSync used to access the running model * @param modelSync used to access the running model
* @return true if model is changed
*/ */
public boolean elementPressed(CircuitComponent cc, Point pos, Vector posInComponent, SyncAccess modelSync) { public void elementPressed(CircuitComponent cc, Point pos, Vector posInComponent, SyncAccess modelSync) {
if (interactor != null) if (interactor != null)
return interactor.pressed(cc, pos, ioState, element, modelSync); interactor.pressed(cc, pos, ioState, element, modelSync);
else
return false;
} }
/** /**
@ -378,13 +372,10 @@ public class VisualElement implements Drawable, Movable, AttributeListener {
* @param pos the position * @param pos the position
* @param posInComponent position in CircuitComponent * @param posInComponent position in CircuitComponent
* @param modelSync used to access the running model * @param modelSync used to access the running model
* @return true if model is changed
*/ */
public boolean elementReleased(CircuitComponent cc, Point pos, Vector posInComponent, SyncAccess modelSync) { public void elementReleased(CircuitComponent cc, Point pos, Vector posInComponent, SyncAccess modelSync) {
if (interactor != null) if (interactor != null)
return interactor.released(cc, pos, ioState, element, modelSync); interactor.released(cc, pos, ioState, element, modelSync);
else
return false;
} }
/** /**
@ -395,13 +386,10 @@ public class VisualElement implements Drawable, Movable, AttributeListener {
* @param pos the position * @param pos the position
* @param posInComponent position in CircuitComponent * @param posInComponent position in CircuitComponent
* @param modelSync used to access the running model * @param modelSync used to access the running model
* @return true if model is changed
*/ */
public boolean elementDragged(CircuitComponent cc, Point pos, Vector posInComponent, SyncAccess modelSync) { public void elementDragged(CircuitComponent cc, Point pos, Vector posInComponent, SyncAccess modelSync) {
if (interactor != null) if (interactor != null)
return interactor.dragged(cc, pos, posInComponent, getTransform(), ioState, element, modelSync); interactor.dragged(cc, pos, posInComponent, getTransform(), ioState, element, modelSync);
else
return false;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
import de.neemann.digital.draw.elements.IOState; import de.neemann.digital.draw.elements.IOState;
@ -43,7 +42,7 @@ public class AsyncClockShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -50,7 +49,7 @@ public class BitSelShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -51,7 +50,7 @@ public class BreakShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -6,7 +6,6 @@
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.BitsException; import de.neemann.digital.core.BitsException;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -56,7 +55,7 @@ public class BusSplitterShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -6,7 +6,6 @@
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.ObservableValue; import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.Value; import de.neemann.digital.core.Value;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
@ -56,10 +55,10 @@ public class ButtonLEDShape extends ButtonShape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
inputValue = ioState.getInput(0); inputValue = ioState.getInput(0);
button = (ButtonLED) ioState.getElement(); button = (ButtonLED) ioState.getElement();
return super.applyStateMonitor(ioState, guiObserver); return super.applyStateMonitor(ioState);
} }
@Override @Override

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.SyncAccess; import de.neemann.digital.core.SyncAccess;
import de.neemann.digital.core.element.Element; import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
@ -51,30 +50,25 @@ public class ButtonShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
this.button = (Button) ioState.getElement(); this.button = (Button) ioState.getElement();
ioState.getOutput(0).addObserverToValue(guiObserver);
return new InteractorInterface() { return new InteractorInterface() {
@Override @Override
public boolean clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) { public void clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) {
return false;
} }
@Override @Override
public boolean pressed(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) { public void pressed(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) {
modelSync.modify(() -> button.setPressed(true)); modelSync.modify(() -> button.setPressed(true));
return true;
} }
@Override @Override
public boolean released(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) { public void released(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) {
modelSync.modify(() -> button.setPressed(false)); modelSync.modify(() -> button.setPressed(false));
return true;
} }
@Override @Override
public boolean dragged(CircuitComponent cc, Point posOnScreen, Vector pos, Transform trans, IOState ioState, Element element, SyncAccess modelSync) { public void dragged(CircuitComponent cc, Point posOnScreen, Vector pos, Transform trans, IOState ioState, Element element, SyncAccess modelSync) {
return false;
} }
}; };
} }

View File

@ -6,7 +6,6 @@
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.ObservableValue; import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.SyncAccess; import de.neemann.digital.core.SyncAccess;
import de.neemann.digital.core.element.Element; import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
@ -56,17 +55,13 @@ public class ClockShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
ioState.getOutput(0).addObserverToValue(guiObserver); // necessary to replot wires also if component itself does not depend on state
return new Interactor() { return new Interactor() {
@Override @Override
public boolean clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) { public void clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) {
ObservableValue value = ioState.getOutput(0); ObservableValue value = ioState.getOutput(0);
if (value.getBits() == 1) { if (value.getBits() == 1)
modelSync.modify(() -> value.setValue(1 - value.getValue())); modelSync.modify(() -> value.setValue(1 - value.getValue()));
return true;
}
return false;
} }
}; };
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.Value; import de.neemann.digital.core.Value;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
@ -47,7 +46,7 @@ public class ConstShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescription; import de.neemann.digital.core.element.PinDescription;
@ -66,7 +65,7 @@ public class DILShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -6,7 +6,6 @@
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Model; import de.neemann.digital.core.Model;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.Signal; import de.neemann.digital.core.Signal;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
@ -54,7 +53,7 @@ public class DataShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.draw.elements.IOState; import de.neemann.digital.draw.elements.IOState;
import de.neemann.digital.draw.elements.Pin; import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins; import de.neemann.digital.draw.elements.Pins;
@ -39,7 +38,7 @@ public class DelayShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -63,7 +62,7 @@ public class DemuxerShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -50,7 +49,7 @@ public class DiodeBackwardShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -50,7 +49,7 @@ public class DiodeForewardShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -48,7 +47,7 @@ public class DiodeShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -6,7 +6,6 @@
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.ObservableValue; import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.SyncAccess; import de.neemann.digital.core.SyncAccess;
import de.neemann.digital.core.Value; import de.neemann.digital.core.Value;
import de.neemann.digital.core.element.Element; import de.neemann.digital.core.element.Element;
@ -75,15 +74,13 @@ public class DipSwitchShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
this.ioState = ioState; this.ioState = ioState;
ioState.getOutput(0).addObserverToValue(guiObserver);
return new Interactor() { return new Interactor() {
@Override @Override
public boolean clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) { public void clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) {
ObservableValue value = ioState.getOutput(0); ObservableValue value = ioState.getOutput(0);
modelSync.modify(() -> value.setValue(1 - value.getValue())); modelSync.modify(() -> value.setValue(1 - value.getValue()));
return true;
} }
}; };
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -68,7 +67,7 @@ public class DriverShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
import de.neemann.digital.core.switching.NFET; import de.neemann.digital.core.switching.NFET;
@ -49,9 +48,8 @@ public abstract class FETShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
fet = (NFET) ioState.getElement(); fet = (NFET) ioState.getElement();
ioState.getInput(0).addObserverToValue(guiObserver);
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -63,7 +62,7 @@ public class FuseShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
import de.neemann.digital.draw.elements.IOState; import de.neemann.digital.draw.elements.IOState;
import de.neemann.digital.draw.elements.Pin; import de.neemann.digital.draw.elements.Pin;
@ -195,7 +194,7 @@ public class GenericShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
import de.neemann.digital.draw.elements.IOState; import de.neemann.digital.draw.elements.IOState;
@ -41,7 +40,7 @@ public class GroundShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -82,9 +82,8 @@ public class InputShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
this.ioState = ioState; this.ioState = ioState;
ioState.getOutput(0).addObserverToValue(guiObserver);
return new InputInteractor(); return new InputInteractor();
} }
@ -148,7 +147,7 @@ public class InputShape implements Shape {
private long lastValueSet; private long lastValueSet;
@Override @Override
public boolean clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) { public void clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) {
ObservableValue value = ioState.getOutput(0); ObservableValue value = ioState.getOutput(0);
if (bits == 1) { if (bits == 1) {
modelSync.modify(() -> { modelSync.modify(() -> {
@ -163,7 +162,6 @@ public class InputShape implements Shape {
} else } else
value.setValue(1 - value.getValue()); value.setValue(1 - value.getValue());
}); });
return true;
} else { } else {
if (dialog == null || !dialog.isVisible()) { if (dialog == null || !dialog.isVisible()) {
Model model = ((In) element).getModel(); Model model = ((In) element).getModel();
@ -172,18 +170,16 @@ public class InputShape implements Shape {
} else } else
dialog.requestFocus(); dialog.requestFocus();
return false;
} }
} }
@Override @Override
public boolean pressed(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) { public void pressed(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) {
isDrag = false; isDrag = false;
return false;
} }
@Override @Override
public boolean dragged(CircuitComponent cc, Point posOnScreen, Vector pos, Transform transform, IOState ioState, Element element, SyncAccess modelSync) { public void dragged(CircuitComponent cc, Point posOnScreen, Vector pos, Transform transform, IOState ioState, Element element, SyncAccess modelSync) {
ObservableValue value = ioState.getOutput(0); ObservableValue value = ioState.getOutput(0);
if (bits > 1 && !value.isHighZ()) { if (bits > 1 && !value.isHighZ()) {
if (!isDrag) { if (!isDrag) {
@ -198,11 +194,9 @@ public class InputShape implements Shape {
if (val != lastValueSet) { if (val != lastValueSet) {
modelSync.modify(() -> value.setValue(val)); modelSync.modify(() -> value.setValue(val));
lastValueSet = val; lastValueSet = val;
return true;
} }
} }
} }
return false;
} }
} }
} }

View File

@ -23,17 +23,14 @@ import java.awt.*;
public abstract class Interactor implements InteractorInterface { public abstract class Interactor implements InteractorInterface {
@Override @Override
public boolean pressed(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) { public void pressed(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) {
return false;
} }
@Override @Override
public boolean released(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) { public void released(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) {
return false;
} }
@Override @Override
public boolean dragged(CircuitComponent cc, Point posOnScreen, Vector pos, Transform transform, IOState ioState, Element element, SyncAccess modelSync) { public void dragged(CircuitComponent cc, Point posOnScreen, Vector pos, Transform transform, IOState ioState, Element element, SyncAccess modelSync) {
return false;
} }
} }

View File

@ -30,9 +30,8 @@ public interface InteractorInterface {
* @param ioState the state of the element * @param ioState the state of the element
* @param element the element which is clicked * @param element the element which is clicked
* @param modelSync used to sync model access * @param modelSync used to sync model access
* @return true if model is changed
*/ */
boolean clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync); void clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync);
/** /**
* Called if mouse is pressed on running model * Called if mouse is pressed on running model
@ -42,9 +41,8 @@ public interface InteractorInterface {
* @param ioState the state of the element * @param ioState the state of the element
* @param element the element on which the mouse is pressed * @param element the element on which the mouse is pressed
* @param modelSync used to sync model access * @param modelSync used to sync model access
* @return true if model is changed
*/ */
boolean pressed(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync); void pressed(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync);
/** /**
* Called if mouse is released on running model * Called if mouse is released on running model
@ -54,9 +52,8 @@ public interface InteractorInterface {
* @param ioState the state of the element * @param ioState the state of the element
* @param element the element on which the mouse is released * @param element the element on which the mouse is released
* @param modelSync used to sync model access * @param modelSync used to sync model access
* @return true if model is changed
*/ */
boolean released(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync); void released(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync);
/** /**
* Called if mouse is dragged on running model * Called if mouse is dragged on running model
@ -68,8 +65,7 @@ public interface InteractorInterface {
* @param ioState the state of the element * @param ioState the state of the element
* @param element the element on which the mouse is dragged * @param element the element on which the mouse is dragged
* @param modelSync used to sync model access * @param modelSync used to sync model access
* @return true if model is changed
*/ */
boolean dragged(CircuitComponent cc, Point posOnScreen, Vector pos, Transform transform, IOState ioState, Element element, SyncAccess modelSync); void dragged(CircuitComponent cc, Point posOnScreen, Vector pos, Transform transform, IOState ioState, Element element, SyncAccess modelSync);
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.Value; import de.neemann.digital.core.Value;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
@ -53,9 +52,8 @@ public class LEDShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
this.ioState = ioState; this.ioState = ioState;
ioState.getInput(0).addObserverToValue(guiObserver);
return null; return null;
} }

View File

@ -6,7 +6,6 @@
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.NodeException; import de.neemann.digital.core.NodeException;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescription; import de.neemann.digital.core.element.PinDescription;
@ -131,7 +130,7 @@ public class LayoutShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -6,7 +6,6 @@
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.ObservableValue; import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.Value; import de.neemann.digital.core.Value;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
@ -54,9 +53,9 @@ public class LightBulbShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
aValue = ioState.getInput(0).addObserverToValue(guiObserver); aValue = ioState.getInput(0);
bValue = ioState.getInput(1).addObserverToValue(guiObserver); bValue = ioState.getInput(1);
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.draw.elements.IOState; import de.neemann.digital.draw.elements.IOState;
import de.neemann.digital.draw.elements.Pins; import de.neemann.digital.draw.elements.Pins;
import de.neemann.digital.draw.graphics.Graphic; import de.neemann.digital.draw.graphics.Graphic;
@ -40,7 +39,7 @@ public class MissingShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -58,7 +57,7 @@ public class MuxerShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.Value; import de.neemann.digital.core.Value;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
@ -70,9 +69,8 @@ public class OutputShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
this.ioState = ioState; this.ioState = ioState;
ioState.getInput(0).addObserverToValue(guiObserver);
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
import de.neemann.digital.draw.elements.IOState; import de.neemann.digital.draw.elements.IOState;
@ -48,7 +47,7 @@ public class PinControlShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -6,7 +6,6 @@
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.ObservableValue; import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.Value; import de.neemann.digital.core.Value;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
@ -60,9 +59,9 @@ public class PolarityAwareLEDShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
aValue = ioState.getInput(0).addObserverToValue(guiObserver); aValue = ioState.getInput(0);
cValue = ioState.getInput(1).addObserverToValue(guiObserver); cValue = ioState.getInput(1);
return null; return null;
} }

View File

@ -7,7 +7,6 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.IntFormat; import de.neemann.digital.core.IntFormat;
import de.neemann.digital.core.ObservableValue; import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.Value; import de.neemann.digital.core.Value;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
@ -52,9 +51,8 @@ public class ProbeShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
inValue = ioState.getInput(0); inValue = ioState.getInput(0);
inValue.addObserverToValue(guiObserver);
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
import de.neemann.digital.draw.elements.IOState; import de.neemann.digital.draw.elements.IOState;
@ -52,7 +51,7 @@ public class PullDownShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
import de.neemann.digital.draw.elements.IOState; import de.neemann.digital.draw.elements.IOState;
@ -46,7 +45,7 @@ public class PullUpShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -7,7 +7,6 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Model; import de.neemann.digital.core.Model;
import de.neemann.digital.core.NodeException; import de.neemann.digital.core.NodeException;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.SyncAccess; import de.neemann.digital.core.SyncAccess;
import de.neemann.digital.core.element.*; import de.neemann.digital.core.element.*;
import de.neemann.digital.core.memory.DataField; import de.neemann.digital.core.memory.DataField;
@ -66,17 +65,16 @@ public class RAMShape extends GenericShape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
return new Interactor() { return new Interactor() {
@Override @Override
public boolean clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) { public void clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) {
if (element instanceof RAMInterface) { if (element instanceof RAMInterface) {
RAMInterface ram = (RAMInterface) element; RAMInterface ram = (RAMInterface) element;
DataField dataField = ram.getMemory(); DataField dataField = ram.getMemory();
DataEditor dataEditor = new DataEditor(cc, dataField, dataBits, addrBits, true, modelSync, ram.getIntFormat()); DataEditor dataEditor = new DataEditor(cc, dataField, dataBits, addrBits, true, modelSync, ram.getIntFormat());
dataEditor.showDialog(dialogTitle, model); dataEditor.showDialog(dialogTitle, model);
} }
return false;
} }
}; };
} }

View File

@ -6,7 +6,6 @@
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Bits; import de.neemann.digital.core.Bits;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -60,11 +59,8 @@ public class RGBLEDShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
this.ioState = ioState; this.ioState = ioState;
ioState.getInput(0).addObserverToValue(guiObserver);
ioState.getInput(1).addObserverToValue(guiObserver);
ioState.getInput(2).addObserverToValue(guiObserver);
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -58,7 +57,7 @@ public class RectShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -63,10 +62,8 @@ public class RelayDTShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
relay = (RelayDT) ioState.getElement(); relay = (RelayDT) ioState.getElement();
ioState.getInput(0).addObserverToValue(guiObserver);
ioState.getInput(1).addObserverToValue(guiObserver);
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -65,10 +64,8 @@ public class RelayShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
relay = (Relay) ioState.getElement(); relay = (Relay) ioState.getElement();
ioState.getInput(0).addObserverToValue(guiObserver);
ioState.getInput(1).addObserverToValue(guiObserver);
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -45,7 +44,7 @@ public class ResetShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
//ioState.getOutput(0).addObserverToValue(guiObserver); //ioState.getOutput(0).addObserverToValue(guiObserver);
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.SyncAccess; import de.neemann.digital.core.SyncAccess;
import de.neemann.digital.core.element.Element; import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
@ -54,31 +53,27 @@ public class RotEncoderShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
ioState.getOutput(0).addObserverToValue(guiObserver);
return new InteractorInterface() { return new InteractorInterface() {
private int initialState; private int initialState;
private boolean initial; private boolean initial;
@Override @Override
public boolean clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) { public void clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) {
return false;
} }
@Override @Override
public boolean pressed(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) { public void pressed(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) {
initial = true; initial = true;
return false;
} }
@Override @Override
public boolean released(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) { public void released(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) {
return false;
} }
@Override @Override
public boolean dragged(CircuitComponent cc, Point posOnScreen, Vector pos, Transform trans, IOState ioState, Element element, SyncAccess modelSync) { public void dragged(CircuitComponent cc, Point posOnScreen, Vector pos, Transform trans, IOState ioState, Element element, SyncAccess modelSync) {
if (ioState != null) { if (ioState != null) {
Vector p = pos.sub(trans.transform(CENTER)); Vector p = pos.sub(trans.transform(CENTER));
final int dist = p.x * p.x + p.y * p.y; final int dist = p.x * p.x + p.y * p.y;
@ -97,13 +92,11 @@ public class RotEncoderShape implements Shape {
ioState.getOutput(0).setBool(a); ioState.getOutput(0).setBool(a);
ioState.getOutput(1).setBool(b); ioState.getOutput(1).setBool(b);
}); });
return true;
} }
} }
} else } else
initial = true; initial = true;
} }
return false;
} }
}; };
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.Value; import de.neemann.digital.core.Value;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -72,10 +71,8 @@ public class SevenSegHexShape extends SevenShape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
this.ioState = ioState; this.ioState = ioState;
ioState.getInput(0).addObserverToValue(guiObserver);
ioState.getInput(1).addObserverToValue(guiObserver);
return null; return null;
} }
} }

View File

@ -5,9 +5,7 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.ObservableValues; import de.neemann.digital.core.ObservableValues;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.Value; import de.neemann.digital.core.Value;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
@ -72,10 +70,8 @@ public class SevenSegShape extends SevenShape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
inputValues = ioState.getInputs(); inputValues = ioState.getInputs();
for (ObservableValue o : inputValues)
o.addObserverToValue(guiObserver);
return null; return null;
} }

View File

@ -6,7 +6,6 @@
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Model; import de.neemann.digital.core.Model;
import de.neemann.digital.core.Observer;
import de.neemann.digital.draw.elements.IOState; import de.neemann.digital.draw.elements.IOState;
import de.neemann.digital.draw.elements.Pins; import de.neemann.digital.draw.elements.Pins;
import de.neemann.digital.draw.model.ModelCreator; import de.neemann.digital.draw.model.ModelCreator;
@ -29,20 +28,15 @@ public interface Shape extends Drawable, ObservableValueReader {
/** /**
* This method call connects the created model element to the shape which represents the model node. * This method call connects the created model element to the shape which represents the model node.
* If the look of the shape depends on an inputs state, the shape has to register the guiObserver
* to all of the inputs ObservableValues it depends on.
* To access the actual state while drawing, the Shape needs to store the IOState or the needed inputs * To access the actual state while drawing, the Shape needs to store the IOState or the needed inputs
* in a member variable. * in a member variable.
* If the shape returns an interactor, this interactors clicked method is called if the * If the shape returns an interactor, this interactors clicked method is called if the
* shape is clicked in running mode. If the shape is not interactive simply return null. * shape is clicked in running mode. If the shape is not interactive simply return null.
* *
* @param ioState the state of the element, never null * @param ioState the state of the element, never null
* @param guiObserver can be used to update the GUI by calling hasChanged, Is maybe null.
* If the shape depends on a signal value, you can add this observer to
* the signal. In this case a repaint is initiated, if the signal changes.
* @return The interactor which is used to interact with the shape while the simulation runs. * @return The interactor which is used to interact with the shape while the simulation runs.
*/ */
InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver); InteractorInterface applyStateMonitor(IOState ioState);
/** /**
* Allows the shape to make its drawing dependent of the model by registering a Observer to the model. * Allows the shape to make its drawing dependent of the model by registering a Observer to the model.

View File

@ -6,7 +6,6 @@
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.ObservableValue; import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.Value; import de.neemann.digital.core.Value;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
@ -80,9 +79,9 @@ public class SixteenShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
input = ioState.getInput(0).addObserverToValue(guiObserver); input = ioState.getInput(0);
dp = ioState.getInput(1).addObserverToValue(guiObserver); dp = ioState.getInput(1);
return null; return null;
} }

View File

@ -6,7 +6,6 @@
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.BitsException; import de.neemann.digital.core.BitsException;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -56,7 +55,7 @@ public class SplitterShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
import de.neemann.digital.core.io.StepperMotorUnipolar; import de.neemann.digital.core.io.StepperMotorUnipolar;
@ -57,9 +56,7 @@ public class StepperMotorShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
for (int i = 0; i < 4; i++)
ioState.getInput(i).addObserver(guiObserver);
motor = (StepperMotorUnipolar) ioState.getElement(); motor = (StepperMotorUnipolar) ioState.getElement();
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.SyncAccess; import de.neemann.digital.core.SyncAccess;
import de.neemann.digital.core.element.Element; import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
@ -64,16 +63,14 @@ public class SwitchDTShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
return new Interactor() { return new Interactor() {
@Override @Override
public boolean clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) { public void clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) {
closed = !closed; closed = !closed;
if (ioState != null) { if (ioState != null)
modelSync.modify(() -> ((SwitchDT) element).setClosed(closed)); modelSync.modify(() -> ((SwitchDT) element).setClosed(closed));
} }
return true;
}
}; };
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.SyncAccess; import de.neemann.digital.core.SyncAccess;
import de.neemann.digital.core.element.Element; import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
@ -63,16 +62,14 @@ public class SwitchShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
return new Interactor() { return new Interactor() {
@Override @Override
public boolean clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) { public void clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, SyncAccess modelSync) {
closed = !closed; closed = !closed;
if (ioState != null) { if (ioState != null)
modelSync.modify(() -> ((Switch) element).setClosed(closed)); modelSync.modify(() -> ((Switch) element).setClosed(closed));
} }
return true;
}
}; };
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
import de.neemann.digital.draw.elements.IOState; import de.neemann.digital.draw.elements.IOState;
@ -43,7 +42,7 @@ public class TestCaseShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -57,7 +56,7 @@ public class TextShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
import de.neemann.digital.core.switching.TransGate; import de.neemann.digital.core.switching.TransGate;
@ -65,7 +64,7 @@ public class TransGateShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
transGate = (TransGate) ioState.getElement(); transGate = (TransGate) ioState.getElement();
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescription; import de.neemann.digital.core.element.PinDescription;
@ -46,7 +45,7 @@ public class TunnelShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes; package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
import de.neemann.digital.draw.elements.IOState; import de.neemann.digital.draw.elements.IOState;
@ -43,7 +42,7 @@ public class VDDShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes.custom; package de.neemann.digital.draw.shapes.custom;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.PinDescription; import de.neemann.digital.core.element.PinDescription;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
import de.neemann.digital.draw.elements.IOState; import de.neemann.digital.draw.elements.IOState;
@ -61,7 +60,7 @@ public class CustomShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes.ieee; package de.neemann.digital.draw.shapes.ieee;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -57,7 +56,7 @@ public abstract class IEEEGenericShape implements Shape {
} }
@Override @Override
public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { public InteractorInterface applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -5,7 +5,6 @@
*/ */
package de.neemann.digital.draw.shapes.ieee; package de.neemann.digital.draw.shapes.ieee;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions; import de.neemann.digital.core.element.PinDescriptions;
@ -58,7 +57,7 @@ public class IEEENotShape implements Shape {
} }
@Override @Override
public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { public Interactor applyStateMonitor(IOState ioState) {
return null; return null;
} }

View File

@ -34,7 +34,7 @@ public class SevenSegShapeTest extends TestCase {
PinDescriptions inputs = new PinDescriptions(observableValues); PinDescriptions inputs = new PinDescriptions(observableValues);
SevenSegShape ss = new SevenSegShape(attr, inputs, new PinDescriptions()); SevenSegShape ss = new SevenSegShape(attr, inputs, new PinDescriptions());
IOState state = new IOState(observableValues, null, null); IOState state = new IOState(observableValues, null, null);
ss.applyStateMonitor(state, null); ss.applyStateMonitor(state);
checkValue(false, ss, 0, a, 0, 1, cc, 0, 1); checkValue(false, ss, 0, a, 0, 1, cc, 0, 1);
checkValue(false, ss, 0, a, 0, 1, cc, 1, 1); checkValue(false, ss, 0, a, 0, 1, cc, 1, 1);
@ -95,7 +95,7 @@ public class SevenSegShapeTest extends TestCase {
PinDescriptions inputs = new PinDescriptions(observableValues); PinDescriptions inputs = new PinDescriptions(observableValues);
SevenSegShape ss = new SevenSegShape(attr, inputs, new PinDescriptions()); SevenSegShape ss = new SevenSegShape(attr, inputs, new PinDescriptions());
IOState state = new IOState(observableValues, null, null); IOState state = new IOState(observableValues, null, null);
ss.applyStateMonitor(state, null); ss.applyStateMonitor(state);
checkValue(false, ss, 0, a, 0, 1, cc, 0, 1); checkValue(false, ss, 0, a, 0, 1, cc, 0, 1);
checkValue(false, ss, 0, a, 0, 1, cc, 1, 1); checkValue(false, ss, 0, a, 0, 1, cc, 1, 1);