X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.model%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fmodel%2Fcomponents%2Fatomic%2FGUIBitDisplay.java;fp=net.mograsim.logic.model%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fmodel%2Fcomponents%2Fatomic%2FGUIBitDisplay.java;h=46c854604037747aae5c0a531e60f57d4f20f0ee;hb=b5d8c2d71e27350ea7c9314e40df5bb0584271cd;hp=0000000000000000000000000000000000000000;hpb=69cb6725ef670328959d55649257ded6ac924b33;p=Mograsim.git diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIBitDisplay.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIBitDisplay.java new file mode 100644 index 00000000..46c85460 --- /dev/null +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIBitDisplay.java @@ -0,0 +1,94 @@ +package net.mograsim.logic.model.model.components.atomic; + +import org.eclipse.swt.graphics.Color; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.components.BitDisplay; +import net.mograsim.logic.core.types.BitVectorFormatter; +import net.mograsim.logic.model.model.ViewModelModifiable; +import net.mograsim.logic.model.model.components.GUIComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.ViewLogicModelAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.BitDisplayAdapter; +import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; +import net.mograsim.preferences.Preferences; + +public class GUIBitDisplay extends GUIComponent +{ + private static final double width = 20; + private static final double height = 15; + private static final double fontHeight = 5; + + private final Pin inputPin; + + private final LogicObserver logicObs; + private BitDisplay bitDisplay; + + public GUIBitDisplay(ViewModelModifiable model) + { + this(model, null); + } + + public GUIBitDisplay(ViewModelModifiable model, String name) + { + super(model, name); + logicObs = (i) -> requestRedraw(); + + setSize(width, height); + addPin(this.inputPin = new Pin(this, "", 1, 0, height / 2)); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + Color foreground = Preferences.current().getColor("net.mograsim.logic.ui.color.foreground"); + if (foreground != null) + gc.setForeground(foreground); + gc.drawRectangle(getBounds()); + String label = bitDisplay == null ? BitVectorFormatter.formatAsString(null) + : BitVectorFormatter.formatAsString(bitDisplay.getDisplayedValue()); + Font oldFont = gc.getFont(); + Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); + gc.setFont(labelFont); + Point textExtent = gc.textExtent(label); + Color textColor = Preferences.current().getColor("net.mograsim.logic.ui.color.text"); + if (textColor != null) + gc.setForeground(textColor); + gc.drawText(label, getPosX() + (width - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true); + gc.setFont(oldFont); + } + + public void setLogicModelBinding(BitDisplay bitDisplay) + { + if (this.bitDisplay != null) + this.bitDisplay.deregisterObserver(logicObs); + this.bitDisplay = bitDisplay; + if (bitDisplay != null) + bitDisplay.registerObserver(logicObs); + } + + public boolean hasLogicModelBinding() + { + return bitDisplay != null; + } + + public BitDisplay getBitDisplay() + { + return bitDisplay; + } + + public Pin getInputPin() + { + return inputPin; + } + + static + { + ViewLogicModelAdapter.addComponentAdapter(new BitDisplayAdapter()); + IndirectGUIComponentCreator.setComponentSupplier(GUIBitDisplay.class.getCanonicalName(), (m, p, n) -> new GUIBitDisplay(m, n)); + } +} \ No newline at end of file