Browse Source

:bookmark: Version 11.12.0

:recycle: Minor changes and improvements to the demo

:bug: Fixed editor regression in MFXLabelSkin and little behavior improvement

Signed-off-by: palexdev <alessandro.parisi406@gmail.com>
palexdev 4 years ago
parent
commit
4bd4f201e6

+ 2 - 2
README.md

@@ -241,7 +241,7 @@ repositories {
 }
 
 dependencies {
-implementation 'io.github.palexdev:materialfx:11.11.1'
+implementation 'io.github.palexdev:materialfx:11.12.0'
 }
 ```
 
@@ -251,7 +251,7 @@ implementation 'io.github.palexdev:materialfx:11.11.1'
 <dependency>
   <groupId>io.github.palexdev</groupId>
   <artifactId>materialfx</artifactId>
-  <version>11.11.1</version>
+  <version>11.12.0</version>
 </dependency>
 ```
 

+ 1 - 1
build.gradle

@@ -4,7 +4,7 @@ plugins {
 }
 
 group 'io.github.palexdev'
-version '11.11.1'
+version '11.12.0'
 
 repositories {
     mavenCentral()

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

@@ -48,6 +48,7 @@ import javafx.scene.layout.VBox;
 import javafx.scene.media.Media;
 import javafx.scene.media.MediaPlayer;
 import javafx.scene.paint.Color;
+import javafx.scene.text.TextFlow;
 import javafx.stage.Modality;
 import javafx.stage.Stage;
 import javafx.util.Duration;
@@ -101,6 +102,9 @@ public class DemoController implements Initializable {
     @FXML
     private Label splashLabel3;
 
+    @FXML
+    private TextFlow version;
+
     public DemoController(Stage primaryStage, HostServices hostServices) {
         m1 = new MediaPlayer(new Media(MFXDemoResourcesLoader.load("assets/welcome1.wav")));
         m2 = new MediaPlayer(new Media(MFXDemoResourcesLoader.load("assets/welcome2.wav")));
@@ -217,7 +221,7 @@ public class DemoController implements Initializable {
     private void presentation() {
         AnimationUtils.SequentialBuilder.build()
                 .add(KeyFrames.of(Duration.ONE, event -> m1.play()))
-                .add(AnimationUtils.TimelineBuilder.build().show(1000, logo).getAnimation())
+                .add(AnimationUtils.ParallelBuilder.build().show(1000, logo, version).getAnimation())
                 .add(AnimationUtils.TimelineBuilder.build().show(450, splashLabel1).setDelay(200).getAnimation())
                 .add(AnimationUtils.TimelineBuilder.build().show(450, splashLabel2).setDelay(50).getAnimation())
                 .add(AnimationUtils.TimelineBuilder.build().show(450, splashLabel3).setDelay(50).getAnimation())

+ 11 - 5
demo/src/main/resources/io/github/palexdev/materialfx/demo/Demo.fxml

@@ -25,6 +25,8 @@
 <?import javafx.scene.image.Image?>
 <?import javafx.scene.image.ImageView?>
 <?import javafx.scene.layout.*?>
+<?import javafx.scene.text.Text?>
+<?import javafx.scene.text.TextFlow?>
 <StackPane id="demoPane" fx:id="demoPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="550.0" prefWidth="960.0" stylesheets="@css/Demo.css" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="io.github.palexdev.materialfx.demo.controllers.DemoController">
    <StackPane id="contentPane" fx:id="contentPane" opacity="0.0" prefHeight="500.0" prefWidth="441.0">
       <StackPane.margin>
@@ -55,25 +57,29 @@
       </padding>
    </HBox>
    <VBox fx:id="logoPane" alignment="CENTER" prefHeight="200.0" prefWidth="100.0">
-      <ImageView fx:id="logo" cache="true" cacheHint="QUALITY" pickOnBounds="true" preserveRatio="true">
-         <Image url="@assets/logo.png"/>
+      <ImageView fx:id="logo" cache="true" cacheHint="QUALITY" opacity="0.0" pickOnBounds="true" preserveRatio="true">
+         <Image url="@assets/logo.png" />
       </ImageView>
       <HBox alignment="CENTER" prefHeight="100.0" spacing="50.0">
          <Label id="splashLabel" fx:id="splashLabel1" text="Simple.">
             <padding>
-               <Insets bottom="20.0" left="20.0" right="20.0" top="20.0"/>
+               <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
             </padding>
          </Label>
          <Label id="splashLabel" fx:id="splashLabel2" text="Efficient.">
             <padding>
-               <Insets bottom="20.0" left="20.0" right="20.0" top="20.0"/>
+               <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
             </padding>
          </Label>
          <Label id="splashLabel" fx:id="splashLabel3" text="Material.">
             <padding>
-               <Insets bottom="20.0" left="20.0" right="20.0" top="20.0"/>
+               <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
             </padding>
          </Label>
       </HBox>
+      <TextFlow fx:id="version" maxWidth="-Infinity" minWidth="-Infinity" opacity="0.0" prefWidth="960.0" textAlignment="CENTER" translateY="75.0">
+         <Text id="textVer1" strokeType="OUTSIDE" strokeWidth="0.0" text="ver." translateX="-3.0" />
+         <Text id="textVer2" strokeType="OUTSIDE" strokeWidth="0.0" text="12.2.0" />
+      </TextFlow>
    </VBox>
 </StackPane>

+ 32 - 11
demo/src/main/resources/io/github/palexdev/materialfx/demo/SlidersDemo.fxml

@@ -30,28 +30,40 @@
                 <padding>
                     <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                 </padding>
-                <Label text="Default" />
+                <Label id="customLabel" alignment="CENTER" minWidth="150.0" text="Default">
+               <padding>
+                  <Insets bottom="2.0" left="5.0" right="5.0" top="2.0" />
+               </padding></Label>
                 <MFXSlider prefWidth="150.0" />
             </VBox>
             <VBox id="customSlider" alignment="CENTER" spacing="20.0">
                 <padding>
                     <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                 </padding>
-                <Label text="Custom 1" />
+                <Label id="customLabel" alignment="CENTER" minWidth="150.0" text="Custom 1">
+               <padding>
+                  <Insets bottom="2.0" left="5.0" right="5.0" top="2.0" />
+               </padding></Label>
                 <MFXSlider id="customSlider" fx:id="customSlider" popupSide="OTHER_SIDE" prefWidth="150.0" />
             </VBox>
             <VBox id="customSlider" alignment="CENTER" spacing="20.0">
                 <padding>
-                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/>
+                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                 </padding>
-                <Label text="Custom 2"/>
-                <MFXSlider id="customSlider2" popupSide="OTHER_SIDE" prefWidth="150.0"/>
+                <Label id="customLabel" alignment="CENTER" minWidth="150.0" text="Custom 2">
+               <padding>
+                  <Insets bottom="2.0" left="5.0" right="5.0" top="2.0" />
+               </padding></Label>
+                <MFXSlider id="customSlider2" popupSide="OTHER_SIDE" prefWidth="150.0" />
             </VBox>
             <VBox alignment="CENTER" spacing="20.0">
                 <padding>
                     <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                 </padding>
-                <Label text="Disabled" />
+                <Label id="customLabel" alignment="CENTER" minWidth="150.0" text="Disabled">
+               <padding>
+                  <Insets bottom="2.0" left="5.0" right="5.0" top="2.0" />
+               </padding></Label>
                 <MFXSlider disable="true" prefWidth="150.0" />
             </VBox>
         </VBox>
@@ -60,21 +72,30 @@
                 <padding>
                     <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                 </padding>
-                <Label text="Bidirectional" />
+                <Label id="customLabel" alignment="CENTER" minWidth="150.0" text="Bidirectional">
+               <padding>
+                  <Insets bottom="2.0" left="5.0" right="5.0" top="2.0" />
+               </padding></Label>
                 <MFXSlider min="-50.0" prefWidth="150.0" />
             </VBox>
             <VBox alignment="CENTER" spacing="20.0">
                 <padding>
                     <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                 </padding>
-                <Label text="Ticks and Snap To Ticks" />
+                <Label id="customLabel" alignment="CENTER" minWidth="150.0" text="Ticks and Snap To Ticks">
+               <padding>
+                  <Insets bottom="2.0" left="5.0" right="5.0" top="2.0" />
+               </padding></Label>
                 <MFXSlider minorTicksCount="4" prefWidth="150.0" showMajorTicks="true" showMinorTicks="true" sliderMode="SNAP_TO_TICKS" tickUnit="20.0" />
             </VBox>
             <VBox alignment="CENTER" spacing="20.0">
                 <padding>
                     <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                 </padding>
-                <Label text="Decimal Precision of 2" />
+                <Label id="customLabel" alignment="CENTER" minWidth="150.0" text="Decimal Precision of 2">
+               <padding>
+                  <Insets bottom="2.0" left="5.0" right="5.0" top="2.0" />
+               </padding></Label>
                 <MFXSlider decimalPrecision="2" prefWidth="150.0" />
             </VBox>
         </VBox>
@@ -82,9 +103,9 @@
             <MFXSlider layoutX="-33.0" layoutY="160.0" min="-100.0" orientation="VERTICAL" prefWidth="150.0" AnchorPane.leftAnchor="-50.0" />
             <MFXSlider disable="true" layoutX="128.0" layoutY="160.0" orientation="VERTICAL" prefWidth="150.0" AnchorPane.rightAnchor="-50.0" />
             <MFXSlider layoutX="35.0" layoutY="160.0" maxWidth="-Infinity" minWidth="-Infinity" orientation="VERTICAL" popupSide="OTHER_SIDE" prefWidth="150.0" AnchorPane.leftAnchor="50.0" AnchorPane.rightAnchor="50.0" />
-            <Label alignment="CENTER" layoutX="114.0" layoutY="14.0" text="Vertical Sliders" AnchorPane.leftAnchor="50.0" AnchorPane.rightAnchor="50.0" AnchorPane.topAnchor="25.0">
+            <Label id="customLabel" alignment="CENTER" layoutX="114.0" layoutY="14.0" text="Vertical Sliders" AnchorPane.leftAnchor="50.0" AnchorPane.rightAnchor="50.0" AnchorPane.topAnchor="25.0">
                 <padding>
-                    <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
+                    <Insets bottom="2.0" left="5.0" right="5.0" top="2.0" />
                 </padding>
             </Label>
         </AnchorPane>

+ 2 - 4
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/Common.css

@@ -234,10 +234,8 @@
 
 #customLabel {
     -fx-background-color: linear-gradient(to bottom right, #C01ADD 0%, #6A6AF8 100%);
-    -fx-background-radius: 7;
-    -fx-border-color: #7F0FFF;
-    -fx-border-radius: 5;
-    -fx-border-width: 2;
+    -fx-background-radius: 6;
+    -fx-border-color: transparent;
 }
 
 #customLabel .text {

+ 15 - 0
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/Demo.css

@@ -138,4 +138,19 @@
 
 #splashLabel .text {
     -fx-font-smoothing-type: gray;
+}
+
+#textVer1,
+#textVer2 {
+    -fx-font-smoothing-type: gray;
+    -fx-font-family: "Open Sans Bold";
+    -fx-fill: #6314A8;
+}
+
+#textVer1 {
+    -fx-font-size: 12;
+}
+
+#textVer2 {
+    -fx-font-size: 24;
 }

+ 1 - 1
materialfx/gradle.properties

@@ -1,6 +1,6 @@
 GROUP=io.github.palexdev
 POM_ARTIFACT_ID=materialfx
-VERSION_NAME=11.11.1
+VERSION_NAME=11.12.0
 
 POM_NAME=materialfx
 POM_DESCRIPTION=Material Desgin components for JavaFX

+ 25 - 32
materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXLabelSkin.java

@@ -62,7 +62,6 @@ public class MFXLabelSkin extends SkinBase<MFXLabel> {
     //================================================================================
     private final HBox container;
     private final Label textNode;
-    private boolean promptIsUsed = false;
 
     private final Line unfocusedLine;
     private final Line focusedLine;
@@ -100,15 +99,12 @@ public class MFXLabelSkin extends SkinBase<MFXLabel> {
 
         textNode = new Label();
         textNode.getStyleClass().add("text-node");
-        textNode.textProperty().bind(Bindings.createStringBinding(() -> {
-            if (label.getText().isEmpty()) {
-                promptIsUsed = true;
-                return label.getPromptText();
-            } else {
-                promptIsUsed = false;
-                return label.getText();
-            }
-        }, label.textProperty(), label.promptTextProperty()));
+        textNode.textProperty().bind(
+                Bindings.createStringBinding(
+                        () -> label.getText().isEmpty() ? label.getPromptText() : label.getText(),
+                        label.textProperty(), label.promptTextProperty()
+                )
+        );
         textNode.fontProperty().bind(label.fontProperty());
         textNode.textFillProperty().bind(label.textFillProperty());
         textNode.alignmentProperty().bind(label.labelAlignmentProperty());
@@ -157,10 +153,6 @@ public class MFXLabelSkin extends SkinBase<MFXLabel> {
         });
 
         label.promptTextShowingProperty().bind(textNode.textProperty().isEqualTo(label.getPromptText()));
-        label.promptTextShowingProperty().bind(Bindings.createBooleanBinding(
-                () -> textNode.getText().equals(label.getPromptText()) && promptIsUsed,
-                textNode.textProperty(), label.promptTextProperty()
-        ));
 
         label.leadingIconProperty().addListener((observable, oldValue, newValue) -> {
             if (newValue == null) {
@@ -267,29 +259,25 @@ public class MFXLabelSkin extends SkinBase<MFXLabel> {
 
         textField.addEventHandler(KeyEvent.KEY_PRESSED, event -> {
             if (event.getCode() == KeyCode.ENTER) {
-                removeEditor(textField);
+                removeEditor(textField, true);
                 label.requestFocus();
             } else if (event.getCode() == KeyCode.ESCAPE) {
-                removeEditor(textField);
+                removeEditor(textField, false);
                 label.requestFocus();
             }
         });
 
-        if (editorFocusListener == null) {
-            editorFocusListener = (observable, oldValue, newValue) -> {
-                if (!newValue) {
-                    label.setText(textField.getText());
-                    container.getChildren().remove(textField);
-                    textNode.setVisible(true);
-                    textNode.setPrefWidth(Region.USE_COMPUTED_SIZE);
-                }
-            };
-        }
+        editorFocusListener = (observable, oldValue, newValue) -> {
+            if (!newValue) {
+                removeEditor(textField, true);
+            }
+        };
         textField.focusedProperty().addListener(editorFocusListener);
 
         container.getChildren().add(textField);
         computeEditorPosition(textField);
         textField.requestFocus();
+        textField.positionCaret(textField.getText().length());
     }
 
     /**
@@ -310,9 +298,9 @@ public class MFXLabelSkin extends SkinBase<MFXLabel> {
         double editorWidth = containerWidth -
                 (
                         label.getContainerPadding().getLeft() +
-                        leadingWidth + label.getGraphicTextGap() +
-                        trailingWidth + label.getGraphicTextGap() +
-                        label.getContainerPadding().getRight()
+                                leadingWidth + label.getGraphicTextGap() +
+                                trailingWidth + label.getGraphicTextGap() +
+                                label.getContainerPadding().getRight()
                 );
         textNode.setPrefWidth(editorWidth);
         textField.resizeRelocate(posX, 0, editorWidth, containerHeight);
@@ -332,11 +320,15 @@ public class MFXLabelSkin extends SkinBase<MFXLabel> {
     /**
      * Removes the editor and sets its text as the label's text.
      */
-    private void removeEditor(MFXTextField textField) {
+    private void removeEditor(MFXTextField textField, boolean commitChanges) {
         MFXLabel label = getSkinnable();
 
-        textNode.setVisible(false);
-        label.setText(textField.getText());
+        textField.setVisible(false);
+        if (commitChanges) {
+            label.setText(textField.getText());
+        }
+        textNode.setPrefWidth(Region.USE_COMPUTED_SIZE);
+        textNode.setVisible(true);
 
         label.editorFocusedProperty().unbind();
         textField.focusedProperty().removeListener(editorFocusListener);
@@ -373,6 +365,7 @@ public class MFXLabelSkin extends SkinBase<MFXLabel> {
     public void dispose() {
         super.dispose();
         iconEditorHandler = null;
+        editorFocusListener = null;
     }
 
     @Override