Search in sources :

Example 61 with Timeline

use of javafx.animation.Timeline in project JFoenix by jfoenixadmin.

the class JFXListCell method updateItem.

/**
	 * {@inheritDoc}
	 */
@Override
public void updateItem(T item, boolean empty) {
    super.updateItem(item, empty);
    if (empty) {
        setText(null);
        setGraphic(null);
        // remove empty (Trailing cells)
        setMouseTransparent(true);
        setStyle("-fx-background-color:TRANSPARENT;");
    } else {
        if (item != null) {
            // if cell is not a trailing cell then show it
            setStyle(null);
            setMouseTransparent(false);
            Node currentNode = getGraphic();
            Node newNode;
            if ((item instanceof Region || item instanceof Control))
                newNode = (Node) item;
            else
                newNode = new Label(item.toString());
            boolean isJFXListView = getListView() instanceof JFXListView;
            // show cell tooltip if its toggled in JFXListView
            if (isJFXListView && ((JFXListView<?>) getListView()).isShowTooltip() && newNode instanceof Label) {
                setTooltip(new Tooltip(((Label) newNode).getText()));
            }
            if (currentNode == null || !currentNode.equals(newNode)) {
                // clear nodes
                cellContent = newNode;
                cellRippler.rippler.cacheRippleClip(false);
                // RIPPLER ITEM : in case if the list item has its own rippler bind the list rippler and item rippler properties
                if (newNode instanceof JFXRippler) {
                    // build cell container from exisiting rippler
                    cellRippler.ripplerFillProperty().bind(((JFXRippler) newNode).ripplerFillProperty());
                    cellRippler.maskTypeProperty().bind(((JFXRippler) newNode).maskTypeProperty());
                    cellRippler.positionProperty().bind(((JFXRippler) newNode).positionProperty());
                    cellContent = ((JFXRippler) newNode).getControl();
                } else // SUBLIST ITEM : build the Cell node as sublist the sublist
                if (newNode instanceof JFXListView<?>) {
                    // add the sublist to the parent and style the cell as sublist item
                    ((JFXListView<?>) getListView()).addSublist((JFXListView<?>) newNode, this.getIndex());
                    this.getStyleClass().add("sublist-item");
                    if (this.getPadding() != null)
                        this.setPadding(new Insets(this.getPadding().getTop(), 0, this.getPadding().getBottom(), 0));
                    // First build the group item used to expand / hide the sublist
                    StackPane groupNode = new StackPane();
                    groupNode.getStyleClass().add("sublist-header");
                    SVGGlyph dropIcon = new SVGGlyph(0, "ANGLE_RIGHT", "M340 548.571q0 7.429-5.714 13.143l-266.286 266.286q-5.714 5.714-13.143 5.714t-13.143-5.714l-28.571-28.571q-5.714-5.714-5.714-13.143t5.714-13.143l224.571-224.571-224.571-224.571q-5.714-5.714-5.714-13.143t5.714-13.143l28.571-28.571q5.714-5.714 13.143-5.714t13.143 5.714l266.286 266.286q5.714 5.714 5.714 13.143z", Color.BLACK);
                    dropIcon.setStyle("-fx-min-width:0.4em;-fx-max-width:0.4em;-fx-min-height:0.6em;-fx-max-height:0.6em;");
                    dropIcon.getStyleClass().add("drop-icon");
                    /*
						 *  alignment of the group node can be changed using the following css selector
						 *  .jfx-list-view .sublist-header{ }
						 */
                    groupNode.getChildren().setAll(((JFXListView<?>) newNode).getGroupnode(), dropIcon);
                    // the margin is needed when rotating the angle
                    StackPane.setMargin(dropIcon, new Insets(0, 19, 0, 0));
                    StackPane.setAlignment(dropIcon, Pos.CENTER_RIGHT);
                    // Second build the sublist container
                    StackPane sublistContainer = new StackPane();
                    sublistContainer.setMinHeight(0);
                    sublistContainer.setMaxHeight(0);
                    sublistContainer.getChildren().setAll(newNode);
                    sublistContainer.setTranslateY(this.snappedBottomInset());
                    sublistContainer.setOpacity(0);
                    StackPane.setMargin(newNode, new Insets(-1, -1, 0, -1));
                    //						sublistContainer.heightProperty().addListener((o,oldVal,newVal)->{
                    //							// store the hieght of the sublist and resize it to 0 to make it hidden
                    //							if(subListHeight == -1){
                    //								subListHeight = newVal.doubleValue() + this.snappedBottomInset()/2;
                    //								//								totalSubListsHeight += subListHeight;
                    //								// set the parent list 
                    //								Platform.runLater(()->{
                    //									sublistContainer.setMinHeight(0);
                    //									sublistContainer.setPrefHeight(0);
                    //									sublistContainer.setMaxHeight(0);
                    //									//									double currentHeight = ((JFXListView<T>)getListView()).getHeight();
                    //									// FIXME : THIS SHOULD ONLY CALLED ONCE ( NOW ITS BEING CALLED FOR EVERY SUBLIST)
                    //									//									updateListViewHeight(currentHeight - totalSubListsHeight);
                    //								});	
                    //							}
                    //						});
                    // Third, create container of group title and the sublist
                    VBox contentHolder = new VBox();
                    contentHolder.getChildren().setAll(groupNode, sublistContainer);
                    contentHolder.getStyleClass().add("sublist-container");
                    VBox.setVgrow(groupNode, Priority.ALWAYS);
                    cellContent = contentHolder;
                    cellRippler.ripplerPane.addEventHandler(MouseEvent.ANY, (e) -> e.consume());
                    contentHolder.addEventHandler(MouseEvent.ANY, (e) -> {
                        if (!e.isConsumed()) {
                            cellRippler.ripplerPane.fireEvent(e);
                            e.consume();
                        }
                    });
                    cellRippler.ripplerPane.addEventHandler(MouseEvent.MOUSE_CLICKED, (e) -> {
                        if (!e.isConsumed()) {
                            e.consume();
                            contentHolder.fireEvent(e);
                        }
                    });
                    // cache rippler clip in subnodes						
                    cellRippler.rippler.cacheRippleClip(true);
                    this.setOnMouseClicked((e) -> e.consume());
                    // Finally, add sublist animation						
                    contentHolder.setOnMouseClicked((click) -> {
                        click.consume();
                        // stop the animation or change the list height 
                        if (expandAnimation != null && expandAnimation.getStatus().equals(Status.RUNNING))
                            expandAnimation.stop();
                        // invert the expand property 
                        expandedProperty.set(!expandedProperty.get());
                        double newAnimatedHeight = ((Region) newNode).prefHeight(-1) * (expandedProperty.get() ? 1 : -1);
                        double newHeight = expandedProperty.get() ? this.getHeight() + newAnimatedHeight : this.prefHeight(-1);
                        // animate showing/hiding the sublist
                        double contentHeight = expandedProperty.get() ? newAnimatedHeight : 0;
                        if (expandedProperty.get()) {
                            updateClipHeight(newHeight);
                            getListView().setPrefHeight(getListView().getHeight() + newAnimatedHeight + animatedHeight);
                        }
                        // update the animated height
                        animatedHeight = newAnimatedHeight;
                        int opacity = expandedProperty.get() ? 1 : 0;
                        expandAnimation = new Timeline(new KeyFrame(Duration.millis(320), new KeyValue(sublistContainer.minHeightProperty(), contentHeight, Interpolator.EASE_BOTH), new KeyValue(sublistContainer.maxHeightProperty(), contentHeight, Interpolator.EASE_BOTH), new KeyValue(sublistContainer.opacityProperty(), opacity, Interpolator.EASE_BOTH)));
                        if (!expandedProperty.get()) {
                            expandAnimation.setOnFinished((finish) -> {
                                updateClipHeight(newHeight);
                                getListView().setPrefHeight(getListView().getHeight() + newAnimatedHeight);
                                animatedHeight = 0;
                            });
                        }
                        expandAnimation.play();
                    });
                    // animate arrow
                    expandedProperty.addListener((o, oldVal, newVal) -> {
                        if (newVal)
                            new Timeline(new KeyFrame(Duration.millis(160), new KeyValue(dropIcon.rotateProperty(), 90, Interpolator.EASE_BOTH))).play();
                        else
                            new Timeline(new KeyFrame(Duration.millis(160), new KeyValue(dropIcon.rotateProperty(), 0, Interpolator.EASE_BOTH))).play();
                    });
                }
                ((Region) cellContent).setMaxHeight(((Region) cellContent).prefHeight(-1));
                setGraphic(cellContent);
                setText(null);
            }
        }
    }
}
Also used : Pos(javafx.geometry.Pos) ListCell(javafx.scene.control.ListCell) Control(javafx.scene.control.Control) MouseEvent(javafx.scene.input.MouseEvent) StackPane(javafx.scene.layout.StackPane) VBox(javafx.scene.layout.VBox) Insets(javafx.geometry.Insets) KeyValue(javafx.animation.KeyValue) Tooltip(javafx.scene.control.Tooltip) Color(javafx.scene.paint.Color) KeyFrame(javafx.animation.KeyFrame) Label(javafx.scene.control.Label) Status(javafx.animation.Animation.Status) Node(javafx.scene.Node) Timeline(javafx.animation.Timeline) Rectangle(javafx.scene.shape.Rectangle) SVGGlyph(com.jfoenix.svg.SVGGlyph) Platform(javafx.application.Platform) Priority(javafx.scene.layout.Priority) BooleanProperty(javafx.beans.property.BooleanProperty) Duration(javafx.util.Duration) SimpleBooleanProperty(javafx.beans.property.SimpleBooleanProperty) Region(javafx.scene.layout.Region) Interpolator(javafx.animation.Interpolator) Shape(javafx.scene.shape.Shape) Insets(javafx.geometry.Insets) KeyValue(javafx.animation.KeyValue) Node(javafx.scene.Node) Tooltip(javafx.scene.control.Tooltip) Label(javafx.scene.control.Label) Control(javafx.scene.control.Control) Timeline(javafx.animation.Timeline) SVGGlyph(com.jfoenix.svg.SVGGlyph) Region(javafx.scene.layout.Region) KeyFrame(javafx.animation.KeyFrame) VBox(javafx.scene.layout.VBox) StackPane(javafx.scene.layout.StackPane)

