diff --git a/ui/src/main/java/edu/wpi/grip/ui/pipeline/AddSourceView.java b/ui/src/main/java/edu/wpi/grip/ui/pipeline/AddSourceButton.java similarity index 89% rename from ui/src/main/java/edu/wpi/grip/ui/pipeline/AddSourceView.java rename to ui/src/main/java/edu/wpi/grip/ui/pipeline/AddSourceButton.java index cdce572dc8..fb02d993d4 100644 --- a/ui/src/main/java/edu/wpi/grip/ui/pipeline/AddSourceView.java +++ b/ui/src/main/java/edu/wpi/grip/ui/pipeline/AddSourceButton.java @@ -24,25 +24,23 @@ import java.util.Optional; import java.util.function.Consumer; import java.util.function.Predicate; - import javafx.application.Platform; +import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Parent; import javafx.scene.control.Button; import javafx.scene.control.ButtonBar; import javafx.scene.control.ButtonType; -import javafx.scene.control.ContentDisplay; import javafx.scene.control.Control; import javafx.scene.control.Dialog; +import javafx.scene.control.MenuButton; +import javafx.scene.control.MenuItem; import javafx.scene.control.Spinner; import javafx.scene.control.TextField; import javafx.scene.image.ImageView; -import javafx.scene.input.MouseEvent; import javafx.scene.layout.GridPane; -import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.text.Text; -import javafx.scene.text.TextAlignment; import javafx.stage.FileChooser; import javafx.stage.FileChooser.ExtensionFilter; @@ -52,29 +50,28 @@ * construct that source. As an example, the image file source results in a file picker that the * user can use to browse for an image. */ -public class AddSourceView extends HBox { +public class AddSourceButton extends MenuButton { @VisibleForTesting static final String SOURCE_DIALOG_STYLE_CLASS = "source-dialog"; private final EventBus eventBus; - private final Button webcamButton; - private final Button ipcamButton; + private final MenuItem webcamButton; + private final MenuItem ipcamButton; + private final MenuItem httpButton; private Optional activeDialog = Optional.empty(); @Inject - AddSourceView(EventBus eventBus, + AddSourceButton(EventBus eventBus, MultiImageFileSource.Factory multiImageSourceFactory, ImageFileSource.Factory imageSourceFactory, CameraSource.Factory cameraSourceFactory, HttpSource.Factory httpSourceFactory) { + super("Add Source"); this.eventBus = eventBus; - - this.setFillHeight(true); - - addButton("Add\nImage(s)", - getClass().getResource("/edu/wpi/grip/ui/icons/add-image.png"), - mouseEvent -> { + + addMenuItem("Image(s)", + getClass().getResource("/edu/wpi/grip/ui/icons/add-image.png"), mouseEvent -> { // Show a file picker so the user can open one or more images from disk final FileChooser fileChooser = new FileChooser(); fileChooser.setTitle("Open an image"); @@ -120,14 +117,12 @@ public class AddSourceView extends HBox { } }); - webcamButton = addButton( - "Add\nWebcam", - getClass().getResource("/edu/wpi/grip/ui/icons/add-webcam.png"), - mouseEvent -> { + webcamButton = addMenuItem("Webcam", + getClass().getResource("/edu/wpi/grip/ui/icons/add-webcam.png"), mouseEvent -> { final Parent root = this.getScene().getRoot(); // Show a dialog for the user to pick a camera index - final Spinner cameraIndex = new Spinner(0, Integer.MAX_VALUE, 0); + final Spinner cameraIndex = new Spinner<>(0, Integer.MAX_VALUE, 0); final SourceDialog dialog = new SourceDialog(root, cameraIndex); dialog.setTitle("Add Webcam"); @@ -144,15 +139,11 @@ public class AddSourceView extends HBox { cameraSource.initialize(); return cameraSource; }, - e -> { - dialog.errorText.setText(e.getMessage()); - }); + e -> dialog.errorText.setText(e.getMessage())); }); - ipcamButton = addButton( - "Add IP\nCamera", - getClass().getResource("/edu/wpi/grip/ui/icons/add-webcam.png"), - mouseEvent -> { + ipcamButton = addMenuItem("IP Camera", + getClass().getResource("/edu/wpi/grip/ui/icons/add-webcam.png"), mouseEvent -> { final Parent root = this.getScene().getRoot(); // Show a dialog for the user to pick a camera URL @@ -197,8 +188,8 @@ public class AddSourceView extends HBox { e -> dialog.errorText.setText(e.getMessage())); }); - addButton("Add\nHTTP source", getClass().getResource("/edu/wpi/grip/ui/icons/publish.png"), - mouseEvent -> { + httpButton = addMenuItem("HTTP", + getClass().getResource("/edu/wpi/grip/ui/icons/publish.png"), mouseEvent -> { final Parent root = this.getScene().getRoot(); // Show a dialog to pick the server path images will be uploaded on final String imageRoot = GripServer.IMAGE_UPLOAD_PATH + "/"; @@ -252,31 +243,34 @@ private void loadCamera(Dialog dialog, SupplierWithIO /** * Add a new button for adding a source. This method takes care of setting the event handler. */ - private Button addButton(String text, URL graphicURL, EventHandler - onMouseClicked) { + private MenuItem addMenuItem(String text, URL graphicURL, EventHandler + onActionEvent) { final ImageView graphic = new ImageView(graphicURL.toString()); graphic.setFitWidth(DPIUtility.SMALL_ICON_SIZE); graphic.setFitHeight(DPIUtility.SMALL_ICON_SIZE); - final Button button = new Button(text, graphic); - button.setTextAlignment(TextAlignment.CENTER); - button.setContentDisplay(ContentDisplay.TOP); - button.setOnMouseClicked(onMouseClicked); + final MenuItem menuItem = new MenuItem(" " + text, graphic); + menuItem.setOnAction(onActionEvent); - this.getChildren().add(button); - return button; + getItems().add(menuItem); + return menuItem; } @VisibleForTesting - Button getWebcamButton() { + MenuItem getWebcamButton() { return webcamButton; } @VisibleForTesting - Button getIpcamButton() { + MenuItem getIpcamButton() { return ipcamButton; } + @VisibleForTesting + MenuItem getHttpButton() { + return httpButton; + } + @VisibleForTesting void closeDialogs() { activeDialog.ifPresent(dialog -> { @@ -291,7 +285,7 @@ void closeDialogs() { } public interface Factory { - AddSourceView create(); + AddSourceButton create(); } private static class SourceDialog extends Dialog { diff --git a/ui/src/main/java/edu/wpi/grip/ui/pipeline/PipelineController.java b/ui/src/main/java/edu/wpi/grip/ui/pipeline/PipelineController.java index f33336d5fc..09f83e9710 100644 --- a/ui/src/main/java/edu/wpi/grip/ui/pipeline/PipelineController.java +++ b/ui/src/main/java/edu/wpi/grip/ui/pipeline/PipelineController.java @@ -31,7 +31,6 @@ import java.util.NavigableMap; import java.util.TreeMap; import java.util.stream.Collectors; - import javafx.beans.InvalidationListener; import javafx.beans.property.ReadOnlyObjectProperty; import javafx.collections.ObservableList; @@ -43,9 +42,7 @@ import javafx.scene.Parent; import javafx.scene.input.TransferMode; import javafx.scene.layout.HBox; -import javafx.scene.layout.Pane; import javafx.scene.layout.VBox; - import javax.annotation.Nullable; import javax.inject.Inject; @@ -61,7 +58,7 @@ public final class PipelineController { @FXML private VBox sourcesBox; @FXML - private Pane addSourcePane; + private VBox addSourceBox; @FXML private HBox stepBox; @FXML @@ -78,7 +75,7 @@ public final class PipelineController { @Inject private StepController.Factory stepControllerFactory; @Inject - private AddSourceView addSourceView; + private AddSourceButton addSourceButton; @Inject private OperationDragService operationDragService; @Inject @@ -135,7 +132,7 @@ public void initialize() throws Exception { }); }); - addSourcePane.getChildren().add(addSourceView); + addSourceBox.getChildren().add(addSourceButton); } /** 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 d98ca42b23..ca047452b8 100644 --- a/ui/src/main/resources/edu/wpi/grip/ui/GRIP.css +++ b/ui/src/main/resources/edu/wpi/grip/ui/GRIP.css @@ -72,6 +72,15 @@ Label.operation-description { -fx-padding: 0.5em; } +.addSource { + -fx-padding: 0.5em; + -fx-spacing: 1em; +} + +.addSource * { + -fx-max-width: Infinity; +} + .sources { -fx-padding: 0.5em; -fx-spacing: 1em; diff --git a/ui/src/main/resources/edu/wpi/grip/ui/pipeline/Pipeline.fxml b/ui/src/main/resources/edu/wpi/grip/ui/pipeline/Pipeline.fxml index 4f5878e345..87377d1b3b 100644 --- a/ui/src/main/resources/edu/wpi/grip/ui/pipeline/Pipeline.fxml +++ b/ui/src/main/resources/edu/wpi/grip/ui/pipeline/Pipeline.fxml @@ -5,7 +5,6 @@ - @@ -21,7 +20,7 @@