Prechádzať zdrojové kódy

Addressed some TODOs, added some new

Signed-off-by: palexdev <alessandro.parisi406@gmail.com>
palexdev 3 rokov pred
rodič
commit
043eb0e976
27 zmenil súbory, kde vykonal 78 pridanie a 95 odobranie
  1. 1 2
      demo/src/main/java/io/github/palexdev/materialfx/demo/TestDemo.java
  2. 5 10
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/DemoController.java
  3. 1 3
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/FontResourcesDemoController.java
  4. 2 3
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/LabelsDemoController.java
  5. 1 1
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/StepperDemoController.java
  6. 0 1
      materialfx/src/main/java/io/github/palexdev/materialfx/beans/TransitionPositionBean.java
  7. 16 2
      materialfx/src/main/java/io/github/palexdev/materialfx/controls/MFXIconWrapper.java
  8. 3 3
      materialfx/src/main/java/io/github/palexdev/materialfx/controls/MFXSlider.java
  9. 3 3
      materialfx/src/main/java/io/github/palexdev/materialfx/controls/MFXTableRow.java
  10. 1 2
      materialfx/src/main/java/io/github/palexdev/materialfx/controls/cell/MFXTableColumn.java
  11. 2 2
      materialfx/src/main/java/io/github/palexdev/materialfx/filter/base/AbstractFilter.java
  12. 0 1
      materialfx/src/main/java/io/github/palexdev/materialfx/notifications/MFXNotificationCenterSystem.java
  13. 0 1
      materialfx/src/main/java/io/github/palexdev/materialfx/notifications/MFXNotificationSystem.java
  14. 0 1
      materialfx/src/main/java/io/github/palexdev/materialfx/notifications/base/AbstractMFXNotificationSystem.java
  15. 3 3
      materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXCircleToggleNodeSkin.java
  16. 5 10
      materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXComboBoxSkin.java
  17. 3 3
      materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXDateCellSkin.java
  18. 5 5
      materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXDatePickerContent.java
  19. 4 7
      materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXFilterComboBoxSkin.java
  20. 9 8
      materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXFilterPaneSkin.java
  21. 6 8
      materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXNotificationCenterSkin.java
  22. 2 2
      materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXRectangleToggleNodeSkin.java
  23. 1 4
      materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXStepperToggleSkin.java
  24. 1 1
      materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXTableViewSkin.java
  25. 1 3
      materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXTextFieldSkin.java
  26. 2 4
      materialfx/src/main/java/io/github/palexdev/materialfx/skins/legacy/MFXLegacyComboBoxSkin.java
  27. 1 2
      materialfx/src/main/java/io/github/palexdev/materialfx/utils/NodeUtils.java

+ 1 - 2
demo/src/main/java/io/github/palexdev/materialfx/demo/TestDemo.java

@@ -25,7 +25,6 @@ import io.github.palexdev.materialfx.controls.cell.MFXTableColumn;
 import io.github.palexdev.materialfx.controls.cell.MFXTableRowCell;
 import io.github.palexdev.materialfx.demo.model.FilterablePerson;
 import io.github.palexdev.materialfx.font.FontResources;
-import io.github.palexdev.materialfx.font.MFXFontIcon;
 import io.github.palexdev.materialfx.selection.SingleSelectionModel;
 import io.github.palexdev.materialfx.utils.ColorUtils;
 import javafx.application.Application;
@@ -133,7 +132,7 @@ public class TestDemo extends Application {
     public MFXIconWrapper getRandomIcon(double size) {
         FontResources[] resources = FontResources.values();
         String desc = resources[random.nextInt(resources.length)].getDescription();
-        return new MFXIconWrapper(new MFXFontIcon(desc, size, ColorUtils.getRandomColor()), size * 1.5);
+        return new MFXIconWrapper(desc, size, ColorUtils.getRandomColor(), size * 1.5);
     }
 
     private void setupTable(MFXTableView<FilterablePerson> tableView) {

+ 5 - 10
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/DemoController.java

@@ -119,26 +119,22 @@ public class DemoController implements Initializable {
     @Override
     public void initialize(URL location, ResourceBundle resources) {
         // Icons
-        MFXFontIcon xIcon = new MFXFontIcon("mfx-x-circle", 16);
-        MFXFontIcon minusIcon = new MFXFontIcon("mfx-minus-circle", 16);
-        MFXFontIcon expandIcon = new MFXFontIcon("mfx-expand", 12.5);
-        MFXFontIcon infoIcon = new MFXFontIcon("mfx-info-circle", 30, Color.rgb(75, 181, 255));
         MFXFontIcon angleIcon = new MFXFontIcon("mfx-angle-right", 20);
 
         // Buttons
-        MFXIconWrapper closeButton = new MFXIconWrapper(xIcon, 22);
+        MFXIconWrapper closeButton = new MFXIconWrapper("mfx-x-circle", 16, 22);
         closeButton.setId("closeButton");
         closeButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> primaryStage.close());
 
-        MFXIconWrapper minimizeButton = new MFXIconWrapper(minusIcon, 22);
+        MFXIconWrapper minimizeButton = new MFXIconWrapper("mfx-minus-circle", 16, 22);
         minimizeButton.setId("minimizeButton");
         minimizeButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> primaryStage.setIconified(true));
 
-        MFXIconWrapper expandButton = new MFXIconWrapper(expandIcon, 22);
+        MFXIconWrapper expandButton = new MFXIconWrapper("mfx-expand", 12.5, 22);
         expandButton.setId("expandButton");
         expandButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> primaryStage.setFullScreen(!primaryStage.isFullScreen()));
 
-        MFXIconWrapper infoButton = new MFXIconWrapper(infoIcon, 30).defaultRippleGeneratorBehavior();
+        MFXIconWrapper infoButton = new MFXIconWrapper("mfx-info-circle", 30, Color.rgb(75, 181, 255), 30).defaultRippleGeneratorBehavior();
         infoButton.setId("infoButton");
         infoButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> showInfo());
 