Example 62 with Timeline

use of javafx.animation.Timeline in project JFoenix by jfoenixadmin.

the class JFXSnackbar method close.

public void close() {
    Timeline animation = new Timeline(new KeyFrame(Duration.ZERO, (e) -> popup.toFront(), new KeyValue(popup.opacityProperty(), 1, easeInterpolator), new KeyValue(popup.translateYProperty(), 0, easeInterpolator)), new KeyFrame(Duration.millis(290), new KeyValue(popup.visibleProperty(), true, Interpolator.EASE_BOTH)), new KeyFrame(Duration.millis(300), (e) -> popup.toBack(), new KeyValue(popup.visibleProperty(), false, Interpolator.EASE_BOTH), new KeyValue(popup.translateYProperty(), popup.getLayoutBounds().getHeight(), easeInterpolator), new KeyValue(popup.opacityProperty(), 0, easeInterpolator)));
    animation.setCycleCount(1);
    animation.setOnFinished((e) -> processSnackbars());
    animation.play();
}
Also used : EventHandler(javafx.event.EventHandler) ButtonType(com.jfoenix.controls.JFXButton.ButtonType) KeyFrame(javafx.animation.KeyFrame) Label(javafx.scene.control.Label) Control(javafx.scene.control.Control) MouseEvent(javafx.scene.input.MouseEvent) Event(javafx.event.Event) Timeline(javafx.animation.Timeline) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) StackPane(javafx.scene.layout.StackPane) Group(javafx.scene.Group) Bindings(javafx.beans.binding.Bindings) EventType(javafx.event.EventType) Platform(javafx.application.Platform) Duration(javafx.util.Duration) Insets(javafx.geometry.Insets) Interpolator(javafx.animation.Interpolator) BorderPane(javafx.scene.layout.BorderPane) KeyValue(javafx.animation.KeyValue) ChangeListener(javafx.beans.value.ChangeListener) Bounds(javafx.geometry.Bounds) Pane(javafx.scene.layout.Pane) ConcurrentLinkedQueue(java.util.concurrent.ConcurrentLinkedQueue) Timeline(javafx.animation.Timeline) KeyValue(javafx.animation.KeyValue) KeyFrame(javafx.animation.KeyFrame)

