1 package net.mograsim.logic.model.model.components.atomic;
3 import java.util.HashMap;
6 import net.haspamelodica.swt.helper.gcs.GeneralGC;
7 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
8 import net.mograsim.logic.core.wires.Wire.ReadEnd;
9 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
10 import net.mograsim.logic.model.model.ViewModelModifiable;
11 import net.mograsim.logic.model.model.components.GUIComponent;
12 import net.mograsim.logic.model.model.wires.Pin;
13 import net.mograsim.logic.model.modeladapter.ViewLogicModelAdapter;
14 import net.mograsim.logic.model.modeladapter.componentadapters.SimpleRectangularHardcodedGUIComponentAdapter;
15 import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer;
16 import net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer;
17 import net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer.CenteredTextParams;
18 import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer;
19 import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams;
20 import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position;
22 public abstract class SimpleRectangularHardcodedGUIComponent extends GUIComponent
24 private static final double centerTextHeight = 5;
25 private static final double pinNamesHeight = 3.5;
26 private static final double pinNamesMargin = .5;
28 // TODO maybe make this more general?
29 private final Map<Pin, Usage> pinUsages;
31 private final DefaultOutlineRenderer outlineRenderer;
32 private final CenteredTextSymbolRenderer centerTextRenderer;
33 private final PinNamesSymbolRenderer pinNamesRenderer;
35 // creation and destruction
37 public SimpleRectangularHardcodedGUIComponent(ViewModelModifiable model, String name, String centerText)
40 pinUsages = new HashMap<>();
41 this.outlineRenderer = new DefaultOutlineRenderer(this);
42 CenteredTextParams centeredTextParams = new CenteredTextParams();
43 centeredTextParams.text = centerText;
44 centeredTextParams.fontHeight = centerTextHeight;
45 this.centerTextRenderer = new CenteredTextSymbolRenderer(this, centeredTextParams);
46 PinNamesParams pinNamesParams = new PinNamesParams();
47 pinNamesParams.pinLabelHeight = pinNamesHeight;
48 pinNamesParams.pinLabelMargin = pinNamesMargin;
49 this.pinNamesRenderer = new PinNamesSymbolRenderer(this, pinNamesParams);
50 addPinRemovedListener(this::pinRemoved);
55 protected void addPin(Pin pin, Usage usage, Position namePosition)
57 super.addPin(pin); // do this first to catch errors
58 pinUsages.put(pin, usage);
59 pinNamesRenderer.setPinPosition(pin, namePosition);
62 private void pinRemoved(Pin pin)
64 pinUsages.remove(pin);
65 pinNamesRenderer.setPinPosition(pin, null);
68 public Usage getPinUsage(Pin pin)
70 return pinUsages.get(pin);
75 protected abstract Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds);
77 // "graphical" operations
80 public void render(GeneralGC gc, Rectangle visibleRegion)
82 outlineRenderer.render(gc, visibleRegion);
83 centerTextRenderer.render(gc, visibleRegion);
84 pinNamesRenderer.render(gc, visibleRegion);
87 // operations no longer supported
90 protected void addPin(Pin pin)
92 throw new UnsupportedOperationException("Can't add pins without setting usage, call addPin(Pin, Usage [, Position]) instead");
95 public static enum Usage
97 INPUT, OUTPUT, TRISTATE;
102 ViewLogicModelAdapter.addComponentAdapter(new SimpleRectangularHardcodedGUIComponentAdapter(c -> c::recalculate));