package de.calette.mephisto3.util; import callete.api.services.resources.ImageResource; import callete.api.services.resources.SlideShow; import javafx.application.Platform; import javafx.scene.effect.ColorAdjust; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.StackPane; import java.util.Timer; import java.util.TimerTask; /** */ public class SlideshowPanel extends StackPane { public static final int PERIOD = 5000; public static final int TRANSITION_MILLIS = 400; private ImageView imageViewOld = new ImageView(); private ImageView imageViewNew = new ImageView(); private SlideShow slideShow; private Timer timer; public SlideshowPanel() { ColorAdjust brightness = new ColorAdjust(); brightness.setBrightness(-0.3); imageViewNew.setEffect(brightness); imageViewOld.setEffect(brightness); getChildren().add(imageViewOld); getChildren().add(imageViewNew); } public void setSlideShow(SlideShow slideShow) { if(timer != null) { this.stopSlideShow(); } this.slideShow = slideShow; } public void startSlideShow() { //apply datetime timer boolean startTimer = slideShow.size() > 1; if(startTimer) { timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { nextImage(); } }, 0, PERIOD); } else { nextImage(); } } public void stopSlideShow() { this.timer.cancel(); this.timer.purge(); } // ----------------- Helper --------------------------------- /** * Applies the next image from the slide show. */ private void nextImage() { ImageResource imageResource = slideShow.nextImage(); final Image image = ComponentUtil.toFXImage(imageResource); Platform.runLater(new Runnable() { @Override public void run() { ImageView showView = imageViewOld; ImageView hideView = imageViewNew; if(hideView.getOpacity() == 0) { showView = imageViewNew; hideView = imageViewOld; } showView.setImage(image); TransitionUtil.createInFader(showView, TRANSITION_MILLIS).play(); if(hideView.getOpacity() == 1) { TransitionUtil.createOutFader(hideView, TRANSITION_MILLIS).play(); } } }); } }