Example 63 with Timeline

use of javafx.animation.Timeline in project JFoenix by jfoenixadmin.

the class JFXSnackbar method getTimeline.

private Timeline getTimeline(long timeout) {
    Timeline animation;
    if (timeout <= 0) {
        animation = new Timeline(new KeyFrame(Duration.ZERO, (e) -> popup.toBack(), new KeyValue(popup.visibleProperty(), false, Interpolator.EASE_BOTH), new KeyValue(popup.translateYProperty(), popup.getLayoutBounds().getHeight(), easeInterpolator), new KeyValue(popup.opacityProperty(), 0, easeInterpolator)), new KeyFrame(Duration.millis(10), (e) -> popup.toFront(), new KeyValue(popup.visibleProperty(), true, Interpolator.EASE_BOTH)), new KeyFrame(Duration.millis(300), new KeyValue(popup.opacityProperty(), 1, easeInterpolator), new KeyValue(popup.translateYProperty(), 0, easeInterpolator)));
        animation.setCycleCount(1);
    } else {
        animation = new Timeline(new KeyFrame(Duration.ZERO, (e) -> popup.toBack(), new KeyValue(popup.visibleProperty(), false, Interpolator.EASE_BOTH), new KeyValue(popup.translateYProperty(), popup.getLayoutBounds().getHeight(), easeInterpolator), new KeyValue(popup.opacityProperty(), 0, easeInterpolator)), new KeyFrame(Duration.millis(10), (e) -> popup.toFront(), new KeyValue(popup.visibleProperty(), true, Interpolator.EASE_BOTH)), new KeyFrame(Duration.millis(300), new KeyValue(popup.opacityProperty(), 1, easeInterpolator), new KeyValue(popup.translateYProperty(), 0, easeInterpolator)), new KeyFrame(Duration.millis(timeout / 2)));
        animation.setAutoReverse(true);
        animation.setCycleCount(2);
        animation.setOnFinished((e) -> processSnackbars());
    }
    return animation;
}
Also used : Timeline(javafx.animation.Timeline) KeyValue(javafx.animation.KeyValue) KeyFrame(javafx.animation.KeyFrame)