@@ -276,8 +272,7 @@ public class DemoController implements Initializable {
         // Close Button
         StackPane header = (StackPane) infoDialog.lookup("#headerNode");
 
-        MFXFontIcon xIcon = new MFXFontIcon("mfx-x", 8);
-        MFXIconWrapper closeButton = new MFXIconWrapper(xIcon, 22).defaultRippleGeneratorBehavior();
+        MFXIconWrapper closeButton = new MFXIconWrapper("mfx-x", 8, 22).defaultRippleGeneratorBehavior();
         closeButton.setId("closeButton");
         StackPane.setAlignment(closeButton, Pos.TOP_RIGHT);
         StackPane.setMargin(closeButton, new Insets(4, 4, 0, 0));

+ 1 - 3
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/FontResourcesDemoController.java

@@ -23,7 +23,6 @@ import io.github.palexdev.materialfx.controls.MFXLabel;
 import io.github.palexdev.materialfx.controls.MFXListView;
 import io.github.palexdev.materialfx.controls.cell.MFXListCell;
 import io.github.palexdev.materialfx.font.FontResources;
-import io.github.palexdev.materialfx.font.MFXFontIcon;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
 import javafx.fxml.FXML;
@@ -75,7 +74,6 @@ public class FontResourcesDemoController implements Initializable {
     }
 
     private HBox buildNode(FontResources fontResource) {
-        MFXFontIcon icon = new MFXFontIcon(fontResource.getDescription(), 20);
         MFXLabel l1 = new MFXLabel();
         l1.setLineColor(Color.TRANSPARENT);
         l1.setUnfocusedLineColor(Color.TRANSPARENT);
@@ -98,7 +96,7 @@ public class FontResourcesDemoController implements Initializable {
         s2.setStyle("-fx-fill: white");
 
 
-        HBox box = new HBox(10, new MFXIconWrapper(icon, 24), s1, l1, s2, l2);
+        HBox box = new HBox(10, new MFXIconWrapper(fontResource.getDescription(), 20, 24), s1, l1, s2, l2);
         box.setPadding(new Insets(5));
         box.setAlignment(Pos.CENTER_LEFT);
         return box;

+ 2 - 3
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/LabelsDemoController.java

@@ -21,7 +21,6 @@ package io.github.palexdev.materialfx.demo.controllers;
 import io.github.palexdev.materialfx.controls.MFXIconWrapper;
 import io.github.palexdev.materialfx.controls.MFXLabel;
 import io.github.palexdev.materialfx.effects.ripple.MFXCircleRippleGenerator;
-import io.github.palexdev.materialfx.font.MFXFontIcon;
 import io.github.palexdev.materialfx.utils.NodeUtils;
 import javafx.fxml.FXML;
 import javafx.fxml.Initializable;
@@ -37,8 +36,8 @@ public class LabelsDemoController implements Initializable {
 
     @Override
     public void initialize(URL location, ResourceBundle resources) {
-        MFXIconWrapper leading = new MFXIconWrapper(new MFXFontIcon("mfx-filter", 15), 22).defaultRippleGeneratorBehavior();
-        MFXIconWrapper trailing = new MFXIconWrapper(new MFXFontIcon("mfx-info-circle", 15), 22).defaultRippleGeneratorBehavior();
+        MFXIconWrapper leading = new MFXIconWrapper("mfx-filter", 15, 22).defaultRippleGeneratorBehavior();
+        MFXIconWrapper trailing = new MFXIconWrapper("mfx-info-circle", 15, 22).defaultRippleGeneratorBehavior();
 
         NodeUtils.makeRegionCircular(leading);
         NodeUtils.makeRegionCircular(trailing);

+ 1 - 1
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/StepperDemoController.java

@@ -68,7 +68,7 @@ public class StepperDemoController implements Initializable {
         loginField.setPromptText("Username...");
         loginField.getValidator().add(BindingUtils.toProperty(loginField.textProperty().length().greaterThanOrEqualTo(6)), "The username must be at least 6 characters long");
         loginField.setValidated(true);
-        loginField.setIcon(new MFXIconWrapper(new MFXFontIcon("mfx-user", 16, Color.web("#4D4D4D")), 24));
+        loginField.setIcon(new MFXIconWrapper("mfx-user", 16, Color.web("#4D4D4D"), 24));
         passwordField.setPromptText("Password...");
         passwordField.getValidator().add(BindingUtils.toProperty(passwordField.passwordProperty().length().greaterThanOrEqualTo(8)), "The password must be at least 8 characters long");
         passwordField.setValidated(true);

+ 0 - 1
materialfx/src/main/java/io/github/palexdev/materialfx/beans/TransitionPositionBean.java

@@ -2,7 +2,6 @@ package io.github.palexdev.materialfx.beans;
 
 import javafx.animation.Transition;
 
-// TODO documentation
 /**
  * This is an extension of {@link PositionBean} to be used
  * with {@link Transition}s that start from a point P(x, y) and

+ 16 - 2
materialfx/src/main/java/io/github/palexdev/materialfx/controls/MFXIconWrapper.java

@@ -18,9 +18,10 @@
 
 package io.github.palexdev.materialfx.controls;
 
-import io.github.palexdev.materialfx.effects.ripple.MFXCircleRippleGenerator;
 import io.github.palexdev.materialfx.beans.PositionBean;
+import io.github.palexdev.materialfx.effects.ripple.MFXCircleRippleGenerator;
 import io.github.palexdev.materialfx.effects.ripple.base.IRippleGenerator;
+import io.github.palexdev.materialfx.font.MFXFontIcon;
 import javafx.beans.property.DoubleProperty;
 import javafx.beans.property.ObjectProperty;
 import javafx.beans.property.SimpleDoubleProperty;
@@ -31,6 +32,7 @@ import javafx.scene.Node;
 import javafx.scene.input.MouseButton;
 import javafx.scene.input.MouseEvent;
 import javafx.scene.layout.StackPane;
+import javafx.scene.paint.Color;
 
 import java.util.function.Function;
 
@@ -63,7 +65,19 @@ public class MFXIconWrapper extends StackPane {
         setSize(size);
     }
 
-    // TODO add constructor with MFXFontIcon description and replace everywhere
+    public MFXIconWrapper(String description, double iconSize, double wrapperSize) {
+        initialize();
+
+        setIcon(new MFXFontIcon(description, iconSize));
+        setSize(wrapperSize);
+    }
+
+    public MFXIconWrapper(String description, double iconSize, Color iconColor, double wrapperSize) {
+        initialize();
+
+        setIcon(new MFXFontIcon(description, iconSize, iconColor));
+        setSize(wrapperSize);
+    }
 
     //================================================================================
     // Methods

+ 3 - 3
materialfx/src/main/java/io/github/palexdev/materialfx/controls/MFXSlider.java

@@ -20,10 +20,10 @@ package io.github.palexdev.materialfx.controls;
 
 import io.github.palexdev.materialfx.MFXResourcesLoader;
 import io.github.palexdev.materialfx.beans.NumberRange;
+import io.github.palexdev.materialfx.beans.PositionBean;
+import io.github.palexdev.materialfx.effects.ripple.MFXCircleRippleGenerator;
 import io.github.palexdev.materialfx.enums.SliderEnums.SliderMode;
 import io.github.palexdev.materialfx.enums.SliderEnums.SliderPopupSide;
-import io.github.palexdev.materialfx.effects.ripple.MFXCircleRippleGenerator;
-import io.github.palexdev.materialfx.beans.PositionBean;
 import io.github.palexdev.materialfx.font.MFXFontIcon;
 import io.github.palexdev.materialfx.skins.MFXSliderSkin;
 import io.github.palexdev.materialfx.utils.NodeUtils;
@@ -264,7 +264,7 @@ public class MFXSlider extends Control {
             rippleGenerator.setMouseTransparent(true);
             rippleGenerator.setRadiusMultiplier(2.5);
             rippleGenerator.setRippleRadius(6);
-            rippleGenerator.setRipplePositionFunction(mouseEvent -> new PositionBean(stackPane.getWidth() / 2, stackPane.getHeight() / 2));
+            rippleGenerator.setRipplePositionFunction(mouseEvent -> PositionBean.of(stackPane.getWidth() / 2, stackPane.getHeight() / 2));
             stackPane.addEventFilter(MouseEvent.MOUSE_PRESSED, rippleGenerator::generateRipple);
             stackPane.getChildren().add(rippleGenerator);
 

+ 3 - 3
materialfx/src/main/java/io/github/palexdev/materialfx/controls/MFXTableRow.java

@@ -19,10 +19,10 @@
 package io.github.palexdev.materialfx.controls;
 
 import io.github.palexdev.materialfx.MFXResourcesLoader;
-import io.github.palexdev.materialfx.factories.RippleClipTypeFactory;
+import io.github.palexdev.materialfx.beans.PositionBean;
 import io.github.palexdev.materialfx.effects.ripple.MFXCircleRippleGenerator;
 import io.github.palexdev.materialfx.effects.ripple.RippleClipType;
-import io.github.palexdev.materialfx.beans.PositionBean;
+import io.github.palexdev.materialfx.factories.RippleClipTypeFactory;
 import javafx.beans.property.BooleanProperty;
 import javafx.beans.property.SimpleBooleanProperty;
 import javafx.css.PseudoClass;
@@ -89,7 +89,7 @@ public class MFXTableRow<T> extends HBox {
         rippleGenerator.setClipSupplier(() -> new RippleClipTypeFactory(RippleClipType.RECTANGLE).setOffsetW(10).build(this));
         rippleGenerator.setComputeRadiusMultiplier(true);
         rippleGenerator.setManaged(false);
-        rippleGenerator.setRipplePositionFunction(event -> new PositionBean(event.getX(), event.getY()));
+        rippleGenerator.setRipplePositionFunction(event -> PositionBean.of(event.getX(), event.getY()));
         rippleGenerator.setTranslateX(-5);
         rippleGenerator.rippleRadiusProperty().bind(widthProperty().divide(2.0));
         addEventFilter(MouseEvent.MOUSE_PRESSED, rippleGenerator::generateRipple);

+ 1 - 2
materialfx/src/main/java/io/github/palexdev/materialfx/controls/cell/MFXTableColumn.java

@@ -22,7 +22,6 @@ import io.github.palexdev.materialfx.MFXResourcesLoader;
 import io.github.palexdev.materialfx.controls.MFXIconWrapper;
 import io.github.palexdev.materialfx.controls.MFXTableView;
 import io.github.palexdev.materialfx.enums.SortState;
-import io.github.palexdev.materialfx.font.MFXFontIcon;
 import io.github.palexdev.materialfx.skins.MFXTableColumnSkin;
 import io.github.palexdev.materialfx.skins.MFXTableViewSkin;
 import io.github.palexdev.materialfx.utils.NodeUtils;
@@ -118,7 +117,7 @@ public class MFXTableColumn<T> extends Control {
         addEventFilter(MouseEvent.MOUSE_DRAGGED, event -> dragged.set(true));
         addEventFilter(MouseEvent.MOUSE_RELEASED, event -> dragged.set(false));
 
-        sortIcon = new MFXIconWrapper(new MFXFontIcon("mfx-caret-up", 14), 18);
+        sortIcon = new MFXIconWrapper("mfx-caret-up", 14, 18);
         sortIcon.setManaged(false);
         sortIcon.setVisible(false);
         NodeUtils.makeRegionCircular(sortIcon);

+ 2 - 2
materialfx/src/main/java/io/github/palexdev/materialfx/filter/base/AbstractFilter.java

@@ -1,9 +1,9 @@
 package io.github.palexdev.materialfx.filter.base;
 
 import io.github.palexdev.materialfx.beans.BiPredicateBean;
+import io.github.palexdev.materialfx.beans.FilterBean;
 import io.github.palexdev.materialfx.controls.MFXFilterPane;
 import io.github.palexdev.materialfx.enums.ChainMode;
-import io.github.palexdev.materialfx.beans.FilterBean;
 import javafx.beans.property.IntegerProperty;
 import javafx.beans.property.SimpleIntegerProperty;
 import javafx.collections.ObservableList;
@@ -82,6 +82,7 @@ public abstract class AbstractFilter<T, U> {
     /**
      * Allows to add some extra {@link BiPredicateBean}s alongside the default ones.
      */
+    @SuppressWarnings("unchecked")
     protected abstract AbstractFilter<T, U> extend(BiPredicateBean<U, U>... predicateBeans);
 
     //================================================================================
@@ -120,7 +121,6 @@ public abstract class AbstractFilter<T, U> {
         return t -> predicates.get(index).predicate().test(extractor.apply(t), convertedInput);
     }
 
-    // TODO can be used but warn
     /**
      * Produces a {@link Predicate} from the given input and {@link BiPredicate}.
      * <p></p>

+ 0 - 1
materialfx/src/main/java/io/github/palexdev/materialfx/notifications/MFXNotificationCenterSystem.java

@@ -100,7 +100,6 @@ public class MFXNotificationCenterSystem extends AbstractMFXNotificationSystem {
         PositionBean positionBean = computePosition();
         popup.setX(positionBean.getX());
         popup.setY(positionBean.getY());
-        init = true; // TODO remove?
     }
 
     /**

+ 0 - 1
materialfx/src/main/java/io/github/palexdev/materialfx/notifications/MFXNotificationSystem.java

@@ -87,7 +87,6 @@ public class MFXNotificationSystem extends AbstractMFXNotificationSystem {
     protected void init() {
         PositionBean position = computePosition();
         popup.show(dummyStage, position.getX(), position.getY());
-        init = true; // TODO remove?
     }
 
     /**

+ 0 - 1
materialfx/src/main/java/io/github/palexdev/materialfx/notifications/base/AbstractMFXNotificationSystem.java

@@ -72,7 +72,6 @@ public abstract class AbstractMFXNotificationSystem implements INotificationSyst
 
     protected final ResettableBooleanProperty showing = new ResettableBooleanProperty(false, false);
     protected final ResettableBooleanProperty closing = new ResettableBooleanProperty(false, false);
-    protected boolean init = false;
 
     //================================================================================
     // Constructors

+ 3 - 3
materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXCircleToggleNodeSkin.java

@@ -18,11 +18,11 @@
 
 package io.github.palexdev.materialfx.skins;
 
+import io.github.palexdev.materialfx.beans.PositionBean;
 import io.github.palexdev.materialfx.controls.MFXCircleToggleNode;
 import io.github.palexdev.materialfx.controls.MFXLabel;
-import io.github.palexdev.materialfx.enums.TextPosition;
 import io.github.palexdev.materialfx.effects.ripple.MFXCircleRippleGenerator;
-import io.github.palexdev.materialfx.beans.PositionBean;
+import io.github.palexdev.materialfx.enums.TextPosition;
 import io.github.palexdev.materialfx.utils.LabelUtils;
 import io.github.palexdev.materialfx.utils.NodeUtils;
 import javafx.beans.binding.Bindings;
@@ -112,7 +112,7 @@ public class MFXCircleToggleNodeSkin extends SkinBase<MFXCircleToggleNode> {
             ));
             return clip;
         });
-        rippleGenerator.setRipplePositionFunction(event -> new PositionBean(event.getX(), event.getY()));
+        rippleGenerator.setRipplePositionFunction(event -> PositionBean.of(event.getX(), event.getY()));
         rippleGenerator.rippleRadiusProperty().bind(circle.radiusProperty().add(5));
     }
 

+ 5 - 10
materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXComboBoxSkin.java

@@ -19,16 +19,15 @@
 package io.github.palexdev.materialfx.skins;
 
 import io.github.palexdev.materialfx.beans.MFXSnapshotWrapper;
+import io.github.palexdev.materialfx.beans.PositionBean;
 import io.github.palexdev.materialfx.controls.MFXComboBox;
 import io.github.palexdev.materialfx.controls.MFXIconWrapper;
 import io.github.palexdev.materialfx.controls.MFXLabel;
 import io.github.palexdev.materialfx.controls.MFXListView;
 import io.github.palexdev.materialfx.controls.cell.MFXListCell;
+import io.github.palexdev.materialfx.effects.ripple.MFXCircleRippleGenerator;
 import io.github.palexdev.materialfx.enums.Styles;
 import io.github.palexdev.materialfx.factories.MFXAnimationFactory;
-import io.github.palexdev.materialfx.effects.ripple.MFXCircleRippleGenerator;
-import io.github.palexdev.materialfx.beans.PositionBean;
-import io.github.palexdev.materialfx.font.MFXFontIcon;
 import io.github.palexdev.materialfx.selection.ComboBoxSelectionModel;
 import io.github.palexdev.materialfx.utils.AnimationUtils;
 import io.github.palexdev.materialfx.utils.AnimationUtils.KeyFrames;
@@ -95,8 +94,7 @@ public class MFXComboBoxSkin<T> extends SkinBase<MFXComboBox<T>> {
         focusedLine.setScaleX(0.0);
         focusedLine.setSmooth(true);
 
-        MFXFontIcon warnIcon = new MFXFontIcon("mfx-exclamation-triangle", Color.RED);
-        MFXIconWrapper warnWrapper = new MFXIconWrapper(warnIcon, 10);
+        MFXIconWrapper warnWrapper = new MFXIconWrapper("mfx-exclamation-triangle", 10, Color.RED, 10);
 
         validate = new Label();
         validate.setGraphic(warnWrapper);
@@ -112,8 +110,7 @@ public class MFXComboBoxSkin<T> extends SkinBase<MFXComboBox<T>> {
 
         valueLabel = buildLabel();
 
-        MFXFontIcon fontIcon = new MFXFontIcon("mfx-caret-down", 12);
-        icon = new MFXIconWrapper(fontIcon, 24);
+        icon = new MFXIconWrapper("mfx-caret-down", 12, 24);
         icon.setManaged(false);
         icon.getStylesheets().addAll(comboBox.getUserAgentStylesheet());
         NodeUtils.makeRegionCircular(icon, 10);
@@ -363,9 +360,7 @@ public class MFXComboBoxSkin<T> extends SkinBase<MFXComboBox<T>> {
      * the popup handling when the mouse is pressed.
      */
     private void iconBehavior() {
-        icon.rippleGeneratorBehavior(event ->
-                new PositionBean(icon.getWidth() / 2, icon.getHeight() / 2)
-        );
+        icon.rippleGeneratorBehavior(event -> PositionBean.of(icon.getWidth() / 2, icon.getHeight() / 2));
 
         MFXCircleRippleGenerator rg = icon.getRippleGenerator();
         rg.setAnimationSpeed(1.3);

+ 3 - 3
materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXDateCellSkin.java

@@ -18,11 +18,11 @@
 
 package io.github.palexdev.materialfx.skins;
 
+import io.github.palexdev.materialfx.beans.PositionBean;
 import io.github.palexdev.materialfx.controls.cell.MFXDateCell;
-import io.github.palexdev.materialfx.factories.RippleClipTypeFactory;
 import io.github.palexdev.materialfx.effects.ripple.MFXCircleRippleGenerator;
 import io.github.palexdev.materialfx.effects.ripple.RippleClipType;
-import io.github.palexdev.materialfx.beans.PositionBean;
+import io.github.palexdev.materialfx.factories.RippleClipTypeFactory;
 import javafx.scene.control.skin.DateCellSkin;
 import javafx.scene.input.MouseEvent;
 import javafx.scene.paint.Color;
@@ -47,7 +47,7 @@ public class MFXDateCellSkin extends DateCellSkin {
         rippleGenerator = new MFXCircleRippleGenerator(dateCell);
         rippleGenerator.setClipSupplier(() -> new RippleClipTypeFactory(RippleClipType.ROUNDED_RECTANGLE).setArcs(15).build(dateCell));
         rippleGenerator.setRippleColor(Color.rgb(220, 220, 220, 0.6));
-        rippleGenerator.setRipplePositionFunction(event -> new PositionBean(event.getX(), event.getY()));
+        rippleGenerator.setRipplePositionFunction(event -> PositionBean.of(event.getX(), event.getY()));
         dateCell.addEventFilter(MouseEvent.MOUSE_PRESSED, rippleGenerator::generateRipple);
 
         updateChildren();

+ 5 - 5
materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXDatePickerContent.java

@@ -20,13 +20,13 @@ package io.github.palexdev.materialfx.skins;
 
 import io.github.palexdev.materialfx.MFXResourcesLoader;
 import io.github.palexdev.materialfx.beans.MFXSnapshotWrapper;
+import io.github.palexdev.materialfx.beans.PositionBean;
 import io.github.palexdev.materialfx.controls.MFXDatePicker;
 import io.github.palexdev.materialfx.controls.MFXIconWrapper;
 import io.github.palexdev.materialfx.controls.MFXScrollPane;
 import io.github.palexdev.materialfx.controls.MFXTextField;
 import io.github.palexdev.materialfx.controls.cell.MFXDateCell;
 import io.github.palexdev.materialfx.effects.ripple.MFXCircleRippleGenerator;
-import io.github.palexdev.materialfx.beans.PositionBean;
 import io.github.palexdev.materialfx.font.MFXFontIcon;
 import io.github.palexdev.materialfx.utils.*;
 import io.github.palexdev.materialfx.utils.AnimationUtils.KeyFrames;
@@ -489,7 +489,7 @@ public class MFXDatePickerContent extends VBox {
     private void buildButtons() {
         MFXFontIcon chevronDown = new MFXFontIcon("mfx-chevron-down", 13);
         yearsButton = new MFXIconWrapper(chevronDown, 20).rippleGeneratorBehavior(event ->
-                new PositionBean(yearsButton.getWidth() / 2, yearsButton.getHeight() / 2)
+                PositionBean.of(yearsButton.getWidth() / 2, yearsButton.getHeight() / 2)
         );
         yearsButton.getStyleClass().add("years-button");
         NodeUtils.makeRegionCircular(yearsButton);
@@ -501,7 +501,7 @@ public class MFXDatePickerContent extends VBox {
 
         MFXFontIcon chevronLeft = new MFXFontIcon("mfx-chevron-left", 13);
         monthBackButton = new MFXIconWrapper(chevronLeft, 20).rippleGeneratorBehavior(event ->
-                new PositionBean(monthBackButton.getWidth() / 2, monthBackButton.getHeight() / 2)
+                PositionBean.of(monthBackButton.getWidth() / 2, monthBackButton.getHeight() / 2)
         );
         monthBackButton.getStyleClass().add("month-back-button");
         NodeUtils.makeRegionCircular(monthBackButton);
@@ -509,7 +509,7 @@ public class MFXDatePickerContent extends VBox {
 
         MFXFontIcon chevronRight = new MFXFontIcon("mfx-chevron-right", 13);
         monthForwardButton = new MFXIconWrapper(chevronRight, 20).rippleGeneratorBehavior(event ->
-                new PositionBean(monthForwardButton.getWidth() / 2, monthForwardButton.getHeight() / 2)
+                PositionBean.of(monthForwardButton.getWidth() / 2, monthForwardButton.getHeight() / 2)
         );
         monthForwardButton.getStyleClass().add("month-forward-button");
         NodeUtils.makeRegionCircular(monthForwardButton);
@@ -517,7 +517,7 @@ public class MFXDatePickerContent extends VBox {
 
         MFXFontIcon calendar = new MFXFontIcon("mfx-calendar-semi-black", 17);
         inputButton = new MFXIconWrapper(calendar, 35).rippleGeneratorBehavior(event ->
-                new PositionBean(inputButton.getWidth() / 2, inputButton.getHeight() / 2)
+                PositionBean.of(inputButton.getWidth() / 2, inputButton.getHeight() / 2)
         );
         inputButton.getStyleClass().add("change-input-button");
         Tooltip tooltip = new Tooltip("Switches between mouse input and keyboard input");

+ 4 - 7
materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXFilterComboBoxSkin.java

@@ -19,12 +19,12 @@
 package io.github.palexdev.materialfx.skins;
 
 import io.github.palexdev.materialfx.beans.MFXSnapshotWrapper;
+import io.github.palexdev.materialfx.beans.PositionBean;
 import io.github.palexdev.materialfx.controls.*;
 import io.github.palexdev.materialfx.controls.cell.MFXListCell;
+import io.github.palexdev.materialfx.effects.ripple.MFXCircleRippleGenerator;
 import io.github.palexdev.materialfx.enums.Styles;
 import io.github.palexdev.materialfx.factories.MFXAnimationFactory;
-import io.github.palexdev.materialfx.effects.ripple.MFXCircleRippleGenerator;
-import io.github.palexdev.materialfx.beans.PositionBean;
 import io.github.palexdev.materialfx.font.MFXFontIcon;
 import io.github.palexdev.materialfx.selection.ComboBoxSelectionModel;
 import io.github.palexdev.materialfx.utils.AnimationUtils;
@@ -143,8 +143,7 @@ public class MFXFilterComboBoxSkin<T> extends SkinBase<MFXFilterComboBox<T>> {
 
         valueLabel = buildLabel();
 
-        MFXFontIcon fontIcon = new MFXFontIcon("mfx-caret-down", 12);
-        icon = new MFXIconWrapper(fontIcon, 24);
+        icon = new MFXIconWrapper("mfx-caret-down", 12, 24);
         icon.setManaged(false);
         icon.getStylesheets().addAll(comboBox.getUserAgentStylesheet());
         NodeUtils.makeRegionCircular(icon, 10);
@@ -378,9 +377,7 @@ public class MFXFilterComboBoxSkin<T> extends SkinBase<MFXFilterComboBox<T>> {
      * the popup handling when the mouse is pressed.
      */
     private void iconBehavior() {
-        icon.rippleGeneratorBehavior(event ->
-                new PositionBean(icon.getWidth() / 2, icon.getHeight() / 2)
-        );
+        icon.rippleGeneratorBehavior(event -> PositionBean.of(icon.getWidth() / 2, icon.getHeight() / 2));
 
         MFXCircleRippleGenerator rg = icon.getRippleGenerator();
         rg.setAnimationSpeed(1.3);

+ 9 - 8
materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXFilterPaneSkin.java

@@ -1,16 +1,16 @@
 package io.github.palexdev.materialfx.skins;
 
+import io.github.palexdev.materialfx.beans.BiPredicateBean;
+import io.github.palexdev.materialfx.beans.FilterBean;
 import io.github.palexdev.materialfx.controls.*;
+import io.github.palexdev.materialfx.effects.ripple.RippleClipType;
+import io.github.palexdev.materialfx.enums.ChainMode;
 import io.github.palexdev.materialfx.factories.InsetsFactory;
 import io.github.palexdev.materialfx.factories.RippleClipTypeFactory;
-import io.github.palexdev.materialfx.effects.ripple.RippleClipType;
 import io.github.palexdev.materialfx.filter.BooleanFilter;
-import io.github.palexdev.materialfx.enums.ChainMode;
 import io.github.palexdev.materialfx.filter.EnumFilter;
 import io.github.palexdev.materialfx.filter.base.AbstractFilter;
 import io.github.palexdev.materialfx.filter.base.NumberFilter;
-import io.github.palexdev.materialfx.beans.BiPredicateBean;
-import io.github.palexdev.materialfx.beans.FilterBean;
 import io.github.palexdev.materialfx.font.MFXFontIcon;
 import io.github.palexdev.materialfx.utils.NodeUtils;
 import javafx.beans.InvalidationListener;
@@ -39,6 +39,7 @@ import javafx.stage.Modality;
  * <p> - A label which acts as a separator
  * <p> - A {@link FlowPane} to show the currently built active filters
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public class MFXFilterPaneSkin<T> extends SkinBase<MFXFilterPane<T>> {
     //================================================================================
     // Properties
@@ -167,8 +168,8 @@ public class MFXFilterPaneSkin<T> extends SkinBase<MFXFilterPane<T>> {
         headerLabel.setMaxWidth(Double.MAX_VALUE);
         HBox.setHgrow(headerLabel, Priority.ALWAYS);
 
-        MFXIconWrapper filter = new MFXIconWrapper(new MFXFontIcon("mfx-variant7-mark", 16), 28).defaultRippleGeneratorBehavior();
-        MFXIconWrapper reset = new MFXIconWrapper(new MFXFontIcon("mfx-undo", 16), 28).defaultRippleGeneratorBehavior();
+        MFXIconWrapper filter = new MFXIconWrapper("mfx-variant7-mark", 16, 28).defaultRippleGeneratorBehavior();
+        MFXIconWrapper reset = new MFXIconWrapper("mfx-undo", 16, 28).defaultRippleGeneratorBehavior();
 
         filter.setId("filterIcon");
         reset.setId("resetIcon");
@@ -176,7 +177,7 @@ public class MFXFilterPaneSkin<T> extends SkinBase<MFXFilterPane<T>> {
         NodeUtils.makeRegionCircular(filter);
         NodeUtils.makeRegionCircular(reset);
 
-        filter.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> filterPane.getOnFilter().handle(event)); // TODO action
+        filter.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> filterPane.getOnFilter().handle(event));
         reset.addEventHandler(MouseEvent.MOUSE_CLICKED, this::reset);
 
         HBox box = new HBox(5, headerLabel, filter, reset);
@@ -248,7 +249,7 @@ public class MFXFilterPaneSkin<T> extends SkinBase<MFXFilterPane<T>> {
 
                 if (queryValidation(selected)) {
                     filterPane.getActiveFilters().add(predicate);
-                };
+                }
             }
         });
         addButton.getRippleGenerator().setClipSupplier(() -> new RippleClipTypeFactory(RippleClipType.ROUNDED_RECTANGLE).setArcs(30).build(addButton));

+ 6 - 8
materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXNotificationCenterSkin.java

@@ -3,10 +3,9 @@ package io.github.palexdev.materialfx.skins;
 import io.github.palexdev.materialfx.controls.*;
 import io.github.palexdev.materialfx.controls.MFXPopup.MFXPopupEvent;
 import io.github.palexdev.materialfx.controls.cell.MFXNotificationCell;
-import io.github.palexdev.materialfx.factories.InsetsFactory;
 import io.github.palexdev.materialfx.enums.NotificationCounterStyle;
 import io.github.palexdev.materialfx.enums.NotificationState;
-import io.github.palexdev.materialfx.font.MFXFontIcon;
+import io.github.palexdev.materialfx.factories.InsetsFactory;
 import io.github.palexdev.materialfx.notifications.base.INotification;
 import io.github.palexdev.materialfx.utils.NodeUtils;
 import io.github.palexdev.virtualizedfx.flow.simple.SimpleVirtualFlow;
@@ -43,8 +42,7 @@ public class MFXNotificationCenterSkin extends SkinBase<MFXNotificationCenter> {
     public MFXNotificationCenterSkin(MFXNotificationCenter notificationCenter, SimpleVirtualFlow<INotification, MFXNotificationCell> virtualFlow) {
         super(notificationCenter);
 
-        MFXFontIcon bell = new MFXFontIcon("mfx-bell-alt", 36);
-        bellWrapped = new MFXIconWrapper(bell, 56);
+        bellWrapped = new MFXIconWrapper("mfx-bell-alt", 36, 56);
         bellWrapped.getStyleClass().add("notifications-icon");
 
         counter = new NotificationsCounter();
@@ -65,10 +63,10 @@ public class MFXNotificationCenterSkin extends SkinBase<MFXNotificationCenter> {
         header.getStyleClass().add("header");
         header.setAlignment(Pos.CENTER_LEFT);
 
-        MFXIconWrapper select = new MFXIconWrapper(new MFXFontIcon("mfx-variant13-mark", 24), 36).defaultRippleGeneratorBehavior();
-        MFXIconWrapper markAsRead = new MFXIconWrapper(new MFXFontIcon("mfx-eye", 20), 36).defaultRippleGeneratorBehavior();
-        MFXIconWrapper markAsUnread = new MFXIconWrapper(new MFXFontIcon("mfx-eye-slash", 20), 36).defaultRippleGeneratorBehavior();
-        MFXIconWrapper dismiss = new MFXIconWrapper(new MFXFontIcon("mfx-delete", 20), 36).defaultRippleGeneratorBehavior();
+        MFXIconWrapper select = new MFXIconWrapper("mfx-variant13-mark", 24, 36).defaultRippleGeneratorBehavior();
+        MFXIconWrapper markAsRead = new MFXIconWrapper("mfx-eye", 20, 36).defaultRippleGeneratorBehavior();
+        MFXIconWrapper markAsUnread = new MFXIconWrapper("mfx-eye-slash", 20, 36).defaultRippleGeneratorBehavior();
+        MFXIconWrapper dismiss = new MFXIconWrapper("mfx-delete", 20, 36).defaultRippleGeneratorBehavior();
 
         select.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> notificationCenter.setSelectionMode(!notificationCenter.isSelectionMode()));
         markAsRead.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> notificationCenter.markSelectedNotificationsAs(NotificationState.READ));

+ 2 - 2
materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXRectangleToggleNodeSkin.java

@@ -18,10 +18,10 @@
 
 package io.github.palexdev.materialfx.skins;
 
+import io.github.palexdev.materialfx.beans.PositionBean;
 import io.github.palexdev.materialfx.controls.MFXLabel;
 import io.github.palexdev.materialfx.controls.MFXRectangleToggleNode;
 import io.github.palexdev.materialfx.effects.ripple.MFXCircleRippleGenerator;
-import io.github.palexdev.materialfx.beans.PositionBean;
 import io.github.palexdev.materialfx.utils.LabelUtils;
 import io.github.palexdev.materialfx.utils.NodeUtils;
 import javafx.event.Event;
@@ -90,7 +90,7 @@ public class MFXRectangleToggleNodeSkin extends SkinBase<MFXRectangleToggleNode>
 
         rippleGenerator.setAnimateBackground(false);
         rippleGenerator.setClipSupplier(() -> toggleNode.getRippleClipTypeFactory().build(container));
-        rippleGenerator.setRipplePositionFunction(event -> new PositionBean(event.getX(), event.getY()));
+        rippleGenerator.setRipplePositionFunction(event -> PositionBean.of(event.getX(), event.getY()));
         rippleGenerator.rippleRadiusProperty().bind(toggleNode.widthProperty().divide(2.0));
     }
 

+ 1 - 4
materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXStepperToggleSkin.java

@@ -25,7 +25,6 @@ import io.github.palexdev.materialfx.controls.MFXStepperToggle;
 import io.github.palexdev.materialfx.enums.DialogType;
 import io.github.palexdev.materialfx.enums.StepperToggleState;
 import io.github.palexdev.materialfx.enums.TextPosition;
-import io.github.palexdev.materialfx.font.MFXFontIcon;
 import io.github.palexdev.materialfx.utils.DialogUtils;
 import io.github.palexdev.materialfx.utils.LabelUtils;
 import io.github.palexdev.materialfx.validation.MFXDialogValidator;
@@ -69,9 +68,7 @@ public class MFXStepperToggleSkin extends SkinBase<MFXStepperToggle> {
         label.setUnfocusedLineColor(Color.TRANSPARENT);
         label.setManaged(false);
 
-        errorIcon = new MFXIconWrapper(
-                new MFXFontIcon("mfx-exclamation-triangle", Color.web("#EF6E6B")), 16
-        );
+        errorIcon = new MFXIconWrapper("mfx-exclamation-triangle", 10, Color.web("#EF6E6B"), 16);
         errorIcon.setId("errorIcon");
         errorIcon.setVisible(false);
         errorIcon.setManaged(false);

+ 1 - 1
materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXTableViewSkin.java

@@ -736,7 +736,7 @@ public class MFXTableViewSkin<T> extends SkinBase<MFXTableView<T>> {
      * using the specified description and size.
      */
     private MFXIconWrapper buildIcon(String description, double size) {
-        return new MFXIconWrapper(new MFXFontIcon(description, size), 24).defaultRippleGeneratorBehavior();
+        return new MFXIconWrapper(description, size, 24).defaultRippleGeneratorBehavior();
     }
 
     @Override

+ 1 - 3
materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXTextFieldSkin.java

@@ -21,7 +21,6 @@ package io.github.palexdev.materialfx.skins;
 import io.github.palexdev.materialfx.controls.MFXIconWrapper;
 import io.github.palexdev.materialfx.controls.MFXTextField;
 import io.github.palexdev.materialfx.factories.MFXAnimationFactory;
-import io.github.palexdev.materialfx.font.MFXFontIcon;
 import io.github.palexdev.materialfx.utils.LabelUtils;
 import io.github.palexdev.materialfx.validation.MFXDialogValidator;
 import javafx.animation.ScaleTransition;
@@ -97,8 +96,7 @@ public class MFXTextFieldSkin extends TextFieldSkin {
         focusedLine.setScaleX(0.0);
         focusedLine.setSmooth(true);
 
-        MFXFontIcon warnIcon = new MFXFontIcon("mfx-exclamation-triangle", Color.RED);
-        MFXIconWrapper warnWrapper = new MFXIconWrapper(warnIcon, 10);
+        MFXIconWrapper warnWrapper = new MFXIconWrapper("mfx-exclamation-triangle", 10, Color.RED, 10);
 
         validate = new Label();
         validate.setGraphic(warnWrapper);

+ 2 - 4
materialfx/src/main/java/io/github/palexdev/materialfx/skins/legacy/MFXLegacyComboBoxSkin.java

@@ -19,9 +19,8 @@
 package io.github.palexdev.materialfx.skins.legacy;
 
 import io.github.palexdev.materialfx.controls.MFXIconWrapper;
-import io.github.palexdev.materialfx.factories.MFXAnimationFactory;
 import io.github.palexdev.materialfx.controls.legacy.MFXLegacyComboBox;
-import io.github.palexdev.materialfx.font.MFXFontIcon;
+import io.github.palexdev.materialfx.factories.MFXAnimationFactory;
 import io.github.palexdev.materialfx.utils.LabelUtils;
 import io.github.palexdev.materialfx.validation.MFXDialogValidator;
 import javafx.animation.ScaleTransition;
@@ -88,8 +87,7 @@ public class MFXLegacyComboBoxSkin<T> extends ComboBoxListViewSkin<T> {
         focusedLine.setScaleX(0.0);
         focusedLine.setManaged(false);
 
-        MFXFontIcon warnIcon = new MFXFontIcon("mfx-exclamation-triangle", Color.RED);
-        MFXIconWrapper warnWrapper = new MFXIconWrapper(warnIcon, 10);
+        MFXIconWrapper warnWrapper = new MFXIconWrapper("mfx-exclamation-triangle", 10, Color.RED, 10);
 
         validate = new Label();
         validate.setGraphic(warnWrapper);

+ 1 - 2
materialfx/src/main/java/io/github/palexdev/materialfx/utils/NodeUtils.java

@@ -142,8 +142,6 @@ public class NodeUtils {
         return false;
     }
 
-    // TODO to replace ALL!
-
     /**
      * Checks if the pressed node is in the hierarchy of the specified node, {@link PickResult#getIntersectedNode()}.
      */
@@ -416,6 +414,7 @@ public class NodeUtils {
         }
     }
 
+    // TODO replace all popups with MFXPopup
     public static Point2D pointRelativeTo(Node parent, Node node, HPos hpos,
                                           VPos vpos, double dx, double dy, boolean reposition) {
         final double nodeWidth = node.getLayoutBounds().getWidth();