From 9addc660b752a053209b67653ff9ffd9a99cc71f Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Thu, 8 Dec 2016 00:27:38 +0100 Subject: [PATCH] Fixed #3 --- .../roadgame/ui/Controller$1.class | Bin 1263 -> 1263 bytes .../roadgame/ui/Controller$2.class | Bin 1401 -> 1401 bytes .../deadlocker8/roadgame/ui/Controller.class | Bin 13210 -> 13411 bytes bin/de/deadlocker8/roadgame/ui/GUI.fxml | 6 +- .../ui/ZoomableScrollPane$ZoomHandler.class | Bin 0 -> 1350 bytes .../roadgame/ui/ZoomableScrollPane.class | Bin 0 -> 2715 bytes .../deadlocker8/roadgame/ui/Controller.java | 21 ++- src/de/deadlocker8/roadgame/ui/GUI.fxml | 6 +- .../roadgame/ui/ZoomableScrollPane.java | 136 ++++++++++++++++++ 9 files changed, 153 insertions(+), 16 deletions(-) create mode 100644 bin/de/deadlocker8/roadgame/ui/ZoomableScrollPane$ZoomHandler.class create mode 100644 bin/de/deadlocker8/roadgame/ui/ZoomableScrollPane.class create mode 100644 src/de/deadlocker8/roadgame/ui/ZoomableScrollPane.java diff --git a/bin/de/deadlocker8/roadgame/ui/Controller$1.class b/bin/de/deadlocker8/roadgame/ui/Controller$1.class index 6f25679d13703a2bd3e5d1e2f2263eca6fb93cae..4e053851e8c3cbe0d8718bff2acf9e8545bf0414 100644 GIT binary patch delta 27 icmaFQ`JQuwAPb|%WFZzGPG1II27d+-hQP_`EFA!6ng)>o delta 27 icmaFQ`JQuwAPb}YWFZzGP8SAV1~&!~29L?<EFA!4{040R diff --git a/bin/de/deadlocker8/roadgame/ui/Controller$2.class b/bin/de/deadlocker8/roadgame/ui/Controller$2.class index fbe577013de6ba25a8f7dccf22368c68e3f615ae..96d6c60f6b62215bc8af9008d96194a98f7dc941 100644 GIT binary patch delta 27 jcmey#^^<GEWERGClc%tRaBgPcW!TCf!?1nwN0tr%l0*sJ delta 27 jcmey#^^<GEWERGylc%tRaIRwDWmv-?!?14hN0tr%kfsT_ diff --git a/bin/de/deadlocker8/roadgame/ui/Controller.class b/bin/de/deadlocker8/roadgame/ui/Controller.class index 5cfb47e5e37c56fb953c13b3aa1a0facd10988d5..125ef454b418ee3c37fa4114307dd6a209ce8bb8 100644 GIT binary patch delta 6922 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 DNqb#% delta 6889 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 JWGZlw1OO#TE6o4^ diff --git a/bin/de/deadlocker8/roadgame/ui/GUI.fxml b/bin/de/deadlocker8/roadgame/ui/GUI.fxml index 22974c0..83ae0d5 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 GIT binary patch literal 1350 zcmX^0Z`VEs1_l!bb9M$MMh452RQ;6H#FU);<m}WU3;m+}#FX^J+*JM2O#P_*{M^K( zoYdgtqWqkkfW*916_AieVqQv4Y7sjF3nPO-R$^JAeokUuy1su>R%&tyI|CadgCs~a ztwKMwEH$r0-xWkcH8C=<m1JZVs~9jc==+dlwKXFHn@wh3W{DjmgOLV_dNsos8Cab2 zQ&Kq@7#VnZ7}yy&xEPoj_<0yO83Y&^m^DBO_<b_-QvFJElTwR9K;C9#5c0`SPRt2Q zEXoA&p@J+R4=^%Vlja2EkOO%o100Bq49Xfl(7-BAPR&cz&&(?*EzyUBI5^;}HN&_V zBp9UF86+7Q<nXKIVUT8!VPxP;Pc3mt%_&KY1bfYei$RV-ft^8~kwKTFAm?FF1ceTJ zRepZ1e`yKG7-b#?6_6MkNX#=2<T5oL26d1SdvbnWacOQUBLjCaIKhCO&&Z%a$b*aw zyul@j$=SY%1<)WChX)E$3IYcNBZDpvgD8U-BSS8!X@G+G0!0BMg8?YDa4|A)1?QI* zC8xS&=A<$*h=XzjD0M)h43tUqK#|1Az!{vGo|jlsT9nGj;13Q1<a}Zc7QvcFY+zEj zQiPo~BLk0TUS4XEb53G$acVIm12@PS&^*SVz`)4B%)rRN%D^Zf07~l&3=Av`Obnb1 zTnvm1+~C~L#K6SBz`&)Yy_JDSYdZtqMg|53CI&$U1_m|;Mg|6k5(Xg#1_mB5n~Oo1 zL4<*Ufe{q)P!kHlCNeO{Yj0x^=bJHyfmdq_1J5=F+2sse5SEhmHU?FYvCLp&r5M;4 z7#OM<I2mdg1Q_ZVgc%wcq!?Nl<QUq(R*8WfBoDQUfkB=@gF%ylkwFXMcwsgHM+Q*_ zZK(B{3=j`+YH1%}kl4nc1F{I&{fuBknHU%Z7#KJi^q|_*7?>ECL4MTI-p-(pt_R|0 gP`EHN7=pvYh`|_4n=qJyLW_ZsfssLu!Hj_k0KI2VqyPW_ literal 0 HcmV?d00001 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 GIT binary patch literal 2715 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 O0F|*842%qI3`_u*LQ&5E literal 0 HcmV?d00001 diff --git a/src/de/deadlocker8/roadgame/ui/Controller.java b/src/de/deadlocker8/roadgame/ui/Controller.java index 6986277..5e5df99 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 22974c0..83ae0d5 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 0000000..8e648f0 --- /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 -- GitLab