From 9739c6202c16c209373838de148741215b3d1870 Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Sun, 17 Apr 2016 14:35:46 +0200 Subject: [PATCH 1/3] FX: cursors Fixes #4405 --- core/src/processing/javafx/PSurfaceFX.java | 37 +++++++++++++++++----- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/core/src/processing/javafx/PSurfaceFX.java b/core/src/processing/javafx/PSurfaceFX.java index 29fa59861..6c1992a1c 100644 --- a/core/src/processing/javafx/PSurfaceFX.java +++ b/core/src/processing/javafx/PSurfaceFX.java @@ -38,9 +38,13 @@ import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.event.EventType; +import javafx.scene.Cursor; +import javafx.scene.ImageCursor; import javafx.scene.Scene; import javafx.scene.SceneAntialiasing; import javafx.scene.canvas.Canvas; +import javafx.scene.image.PixelFormat; +import javafx.scene.image.WritableImage; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.input.MouseEvent; @@ -590,28 +594,45 @@ public class PSurfaceFX implements PSurface { // canvas.requestFocus(); // } + Cursor lastCursor = Cursor.DEFAULT; public void setCursor(int kind) { - // TODO Auto-generated method stub - + Cursor c; + switch (kind) { + case PConstants.ARROW: c = Cursor.DEFAULT; break; + case PConstants.CROSS: c = Cursor.CROSSHAIR; break; + case PConstants.HAND: c = Cursor.HAND; break; + case PConstants.MOVE: c = Cursor.MOVE; break; + case PConstants.TEXT: c = Cursor.TEXT; break; + case PConstants.WAIT: c = Cursor.WAIT; break; + default: c = Cursor.DEFAULT; break; + } + lastCursor = c; + canvas.getScene().setCursor(c); } public void setCursor(PImage image, int hotspotX, int hotspotY) { - // TODO Auto-generated method stub - + int w = image.pixelWidth; + int h = image.pixelHeight; + WritableImage im = new WritableImage(w, h); + im.getPixelWriter().setPixels(0, 0, w, h, + PixelFormat.getIntArgbInstance(), + image.pixels, + 0, w); + ImageCursor c = new ImageCursor(im, hotspotX, hotspotY); + lastCursor = c; + canvas.getScene().setCursor(c); } public void showCursor() { - // TODO Auto-generated method stub - + canvas.getScene().setCursor(lastCursor); } public void hideCursor() { - // TODO Auto-generated method stub - + canvas.getScene().setCursor(Cursor.NONE); } From b5e09b474aaaa2a4170d23e2a5c3eb6e4b8f0fd5 Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Sun, 17 Apr 2016 14:36:01 +0200 Subject: [PATCH 2/3] FX: window icons --- core/src/processing/javafx/PSurfaceFX.java | 43 +++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/core/src/processing/javafx/PSurfaceFX.java b/core/src/processing/javafx/PSurfaceFX.java index 6c1992a1c..088646f3d 100644 --- a/core/src/processing/javafx/PSurfaceFX.java +++ b/core/src/processing/javafx/PSurfaceFX.java @@ -25,7 +25,10 @@ package processing.javafx; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; +import java.net.URL; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import javafx.animation.Animation; @@ -43,6 +46,7 @@ import javafx.scene.ImageCursor; import javafx.scene.Scene; import javafx.scene.SceneAntialiasing; import javafx.scene.canvas.Canvas; +import javafx.scene.image.Image; import javafx.scene.image.PixelFormat; import javafx.scene.image.WritableImage; import javafx.scene.input.KeyCode; @@ -356,6 +360,8 @@ public class PSurfaceFX implements PSurface { Thread.sleep(5); } catch (InterruptedException e) { } } + + setProcessingIcon(stage); } @@ -394,7 +400,42 @@ public class PSurfaceFX implements PSurface { public void setIcon(PImage icon) { - // TODO implement this in JavaFX + int w = icon.pixelWidth; + int h = icon.pixelHeight; + WritableImage im = new WritableImage(w, h); + im.getPixelWriter().setPixels(0, 0, w, h, + PixelFormat.getIntArgbInstance(), + icon.pixels, + 0, w); + + Stage stage = (Stage) canvas.getScene().getWindow(); + stage.getIcons().clear(); + stage.getIcons().add(im); + } + + + List iconImages; + + protected void setProcessingIcon(Stage stage) { + // Adapted from PSurfaceAWT + // Note: FX chooses wrong icon size, should be fixed in Java 9, see: + // https://bugs.openjdk.java.net/browse/JDK-8091186 + // Removing smaller sizes helps a bit, but big ones are downsized + try { + if (iconImages == null) { + iconImages = new ArrayList<>(); + final int[] sizes = { 48, 64, 128, 256, 512 }; + + for (int sz : sizes) { + URL url = PApplet.class.getResource("/icon/icon-" + sz + ".png"); + Image image = new Image(url.toString()); + iconImages.add(image); + } + } + List icons = stage.getIcons(); + icons.clear(); + icons.addAll(iconImages); + } catch (Exception e) { } // harmless; keep this to ourselves } From eec809091e7a129647cbd289e35a8df6f1336295 Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Sun, 17 Apr 2016 14:59:15 +0200 Subject: [PATCH 3/3] FX: make sure dispose() is called on exit --- core/src/processing/javafx/PSurfaceFX.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/processing/javafx/PSurfaceFX.java b/core/src/processing/javafx/PSurfaceFX.java index 088646f3d..9cd5baa11 100644 --- a/core/src/processing/javafx/PSurfaceFX.java +++ b/core/src/processing/javafx/PSurfaceFX.java @@ -337,6 +337,11 @@ public class PSurfaceFX implements PSurface { // the stage, assign it only when it is all set up surface.stage = stage; } + + @Override + public void stop() throws Exception { + surface.sketch.dispose(); + } }