diff --git a/bin/de/deadlocker8/roadgame/ui/Controller$1.class b/bin/de/deadlocker8/roadgame/ui/Controller$1.class index 6f25679d13703a2bd3e5d1e2f2263eca6fb93cae..4e053851e8c3cbe0d8718bff2acf9e8545bf0414 100644 Binary files a/bin/de/deadlocker8/roadgame/ui/Controller$1.class and b/bin/de/deadlocker8/roadgame/ui/Controller$1.class differ diff --git a/bin/de/deadlocker8/roadgame/ui/Controller$2.class b/bin/de/deadlocker8/roadgame/ui/Controller$2.class index fbe577013de6ba25a8f7dccf22368c68e3f615ae..96d6c60f6b62215bc8af9008d96194a98f7dc941 100644 Binary files a/bin/de/deadlocker8/roadgame/ui/Controller$2.class and b/bin/de/deadlocker8/roadgame/ui/Controller$2.class differ diff --git a/bin/de/deadlocker8/roadgame/ui/Controller.class b/bin/de/deadlocker8/roadgame/ui/Controller.class index 5cfb47e5e37c56fb953c13b3aa1a0facd10988d5..125ef454b418ee3c37fa4114307dd6a209ce8bb8 100644 Binary files a/bin/de/deadlocker8/roadgame/ui/Controller.class and b/bin/de/deadlocker8/roadgame/ui/Controller.class differ diff --git a/bin/de/deadlocker8/roadgame/ui/GUI.fxml b/bin/de/deadlocker8/roadgame/ui/GUI.fxml index 22974c03f72d05a5a28feb2fef89b5059e581973..83ae0d5f1eee3b63d1f64a00dc8c85d792d8b8b9 100644 --- a/bin/de/deadlocker8/roadgame/ui/GUI.fxml +++ b/bin/de/deadlocker8/roadgame/ui/GUI.fxml @@ -5,7 +5,6 @@ <?import javafx.scene.control.Menu?> <?import javafx.scene.control.MenuBar?> <?import javafx.scene.control.MenuItem?> -<?import javafx.scene.control.ScrollPane?> <?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.HBox?> <?import javafx.scene.layout.StackPane?> @@ -15,10 +14,7 @@ <children> <HBox layoutX="14.0" layoutY="40.0" prefHeight="546.0" prefWidth="772.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="40.0"> <children> - <AnchorPane fx:id="anchorPaneGame" prefHeight="572.0" prefWidth="599.0" HBox.hgrow="ALWAYS"> - <children> - <ScrollPane fx:id="scrollPane" prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" /> - </children></AnchorPane> + <AnchorPane fx:id="anchorPaneGame" prefHeight="572.0" prefWidth="599.0" HBox.hgrow="ALWAYS" /> <VBox alignment="TOP_CENTER" prefHeight="572.0" prefWidth="124.0"> <HBox.margin> <Insets left="20.0" /> diff --git a/bin/de/deadlocker8/roadgame/ui/ZoomableScrollPane$ZoomHandler.class b/bin/de/deadlocker8/roadgame/ui/ZoomableScrollPane$ZoomHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..6ebaee931c211e1dc65fbb96c1c0d00a4e3f5e27 Binary files /dev/null and b/bin/de/deadlocker8/roadgame/ui/ZoomableScrollPane$ZoomHandler.class differ diff --git a/bin/de/deadlocker8/roadgame/ui/ZoomableScrollPane.class b/bin/de/deadlocker8/roadgame/ui/ZoomableScrollPane.class new file mode 100644 index 0000000000000000000000000000000000000000..6bc0c53ad5bcb6fa305c70236010b97c4e463dc3 Binary files /dev/null and b/bin/de/deadlocker8/roadgame/ui/ZoomableScrollPane.class differ diff --git a/src/de/deadlocker8/roadgame/ui/Controller.java b/src/de/deadlocker8/roadgame/ui/Controller.java index 698627764e472476a451b68f1d1f0233b18dc38b..5e5df99607f1a892fcd30d609643d7ecda71f01d 100644 --- a/src/de/deadlocker8/roadgame/ui/Controller.java +++ b/src/de/deadlocker8/roadgame/ui/Controller.java @@ -21,7 +21,6 @@ import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.Button; import javafx.scene.control.Label; -import javafx.scene.control.ScrollPane; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.input.MouseButton; @@ -39,14 +38,14 @@ public class Controller @FXML private AnchorPane anchorPaneGame; @FXML private StackPane stackPaneCurrentTile; @FXML private Button buttonRotate; - @FXML private ScrollPane scrollPane; - + private Stage stage; private Image icon = new Image("de/deadlocker8/roadgame/resources/icon.png"); private final ResourceBundle bundle = ResourceBundle.getBundle("de/deadlocker8/roadgame/main/", Locale.GERMANY); private GridPane grid; private Game game; private Textures textures; + private ZoomableScrollPane scrollPane; private StackPane stackPanePlaceHolder; public void init(Stage stage) @@ -56,10 +55,20 @@ public class Controller anchorPaneGame.setStyle("-fx-border-color: #333333; -fx-border-width: 2px"); stackPaneCurrentTile.setStyle("-fx-border-color: #333333; -fx-border-width: 2px"); - + grid = new GridPane(); - grid.setFocusTraversable(false); - scrollPane.setContent(grid); + grid.setFocusTraversable(false); + + scrollPane = new ZoomableScrollPane(grid); + scrollPane.setPannable(true); + scrollPane.setFitToHeight(true); + scrollPane.setFitToWidth(true); + anchorPaneGame.getChildren().add(scrollPane); + AnchorPane.setTopAnchor(scrollPane, 0.0); + AnchorPane.setRightAnchor(scrollPane, 0.0); + AnchorPane.setBottomAnchor(scrollPane, 0.0); + AnchorPane.setLeftAnchor(scrollPane, 0.0); + anchorPaneGame.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override diff --git a/src/de/deadlocker8/roadgame/ui/GUI.fxml b/src/de/deadlocker8/roadgame/ui/GUI.fxml index 22974c03f72d05a5a28feb2fef89b5059e581973..83ae0d5f1eee3b63d1f64a00dc8c85d792d8b8b9 100644 --- a/src/de/deadlocker8/roadgame/ui/GUI.fxml +++ b/src/de/deadlocker8/roadgame/ui/GUI.fxml @@ -5,7 +5,6 @@ <?import javafx.scene.control.Menu?> <?import javafx.scene.control.MenuBar?> <?import javafx.scene.control.MenuItem?> -<?import javafx.scene.control.ScrollPane?> <?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.HBox?> <?import javafx.scene.layout.StackPane?> @@ -15,10 +14,7 @@ <children> <HBox layoutX="14.0" layoutY="40.0" prefHeight="546.0" prefWidth="772.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="40.0"> <children> - <AnchorPane fx:id="anchorPaneGame" prefHeight="572.0" prefWidth="599.0" HBox.hgrow="ALWAYS"> - <children> - <ScrollPane fx:id="scrollPane" prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" /> - </children></AnchorPane> + <AnchorPane fx:id="anchorPaneGame" prefHeight="572.0" prefWidth="599.0" HBox.hgrow="ALWAYS" /> <VBox alignment="TOP_CENTER" prefHeight="572.0" prefWidth="124.0"> <HBox.margin> <Insets left="20.0" /> diff --git a/src/de/deadlocker8/roadgame/ui/ZoomableScrollPane.java b/src/de/deadlocker8/roadgame/ui/ZoomableScrollPane.java new file mode 100644 index 0000000000000000000000000000000000000000..8e648f0a1901a989476eb10f56052acc7e3d45b6 --- /dev/null +++ b/src/de/deadlocker8/roadgame/ui/ZoomableScrollPane.java @@ -0,0 +1,136 @@ +package de.deadlocker8.roadgame.ui; + +import javafx.event.EventHandler; +import javafx.scene.Group; +import javafx.scene.Node; +import javafx.scene.control.ScrollPane; +import javafx.scene.input.ScrollEvent; +import javafx.scene.transform.Scale; + +public class ZoomableScrollPane extends ScrollPane +{ + Group zoomGroup; + Scale scaleTransform; + Node content; + double scaleValue = 1.0; + double delta = 0.1; + + public ZoomableScrollPane(Node content) + { + this.content = content; + Group contentGroup = new Group(); + zoomGroup = new Group(); + contentGroup.getChildren().add(zoomGroup); + zoomGroup.getChildren().add(content); + setContent(contentGroup); + scaleTransform = new Scale(scaleValue, scaleValue, 0, 0); + zoomGroup.getTransforms().add(scaleTransform); + + zoomGroup.setOnScroll(new ZoomHandler()); + } + + public double getScaleValue() + { + return scaleValue; + } + + public void zoomToActual() + { + zoomTo(1.0); + } + + public void zoomTo(double scaleValue) + { + this.scaleValue = scaleValue; + + scaleTransform.setX(scaleValue); + scaleTransform.setY(scaleValue); + } + + public void zoomActual() + { + scaleValue = 1; + zoomTo(scaleValue); + } + + public void zoomOut() + { + scaleValue -= delta; + + if(Double.compare(scaleValue, 0.2) < 0) + { + scaleValue = 0.2; + } + + zoomTo(scaleValue); + } + + public void zoomIn() + { + scaleValue += delta; + + if(Double.compare(scaleValue, 2) > 0) + { + scaleValue = 2; + } + + zoomTo(scaleValue); + } + + /** + * + * @param minimizeOnly + * If the content fits already into the viewport, then we don't + * zoom if this parameter is true. + */ + public void zoomToFit(boolean minimizeOnly) + { + + double scaleX = getViewportBounds().getWidth() / getContent().getBoundsInLocal().getWidth(); + double scaleY = getViewportBounds().getHeight() / getContent().getBoundsInLocal().getHeight(); + + // consider current scale (in content calculation) + scaleX *= scaleValue; + scaleY *= scaleValue; + + // distorted zoom: we don't want it => we search the minimum scale + // factor and apply it + double scale = Math.min(scaleX, scaleY); + + // check precondition + if(minimizeOnly) + { + + // check if zoom factor would be an enlargement and if so, just set + // it to 1 + if(Double.compare(scale, 1) > 0) + { + scale = 1; + } + } + + // apply zoom + zoomTo(scale); + } + + private class ZoomHandler implements EventHandler<ScrollEvent> + { + @Override + public void handle(ScrollEvent scrollEvent) + { + // if (scrollEvent.isControlDown()) + { + if(scrollEvent.getDeltaY() < 0) + { + zoomOut(); + } + else + { + zoomIn(); + } + + scrollEvent.consume(); + } + } + } +} \ No newline at end of file