Example 64 with Timeline

use of javafx.animation.Timeline in project JFoenix by jfoenixadmin.

the class JFXTogglePane method updateToggleAnimation.

private void updateToggleAnimation() {
    if (getContentNode() == null)
        return;
    double rateX = this.getWidth() / getClip().getLayoutBounds().getWidth();
    double rateY = this.getHeight() / getClip().getLayoutBounds().getHeight();
    double newRate = Math.max(rateX, rateY) * getScalingFactor();
    double animationRate = toggleAnimation == null ? -1 : toggleAnimation.getRate();
    toggleAnimation = new Timeline(new KeyFrame(Duration.millis(0), new KeyValue(getClip().scaleXProperty(), 1, Interpolator.EASE_BOTH)), new KeyFrame(Duration.millis(0), new KeyValue(getClip().scaleYProperty(), 1, Interpolator.EASE_BOTH)), new KeyFrame(Duration.millis(0), new KeyValue(getContentNode().opacityProperty(), 0, Interpolator.EASE_BOTH)), new KeyFrame(Duration.millis(350), new KeyValue(getClip().scaleXProperty(), newRate, Interpolator.EASE_BOTH)), new KeyFrame(Duration.millis(350), new KeyValue(getClip().scaleYProperty(), newRate, Interpolator.EASE_BOTH)), new KeyFrame(Duration.millis(370), new KeyValue(getContentNode().opacityProperty(), 0, Interpolator.EASE_BOTH)), new KeyFrame(Duration.millis(510), new KeyValue(getContentNode().opacityProperty(), 1, Interpolator.EASE_BOTH)));
    toggleAnimation.setOnFinished((finish) -> {
        if (toggleAnimation.getRate() == 1) {
            this.getClip().scaleXProperty().bind(Bindings.createDoubleBinding(() -> {
                double X = this.getWidth() / getClip().getLayoutBounds().getWidth();
                double Y = this.getHeight() / getClip().getLayoutBounds().getHeight();
                double scale = Math.max(X, Y) * getScalingFactor();
                return scale;
            }, this.widthProperty(), this.heightProperty()));
            this.getClip().scaleYProperty().bind(Bindings.createDoubleBinding(() -> {
                double X = this.getWidth() / getClip().getLayoutBounds().getWidth();
                double Y = this.getHeight() / getClip().getLayoutBounds().getHeight();
                double scale = Math.max(X, Y) * getScalingFactor();
                return scale;
            }, this.widthProperty(), this.heightProperty()));
        }
    });
    toggleAnimation.setRate(animationRate);
}
Also used : Timeline(javafx.animation.Timeline) KeyValue(javafx.animation.KeyValue) KeyFrame(javafx.animation.KeyFrame)

Example 65 with Timeline

use of javafx.animation.Timeline in project JFoenix by jfoenixadmin.

the class JFXTreeCell method animateSibling.

private void animateSibling(int i, JFXTreeView<T> jfxTreeView) {
    if (!jfxTreeView.disableSiblings) {
        Timeline createSibAnimation = createSibAnimation(this, i);
        jfxTreeView.sibAnimationMap.put(i, new CellAnimation(this, createSibAnimation));
        jfxTreeView.trans.getChildren().add(createSibAnimation);
    }
}
Also used : Timeline(javafx.animation.Timeline) CellAnimation(com.jfoenix.controls.JFXTreeView.CellAnimation)

Aggregations

Timeline (javafx.animation.Timeline)111 KeyFrame (javafx.animation.KeyFrame)107 KeyValue (javafx.animation.KeyValue)81 Duration (javafx.util.Duration)32 ActionEvent (javafx.event.ActionEvent)22 JFXButton (com.jfoenix.controls.JFXButton)20 IOException (java.io.IOException)19 URL (java.net.URL)19 ResourceBundle (java.util.ResourceBundle)19 FXML (javafx.fxml.FXML)19 Initializable (javafx.fxml.Initializable)18 FXMLLoader (javafx.fxml.FXMLLoader)17 Pane (javafx.scene.layout.Pane)17 AnchorPane (javafx.scene.layout.AnchorPane)16 Level (java.util.logging.Level)15 Logger (java.util.logging.Logger)15 MouseEvent (javafx.scene.input.MouseEvent)14 Rotate (javafx.scene.transform.Rotate)14 JFXTextField (com.jfoenix.controls.JFXTextField)12 Interpolator (javafx.animation.Interpolator)12