diff --git a/core/src/test/java/edu/wpi/grip/core/operations/network/MockGRIPNetworkModule.java b/core/src/test/java/edu/wpi/grip/core/operations/network/MockGRIPNetworkModule.java new file mode 100644 index 0000000000..fc21353c42 --- /dev/null +++ b/core/src/test/java/edu/wpi/grip/core/operations/network/MockGRIPNetworkModule.java @@ -0,0 +1,21 @@ +package edu.wpi.grip.core.operations.network; + +import com.google.inject.AbstractModule; +import com.google.inject.name.Names; +import edu.wpi.grip.core.operations.network.ros.MockROSManager; +import edu.wpi.grip.core.operations.network.ros.ROSNetworkPublisherFactory; + +/** + * A mock of {@Link GRIPNetworkModule} for testing. + */ +public final class MockGRIPNetworkModule extends AbstractModule { + @Override + protected void configure() { + bind(MapNetworkPublisherFactory.class) + .annotatedWith(Names.named("ntManager")) + .to(MockMapNetworkPublisher.class); + bind(ROSNetworkPublisherFactory.class) + .annotatedWith(Names.named("rosManager")) + .to(MockROSManager.class); + } +} diff --git a/core/src/test/java/edu/wpi/grip/core/operations/network/MockMapNetworkPublisher.java b/core/src/test/java/edu/wpi/grip/core/operations/network/MockMapNetworkPublisher.java index 34938a2093..d8cf784323 100644 --- a/core/src/test/java/edu/wpi/grip/core/operations/network/MockMapNetworkPublisher.java +++ b/core/src/test/java/edu/wpi/grip/core/operations/network/MockMapNetworkPublisher.java @@ -1,12 +1,16 @@ package edu.wpi.grip.core.operations.network; - +import java.util.Collections; import java.util.Map; import java.util.Optional; import java.util.Set; @SuppressWarnings("PMD.UncommentedEmptyMethodBody") -public class MockMapNetworkPublisher extends MapNetworkPublisher { +public class MockMapNetworkPublisher extends MapNetworkPublisher implements MapNetworkPublisherFactory { + + public MockMapNetworkPublisher() { + this(Collections.emptySet()); + } public MockMapNetworkPublisher(Set keys) { super(keys); @@ -36,4 +40,9 @@ protected void publishNameChanged(Optional oldName, String newName) { public void close() { } + + @Override + public MapNetworkPublisher create(Set keys) { + return new MockMapNetworkPublisher<>(keys); + } } diff --git a/core/src/test/java/edu/wpi/grip/core/operations/network/ros/MockROSManager.java b/core/src/test/java/edu/wpi/grip/core/operations/network/ros/MockROSManager.java new file mode 100644 index 0000000000..dc95b2263a --- /dev/null +++ b/core/src/test/java/edu/wpi/grip/core/operations/network/ros/MockROSManager.java @@ -0,0 +1,9 @@ +package edu.wpi.grip.core.operations.network.ros; + +public class MockROSManager implements ROSNetworkPublisherFactory { + + @Override + public ROSMessagePublisher create(C converter) { + return null; + } +} diff --git a/core/src/test/java/edu/wpi/grip/core/operations/network/ros/ROSPackageSanityTest.java b/core/src/test/java/edu/wpi/grip/core/operations/network/ros/ROSPackageSanityTest.java index 6d3f2cb8da..38e966d8e3 100644 --- a/core/src/test/java/edu/wpi/grip/core/operations/network/ros/ROSPackageSanityTest.java +++ b/core/src/test/java/edu/wpi/grip/core/operations/network/ros/ROSPackageSanityTest.java @@ -6,7 +6,7 @@ public class ROSPackageSanityTest extends AbstractPackageSanityTests { public ROSPackageSanityTest() { super(); - ignoreClasses(c -> c.equals(ROSLoader.class)); + ignoreClasses(c -> c.equals(ROSLoader.class) || c.equals(MockROSManager.class)); setDefault(JavaToMessageConverter.class, JavaToMessageConverter.BLOBS); } } diff --git a/ui/src/main/java/edu/wpi/grip/ui/AboutDialogController.java b/ui/src/main/java/edu/wpi/grip/ui/AboutDialogController.java new file mode 100644 index 0000000000..afc6599faa --- /dev/null +++ b/ui/src/main/java/edu/wpi/grip/ui/AboutDialogController.java @@ -0,0 +1,31 @@ +package edu.wpi.grip.ui; + +import javafx.fxml.FXML; +import javafx.scene.control.Label; +import javafx.scene.input.MouseEvent; + +import javax.inject.Inject; + +public class AboutDialogController { + + @Inject + private Main main; + + @FXML + private Label versionNumberLabel; + + @FXML + void mousePressedDocumentationButton(MouseEvent event) { + main.getHostServices().showDocument("http://wpilib.screenstepslive.com/s/4485/m/50711"); + } + + @FXML + void mousePressedGithubButton(MouseEvent event) { + main.getHostServices().showDocument("https://github.com/WPIRoboticsProjects/GRIP"); + } + + @FXML + void initialize() { + versionNumberLabel.setText("Version " + edu.wpi.grip.core.Main.class.getPackage().getImplementationVersion()); + } +} diff --git a/ui/src/main/java/edu/wpi/grip/ui/MainWindowController.java b/ui/src/main/java/edu/wpi/grip/ui/MainWindowController.java index 81376b77dc..eec9fd22c7 100644 --- a/ui/src/main/java/edu/wpi/grip/ui/MainWindowController.java +++ b/ui/src/main/java/edu/wpi/grip/ui/MainWindowController.java @@ -17,6 +17,7 @@ import javafx.application.Platform; import javafx.fxml.FXML; import javafx.scene.Parent; +import javafx.scene.Scene; import javafx.scene.control.ButtonType; import javafx.scene.control.Dialog; import javafx.scene.control.SplitPane; @@ -26,6 +27,8 @@ import javafx.scene.layout.Region; import javafx.stage.FileChooser; import javafx.stage.FileChooser.ExtensionFilter; +import javafx.stage.Stage; +import javafx.stage.StageStyle; import org.controlsfx.control.StatusBar; import javax.inject.Inject; @@ -49,6 +52,8 @@ public class MainWindowController { @FXML private Pane deployPane; @FXML + private Pane aboutPane; + @FXML private StatusBar statusBar; @Inject private EventBus eventBus; @@ -65,6 +70,8 @@ public class MainWindowController { @Inject private Project project; + private Stage aboutDialogStage; + public void initialize() { pipelineView.prefHeightProperty().bind(bottomPane.heightProperty()); statusBar.getLeftItems().add(startStoppableButtonFactory.create(pipelineRunner)); @@ -209,6 +216,21 @@ public void showProjectSettingsEditor() { }); } + @FXML + public void showProjectAboutDialog() throws IOException { + if (aboutDialogStage == null) { + aboutDialogStage = new Stage(); + aboutDialogStage.setScene(new Scene(aboutPane)); + aboutDialogStage.initStyle(StageStyle.UTILITY); + aboutDialogStage.focusedProperty().addListener((observable, oldvalue, newvalue) -> { + if (oldvalue) { + aboutDialogStage.hide(); + } + }); + } + aboutDialogStage.show(); + } + @FXML public void quit() { if (showConfirmationDialogAndWait()) { diff --git a/ui/src/main/resources/edu/wpi/grip/ui/AboutDialog.fxml b/ui/src/main/resources/edu/wpi/grip/ui/AboutDialog.fxml new file mode 100644 index 0000000000..ae3bd81ea7 --- /dev/null +++ b/ui/src/main/resources/edu/wpi/grip/ui/AboutDialog.fxml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui/src/main/resources/edu/wpi/grip/ui/GRIP.css b/ui/src/main/resources/edu/wpi/grip/ui/GRIP.css index 739b3767e2..d98ca42b23 100644 --- a/ui/src/main/resources/edu/wpi/grip/ui/GRIP.css +++ b/ui/src/main/resources/edu/wpi/grip/ui/GRIP.css @@ -233,4 +233,18 @@ VBox.sockets { .info-label { -fx-font-weight: bold; -} \ No newline at end of file +} + +.about-window Label { + -fx-font-size: 14; +} + +.about-button:hover { + -fx-background-color: gray; + -fx-background-radius: 12; + -fx-cursor: hand; +} + +.about-button:hover Label { + -fx-text-fill: white; +} diff --git a/ui/src/main/resources/edu/wpi/grip/ui/MainWindow.fxml b/ui/src/main/resources/edu/wpi/grip/ui/MainWindow.fxml index c11b8f9ae6..edacc42d87 100644 --- a/ui/src/main/resources/edu/wpi/grip/ui/MainWindow.fxml +++ b/ui/src/main/resources/edu/wpi/grip/ui/MainWindow.fxml @@ -132,6 +132,23 @@ + + + + + + + + + + + + + + + + + @@ -148,6 +165,7 @@ + diff --git a/ui/src/test/java/edu/wpi/grip/ui/MainWindowTest.java b/ui/src/test/java/edu/wpi/grip/ui/MainWindowTest.java index fb67c75267..0bb4bdc737 100644 --- a/ui/src/test/java/edu/wpi/grip/ui/MainWindowTest.java +++ b/ui/src/test/java/edu/wpi/grip/ui/MainWindowTest.java @@ -7,6 +7,7 @@ import com.google.inject.util.Modules; import edu.wpi.grip.core.*; import edu.wpi.grip.core.events.OperationAddedEvent; +import edu.wpi.grip.core.operations.network.MockGRIPNetworkModule; import edu.wpi.grip.core.sockets.InputSocket; import edu.wpi.grip.core.sockets.OutputSocket; import edu.wpi.grip.ui.util.DPIUtility; @@ -39,7 +40,8 @@ public class MainWindowTest extends ApplicationTest { public void start(Stage stage) throws Exception { testModule.setUp(); - Injector injector = Guice.createInjector(Modules.override(testModule).with(new GRIPUIModule())); + Injector injector = Guice.createInjector( + Modules.override(testModule, new MockGRIPNetworkModule()).with(new GRIPUIModule())); final Parent root = FXMLLoader.load(Main.class.getResource("MainWindow.fxml"), null, null, injector::getInstance);