From 204f80aebd980e52e1091b8d07810b16ef97123b Mon Sep 17 00:00:00 2001 From: hneemann Date: Sun, 5 Mar 2017 14:35:21 +0100 Subject: [PATCH] More intuitive tool bar buttons to start and stop the simulation. --- .../java/de/neemann/digital/gui/Main.java | 53 +++++++++--------- .../de/neemann/digital/gui/state/State.java | 24 +++++--- src/main/resources/lang/lang_de.xml | 6 +- src/main/resources/lang/lang_en.xml | 8 +-- src/main/resources/media-playback-stop.png | Bin 0 -> 728 bytes 5 files changed, 51 insertions(+), 40 deletions(-) create mode 100644 src/main/resources/media-playback-stop.png diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index e2f57a949..7fd559385 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -88,7 +88,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E private static final Icon ICON_MICRO = IconCreator.create("media-playback-start-2.png"); private static final Icon ICON_TEST = IconCreator.create("media-playback-start-T.png"); private static final Icon ICON_STEP = IconCreator.create("media-seek-forward.png"); - private static final Icon ICON_ELEMENT = IconCreator.create("preferences-system.png"); + private static final Icon ICON_STOP = IconCreator.create("media-playback-stop.png"); private static final Icon ICON_NEW = IconCreator.create("document-new.png"); private static final Icon ICON_OPEN = IconCreator.create("document-open.png"); private static final Icon ICON_OPEN_WIN = IconCreator.create("document-open-new.png"); @@ -123,7 +123,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E private ModelCreator modelCreator; private boolean realtimeClockRunning; - private State elementState; + private State stoppedState; private RunModelState runModelState; private State runModelMicroState; @@ -214,11 +214,8 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E toolBar.addSeparator(); - ToolTipAction elementStateAction = elementState.createToolTipAction(Lang.get("menu_element"), ICON_ELEMENT).setToolTip(Lang.get("menu_element_tt")); + createEditMenu(menuBar); - createEditMenu(menuBar, elementStateAction); - - toolBar.add(elementState.setIndicator(elementStateAction.createJButtonNoText())); toolBar.add(circuitComponent.getDeleteAction().createJButtonNoText()); toolBar.addSeparator(); @@ -228,7 +225,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E toolBar.addSeparator(); - librarySelector = new LibrarySelector(library, shapeFactory, elementState); + librarySelector = new LibrarySelector(library, shapeFactory, stoppedState); menuBar.add(librarySelector.buildMenu(new InsertHistory(toolBar), circuitComponent)); getContentPane().add(toolBar, BorderLayout.NORTH); @@ -405,9 +402,8 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E * Creates the edit menu * * @param menuBar the menu bar - * @param elementStateAction state action to add to menu */ - private void createEditMenu(JMenuBar menuBar, ToolTipAction elementStateAction) { + private void createEditMenu(JMenuBar menuBar) { JMenu edit = new JMenu(Lang.get("menu_edit")); menuBar.add(edit); @@ -462,23 +458,22 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E @Override public void actionPerformed(ActionEvent e) { circuitComponent.getCircuit().actualToDefault(); - elementState.enter(); + stoppedState.enter(); } }.setToolTip(Lang.get("menu_actualToDefault_tt")); - ToolTipAction unprogramAlFuses = new ToolTipAction(Lang.get("menu_unprogramAllFuses")) { + ToolTipAction unprogramAllFuses = new ToolTipAction(Lang.get("menu_unprogramAllFuses")) { @Override public void actionPerformed(ActionEvent e) { circuitComponent.getCircuit().unprogramAllFuses(); - elementState.enter(); + stoppedState.enter(); } }.setToolTip(Lang.get("menu_unprogramAllFuses_tt")); edit.add(editAttributes.createJMenuItem()); edit.add(actualToDefault.createJMenuItem()); - edit.add(unprogramAlFuses.createJMenuItem()); + edit.add(unprogramAllFuses.createJMenuItem()); edit.addSeparator(); - edit.add(elementStateAction.createJMenuItem()); edit.add(orderInputs.createJMenuItem()); edit.add(orderOutputs.createJMenuItem()); edit.add(orderMeasurements.createJMenuItem()); @@ -499,8 +494,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E /** * Creates the start menu - * - * @param menuBar the menu bar + * @param menuBar the menu bar * @param toolBar the tool bar */ private void createStartMenu(JMenuBar menuBar, JToolBar toolBar) { @@ -533,12 +527,13 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E circuitComponent.hasChanged(); statusLabel.setText(Lang.get("stat_clocks", i)); } catch (NodeException e1) { - elementState.enter(); + stoppedState.enter(); new ErrorMessage(Lang.get("msg_fastRunError")).addCause(e1).show(Main.this); } } }.setToolTip(Lang.get("menu_fast_tt")).setActive(false); + ToolTipAction stoppedStateAction = stoppedState.createToolTipAction(Lang.get("menu_element"), ICON_STOP).setToolTip(Lang.get("menu_element_tt")); ToolTipAction runTests = new ToolTipAction(Lang.get("menu_runTests"), ICON_TEST) { @Override @@ -578,6 +573,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E run.add(runModelMicroAction.createJMenuItem()); run.add(doStep.createJMenuItem()); run.add(runToBreakAction.createJMenuItem()); + run.add(stoppedStateAction.createJMenuItem()); run.add(runTests.createJMenuItem()); run.addSeparator(); run.add(speedTest.createJMenuItem()); @@ -589,6 +585,8 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E toolBar.add(runModelMicroState.setIndicator(runModelMicroAction.createJButtonNoText())); toolBar.add(doStep.createJButtonNoText()); toolBar.addSeparator(); + toolBar.add(stoppedStateAction.createJButtonNoText()); + toolBar.addSeparator(); toolBar.add(runTests.createJButtonNoText()); } @@ -609,7 +607,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E windowPosManager.register("testresult", new TestResultDialog(Main.this, tsl, circuitComponent.getCircuit(), library)).setVisible(true); - elementState.enter(); + stoppedState.enter(); } catch (Exception e1) { showErrorAndStopModel(Lang.get("msg_runningTestError"), e1); } @@ -631,7 +629,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E new TableDialog(Main.this, new ModelAnalyser(model).analyse(), shapeFactory, filename) .setPinMap(new PinMap().addModel(model)) .setVisible(true); - elementState.enter(); + stoppedState.enter(); } catch (PinException | PinMapException | NodeException | AnalyseException | ElementNotFoundException e1) { showErrorAndStopModel(Lang.get("msg_annalyseErr"), e1); } @@ -645,7 +643,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E public void actionPerformed(ActionEvent e) { TruthTable tt = new TruthTable(3).addResult(); new TableDialog(Main.this, tt, shapeFactory, null).setVisible(true); - elementState.enter(); + stoppedState.enter(); } } .setToolTip(Lang.get("menu_synthesise_tt")) @@ -665,7 +663,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E private void orderMeasurements() { try { Model m = new ModelCreator(circuitComponent.getCircuit(), library).createModel(false); - elementState.enter(); + stoppedState.enter(); ArrayList names = new ArrayList<>(); for (Signal s : m.getSignals()) names.add(s.getName()); @@ -682,13 +680,14 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E } private void setupStates() { - elementState = stateManager.register(new State() { + stoppedState = stateManager.register(new State() { @Override public void enter() { super.enter(); clearModelDescription(); circuitComponent.setModeAndReset(false, NoSync.INST); doStep.setEnabled(false); + stoppedState.getAction().setEnabled(false); runToBreakAction.setEnabled(false); } @@ -698,6 +697,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E @Override public void enter() { super.enter(); + stoppedState.getAction().setEnabled(true); if (createAndStartModel(false, ModelEvent.MICROSTEP, null)) circuitComponent.setManualChangeObserver(new MicroStepObserver(model)); } @@ -793,7 +793,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E } circuitComponent.hasChanged(); new ErrorMessage(message).addCause(cause).show(Main.this); - elementState.enter(); + stoppedState.enter(); }); } @@ -830,7 +830,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E librarySelector.setFilePath(filename.getParentFile()); Circuit circ = Circuit.loadCircuit(filename, shapeFactory); circuitComponent.setCircuit(circ); - elementState.enter(); + stoppedState.enter(); windowPosManager.closeAll(); setFilename(filename, toPrefs); statusLabel.setText(" "); @@ -847,7 +847,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E circuitComponent.getCircuit().save(filename); if (savedListener != null) savedListener.saved(filename); - elementState.enter(); + stoppedState.enter(); setFilename(filename, toPrefs); } catch (IOException e) { new ErrorMessage(Lang.get("msg_errorWritingFile")).addCause(e).show(); @@ -974,6 +974,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E void enter(boolean runRealTime, ModelModifier modelModifier) { super.enter(); + stoppedState.getAction().setEnabled(true); if (createAndStartModel(runRealTime, ModelEvent.STEP, modelModifier)) circuitComponent.setManualChangeObserver(new FullStepObserver(model)); } @@ -1074,7 +1075,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E @Override public void stop() { SwingUtilities.invokeLater(() -> { - elementState.enter(); + stoppedState.enter(); circuitComponent.hasChanged(); }); } diff --git a/src/main/java/de/neemann/digital/gui/state/State.java b/src/main/java/de/neemann/digital/gui/state/State.java index f19121754..fecc45fc0 100644 --- a/src/main/java/de/neemann/digital/gui/state/State.java +++ b/src/main/java/de/neemann/digital/gui/state/State.java @@ -17,6 +17,7 @@ public class State implements StateInterface { private static final Border DISABLED_BORDER = BorderFactory.createCompoundBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED), BorderFactory.createEmptyBorder(4, 4, 4, 4)); private JComponent indicator; private StateManager stateManager; + private ToolTipAction action; /** * Creates new state @@ -56,20 +57,29 @@ public class State implements StateInterface { indicator.setBorder(DISABLED_BORDER); } + /** + * @return the action associated with this state + */ + public ToolTipAction getAction() { + return action; + } + /** * Creates a tooltip action which activates the state * * @param name the name of the action to create * @param icon the icon to use - * @return the acttion + * @return the action */ public ToolTipAction createToolTipAction(String name, Icon icon) { - return new ToolTipAction(name, icon) { - @Override - public void actionPerformed(ActionEvent e) { - enter(); - } - }; + if (action == null) + action = new ToolTipAction(name, icon) { + @Override + public void actionPerformed(ActionEvent e) { + enter(); + } + }; + return action; } } diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index fcdff1315..0d483cf23 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -534,8 +534,8 @@ Zur Analyse können Sie die Schaltung im Gatterschrittmodus ausführen. Einstellungen für den Start der Simulation Einstellungen Bearbeitet die globalen Einstellungen - Elemente bearbeiten - Bearbeitet die vorhandenen Elemente oder dessen Eigenschaften + Stoppen der Simulation + Stopt die Simulation und erlaubt das Bearbeiten der Schaltung. Bauteile Export Export PNG groß @@ -566,7 +566,7 @@ Zur Analyse können Sie die Schaltung im Gatterschrittmodus ausführen. Alle neu laden Alle importierten Schaltungen werden neu geladen Rotieren - Start + Start der Simulation Startet die Simulation der Schaltung Speichern Speichern unter diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index 9dcb7a652..74c7a2ba3 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -520,8 +520,8 @@ To analyse you can run the circuit in single gate step mode. Settings used to start the simulation Settings Edits Digitals Preferences - Edit components - Edits the circuit. Moves a single component or edits its properties. + Stop Simulation + Stops the simulation and allows to edits the circuit. Components Export Export PNG large @@ -552,8 +552,8 @@ To analyse you can run the circuit in single gate step mode. Reload Reload all imported circuits Rotate - Run - Runs the circuit + Start Simulation + Starts the simulation of the circuit. Save Save As Save Data diff --git a/src/main/resources/media-playback-stop.png b/src/main/resources/media-playback-stop.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff8806c395f50c1a55d05b3d9019a89d4cdb352 GIT binary patch literal 728 zcmeAS@N?(olHy`uVBq!ia0vp^G9b*s1|*Ak?@s|zEX7WqAsj$Z!;#Vf4nJ zaLff^#!Y=cHUb4DOI#yLg7ec#$`gxH8OqDc^)mCai<1)zQuXqS(r3T3kpe1`0x1f~ zEXhe_@J&t0OjHQSNvuptOwLvaNGvT*^_u*o1gJ_Jq{^|hBqP6w!6&gGU%@#sCowlM zFQq6o^ZrCBEufMJkP_$og36-I^o$Y)XJ-S2fYPL#%wz?Z{M^LMJOvk^@yUrLnfZAN z86_nJR{HwMMX5l3S!!~AZf<^FG00W=1zym-RXjhT<;kS&94${6e;L_+yHdPz;c_`I zg(>@-{5dVAmF<&RvURdUSYPc)M|qBom)`vOk(MU@;>ydtr*j09^UruP?9wfG|KiJw zqzPZ`a=mu{{r&#+pW}aSXa8S(;n^aMGY=0w|NMCJ=FCXF=)`lH>(=T2&*zolYxk+L z)m^Qs6~2vWtzd-oyM|oGrYEcaR%nK{MkH#ey(qAe6JGOOIyvw>^PlBzuUoYQkCs(G z$S`5z?9vzh``XiQUHG|BgEaQ`%P*&dv3y#jpX1==`cx)FcFt-Bj!P!IOL>@o|FxT} zvUDR`iK#>A!x+}k)}ZWm77wK^9=4we%jJ~%UhfRj@;G$BL8WOc%g--?5fV?DOR5tB zMRe{qce!*ZH&yUeu!Xb=o!BHR!{i`zRA6FgQYgPs0DqX1Zo-rkn{;OASMa58mQ?lY zSmquxm)(Bm7h#qK`_w<%@Xx!w;PAk9|(srSyaKIp3e(*=X4tDnm{r-UW|a3CxY literal 0 HcmV?d00001