diff --git a/ui/src/main/java/edu/wpi/grip/ui/Main.java b/ui/src/main/java/edu/wpi/grip/ui/Main.java index 0b6bd002e5..19a3316b0d 100644 --- a/ui/src/main/java/edu/wpi/grip/ui/Main.java +++ b/ui/src/main/java/edu/wpi/grip/ui/Main.java @@ -43,6 +43,8 @@ public class Main extends Application { private final Object dialogLock = new Object(); private Parent root; + private static Main instance; + public static void main(String[] args) { launch(args); } @@ -77,6 +79,7 @@ public void start(Stage stage) throws Exception { stage.setScene(new Scene(root)); stage.show(); + instance = this; } public void stop() { @@ -118,4 +121,8 @@ public final void onUnexpectedThrowableEvent(UnexpectedThrowableEvent event) { } }); } + + public static Main getInstance() { + return instance; + } } 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 2717a16534..ea45abbfa6 100644 --- a/ui/src/main/java/edu/wpi/grip/ui/MainWindowController.java +++ b/ui/src/main/java/edu/wpi/grip/ui/MainWindowController.java @@ -206,6 +206,12 @@ public void showProjectSettingsEditor() { }); } + @FXML + public void showProjectAboutDialog() { + ProjectAboutDialog projectAboutDialog = new ProjectAboutDialog(root); + projectAboutDialog.showAndWait(); + } + @FXML public void quit() { if (showConfirmationDialogAndWait()) { diff --git a/ui/src/main/java/edu/wpi/grip/ui/ProjectAboutDialog.java b/ui/src/main/java/edu/wpi/grip/ui/ProjectAboutDialog.java new file mode 100644 index 0000000000..d874d9d5a5 --- /dev/null +++ b/ui/src/main/java/edu/wpi/grip/ui/ProjectAboutDialog.java @@ -0,0 +1,82 @@ +package edu.wpi.grip.ui; + +import com.sun.deploy.uitoolkit.impl.fx.HostServicesFactory; +import edu.wpi.grip.ui.util.DPIUtility; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.Parent; +import javafx.scene.control.*; +import javafx.scene.control.Dialog; +import javafx.scene.control.Label; +import javafx.scene.image.*; +import javafx.scene.image.Image; +import javafx.scene.layout.GridPane; +import javafx.scene.text.Font; + +/** + * A JavaFX dialog that displays information about the application (such as the version number) + */ +public class ProjectAboutDialog extends Dialog { + + public ProjectAboutDialog(Parent root) { + super(); + + GridPane grid = new GridPane(); + grid.setVgap(10); + grid.setAlignment(Pos.TOP_LEFT); + + ImageView img = new ImageView(new Image("edu/wpi/grip/ui/icons/grip-title.png")); + + grid.add(img, 0, 0); + + Label versionLabel = new Label("Version " + edu.wpi.grip.core.Main.class.getPackage().getImplementationVersion()); + // makes the version label look a little bit better aligned (looks too far to the left otherwise) + versionLabel.setPadding(new Insets(0, 0, 0, 1)); + Font versionLabelFont = new Font(16.0); + versionLabel.setFont(versionLabelFont); + grid.add(versionLabel, 0, 1, 3, 1); + + Hyperlink githubLink = new Hyperlink(); + githubLink.setText("GRIP on Github"); + githubLink.setPadding(new Insets(0, 0, 0, 0)); + githubLink.setOnAction(event -> { + HostServicesFactory.getInstance(Main.getInstance()).showDocument("https://github.com/WPIRoboticsProjects/GRIP"); + }); + grid.add(githubLink, 0, 2); + + Hyperlink issuesLink = new Hyperlink(); + issuesLink.setText("Issues List"); + issuesLink.setPadding(new Insets(0, 0, 0, 0)); + issuesLink.setOnAction(event -> { + HostServicesFactory.getInstance(Main.getInstance()).showDocument("https://github.com/WPIRoboticsProjects/GRIP/issues"); + }); + grid.add(issuesLink, 0, 3); + + Hyperlink wikiLink = new Hyperlink(); + wikiLink.setText("Wiki"); + wikiLink.setPadding(new Insets(0, 0, 0, 0)); + wikiLink.setOnAction(event -> { + HostServicesFactory.getInstance(Main.getInstance()).showDocument("https://github.com/WPIRoboticsProjects/GRIP/wiki"); + }); + grid.add(wikiLink, 0, 4); + + Hyperlink operationsLink = new Hyperlink(); + operationsLink.setText("Operation Reference"); + operationsLink.setPadding(new Insets(0, 0, 0, 0)); + operationsLink.setOnAction(event -> { + HostServicesFactory.getInstance(Main.getInstance()).showDocument("https://github.com/WPIRoboticsProjects/GRIP/wiki/Operation-Reference-Table"); + }); + grid.add(operationsLink, 0, 5); + + DialogPane pane = getDialogPane(); + pane.getButtonTypes().setAll(ButtonType.OK); + pane.setContent(grid); + pane.styleProperty().bind(root.styleProperty()); + pane.getStylesheets().addAll(root.getStylesheets()); + pane.setPrefSize(DPIUtility.ABOUT_DIALOG_WIDTH, DPIUtility.ABOUT_DIALOG_HEIGHT ); + + setTitle("About GRIP"); + setHeaderText("About GRIP"); + setResizable(true); + } +} diff --git a/ui/src/main/java/edu/wpi/grip/ui/util/DPIUtility.java b/ui/src/main/java/edu/wpi/grip/ui/util/DPIUtility.java index 643d3ad84d..acfaa8c1ac 100644 --- a/ui/src/main/java/edu/wpi/grip/ui/util/DPIUtility.java +++ b/ui/src/main/java/edu/wpi/grip/ui/util/DPIUtility.java @@ -16,6 +16,8 @@ public class DPIUtility { public final static double LARGE_ICON_SIZE = 48.0 * (isManualHiDPI() ? HIDPI_SCALE : 1.0); public final static double STROKE_WIDTH = 2.0 * (isManualHiDPI() ? HIDPI_SCALE : 1.0); public final static double SETTINGS_DIALOG_SIZE = 400.0 * (isManualHiDPI() ? HIDPI_SCALE : 1.0); + public final static double ABOUT_DIALOG_WIDTH = 400.0 * (isManualHiDPI() ? HIDPI_SCALE : 1.0); + public final static double ABOUT_DIALOG_HEIGHT = 200.0 * (isManualHiDPI() ? HIDPI_SCALE : 1.0); private static boolean isManualHiDPI() { // We need to do manual size adjustments for HiDPI on Linux. JavaFX automatically does this on Windows and OSX 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 7f0fd3387b..7b6905da68 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,9 @@ + + + diff --git a/ui/src/main/resources/edu/wpi/grip/ui/icons/grip-title.png b/ui/src/main/resources/edu/wpi/grip/ui/icons/grip-title.png new file mode 100644 index 0000000000..282fd1aeb6 Binary files /dev/null and b/ui/src/main/resources/edu/wpi/grip/ui/icons/grip-title.png differ