X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.ui%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fui%2FLogicUICanvas.java;h=8e01a1625e9dc42cdffc7d12652099950f5a2cba;hb=ec645d5910fcffae8992ed66abe98ac20b03ac6d;hp=41dde7d9a3f2116a2e48128c24921e0293deaaba;hpb=193667ac7c2900324c2de9996590a4cde5ac2c70;p=Mograsim.git diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/LogicUICanvas.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/LogicUICanvas.java index 41dde7d9..8e01a162 100644 --- a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/LogicUICanvas.java +++ b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/LogicUICanvas.java @@ -1,15 +1,31 @@ package net.mograsim.logic.ui; +import java.util.ArrayList; +import java.util.List; + import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; import net.haspamelodica.swt.helper.swtobjectwrappers.Point; import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; import net.mograsim.logic.ui.model.ViewModel; import net.mograsim.logic.ui.model.components.GUIComponent; +import net.mograsim.logic.ui.model.components.SubmodelComponent; +import net.mograsim.logic.ui.model.components.SubmodelInterface; +import net.mograsim.logic.ui.model.wires.WireCrossPoint; import net.mograsim.preferences.Preferences; /** @@ -19,6 +35,8 @@ import net.mograsim.preferences.Preferences; */ public class LogicUICanvas extends ZoomableCanvas { + private static final boolean OPEN_DEBUG_SETHIGHLEVELSTATE_SHELL = false; + private final ViewModel model; public LogicUICanvas(Composite parent, int style, ViewModel model) @@ -38,6 +56,9 @@ public class LogicUICanvas extends ZoomableCanvas model.addRedrawListener(this::redrawThreadsafe); addListener(SWT.MouseDown, this::mouseDown); + + if (OPEN_DEBUG_SETHIGHLEVELSTATE_SHELL) + openDebugSetHighLevelStateShell(model); } private void mouseDown(Event e) @@ -53,4 +74,103 @@ public class LogicUICanvas extends ZoomableCanvas } } } + + private void openDebugSetHighLevelStateShell(ViewModel model) + { + Shell debugShell = new Shell(); + debugShell.setLayout(new GridLayout(2, false)); + new Label(debugShell, SWT.NONE).setText("Target component: "); + Combo componentSelector = new Combo(debugShell, SWT.DROP_DOWN | SWT.READ_ONLY); + componentSelector.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + List componentsByItemIndex = new ArrayList<>(); + model.addComponentAddedListener(c -> recalculateComponentSelector(componentsByItemIndex, componentSelector, model)); + model.addComponentRemovedListener(c -> recalculateComponentSelector(componentsByItemIndex, componentSelector, model)); + recalculateComponentSelector(componentsByItemIndex, componentSelector, model); + new Label(debugShell, SWT.NONE).setText("Target state ID: "); + Text stateIDText = new Text(debugShell, SWT.SINGLE | SWT.LEAD | SWT.BORDER); + stateIDText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + new Label(debugShell, SWT.NONE).setText("Value type: "); + Composite radioGroup = new Composite(debugShell, SWT.NONE); + radioGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + GridLayout radioGroupLayout = new GridLayout(2, false); + radioGroupLayout.marginHeight = 0; + radioGroupLayout.marginWidth = 0; + radioGroup.setLayout(radioGroupLayout); + Button radioBit = new Button(radioGroup, SWT.RADIO); + radioBit.setText("Single bit"); + Button radioBitVector = new Button(radioGroup, SWT.RADIO); + radioBitVector.setText("Bitvector"); + new Label(debugShell, SWT.NONE).setText("Value string representation: \n(Bit vectors: MSBit...LSBit)"); + Text valueText = new Text(debugShell, SWT.SINGLE | SWT.LEAD | SWT.BORDER); + valueText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + Button send = new Button(debugShell, SWT.PUSH); + send.setText("Send!"); + Button get = new Button(debugShell, SWT.PUSH); + get.setText("Get!"); + Text output = new Text(debugShell, SWT.READ_ONLY); + output.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); + Listener sendAction = e -> + { + try + { + if (componentSelector.getSelectionIndex() >= componentsByItemIndex.size()) + throw new RuntimeException("No valid component selected"); + GUIComponent target = componentsByItemIndex.get(componentSelector.getSelectionIndex()); + String valueString = valueText.getText(); + Object value; + if (radioBit.getSelection()) + value = Bit.parse(valueString); + else if (radioBitVector.getSelection()) + value = BitVector.parse(new StringBuilder(valueString).reverse().toString()); + else + throw new RuntimeException("No value type selected"); + target.setHighLevelState(stateIDText.getText(), value); + output.setText("Success!"); + } + catch (Exception x) + { + output.setText(x.getClass().getSimpleName() + (x.getMessage() == null ? "" : ": " + x.getMessage())); + } + }; + Listener getAction = e -> + { + try + { + if (componentSelector.getSelectionIndex() >= componentsByItemIndex.size()) + throw new RuntimeException("No valid component selected"); + output.setText("Success! Value: \r\n" + + componentsByItemIndex.get(componentSelector.getSelectionIndex()).getHighLevelState(stateIDText.getText())); + } + catch (Exception x) + { + output.setText(x.getClass().getSimpleName() + (x.getMessage() == null ? "" : ": " + x.getMessage())); + } + }; + send.addListener(SWT.Selection, sendAction); + valueText.addListener(SWT.DefaultSelection, sendAction); + get.addListener(SWT.Selection, getAction); + stateIDText.addListener(SWT.DefaultSelection, getAction); + debugShell.open(); + } + + private void recalculateComponentSelector(List componentsByItemIndex, Combo componentSelector, ViewModel model) + { + componentsByItemIndex.clear(); + componentSelector.setItems(); + addComponentSelectorItems(componentsByItemIndex, "", componentSelector, model); + } + + private void addComponentSelectorItems(List componentsByItemIndex, String base, Combo componentSelector, ViewModel model) + { + for (GUIComponent c : model.getComponents()) + if (!(c instanceof WireCrossPoint || c instanceof SubmodelInterface)) + { + String item = base + c.getIdentifier(); + componentsByItemIndex.add(c); + componentSelector.add(item); + if (c instanceof SubmodelComponent) + addComponentSelectorItems(componentsByItemIndex, item + " -> ", componentSelector, ((SubmodelComponent) c).submodel); + } + } + } \ No newline at end of file