package de.calette.mephisto3.util;
import de.calette.mephisto3.ui.ServiceChooser;
import javafx.animation.*;
import javafx.scene.CacheHint;
import javafx.scene.Node;
import javafx.scene.layout.Pane;
import javafx.util.Duration;
/**
* Utility class for creating transitions with default values.
*/
public class TransitionUtil {
public static final int FADER_DEFAULT = 200;
/**
* Creates a fade in effect without playing it
*/
public static FadeTransition createInFader(Node node) {
return createInFader(node, FADER_DEFAULT);
}
public static FadeTransition createInFader(Node node, long duration) {
FadeTransition fadeTransition = new FadeTransition(Duration.millis(duration), node);
fadeTransition.setFromValue(0);
fadeTransition.setToValue(1);
applyDefaults(node, fadeTransition);
return fadeTransition;
}
public static FadeTransition createOutFader(Node node, long duration) {
FadeTransition fadeTransition = new FadeTransition(Duration.millis(duration), node);
fadeTransition.setFromValue(1);
fadeTransition.setToValue(0);
applyDefaults(node, fadeTransition);
return fadeTransition;
}
public static FadeTransition createOutFader(Node node) {
FadeTransition fadeTransition = new FadeTransition(Duration.millis(FADER_DEFAULT), node);
fadeTransition.setFromValue(1);
fadeTransition.setToValue(0);
applyDefaults(node, fadeTransition);
return fadeTransition;
}
public static ScaleTransition createScaler(Node node, double factor) {
ScaleTransition scaleTransition = new ScaleTransition(Duration.millis(ServiceChooser.SCROLL_DURATION), node);
scaleTransition.setToX(factor);
scaleTransition.setToY(factor);
applyDefaults(node, scaleTransition);
return scaleTransition;
}
/**
* Creates a blink out effect without playing it
*/
public static FadeTransition createBlink(Node node) {
FadeTransition fadeTransition = new FadeTransition(Duration.millis(80), node);
fadeTransition.setFromValue(0.1);
fadeTransition.setCycleCount(3);
fadeTransition.setToValue(1);
applyDefaults(node, fadeTransition);
return fadeTransition;
}
/**
* Expands the width of the given Pane to the target width.
*
* @param node the pane to expand
* @param offset the offset width of the pane
*/
public static Transition createMaxWidthTransition(final Pane node, final int originalWidth, final int offset, final boolean increase) {
final Transition transition = new Transition() {
{
setCycleDuration(Duration.millis(200));
}
@Override
protected void interpolate(double v) {
double percent = v * 100;
double newWidthOffset = offset * percent / 100;
if(increase) {
node.setMinWidth(originalWidth + newWidthOffset);
}
else {
node.setMinWidth(originalWidth - newWidthOffset);
}
}
};
transition.setAutoReverse(false);
transition.setInterpolator(Interpolator.EASE_BOTH);
applyDefaults(node, transition);
return transition;
}
/**
* Translate transition used for scrolling
*/
public static TranslateTransition createTranslateByXTransition(Node node, long duration, int width) {
TranslateTransition translateTransition = new TranslateTransition(Duration.millis(duration), node);
translateTransition.setByX(width);
applyDefaults(node, translateTransition);
return translateTransition;
}
/**
* Translate transition used for scrolling
*/
public static TranslateTransition createTranslateByYTransition(Node node, long duration, int height) {
TranslateTransition translateTransition = new TranslateTransition(Duration.millis(duration), node);
translateTransition.setByY(height);
applyDefaults(node, translateTransition);
return translateTransition;
}
/**
* Applies common settings for transitions and their nodes.
*
* @param node the node the transition is working on
* @param transition the transition to apply the defaults for
*/
private static void applyDefaults(Node node, Transition transition) {
transition.setAutoReverse(false);
transition.setInterpolator(Interpolator.EASE_BOTH);
//apply speed as default cache strategy.
if(!node.getCacheHint().equals(CacheHint.SPEED)) {
node.setCache(true);
node.setCacheHint(CacheHint.SPEED);
}
}
}