From 84891067174602e27640eef6fd8f7c4d0c51e0f1 Mon Sep 17 00:00:00 2001 From: mkpaz Date: Mon, 26 Sep 2022 16:33:57 +0400 Subject: [PATCH] Add widgets showcase Includes additional showcase page for widgets and examples how to implement some conventional controls: card, message, stepper and tag. More widgets can be added in the future. --- .../atlantafx/sampler/layout/MainLayer.java | 4 +- .../atlantafx/sampler/layout/Sidebar.java | 4 +- .../atlantafx/sampler/page/SampleBlock.java | 10 + .../sampler/page/showcase/widget/Card.java | 160 ++++++++++++ .../page/showcase/widget/CardSample.java | 139 ++++++++++ .../sampler/page/showcase/widget/Message.java | 145 +++++++++++ .../page/showcase/widget/MessageSample.java | 42 +++ .../sampler/page/showcase/widget/Stepper.java | 241 ++++++++++++++++++ .../page/showcase/widget/StepperSample.java | 117 +++++++++ .../sampler/page/showcase/widget/Tag.java | 26 ++ .../page/showcase/widget/TagSample.java | 117 +++++++++ .../showcase/widget/WidgetCollectionPage.java | 125 +++++++++ .../assets/styles/scss/layout/_page.scss | 14 +- sampler/src/main/resources/images/pattern.jpg | Bin 0 -> 68192 bytes 14 files changed, 1140 insertions(+), 4 deletions(-) create mode 100644 sampler/src/main/java/atlantafx/sampler/page/showcase/widget/Card.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/showcase/widget/CardSample.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/showcase/widget/Message.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/showcase/widget/MessageSample.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/showcase/widget/Stepper.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/showcase/widget/StepperSample.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/showcase/widget/Tag.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/showcase/widget/TagSample.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/showcase/widget/WidgetCollectionPage.java create mode 100644 sampler/src/main/resources/images/pattern.jpg diff --git a/sampler/src/main/java/atlantafx/sampler/layout/MainLayer.java b/sampler/src/main/java/atlantafx/sampler/layout/MainLayer.java index 357a497..0eb1679 100644 --- a/sampler/src/main/java/atlantafx/sampler/layout/MainLayer.java +++ b/sampler/src/main/java/atlantafx/sampler/layout/MainLayer.java @@ -108,7 +108,7 @@ class MainLayer extends BorderPane { // startup, no prev page, no animation if (getScene() == null) { - subLayerPane.getChildren().add(nextPage.getView()); + subLayerPane.getChildren().setAll(nextPage.getView()); return; } @@ -118,7 +118,7 @@ class MainLayer extends BorderPane { prevPage.reset(); // animate switching between pages - subLayerPane.getChildren().add(nextPage.getView()); + subLayerPane.getChildren().setAll(nextPage.getView()); var transition = new FadeTransition(Duration.millis(PAGE_TRANSITION_DURATION), nextPage.getView()); transition.setFromValue(0.0); transition.setToValue(1.0); diff --git a/sampler/src/main/java/atlantafx/sampler/layout/Sidebar.java b/sampler/src/main/java/atlantafx/sampler/layout/Sidebar.java index 8eb6167..211bbd5 100644 --- a/sampler/src/main/java/atlantafx/sampler/layout/Sidebar.java +++ b/sampler/src/main/java/atlantafx/sampler/layout/Sidebar.java @@ -9,6 +9,7 @@ import atlantafx.sampler.page.general.ThemePage; import atlantafx.sampler.page.general.TypographyPage; import atlantafx.sampler.page.showcase.filemanager.FileManagerPage; import atlantafx.sampler.page.showcase.musicplayer.MusicPlayerPage; +import atlantafx.sampler.page.showcase.widget.WidgetCollectionPage; import atlantafx.sampler.util.Containers; import javafx.beans.binding.Bindings; import javafx.collections.FXCollections; @@ -209,7 +210,8 @@ class Sidebar extends StackPane { navLink(TreeTablePage.NAME, TreeTablePage.class), caption("SHOWCASE"), navLink(FileManagerPage.NAME, FileManagerPage.class), - navLink(MusicPlayerPage.NAME, MusicPlayerPage.class) + navLink(MusicPlayerPage.NAME, MusicPlayerPage.class), + navLink(WidgetCollectionPage.NAME, WidgetCollectionPage.class) ); } diff --git a/sampler/src/main/java/atlantafx/sampler/page/SampleBlock.java b/sampler/src/main/java/atlantafx/sampler/page/SampleBlock.java index bfda4bf..e8aff46 100644 --- a/sampler/src/main/java/atlantafx/sampler/page/SampleBlock.java +++ b/sampler/src/main/java/atlantafx/sampler/page/SampleBlock.java @@ -7,14 +7,20 @@ import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; import javafx.scene.text.Text; import javafx.scene.text.TextFlow; +import net.datafaker.Faker; +import org.kordamp.ikonli.feather.Feather; import java.util.Objects; +import java.util.Random; public class SampleBlock extends VBox { public static final int BLOCK_HGAP = 20; public static final int BLOCK_VGAP = 10; + protected static final Faker FAKER = new Faker(); + protected static final Random RANDOM = new Random(); + protected final Label titleLabel; protected final Node content; // can be either Pane or Control protected TextFlow descriptionText; @@ -58,4 +64,8 @@ public class SampleBlock extends VBox { VBox.setVgrow(content, Priority.NEVER); } } + + protected static Feather randomIcon() { + return Feather.values()[RANDOM.nextInt(Feather.values().length)]; + } } diff --git a/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/Card.java b/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/Card.java new file mode 100644 index 0000000..b1dab47 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/Card.java @@ -0,0 +1,160 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.showcase.widget; + +import atlantafx.base.theme.Styles; +import javafx.beans.binding.Bindings; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import javafx.scene.Group; +import javafx.scene.Node; +import javafx.scene.Parent; +import javafx.scene.control.Label; +import javafx.scene.control.Separator; +import javafx.scene.image.ImageView; +import javafx.scene.layout.VBox; + +public class Card extends VBox { + + public static final String CSS = """ + .card { + -fx-background-color: -color-bg-default; + -fx-effect: dropshadow(three-pass-box, -color-shadow-default, 8, 0.5, 0, 2); + } + .card > .subtitle { + -fx-text-fill: -color-fg-muted; + -fx-padding: 0px 15px 10px 15px; + } + .card > .title, + .card > .body, + .card > .footer { + -fx-padding: 10px 15px 10px 15px; + } + """; + + private final StringProperty title = new SimpleStringProperty(); + private final StringProperty subtitle = new SimpleStringProperty(); + private final ObjectProperty image = new SimpleObjectProperty<>(); + private final ObjectProperty body = new SimpleObjectProperty<>(); + private final ObjectProperty footer = new SimpleObjectProperty<>(); + + public Card() { + super(); + createView(); + } + + private void createView() { + var footerSep = new Separator(); + footerSep.getStyleClass().add(Styles.SMALL); + footerSep.managedProperty().bind(Bindings.createObjectBinding( + () -> footer.get() != null && footer.get().isManaged(), footer + )); + + getChildren().setAll( + createPlaceholder(), // title + createPlaceholder(), // subtitle + createPlaceholder(), // image + createPlaceholder(), // body + footerSep, + createPlaceholder() // footer + ); + + image.addListener( + (obs, old, val) -> setChild(0, val, "image") + ); + title.addListener( + (obs, old, val) -> setChild(1, val != null ? new Label(val) : null, "title", Styles.TITLE_4) + ); + subtitle.addListener( + (obs, old, val) -> setChild(2, val != null ? new Label(val) : null, "subtitle") + ); + body.addListener( + (obs, old, val) -> setChild(3, val, "body") + ); + footer.addListener( + (obs, old, val) -> setChild(5, val, "footer") + ); + + getStyleClass().addAll("card", Styles.BORDERED); + } + + private void setChild(int index, Node node, String... styleClass) { + if (node != null) { + for (var s : styleClass) { + if (!node.getStyleClass().contains(s)) { + node.getStyleClass().add(s); + } + } + getChildren().set(index, node); + } else { + getChildren().set(index, createPlaceholder()); + } + } + + public String getTitle() { + return title.get(); + } + + public StringProperty titleProperty() { + return title; + } + + public void setTitle(String title) { + this.title.set(title); + } + + public String getSubtitle() { + return subtitle.get(); + } + + public StringProperty subtitleProperty() { + return subtitle; + } + + public void setSubtitle(String subtitle) { + this.subtitle.set(subtitle); + } + + public ImageView getImage() { + return image.get(); + } + + public ObjectProperty imageProperty() { + return image; + } + + public void setImage(ImageView image) { + this.image.set(image); + } + + public Parent getBody() { + return body.get(); + } + + public ObjectProperty bodyProperty() { + return body; + } + + public void setBody(Parent body) { + this.body.set(body); + } + + public Parent getFooter() { + return footer.get(); + } + + public ObjectProperty footerProperty() { + return footer; + } + + public void setFooter(Parent footer) { + this.footer.set(footer); + } + + private Parent createPlaceholder() { + var g = new Group(); + g.setManaged(false); + return g; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/CardSample.java b/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/CardSample.java new file mode 100644 index 0000000..8358fe7 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/CardSample.java @@ -0,0 +1,139 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.showcase.widget; + +import atlantafx.base.theme.Styles; +import atlantafx.sampler.Resources; +import atlantafx.sampler.theme.CSSFragment; +import javafx.geometry.Pos; +import javafx.scene.control.Button; +import javafx.scene.control.Hyperlink; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.image.PixelReader; +import javafx.scene.image.WritableImage; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.scene.text.Text; +import javafx.scene.text.TextFlow; +import net.datafaker.Faker; + +import static atlantafx.sampler.page.Page.PAGE_HGAP; +import static atlantafx.sampler.page.Page.PAGE_VGAP; + +public class CardSample extends HBox { + + private static final Faker FAKER = new Faker(); + private static final int CARD_WIDTH = 300; + + public CardSample() { + new CSSFragment(Card.CSS).addTo(this); + + setSpacing(PAGE_HGAP); + setAlignment(Pos.TOP_CENTER); + setMinWidth(CARD_WIDTH * 2 + PAGE_HGAP); + getChildren().setAll( + // column 0 + new VBox( + PAGE_VGAP, + textFooterCard(), + titleTextCard(), + quoteCard() + ), + // column 1 + new VBox( + PAGE_VGAP, + imageTextCard(), + titleImageCard() + ) + ); + } + + private Card textFooterCard() { + var card = new Card(); + card.setMinWidth(CARD_WIDTH); + card.setMaxWidth(CARD_WIDTH); + + var text = new Text(FAKER.chuckNorris().fact()); + card.setBody(new TextFlow(text)); + + var btn = new Button("More!"); + btn.getStyleClass().addAll(Styles.ACCENT, Styles.BUTTON_OUTLINED); + btn.setOnAction(e -> text.setText(FAKER.chuckNorris().fact())); + + card.setFooter(new HBox(btn)); + + return card; + } + + private Card imageTextCard() { + var card = new Card(); + card.setMinWidth(CARD_WIDTH); + card.setMaxWidth(CARD_WIDTH); + + var image = new ImageView(new Image(Resources.getResourceAsStream("images/20_min_adventure.jpg"))); + image.setFitWidth(300); + image.setPreserveRatio(true); + card.setImage(image); + + var text = new Text(FAKER.rickAndMorty().quote()); + card.setBody(new TextFlow(text)); + + return card; + } + + private Card titleTextCard() { + var card = new Card(); + card.setMinWidth(CARD_WIDTH); + card.setMaxWidth(CARD_WIDTH); + + card.setTitle("Title"); + card.setSubtitle("Subtitle"); + + var text = new Text(FAKER.lorem().paragraph()); + card.setBody(new TextFlow(text)); + + return card; + } + + private Card titleImageCard() { + var card = new Card(); + card.setMinWidth(CARD_WIDTH); + card.setMaxWidth(CARD_WIDTH); + + var image = new Image(Resources.getResourceAsStream("images/pattern.jpg")); + PixelReader pixelReader = image.getPixelReader(); + var cropImage = new WritableImage(pixelReader, 0, 0, 300, 100); + + card.setImage(new ImageView(cropImage)); + card.setTitle("Title"); + + var text = new Text(FAKER.lorem().paragraph()); + card.setBody(new TextFlow(text)); + + return card; + } + + private Card quoteCard() { + var card = new Card(); + card.setMinWidth(CARD_WIDTH); + card.setMaxWidth(CARD_WIDTH); + + var quoteText = new Text(FAKER.bojackHorseman().quotes()); + quoteText.getStyleClass().add(Styles.TITLE_3); + + var authorText = new Text("Bojack Horseman"); + + card.setBody(new VBox( + 10, + new TextFlow(quoteText), + authorText + )); + + card.setFooter(new TextFlow( + new Text("Share on "), + new Hyperlink("Twitter") + )); + + return card; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/Message.java b/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/Message.java new file mode 100644 index 0000000..a3b4c43 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/Message.java @@ -0,0 +1,145 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.showcase.widget; + +import atlantafx.base.theme.Styles; +import javafx.animation.FadeTransition; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.Button; +import javafx.scene.layout.Pane; +import javafx.scene.layout.StackPane; +import javafx.scene.text.Text; +import javafx.scene.text.TextFlow; +import javafx.util.Duration; +import org.kordamp.ikonli.javafx.FontIcon; +import org.kordamp.ikonli.material2.Material2AL; + +import java.util.Objects; +import java.util.function.Consumer; + +public class Message extends StackPane { + + private static final int ANIMATION_DURATION = 500; + + public enum Type { + INFO, SUCCESS, WARNING, DANGER + } + + public static final String CSS = """ + .message { + -color-message-bg: -color-bg-default; + -color-message-fg: -color-fg-default; + -fx-background-color: -color-message-bg; + -fx-border-color: -color-message-fg; + -fx-border-width: 0 0 0 5px; + -fx-pref-width: 600px; + -fx-alignment: TOP_LEFT; + } + .message > .header { + -fx-font-weight: bold; + } + .message Text { + -fx-fill: -color-message-fg; + } + .message > .button { + -color-button-fg: -color-message-fg; + } + .message.info { + -color-message-bg: -color-accent-subtle; + -color-message-fg: -color-accent-fg; + } + .message.success { + -color-message-bg: -color-success-subtle; + -color-message-fg: -color-success-fg; + } + .message.warning { + -color-message-bg: -color-warning-subtle; + -color-message-fg: -color-warning-fg; + } + .message.danger { + -color-message-bg: -color-danger-subtle; + -color-message-fg: -color-danger-fg; + } + """; + + private final Type type; + private final String header; + private final String text; + private Consumer closeHandler; + + public Message(Type type, String header, String text) { + this.type = Objects.requireNonNull(type); + this.header = header; + this.text = Objects.requireNonNull(text); + createView(); + } + + private void createView() { + if (header != null) { + var headerText = new Text(header); + headerText.getStyleClass().addAll("header"); + StackPane.setMargin(headerText, new Insets(10, 10, 0, 15)); + getChildren().add(headerText); + } + + var messageText = new TextFlow(new Text(text)); + if (header != null) { + StackPane.setMargin(messageText, new Insets(40, 10, 10, 15)); + } else { + StackPane.setMargin(messageText, new Insets(10, 10, 10, 15)); + } + messageText.maxWidthProperty().bind(widthProperty().subtract(50)); + getChildren().add(messageText); + + var closeBtn = new Button("", new FontIcon(Material2AL.CLOSE)); + closeBtn.getStyleClass().addAll(Styles.BUTTON_CIRCLE, Styles.FLAT); + closeBtn.setOnAction(e -> handleClose()); + StackPane.setMargin(closeBtn, new Insets(2)); + StackPane.setAlignment(closeBtn, Pos.TOP_RIGHT); + getChildren().add(closeBtn); + + parentProperty().addListener((obs, old, val) -> { + if (val != null) { handleOpen(); } + }); + + getStyleClass().setAll("message", type.name().toLowerCase()); + } + + public Type getType() { + return type; + } + + public String getHeader() { + return header; + } + + public String getText() { + return text; + } + + public void setCloseHandler(Consumer closeHandler) { + this.closeHandler = closeHandler; + } + + private void handleOpen() { + var transition = new FadeTransition(new Duration(500), this); + transition.setFromValue(0); + transition.setToValue(1); + transition.play(); + } + + private void handleClose() { + var transition = new FadeTransition(new Duration(ANIMATION_DURATION), this); + transition.setFromValue(1); + transition.setToValue(0); + transition.setOnFinished(e -> { + if (getParent() != null && getParent() instanceof Pane pane) { + pane.getChildren().remove(this); + } + if (closeHandler != null) { + closeHandler.accept(this); + } + }); + transition.play(); + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/MessageSample.java b/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/MessageSample.java new file mode 100644 index 0000000..fefc05b --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/MessageSample.java @@ -0,0 +1,42 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.showcase.widget; + +import atlantafx.sampler.page.SampleBlock; +import atlantafx.sampler.theme.CSSFragment; +import javafx.geometry.Pos; +import javafx.scene.Node; +import javafx.scene.layout.Priority; +import javafx.scene.layout.VBox; + +import java.util.function.Consumer; + +public class MessageSample extends SampleBlock { + + public MessageSample() { + super("Message", createContent()); + } + + private static Node createContent() { + var content = new VBox(BLOCK_VGAP); + content.setAlignment(Pos.TOP_CENTER); + VBox.setVgrow(content, Priority.ALWAYS); + new CSSFragment(Message.CSS).addTo(content); + + var closeHandler = new Consumer() { + @Override + public void accept(Message msg) { + var newMsg = new Message(msg.getType(), msg.getHeader(), FAKER.chuckNorris().fact()); + newMsg.setCloseHandler(this); + content.getChildren().add(newMsg); + } + }; + + for (Message.Type type : Message.Type.values()) { + var msg = new Message(type, type.name(), FAKER.chuckNorris().fact()); + msg.setCloseHandler(closeHandler); + content.getChildren().add(msg); + } + + return content; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/Stepper.java b/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/Stepper.java new file mode 100644 index 0000000..6c6f73f --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/Stepper.java @@ -0,0 +1,241 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.showcase.widget; + +import javafx.beans.binding.Bindings; +import javafx.beans.binding.BooleanBinding; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.css.PseudoClass; +import javafx.geometry.Pos; +import javafx.geometry.Side; +import javafx.scene.Node; +import javafx.scene.control.ContentDisplay; +import javafx.scene.control.Label; +import javafx.scene.control.Separator; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import org.kordamp.ikonli.Ikon; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Stepper extends HBox { + + public static final String CSS = """ + .stepper { + -color-stepper-bg: -color-bg-subtle; + -color-stepper-fg: -color-fg-default; + -color-stepper-border: -color-border-default; + -fx-pref-width: 600px; + -fx-spacing: 10px; + } + .stepper > .item { + -fx-graphic-text-gap: 10px; + } + .stepper > .item > .graphic { + -fx-font-size: 1.1em; + -fx-min-width: 2.2em; + -fx-max-width: 2.2em; + -fx-min-height: 2.2em; + -fx-max-height: 2.2em; + -fx-text-fill: -color-stepper-fg; + -fx-background-color: -color-stepper-bg; + -fx-background-radius: 10em; + -fx-border-color: -color-stepper-border; + -fx-border-radius: 10em; + -fx-border-width: 1; + -fx-alignment: CENTER; + } + .stepper > .item .ikonli-font-icon { + -fx-fill: -color-stepper-fg; + -fx-icon-color: -color-stepper-fg; + } + .stepper > .item:selected > .graphic { + -color-stepper-bg: -color-accent-subtle; + -color-stepper-fg: -color-accent-fg; + -color-stepper-border: -color-accent-emphasis; + } + .stepper > .item:completed { + -color-stepper-bg: -color-accent-emphasis; + -color-stepper-fg: -color-fg-emphasis; + -color-stepper-border: -color-accent-emphasis; + } + """; + + private static final PseudoClass SELECTED = PseudoClass.getPseudoClass("selected"); + private static final PseudoClass COMPLETED = PseudoClass.getPseudoClass("completed"); + + private final List items; + private final ObjectProperty textPosition = new SimpleObjectProperty<>(Side.LEFT); + private final ObjectProperty selectedItem = new SimpleObjectProperty<>(); + private final BooleanBinding canGoBack; + private final BooleanBinding canGoForward; + + public Stepper(Item... items) { + this(Arrays.asList(items)); + } + + public Stepper(List items) { + if (items == null || items.isEmpty()) { + throw new IllegalArgumentException("Item list can't be null or empty."); + } + + this.items = Collections.unmodifiableList(items); + + canGoBack = Bindings.createBooleanBinding(() -> { + if (selectedItem.get() == null) { return false; } + var idx = items.indexOf(selectedItem.get()); + return idx > 0 && idx <= items.size() - 1; + }, selectedItem); + + canGoForward = Bindings.createBooleanBinding(() -> { + if (selectedItem.get() == null) { return false; } + var idx = items.indexOf(selectedItem.get()); + return idx >= 0 && idx < items.size() - 1; + }, selectedItem); + + selectedItem.addListener((obs, old, val) -> { + if (old != null) { old.pseudoClassStateChanged(SELECTED, false); } + if (val != null) { val.pseudoClassStateChanged(SELECTED, true); } + }); + + createView(); + } + + private void createView() { + alignmentProperty().bind(Bindings.createObjectBinding(() -> + switch (textPositionProperty().get()) { + case TOP -> Pos.TOP_LEFT; + case BOTTOM -> Pos.BOTTOM_LEFT; + default -> Pos.CENTER_LEFT; + }, textPositionProperty()) + ); + + updateItems(); + getStyleClass().add("stepper"); + } + + private void updateItems() { + var children = new ArrayList(); + for (int i = 0; i < items.size(); i++) { + var item = items.get(i); + item.contentDisplayProperty().bind(Bindings.createObjectBinding(() -> + switch (textPositionProperty().get()) { + case TOP -> ContentDisplay.TOP; + case BOTTOM -> ContentDisplay.BOTTOM; + case LEFT -> ContentDisplay.LEFT; + case RIGHT -> ContentDisplay.RIGHT; + }, textPositionProperty()) + ); + + children.add(item); + + if (i < items.size() - 1) { + var sep = new Separator(); + HBox.setHgrow(sep, Priority.ALWAYS); + children.add(sep); + } + } + getChildren().setAll(children); + } + + public List getItems() { + return items; + } + + public Side getTextPosition() { + return textPosition.get(); + } + + public void setTextPosition(Side textPosition) { + this.textPosition.set(textPosition); + } + + public ObjectProperty textPositionProperty() { + return textPosition; + } + + public Item getSelectedItem() { + return selectedItem.get(); + } + + public ObjectProperty selectedItemProperty() { + return selectedItem; + } + + public void setSelectedItem(Item selectedItem) { + this.selectedItem.set(selectedItem); + } + + public BooleanBinding canGoBackProperty() { + return canGoBack; + } + + public void backward() { + if (!canGoBack.get()) { return; } + var idx = items.indexOf(selectedItem.get()); + selectedItem.set(items.get(idx - 1)); + } + + public BooleanBinding canGoForwardProperty() { + return canGoForward; + } + + public void forward() { + if (!canGoForward.get()) { return; } + var idx = items.indexOf(selectedItem.get()); + selectedItem.set(items.get(idx + 1)); + } + + /////////////////////////////////////////////////////////////////////////// + + public static class Item extends Label { + + private final BooleanProperty completed = new SimpleBooleanProperty(); + + public Item(String text) { + super(text); + + var graphicLabel = new Label(); + graphicLabel.getStyleClass().add("graphic"); + setGraphic(graphicLabel); + + completed.addListener((obs, old, val) -> pseudoClassStateChanged(COMPLETED, val)); + getStyleClass().add("item"); + setContentDisplay(ContentDisplay.LEFT); + } + + public void setGraphic(Ikon icon) { + var graphicLabel = ((Label) getGraphic()); + if (icon != null) { + graphicLabel.setText(null); + graphicLabel.setGraphic(new FontIcon(icon)); + } + } + + public void setGraphic(String text) { + var graphicLabel = ((Label) getGraphic()); + if (text != null) { + graphicLabel.setText(text); + graphicLabel.setGraphic(null); + } + } + + public boolean isCompleted() { + return completed.get(); + } + + public void setCompleted(boolean state) { + completed.set(state); + } + + public BooleanProperty completedProperty() { + return completed; + } + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/StepperSample.java b/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/StepperSample.java new file mode 100644 index 0000000..6df1a8d --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/StepperSample.java @@ -0,0 +1,117 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.showcase.widget; + +import atlantafx.base.controls.Spacer; +import atlantafx.base.controls.ToggleSwitch; +import atlantafx.base.theme.Styles; +import atlantafx.sampler.page.SampleBlock; +import atlantafx.sampler.page.showcase.widget.Stepper.Item; +import atlantafx.sampler.theme.CSSFragment; +import javafx.geometry.Pos; +import javafx.geometry.Side; +import javafx.scene.Node; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.Separator; +import javafx.scene.layout.HBox; +import javafx.scene.layout.StackPane; +import javafx.scene.layout.VBox; +import org.kordamp.ikonli.javafx.FontIcon; +import org.kordamp.ikonli.material2.Material2MZ; + +public class StepperSample extends SampleBlock { + + public StepperSample() { + super("Stepper", createContent()); + } + + private static Node createContent() { + var content = new VBox(BLOCK_VGAP); + new CSSFragment(Stepper.CSS).addTo(content); + + // == STEPPER CONTENT == + + var stackContent = new Label(); + stackContent.getStyleClass().add(Styles.TITLE_1); + stackContent.setStyle("-fx-background-color:-color-bg-default;"); + stackContent.setWrapText(true); + stackContent.setMinHeight(200); + stackContent.setMaxWidth(400); + stackContent.setAlignment(Pos.CENTER); + + var stack = new StackPane(stackContent); + stack.setPrefHeight(200); + + // == STEPPER == + + var firstItem = new Item("First"); + firstItem.setGraphic("A"); + + var secondItem = new Item("Second"); + secondItem.setGraphic("B"); + + var thirdItem = new Item("Third"); + thirdItem.setGraphic("C"); + + var stepper = new Stepper(firstItem, secondItem, thirdItem); + stepper.selectedItemProperty().addListener( + (obs, old, val) -> stackContent.setText(val != null ? val.getText() : null) + ); + stepper.setSelectedItem(stepper.getItems().get(0)); + + // == CONTROLS == + + var saveBtn = new Button("Save"); + saveBtn.setDefaultButton(true); + saveBtn.setOnAction(e -> { + // you can validate user input before moving forward here + stepper.getSelectedItem().setCompleted(true); + stepper.forward(); + }); + + var cancelBtn = new Button("Cancel"); + cancelBtn.getStyleClass().addAll(Styles.FLAT); + cancelBtn.setOnAction(e -> { + stepper.getSelectedItem().setCompleted(false); + stepper.backward(); + }); + + var iconToggle = new ToggleSwitch("Icons"); + iconToggle.selectedProperty().addListener((obs, old, val) -> { + for (int i = 0; i < stepper.getItems().size(); i++) { + var item = stepper.getItems().get(i); + if (val) { + item.setGraphic(randomIcon()); + } else { + item.setGraphic(String.valueOf(i + 1)); + } + } + }); + + var rotateBtn = new Button("Rotate", new FontIcon(Material2MZ.ROTATE_RIGHT)); + rotateBtn.setOnAction(e -> { + Side nextSide = switch (stepper.getTextPosition()) { + case LEFT -> Side.TOP; + case TOP -> Side.RIGHT; + case RIGHT -> Side.BOTTOM; + case BOTTOM -> Side.LEFT; + }; + stepper.setTextPosition(nextSide); + }); + + var controls = new HBox( + BLOCK_HGAP, + saveBtn, + cancelBtn, + new Spacer(), + iconToggle, + rotateBtn + ); + controls.setAlignment(Pos.CENTER_LEFT); + + // ~ + + content.getChildren().setAll(stepper, stack, new Separator(), controls); + return content; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/Tag.java b/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/Tag.java new file mode 100644 index 0000000..7ffb460 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/Tag.java @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.showcase.widget; + +import javafx.scene.Node; +import javafx.scene.control.Button; + +public class Tag extends Button { + + public static final String CSS = """ + .tag { + -fx-padding: 4px 6px 4px 6px; + -fx-cursor: hand; + -color-button-border-focused: -color-button-border; + -color-button-border-pressed: -color-button-border; + } + """; + + public Tag(String text) { + this(text, null); + } + + public Tag(String text, Node graphic) { + super(text, graphic); + getStyleClass().add("tag"); + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/TagSample.java b/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/TagSample.java new file mode 100644 index 0000000..cde403e --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/TagSample.java @@ -0,0 +1,117 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.showcase.widget; + +import atlantafx.base.theme.Styles; +import atlantafx.sampler.page.SampleBlock; +import atlantafx.sampler.theme.CSSFragment; +import javafx.scene.control.ContentDisplay; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.GridPane; +import org.kordamp.ikonli.feather.Feather; +import org.kordamp.ikonli.javafx.FontIcon; +import org.kordamp.ikonli.material2.Material2AL; + +import static atlantafx.sampler.page.Page.PAGE_HGAP; +import static atlantafx.sampler.page.Page.PAGE_VGAP; +import static atlantafx.sampler.page.SampleBlock.BLOCK_HGAP; +import static atlantafx.sampler.page.SampleBlock.BLOCK_VGAP; + +public class TagSample extends GridPane { + + private static final int PREF_WIDTH = 300; + + public TagSample() { + new CSSFragment(Tag.CSS).addTo(this); + + setHgap(PAGE_HGAP); + setVgap(PAGE_VGAP); + + add(filledTagSample(), 0, 0); + add(iconTagSample(), 1, 0); + add(outlinedTagSample(), 0, 1); + add(closeableTagSample(), 1, 1); + } + + private SampleBlock filledTagSample() { + var content = new FlowPane(BLOCK_HGAP, BLOCK_VGAP); + content.setPrefWidth(PREF_WIDTH); + + var basicTag = new Tag("basic"); + content.getChildren().add(basicTag); + + var accentTag = new Tag("accent"); + accentTag.getStyleClass().add(Styles.ACCENT); + content.getChildren().add(accentTag); + + var successTag = new Tag("success"); + successTag.getStyleClass().add(Styles.SUCCESS); + content.getChildren().add(successTag); + + var dangerTag = new Tag("danger"); + dangerTag.getStyleClass().add(Styles.DANGER); + content.getChildren().add(dangerTag); + + return new SampleBlock("Filled", content); + } + + private SampleBlock iconTagSample() { + var content = new FlowPane(BLOCK_HGAP, BLOCK_VGAP); + content.setPrefWidth(PREF_WIDTH); + + var basicTag = new Tag("image", new FontIcon(Feather.IMAGE)); + content.getChildren().add(basicTag); + + var accentTag = new Tag("music", new FontIcon(Feather.MUSIC)); + content.getChildren().add(accentTag); + + var successTag = new Tag("video", new FontIcon(Feather.VIDEO)); + content.getChildren().add(successTag); + + return new SampleBlock("Icon", content); + } + + private SampleBlock outlinedTagSample() { + var content = new FlowPane(BLOCK_HGAP, BLOCK_VGAP); + content.setPrefWidth(PREF_WIDTH); + + var accentTag = new Tag("accent"); + accentTag.getStyleClass().addAll(Styles.ACCENT, Styles.BUTTON_OUTLINED); + content.getChildren().add(accentTag); + + var successTag = new Tag("success"); + successTag.getStyleClass().addAll(Styles.SUCCESS, Styles.BUTTON_OUTLINED); + content.getChildren().add(successTag); + + var dangerTag = new Tag("danger"); + dangerTag.getStyleClass().addAll(Styles.DANGER, Styles.BUTTON_OUTLINED); + content.getChildren().add(dangerTag); + + return new SampleBlock("Outlined", content); + } + + private SampleBlock closeableTagSample() { + var content = new FlowPane(BLOCK_HGAP, BLOCK_VGAP); + content.setPrefWidth(PREF_WIDTH); + + var basicTag = new Tag("basic", new FontIcon(Material2AL.CLOSE)); + basicTag.setContentDisplay(ContentDisplay.RIGHT); + content.getChildren().add(basicTag); + + var accentTag = new Tag("accent", new FontIcon(Material2AL.CANCEL)); + accentTag.setContentDisplay(ContentDisplay.RIGHT); + accentTag.getStyleClass().add(Styles.ACCENT); + content.getChildren().add(accentTag); + + var successTag = new Tag("success", new FontIcon(Material2AL.CANCEL)); + successTag.setContentDisplay(ContentDisplay.RIGHT); + successTag.getStyleClass().add(Styles.SUCCESS); + content.getChildren().add(successTag); + + var dangerTag = new Tag("danger", new FontIcon(Material2AL.CANCEL)); + dangerTag.setContentDisplay(ContentDisplay.RIGHT); + dangerTag.getStyleClass().add(Styles.DANGER); + content.getChildren().add(dangerTag); + + return new SampleBlock("Removable", content); + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/WidgetCollectionPage.java b/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/WidgetCollectionPage.java new file mode 100644 index 0000000..704327d --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/showcase/widget/WidgetCollectionPage.java @@ -0,0 +1,125 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.showcase.widget; + +import atlantafx.base.theme.Styles; +import atlantafx.base.theme.Tweaks; +import atlantafx.sampler.page.Page; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.Parent; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.Pane; +import javafx.scene.layout.VBox; + +import java.util.function.Supplier; + +// JavaFX Skin API is very complex and almost undocumented. In many cases it's much simpler +// to create a small widget that just do the job than wasting hours to debug control behaviour. +// Consider this as a cookbook of those widgets. +public class WidgetCollectionPage extends BorderPane implements Page { + + public static final String NAME = "Widgets"; + + @Override + public String getName() { return NAME; } + + private final ListView toc = new ListView<>(); + private final VBox widgetWrapper = new VBox(PAGE_HGAP); + private boolean isRendered = false; + + public WidgetCollectionPage() { + super(); + createView(); + } + + private void createView() { + widgetWrapper.getStyleClass().add("widget"); + widgetWrapper.setAlignment(Pos.TOP_CENTER); + widgetWrapper.setFillWidth(false); + + toc.setCellFactory(c -> new TocCell()); + toc.getStyleClass().addAll("toc", Styles.DENSE, Tweaks.EDGE_TO_EDGE); + toc.getItems().setAll(Example.values()); + toc.getSelectionModel().selectedItemProperty().addListener((obs, old, val) -> { + if (val == null) { return; } + widgetWrapper.getChildren().setAll(val.getSupplier().get()); + }); + + // ~ + + setCenter(widgetWrapper); + setRight(toc); + BorderPane.setMargin(toc, new Insets(0, 0, 0, PAGE_HGAP)); + getStyleClass().setAll("page", "widget-collection"); + + toc.getSelectionModel().selectFirst(); + } + + @Override + public Parent getView() { + return this; + } + + @Override + public boolean canDisplaySourceCode() { + return false; + } + + @Override + public boolean canChangeThemeSettings() { + return true; + } + + @Override + public void reset() { } + + @Override + protected void layoutChildren() { + super.layoutChildren(); + if (isRendered) { return; } + + isRendered = true; + toc.getSelectionModel().selectFirst(); + toc.requestFocus(); + } + + /////////////////////////////////////////////////////////////////////////// + + public enum Example { + CARD("Card", () -> new CardSample()), + MESSAGE("Message", () -> new MessageSample()), + STEPPER("Stepper", () -> new StepperSample()), + TAG("Tag", () -> new TagSample()); + + private final String name; + private final Supplier supplier; + + Example(String name, Supplier supplier) { + this.name = name; + this.supplier = supplier; + } + + public String getName() { + return name; + } + + public Supplier getSupplier() { + return supplier; + } + } + + private static class TocCell extends ListCell { + + @Override + protected void updateItem(Example item, boolean empty) { + super.updateItem(item, empty); + if (empty || item == null) { + setText(null); + } else { + setText(item.getName()); + } + } + } +} diff --git a/sampler/src/main/resources/assets/styles/scss/layout/_page.scss b/sampler/src/main/resources/assets/styles/scss/layout/_page.scss index e92a9b2..b0f012e 100644 --- a/sampler/src/main/resources/assets/styles/scss/layout/_page.scss +++ b/sampler/src/main/resources/assets/styles/scss/layout/_page.scss @@ -16,6 +16,18 @@ } } } + + &.widget-collection { + -fx-padding: 40px; + -fx-min-width: 800px; + -fx-max-width: 1200px; + + >.toc { + -fx-pref-width: 150px; + -color-cell-bg-selected: -color-cell-bg; + -color-cell-fg-selected: -color-accent-fg; + } + } } .sample-block { @@ -31,4 +43,4 @@ -fx-font-weight: bold; -fx-padding: 0 0 10px 0; } -} \ No newline at end of file +} diff --git a/sampler/src/main/resources/images/pattern.jpg b/sampler/src/main/resources/images/pattern.jpg new file mode 100644 index 0000000000000000000000000000000000000000..26405863de30ea44bfd0d2bb9f351aec341390ff GIT binary patch literal 68192 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 CP64O@ literal 0 HcmV?d00001