Skip to content

Commit

Permalink
Version 11.3.3
Browse files Browse the repository at this point in the history
Demo completely redone, turn out that wrapping MFXHLoader and MFXVLoader in a ScrollPane is the way to go if there will be lot of buttons in them.
Cleaned up some CSS files.

AbstractMFXDialog/MFXDialog are now visible by default, this is a workaround for using MFXDialog in SceneBuilder.
Added MFXScrollPaneSkin for MFXScrollPane, for many years there is a known bug that makes the content of a ScrollPane blurry, I didn't notice it, for some reason the bug appeared on my laptop.
MFXVLoader forgot to change thread countdown.
MFXHLoader and MFXVLoader, fixed exception for not being on JavaFX Thread.
MFXNotifications are rounded by default now and have borders to distinguish them in case of white background.
Added new SVG resources.

Signed-off-by: PAlex404 <alessandro.parisi406@gmail.com>
  • Loading branch information
palexdev committed Dec 3, 2020
1 parent 776956b commit 86fc447
Show file tree
Hide file tree
Showing 28 changed files with 615 additions and 120 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,15 +86,15 @@ repositories {
}
dependencies {
implementation 'io.github.palexdev:materialfx:11.3.2'
implementation 'io.github.palexdev:materialfx:11.3.3'
}
```
###### Maven
```xml
<dependency>
<groupId>io.github.palexdev</groupId>
<artifactId>materialfx</artifactId>
<version>11.3.2</version>
<version>11.3.3</version>
</dependency>
```

Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ plugins {
}

group 'io.github.palexdev'
version '11.3.2'
version '11.3.3'

repositories {
mavenCentral()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package io.github.palexdev.materialfx.demo;

import fr.brouillard.oss.cssfx.CSSFX;
import io.github.palexdev.materialfx.demo.controllers.DemoController;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
Expand All @@ -20,7 +21,8 @@ public void start(Stage primaryStage) throws IOException {
CSSFX.start();

FXMLLoader fxmlLoader = new FXMLLoader(MFXResourcesLoader.load("demo.fxml"));
AnchorPane demoPane = fxmlLoader.load();
fxmlLoader.setControllerFactory(controller -> new DemoController(primaryStage, getHostServices()));
StackPane demoPane = fxmlLoader.load();

demoPane.setOnMousePressed(event -> {
xOffset = primaryStage.getX() - event.getScreenX();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,69 +1,241 @@
package io.github.palexdev.materialfx.demo.controllers;

import io.github.palexdev.materialfx.MFXResourcesManager.SVGResources;
import io.github.palexdev.materialfx.controls.MFXButton;
import io.github.palexdev.materialfx.controls.MFXHLoader;
import io.github.palexdev.materialfx.controls.MFXToggleNode;
import io.github.palexdev.materialfx.controls.MFXVLoader;
import io.github.palexdev.materialfx.controls.*;
import io.github.palexdev.materialfx.controls.factories.MFXAnimationFactory;
import io.github.palexdev.materialfx.demo.MFXResourcesLoader;
import io.github.palexdev.materialfx.utils.NodeUtils;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.ParallelTransition;
import javafx.animation.Timeline;
import javafx.application.HostServices;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.SVGPath;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.util.Duration;
import org.kordamp.ikonli.javafx.FontIcon;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class DemoController implements Initializable {
private final Stage primaryStage;
private final HostServices hostServices;

private ParallelTransition openNav;
private ParallelTransition closeNav;
private boolean isNavShown = false;

@FXML
private AnchorPane demoPane;
private StackPane demoPane;

@FXML
private MFXHLoader hLoader;
private StackPane navBar;

@FXML
private MFXVLoader vLoader;

private MFXButton opNavButton;

@FXML
private StackPane contentPane;

public DemoController(Stage primaryStage, HostServices hostServices) {
this.primaryStage = primaryStage;
this.hostServices = hostServices;
}

@Override
public void initialize(URL location, ResourceBundle resources) {
MFXButton closeButton = new MFXButton("");
// Resources
SVGPath x = SVGResources.X.getSvgPath();
x.setScaleX(0.15);
x.setScaleY(0.15);
x.setFill(Color.WHITE);
closeButton.setPrefSize(20, 20);
x.setScaleX(0.14);
x.setScaleY(0.14);
SVGPath minus = SVGResources.MINUS.getSvgPath();
minus.setScaleX(0.03);
minus.setScaleY(0.05);
SVGPath expand = SVGResources.EXPAND.getSvgPath();
expand.setScaleX(0.5);
expand.setScaleY(0.5);
SVGPath info = SVGResources.INFO.getSvgPath();
info.setScaleX(0.4);
info.setScaleY(0.4);
info.setFill(Color.rgb(75, 181, 255));
FontIcon angle = new FontIcon("fas-angle-right");
angle.setIconSize(20);

// Buttons
MFXButton closeButton = new MFXButton("");
closeButton.setId("closeButton");
closeButton.setPrefSize(25, 25);
closeButton.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
closeButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> primaryStage.close());

MFXButton minimizeButton = new MFXButton("");
minimizeButton.setId("minimizeButton");
minimizeButton.setPrefSize(22, 22);
minimizeButton.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
minimizeButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> primaryStage.setIconified(true));

MFXButton expandButton = new MFXButton("");
expandButton.setId("expandButton");
expandButton.setPrefSize(22, 22);
expandButton.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
expandButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> primaryStage.setFullScreen(!primaryStage.isFullScreen()));

MFXButton infoButton = new MFXButton("");
infoButton.setId("infoButton");
infoButton.setPrefSize(30, 30);
infoButton.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
infoButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> showInfo());

opNavButton = new MFXButton("");
opNavButton.setId("navButton");
opNavButton.setPrefSize(25, 25);
opNavButton.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
opNavButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> animate());


// Graphics
closeButton.setGraphic(x);
closeButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> ((Stage) demoPane.getScene().getWindow()).close());
closeButton.setStyle("-fx-background-color: transparent");
demoPane.getChildren().add(closeButton);
AnchorPane.setTopAnchor(closeButton, 8.0);
AnchorPane.setRightAnchor(closeButton, 10.0);
minimizeButton.setGraphic(minus);
expandButton.setGraphic(expand);
infoButton.setGraphic(info);
opNavButton.setGraphic(angle);

// Layout and Utils
StackPane.setAlignment(closeButton, Pos.TOP_RIGHT);
StackPane.setMargin(closeButton, new Insets(8, 8, 0, 0));
StackPane.setAlignment(minimizeButton, Pos.TOP_RIGHT);
StackPane.setMargin(minimizeButton, new Insets(10, 34, 0, 0));
StackPane.setAlignment(expandButton, Pos.TOP_RIGHT);
StackPane.setMargin(expandButton, new Insets(10, 60, 0, 0));
StackPane.setAlignment(infoButton, Pos.BOTTOM_RIGHT);
StackPane.setMargin(infoButton, new Insets(0, 8, 8, 0));
StackPane.setAlignment(opNavButton, Pos.CENTER_LEFT);
StackPane.setMargin(opNavButton, new Insets(0, 0, 0, 9));

NodeUtils.makeRegionCircular(closeButton);
NodeUtils.makeRegionCircular(minimizeButton);
NodeUtils.makeRegionCircular(expandButton);
NodeUtils.makeRegionCircular(infoButton);
NodeUtils.makeRegionCircular(opNavButton);

// Add all
demoPane.getChildren().addAll(closeButton, minimizeButton, expandButton, infoButton, opNavButton);

hLoader.setContentPane(contentPane);
// VLoader
vLoader.setContentPane(contentPane);
vLoader.addItem(0, "BUTTONS", new MFXToggleNode("BUTTONS"), MFXResourcesLoader.load("buttons_demo.fxml"));
vLoader.addItem(1, "CHECKBOXES", new MFXToggleNode("CHECKBOXES"), MFXResourcesLoader.load("checkboxes_demo.fxml"));
vLoader.addItem(2, "TOGGLES", new MFXToggleNode("TOGGLES"), MFXResourcesLoader.load("toggle_buttons_demo.fxml"));
vLoader.addItem(3, "DIALOGS", new MFXToggleNode("DIALOGS"), MFXResourcesLoader.load("dialogs_demo.fxml"), controller -> new DialogsController(demoPane));
vLoader.addItem(4, "NOTIFICATIONS", new MFXToggleNode("NOTIFICATIONS"), MFXResourcesLoader.load("notifications_demo.fxml"));
vLoader.addItem(5, "SCROLLPANE", new MFXToggleNode("SCROLLPANE"), MFXResourcesLoader.load("scrollpane_demo.fxml"));
vLoader.setDefault("BUTTONS");

hLoader.addItem(0, "BUTTONS", new MFXToggleNode("BUTTONS"), MFXResourcesLoader.load("buttons_demo.fxml"));
hLoader.addItem(1, "CHECKBOXES", new MFXToggleNode("CHECKBOXES"), MFXResourcesLoader.load("checkboxes_demo.fxml"));
hLoader.addItem(2, "TOGGLES", new MFXToggleNode("TOGGLES"), MFXResourcesLoader.load("toggle_buttons_demo.fxml"));
hLoader.addItem(3, "DIALOGS", new MFXToggleNode("DIALOGS"), MFXResourcesLoader.load("dialogs_demo.fxml"), controller -> new DialogsController(demoPane));
hLoader.addItem(4, "NOTIFICATIONS", new MFXToggleNode("NOTIFICATIONS"), MFXResourcesLoader.load("notifications_demo.fxml"));
hLoader.addItem(5, "SCROLLPANE", new MFXToggleNode("SCROLLPANE"), MFXResourcesLoader.load("scrollpane_demo.fxml"));
hLoader.setDefault("BUTTONS");

/*
vLoader.addItem(0, new MFXButton("Buttons", 80, 40), MFXResourcesLoader.load("buttons_demo.fxml"));
vLoader.addItem(1, new MFXButton("Checkboxes", 80, 40), MFXResourcesLoader.load("checkboxes_demo.fxml"));
vLoader.addItem(2, new MFXButton("Toggles", 80, 40), MFXResourcesLoader.load("toggle_buttons_demo.fxml"));
vLoader.addItem(3, new MFXButton("Dialogs", 80, 40), MFXResourcesLoader.load("dialogs_demo.fxml"), controller -> new DialogsController(demoPane));
*/
// Others
primaryStage.sceneProperty().addListener((observable, oldValue, newValue) -> {
if (newValue != null) {
Scene scene = primaryStage.getScene();
scene.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
if (event.getCode() == KeyCode.F11) {
primaryStage.setFullScreen(!primaryStage.isFullScreen());
}
});
scene.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> {
if (isNavShown) {
animate();
}
});
}
});
navBar.setVisible(false);
initAnimations();
}

private void initAnimations() {
Timeline fadeIn = MFXAnimationFactory.FADE_IN.build(navBar, 400);
Timeline show = new Timeline(
new KeyFrame(Duration.millis(300), new KeyValue(navBar.translateXProperty(), 5))
);
Timeline left = new Timeline(
new KeyFrame(Duration.millis(200), new KeyValue(opNavButton.rotateProperty(), -180))
);

Timeline fadeOut = MFXAnimationFactory.FADE_OUT.build(navBar, 50);
Timeline close = new Timeline(
new KeyFrame(Duration.millis(300), new KeyValue(navBar.translateXProperty(), -200))
);
Timeline right = new Timeline(
new KeyFrame(Duration.millis(200), new KeyValue(opNavButton.rotateProperty(), 0))
);

openNav = new ParallelTransition(fadeIn, show, left);
openNav.setOnFinished(event -> isNavShown = true);
closeNav = new ParallelTransition(fadeOut, close, right);
closeNav.setOnFinished(event -> isNavShown = false);
}

private void animate() {
if (!isNavShown) {
navBar.setVisible(true);
openNav.play();
} else {
closeNav.play();
}
}

private void showInfo() {
MFXDialog infoDialog;
MFXStageDialog stageDialog;
try {
FXMLLoader loader = new FXMLLoader(MFXResourcesLoader.load("info_dialog.fxml"));
loader.setControllerFactory(controller -> new InfoController(hostServices));
infoDialog = loader.load();
} catch (IOException e) {
e.printStackTrace();
return;
}

// Close Button
StackPane header = (StackPane) infoDialog.lookup("#headerNode");

SVGPath x = SVGResources.X.getSvgPath();
x.setScaleX(0.14);
x.setScaleY(0.14);

MFXButton closeButton = new MFXButton("");
closeButton.setId("closeButton");
closeButton.setPrefSize(25, 25);
closeButton.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
closeButton.setGraphic(x);
StackPane.setAlignment(closeButton, Pos.TOP_RIGHT);
StackPane.setMargin(closeButton, new Insets(4, 4, 0, 0));
NodeUtils.makeRegionCircular(closeButton);
header.getChildren().add(closeButton);

stageDialog = new MFXStageDialog(infoDialog);
stageDialog.setScrimBackground(true);
stageDialog.setOwner(primaryStage);
stageDialog.setModality(Modality.APPLICATION_MODAL);
closeButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> stageDialog.close());
stageDialog.setCenterInOwner(true);
stageDialog.show();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@ public DialogsController(Pane pane) {

@Override
public void initialize(URL location, ResourceBundle resources) {
dialog.setVisible(false);
animateDialog.setVisible(false);

pError.setOnAction(event -> {
resetDialog();
MFXDialogFactory.convertToSpecific(DialogType.ERROR, dialog);
Expand All @@ -108,8 +111,9 @@ public void initialize(URL location, ResourceBundle resources) {
AbstractMFXDialog genericDialog = MFXDialogFactory.buildGenericDialog("MFXDialog - Generic Dialog", text);
genericDialog.setCloseHandler(c -> {
genericDialog.close();
this.pane.getChildren().remove(genericDialog);
DialogsController.this.pane.getChildren().remove(genericDialog);
});
genericDialog.setVisible(false);
this.pane.getChildren().add(genericDialog);
genericDialog.show();
});
Expand Down
Loading

0 comments on commit 86fc447

Please sign in to comment.