diff --git a/src/main/java/sh/ball/gui/Gui.java b/src/main/java/sh/ball/gui/Gui.java index 65848d5..86dbfef 100644 --- a/src/main/java/sh/ball/gui/Gui.java +++ b/src/main/java/sh/ball/gui/Gui.java @@ -51,6 +51,10 @@ public class Gui extends Application { Scene scene = new Scene(root); scene.getStylesheets().add(getClass().getResource("/css/main.css").toExternalForm()); + controller.setSoftwareOscilloscopeAction(() -> { + getHostServices().showDocument("https://james.ball.sh/oscilloscope"); + }); + scene.addEventHandler(KeyEvent.KEY_PRESSED, (event -> { switch (event.getCode()) { // frame selection controls diff --git a/src/main/java/sh/ball/gui/controller/MainController.java b/src/main/java/sh/ball/gui/controller/MainController.java index 8d74e48..7ce9622 100644 --- a/src/main/java/sh/ball/gui/controller/MainController.java +++ b/src/main/java/sh/ball/gui/controller/MainController.java @@ -163,6 +163,8 @@ public class MainController implements Initializable, FrequencyListener, MidiLis private MenuItem recordMenuItem; @FXML private Spinner recordLengthSpinner; + @FXML + private MenuItem softwareOscilloscopeMenuItem; public MainController() throws Exception { // Clone DEFAULT_OBJ InputStream using a ByteArrayOutputStream @@ -477,6 +479,10 @@ public class MainController implements Initializable, FrequencyListener, MidiLis new Thread(() -> sendAudioDataToWebSocket(webSocketServer)).start(); } + public void setSoftwareOscilloscopeAction(Runnable openBrowser) { + softwareOscilloscopeMenuItem.setOnAction((e) -> openBrowser.run()); + } + private void sendAudioDataToWebSocket(ByteWebSocketServer server) { while (true) { try { diff --git a/src/main/resources/fxml/main.fxml b/src/main/resources/fxml/main.fxml index 623b8b2..1627dc8 100644 --- a/src/main/resources/fxml/main.fxml +++ b/src/main/resources/fxml/main.fxml @@ -154,6 +154,11 @@ + + + + +