diff --git a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadView.java b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadView.java index 12d07d1a6c3b7de89961c461a977d0a813599ace..1f22e8a009f5d727ee47fbb9a57377ebe1631963 100644 --- a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadView.java +++ b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadView.java @@ -21,8 +21,10 @@ import de.tobias.playpad.pad.viewcontroller.IPadViewController; import de.tobias.playpad.profile.Profile; import de.tobias.playpad.project.page.PadIndex; import de.tobias.playpad.registry.NoSuchComponentException; +import de.tobias.playpad.util.NodeWalker; import de.tobias.playpad.view.EmptyPadView; import de.tobias.playpad.view.PseudoClasses; +import de.tobias.playpad.view.pad.*; import javafx.beans.property.Property; import javafx.css.PseudoClass; import javafx.geometry.Pos; @@ -33,6 +35,8 @@ import javafx.scene.control.ProgressBar; import javafx.scene.layout.*; import javafx.scene.paint.Color; +import static de.tobias.playpad.view.pad.PadStyleClasses.*; + public class DesktopPadView implements IPadView { private Label indexLabel; @@ -60,10 +64,10 @@ public class DesktopPadView implements IPadView { private VBox root; private BusyView busyView; - private VBox cueInContainer; private Label cueInLayer; - private transient DesktopPadViewController controller; // Reference to its controller + // Reference to its controller + private final transient DesktopPadViewController controller; public DesktopPadView(DesktopMainLayoutFactory connect) { controller = new DesktopPadViewController(this, connect); @@ -71,31 +75,24 @@ public class DesktopPadView implements IPadView { } private void setupView() { - superRoot = new StackPane(); - root = new VBox(); + superRoot = new PadStackPane(STYLE_CLASS_PAD, STYLE_CLASS_PAD_INDEX); + root = new PadVBox(STYLE_CLASS_PAD_BUTTON_ROOT); busyView = new BusyView(superRoot); - cueInLayer = new Label(); + cueInLayer = PadLabel.empty(STYLE_CLASS_PAD_CUE_IN, STYLE_CLASS_PAD_CUE_IN_INDEX); cueInLayer.prefHeightProperty().bind(root.heightProperty()); - cueInContainer = new VBox(cueInLayer); - - indexLabel = new Label(); - - loopLabel = new Label(); // Active über Visible - loopLabel.setGraphic(new FontIcon(FontAwesomeType.REPEAT)); - - triggerLabel = new Label(); - triggerLabel.setGraphic(new FontIcon(FontAwesomeType.EXTERNAL_LINK)); + VBox cueInContainer = new VBox(cueInLayer); - errorLabel = new Label(); - errorLabel.setGraphic(new FontIcon(FontAwesomeType.WARNING)); + indexLabel = PadLabel.empty(STYLE_CLASS_PAD_INFO, STYLE_CLASS_PAD_INFO_INDEX); + timeLabel = PadLabel.empty(STYLE_CLASS_PAD_INFO, STYLE_CLASS_PAD_INFO_INDEX); - timeLabel = new Label(); + loopLabel = new PadLabel(new FontIcon(FontAwesomeType.REPEAT)); + triggerLabel = new PadLabel(new FontIcon(FontAwesomeType.EXTERNAL_LINK)); + errorLabel = new PadLabel(new FontIcon(FontAwesomeType.WARNING)); - infoBox = new HBox(); // childern in addDefaultButton() - infoBox.setSpacing(5); + infoBox = new PadHBox(5); - preview = new HBox(); + preview = PadHBox.deepStyled(STYLE_CLASS_PAD_TITLE, STYLE_CLASS_PAD_TITLE_INDEX); HBox.setHgrow(preview, Priority.ALWAYS); VBox.setVgrow(preview, Priority.ALWAYS); @@ -103,25 +100,15 @@ public class DesktopPadView implements IPadView { timeLabel.setMaxWidth(Double.MAX_VALUE); timeLabel.setAlignment(Pos.CENTER_RIGHT); - playBar = new ProgressBar(0); + playBar = new PadProgressBar(0, STYLE_CLASS_PAD_PLAYBAR, STYLE_CLASS_PAD_PLAYBAR_INDEX); playBar.prefWidthProperty().bind(root.widthProperty()); // Buttons - playButton = new Button("", new FontIcon(FontAwesomeType.PLAY)); - playButton.setFocusTraversable(false); - playButton.setOnAction(controller); - pauseButton = new Button("", new FontIcon(FontAwesomeType.PAUSE)); - pauseButton.setFocusTraversable(false); - pauseButton.setOnAction(controller); - stopButton = new Button("", new FontIcon(FontAwesomeType.STOP)); - stopButton.setFocusTraversable(false); - stopButton.setOnAction(controller); - newButton = new Button("", new FontIcon(FontAwesomeType.FOLDER_OPEN)); - newButton.setFocusTraversable(false); - newButton.setOnAction(controller); - settingsButton = new Button("", new FontIcon(FontAwesomeType.GEAR)); - settingsButton.setFocusTraversable(false); - settingsButton.setOnAction(controller); + playButton = new PadButton(new FontIcon(FontAwesomeType.PLAY), controller); + pauseButton = new PadButton(new FontIcon(FontAwesomeType.PAUSE), controller); + stopButton = new PadButton(new FontIcon(FontAwesomeType.STOP), controller); + newButton = new PadButton(new FontIcon(FontAwesomeType.FOLDER_OPEN), controller); + settingsButton = new PadButton(new FontIcon(FontAwesomeType.GEAR), controller); // Not Found Label notFoundLabel = new FontIcon(FontAwesomeType.EXCLAMATION_TRIANGLE); @@ -129,11 +116,10 @@ public class DesktopPadView implements IPadView { notFoundLabel.setOpacity(0.75); notFoundLabel.setSize(80); notFoundLabel.setMouseTransparent(true); - notFoundLabel.setVisible(false); // Button HBOX - buttonBox = new HBox(); // childern in addDefaultButton() + buttonBox = new PadHBox(STYLE_CLASS_PAD_BUTTON_BOX); root.getChildren().addAll(infoBox, preview, playBar, buttonBox); superRoot.getChildren().addAll(cueInContainer, root, notFoundLabel); @@ -162,8 +148,6 @@ public class DesktopPadView implements IPadView { previewContent = connect.getPadContentPreview(pad, preview); Node node = previewContent.getNode(); - node.getStyleClass().addAll("pad-title", "pad" + pad.getPadIndex() + "-title"); - // Copy Pseudoclasses for (PseudoClass pseudoClass : superRoot.getPseudoClassStates()) { node.pseudoClassStateChanged(pseudoClass, true); @@ -177,11 +161,6 @@ public class DesktopPadView implements IPadView { } } EmptyPadView view = new EmptyPadView(preview); - if (pad != null) { - view.getStyleClass().addAll("pad-title", "pad" + pad.getPadIndex() + "-title"); - } else { - view.getStyleClass().addAll("pad-title"); - } preview.getChildren().setAll(view); } @@ -209,31 +188,10 @@ public class DesktopPadView implements IPadView { this.indexLabel.setText(text); } - ProgressBar getPlayBar() { - return playBar; - } - @Override public void pseudoClassState(PseudoClass pseudoClass, boolean active) { - superRoot.pseudoClassStateChanged(pseudoClass, active); - cueInLayer.pseudoClassStateChanged(pseudoClass, active); - indexLabel.pseudoClassStateChanged(pseudoClass, active); - timeLabel.pseudoClassStateChanged(pseudoClass, active); - loopLabel.getGraphic().pseudoClassStateChanged(pseudoClass, active); - triggerLabel.getGraphic().pseudoClassStateChanged(pseudoClass, active); - errorLabel.getGraphic().pseudoClassStateChanged(pseudoClass, active); - - if (preview != null) { - preview.getChildren().forEach(i -> i.pseudoClassStateChanged(pseudoClass, active)); - } - - playBar.pseudoClassStateChanged(pseudoClass, active); - - playButton.getGraphic().pseudoClassStateChanged(pseudoClass, active); - pauseButton.getGraphic().pseudoClassStateChanged(pseudoClass, active); - stopButton.getGraphic().pseudoClassStateChanged(pseudoClass, active); - newButton.getGraphic().pseudoClassStateChanged(pseudoClass, active); - settingsButton.getGraphic().pseudoClassStateChanged(pseudoClass, active); + NodeWalker.getAllNodes(getRootNode()) + .forEach(node -> node.pseudoClassStateChanged(pseudoClass, active)); } @Override @@ -278,8 +236,7 @@ public class DesktopPadView implements IPadView { triggerLabel.setVisible(hasTriggerItems); } - void - setTime(String time) { + void setTime(String time) { if (time == null) { timeLabel.setText(""); } else { @@ -303,6 +260,7 @@ public class DesktopPadView implements IPadView { } else { buttonBox.getChildren().setAll(newButton, settingsButton); } + applyStyleClasses(pad.getPadIndex()); } infoBox.getChildren().setAll(indexLabel, loopLabel, triggerLabel, errorLabel, timeLabel); @@ -325,64 +283,18 @@ public class DesktopPadView implements IPadView { @Override public void applyStyleClasses(PadIndex index) { - superRoot.getStyleClass().addAll("pad", "pad" + index); - cueInLayer.getStyleClass().addAll("pad-cue-in", "pad" + index + "-cue-in"); - - indexLabel.getStyleClass().addAll("pad-index", "pad" + index + "-index", "pad-info", "pad" + index + "-info"); - timeLabel.getStyleClass().addAll("pad-time", "pad" + index + "-time", "pad-info", "pad" + index + "-info"); - loopLabel.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon"); - triggerLabel.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon"); - errorLabel.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon"); - - preview.getChildren().forEach(i -> i.getStyleClass().addAll("pad-title", "pad" + index + "-title")); - - playBar.getStyleClass().addAll("pad-playbar", "pad" + index + "-playbar"); - - playButton.getStyleClass().addAll("pad-button", "pad" + index + "-button"); - pauseButton.getStyleClass().addAll("pad-button", "pad" + index + "-button"); - stopButton.getStyleClass().addAll("pad-button", "pad" + index + "-button"); - newButton.getStyleClass().addAll("pad-button", "pad" + index + "-button"); - settingsButton.getStyleClass().addAll("pad-button", "pad" + index + "-button"); - - playButton.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon"); - pauseButton.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon"); - stopButton.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon"); - newButton.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon"); - settingsButton.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon"); - - buttonBox.getStyleClass().add("pad-button-box"); - root.getStyleClass().add("pad-root"); + NodeWalker.getAllNodes(getRootNode()) + .stream() + .filter(node -> node instanceof PadIndexable) + .forEach(node -> ((PadIndexable) node).setIndex(index)); } @Override public void removeStyleClasses() { - superRoot.getStyleClass().removeIf(c -> c.startsWith("pad")); - cueInLayer.getStyleClass().removeIf(c -> c.startsWith("pad")); - - indexLabel.getStyleClass().removeIf(c -> c.startsWith("pad")); - timeLabel.getStyleClass().removeIf(c -> c.startsWith("pad")); - loopLabel.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad")); - triggerLabel.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad")); - errorLabel.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad")); - - preview.getChildren().forEach(i -> i.getStyleClass().removeIf(c -> c.startsWith("pad"))); - - playBar.getStyleClass().removeIf(c -> c.startsWith("pad")); - - playButton.getStyleClass().removeIf(c -> c.startsWith("pad")); - pauseButton.getStyleClass().removeIf(c -> c.startsWith("pad")); - stopButton.getStyleClass().removeIf(c -> c.startsWith("pad")); - newButton.getStyleClass().removeIf(c -> c.startsWith("pad")); - settingsButton.getStyleClass().removeIf(c -> c.startsWith("pad")); - - playButton.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad")); - pauseButton.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad")); - stopButton.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad")); - newButton.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad")); - settingsButton.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad")); - - buttonBox.getStyleClass().remove("pad-button-box"); - root.getStyleClass().remove("pad-root"); + NodeWalker.getAllNodes(getRootNode()) + .stream() + .filter(node -> node instanceof PadIndexable) + .forEach(node -> ((PadIndexable) node).setIndex(null)); } @Override diff --git a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadViewController.java b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadViewController.java index 2c1973d80cd16a167511c4e3f0f371e6fa16e899..75cabd29dc71b2b324f49c3d25d6d0da935b0390 100644 --- a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadViewController.java +++ b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadViewController.java @@ -326,7 +326,7 @@ public class DesktopPadViewController implements IPadViewController, EventHandle padView.getSettingsButton().setDisable(true); } - // Alles Desktivieren, wenn nicht Play Mode + // Alles Deaktivieren, wenn nicht Play Mode if (connect.getEditMode() != DesktopEditMode.PLAY) { padView.getPlayButton().setDisable(true); padView.getPauseButton().setDisable(true); diff --git a/PlayWall/src/main/java/de/tobias/playpad/layout/touch/pad/TouchPadView.java b/PlayWall/src/main/java/de/tobias/playpad/layout/touch/pad/TouchPadView.java index c094f0df8c0058df0096424b0d132f1bfdd4f122..0ae8de45f92ab9a27cbeb1c642ad083763efbc9d 100644 --- a/PlayWall/src/main/java/de/tobias/playpad/layout/touch/pad/TouchPadView.java +++ b/PlayWall/src/main/java/de/tobias/playpad/layout/touch/pad/TouchPadView.java @@ -18,8 +18,10 @@ import de.tobias.playpad.pad.viewcontroller.IPadViewController; import de.tobias.playpad.profile.Profile; import de.tobias.playpad.project.page.PadIndex; import de.tobias.playpad.registry.NoSuchComponentException; +import de.tobias.playpad.util.NodeWalker; import de.tobias.playpad.view.EmptyPadView; import de.tobias.playpad.view.PseudoClasses; +import de.tobias.playpad.view.pad.*; import javafx.beans.property.Property; import javafx.css.PseudoClass; import javafx.geometry.Pos; @@ -29,6 +31,8 @@ import javafx.scene.control.ProgressBar; import javafx.scene.layout.*; import javafx.scene.paint.Color; +import static de.tobias.playpad.view.pad.PadStyleClasses.*; + public class TouchPadView implements IPadView { private Label indexLabel; @@ -50,10 +54,9 @@ public class TouchPadView implements IPadView { private VBox root; private BusyView busyView; - private VBox cueInContainer; private Label cueInLayer; - private transient TouchPadViewController controller; // Reference to its controller + private final transient TouchPadViewController controller; // Reference to its controller public TouchPadView() { controller = new TouchPadViewController(this); @@ -61,31 +64,24 @@ public class TouchPadView implements IPadView { } private void setupView() { - superRoot = new StackPane(); - root = new VBox(); + superRoot = new PadStackPane(STYLE_CLASS_PAD, STYLE_CLASS_PAD_INDEX); + root = new PadVBox(STYLE_CLASS_PAD_BUTTON_ROOT); busyView = new BusyView(superRoot); - cueInLayer = new Label(); + cueInLayer = PadLabel.empty(STYLE_CLASS_PAD_CUE_IN, STYLE_CLASS_PAD_CUE_IN_INDEX); cueInLayer.prefHeightProperty().bind(root.heightProperty()); - cueInContainer = new VBox(cueInLayer); - - indexLabel = new Label(); - - loopLabel = new Label(); // Active über Visible - loopLabel.setGraphic(new FontIcon(FontAwesomeType.REPEAT)); + VBox cueInContainer = new VBox(cueInLayer); - triggerLabel = new Label(); - triggerLabel.setGraphic(new FontIcon(FontAwesomeType.EXTERNAL_LINK)); + indexLabel = PadLabel.empty(STYLE_CLASS_PAD_INFO, STYLE_CLASS_PAD_INFO_INDEX); + timeLabel = PadLabel.empty(STYLE_CLASS_PAD_INFO, STYLE_CLASS_PAD_INFO_INDEX); - errorLabel = new Label(); - errorLabel.setGraphic(new FontIcon(FontAwesomeType.WARNING)); + loopLabel = new PadLabel(new FontIcon(FontAwesomeType.REPEAT)); + triggerLabel = new PadLabel(new FontIcon(FontAwesomeType.EXTERNAL_LINK)); + errorLabel = new PadLabel(new FontIcon(FontAwesomeType.WARNING)); - timeLabel = new Label(); + infoBox = new PadHBox(5); - infoBox = new HBox(); // childern in addDefaultButton() - infoBox.setSpacing(5); - - preview = new HBox(); + preview = PadHBox.deepStyled(STYLE_CLASS_PAD_TITLE, STYLE_CLASS_PAD_TITLE_INDEX); HBox.setHgrow(preview, Priority.ALWAYS); VBox.setVgrow(preview, Priority.ALWAYS); @@ -93,16 +89,15 @@ public class TouchPadView implements IPadView { timeLabel.setMaxWidth(Double.MAX_VALUE); timeLabel.setAlignment(Pos.CENTER_RIGHT); - playBar = new ProgressBar(0); + playBar = new PadProgressBar(0, STYLE_CLASS_PAD_PLAYBAR, STYLE_CLASS_PAD_PLAYBAR_INDEX); playBar.prefWidthProperty().bind(root.widthProperty()); // Not Found Label notFoundLabel = new FontIcon(FontAwesomeType.EXCLAMATION_TRIANGLE); - notFoundLabel.getStyleClass().add("pad-notfound"); + notFoundLabel.getStyleClass().clear(); notFoundLabel.setOpacity(0.5); notFoundLabel.setSize(50); notFoundLabel.setMouseTransparent(true); - notFoundLabel.setVisible(false); root.getChildren().addAll(infoBox, preview, playBar); @@ -135,8 +130,6 @@ public class TouchPadView implements IPadView { previewContent = connect.getPadContentPreview(pad, preview); Node node = previewContent.getNode(); - node.getStyleClass().addAll("pad-title", "pad" + pad.getPadIndex() + "-title"); - // Copy Pseudoclasses for (PseudoClass pseudoClass : superRoot.getPseudoClassStates()) { node.pseudoClassStateChanged(pseudoClass, true); @@ -150,11 +143,6 @@ public class TouchPadView implements IPadView { } } EmptyPadView view = new EmptyPadView(preview); - if (pad != null) { - view.getStyleClass().addAll("pad-title", "pad" + pad.getPadIndex() + "-title"); - } else { - view.getStyleClass().addAll("pad-title"); - } preview.getChildren().setAll(view); } @@ -188,19 +176,8 @@ public class TouchPadView implements IPadView { @Override public void pseudoClassState(PseudoClass pseudoClass, boolean active) { - superRoot.pseudoClassStateChanged(pseudoClass, active); - cueInLayer.pseudoClassStateChanged(pseudoClass, active); - indexLabel.pseudoClassStateChanged(pseudoClass, active); - timeLabel.pseudoClassStateChanged(pseudoClass, active); - loopLabel.getGraphic().pseudoClassStateChanged(pseudoClass, active); - triggerLabel.getGraphic().pseudoClassStateChanged(pseudoClass, active); - errorLabel.getGraphic().pseudoClassStateChanged(pseudoClass, active); - - if (preview != null) { - preview.getChildren().forEach(i -> i.pseudoClassStateChanged(pseudoClass, active)); - } - - playBar.pseudoClassStateChanged(pseudoClass, active); + NodeWalker.getAllNodes(getRootNode()) + .forEach(node -> node.pseudoClassStateChanged(pseudoClass, active)); } @Override @@ -247,38 +224,18 @@ public class TouchPadView implements IPadView { @Override public void applyStyleClasses(PadIndex index) { - superRoot.getStyleClass().addAll("pad", "pad" + index); - cueInLayer.getStyleClass().addAll("pad-cue-in", "pad" + index + "-cue-in"); - - indexLabel.getStyleClass().addAll("pad-index", "pad" + index + "-index", "pad-info", "pad" + index + "-info"); - timeLabel.getStyleClass().addAll("pad-time", "pad" + index + "-time", "pad-info", "pad" + index + "-info"); - loopLabel.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon"); - triggerLabel.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon"); - errorLabel.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon"); - - preview.getChildren().forEach(i -> i.getStyleClass().addAll("pad-title", "pad" + index + "-title")); - - playBar.getStyleClass().addAll("pad-playbar", "pad" + index + "-playbar"); - - root.getStyleClass().add("pad-root"); + NodeWalker.getAllNodes(getRootNode()) + .stream() + .filter(node -> node instanceof PadIndexable) + .forEach(node -> ((PadIndexable) node).setIndex(index)); } @Override public void removeStyleClasses() { - superRoot.getStyleClass().removeIf(c -> c.startsWith("pad")); - cueInLayer.getStyleClass().removeIf(c -> c.startsWith("pad")); - - indexLabel.getStyleClass().removeIf(c -> c.startsWith("pad")); - timeLabel.getStyleClass().removeIf(c -> c.startsWith("pad")); - loopLabel.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad")); - triggerLabel.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad")); - errorLabel.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad")); - - preview.getChildren().forEach(i -> i.getStyleClass().removeIf(c -> c.startsWith("pad"))); - - playBar.getStyleClass().removeIf(c -> c.startsWith("pad")); - - root.getStyleClass().remove("pad-root"); + NodeWalker.getAllNodes(getRootNode()) + .stream() + .filter(node -> node instanceof PadIndexable) + .forEach(node -> ((PadIndexable) node).setIndex(null)); } @Override diff --git a/PlayWall/src/main/java/de/tobias/playpad/util/NodeWalker.java b/PlayWall/src/main/java/de/tobias/playpad/util/NodeWalker.java new file mode 100644 index 0000000000000000000000000000000000000000..7a2a2b6a86c8a360606310494a7e11737a612020 --- /dev/null +++ b/PlayWall/src/main/java/de/tobias/playpad/util/NodeWalker.java @@ -0,0 +1,37 @@ +package de.tobias.playpad.util; + +import javafx.scene.Node; +import javafx.scene.Parent; +import javafx.scene.control.Labeled; + +import java.util.ArrayList; +import java.util.List; + +public class NodeWalker { + + private NodeWalker() { + } + + public static List<Node> getAllNodes(Parent root) { + List<Node> nodes = new ArrayList<>(); + nodes.add(root); + addAllDescendents(root, nodes); + return nodes; + } + + private static void addAllDescendents(Parent parent, List<Node> nodes) { + for (Node node : parent.getChildrenUnmodifiable()) { + nodes.add(node); + + if (node instanceof Labeled) { + final Node graphic = ((Labeled) node).getGraphic(); + if (graphic != null) { + nodes.add(graphic); + } + } + + if (node instanceof Parent) + addAllDescendents((Parent) node, nodes); + } + } +} diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadButton.java b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadButton.java new file mode 100644 index 0000000000000000000000000000000000000000..9cfcd183917cda844a14d0875b669c8aed059e66 --- /dev/null +++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadButton.java @@ -0,0 +1,35 @@ +package de.tobias.playpad.view.pad; + +import de.thecodelabs.utils.ui.icon.FontIcon; +import de.tobias.playpad.project.page.PadIndex; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.scene.control.Button; + +import static de.tobias.playpad.view.pad.PadStyleClasses.*; + +public class PadButton extends Button implements PadIndexable { + + private final ObjectProperty<PadIndex> indexProperty; + + public PadButton(FontIcon icon, EventHandler<ActionEvent> value) { + super("", icon); + + setFocusTraversable(false); + setOnAction(value); + + indexProperty = new SimpleObjectProperty<>(); + indexProperty.addListener(new StyleIndexListener(this, STYLE_CLASS_PAD_BUTTON, STYLE_CLASS_PAD_BUTTON_INDEX)); + indexProperty.addListener(new StyleIndexListener(getGraphic(), STYLE_CLASS_PAD_ICON, STYLE_CLASS_PAD_ICON_INDEX)); + } + + public PadIndex getIndex() { + return indexProperty.get(); + } + + public void setIndex(PadIndex index) { + indexProperty.set(index); + } +} diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadHBox.java b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadHBox.java new file mode 100644 index 0000000000000000000000000000000000000000..3e0c2cdf37be559da5436023d84f375f701aa7e1 --- /dev/null +++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadHBox.java @@ -0,0 +1,57 @@ +package de.tobias.playpad.view.pad; + +import de.tobias.playpad.project.page.PadIndex; +import javafx.beans.InvalidationListener; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.scene.Node; +import javafx.scene.layout.HBox; + +import java.util.LinkedList; +import java.util.List; + +public class PadHBox extends HBox implements PadIndexable { + + private final ObjectProperty<PadIndex> indexProperty; + private final List<StyleIndexListener> styleListeners = new LinkedList<>(); + + public static PadHBox deepStyled(String... styleClasses) { + PadHBox padHBox = new PadHBox(styleClasses); + + padHBox.getChildren().addListener((InvalidationListener) observable -> { + for (StyleIndexListener listener : padHBox.styleListeners) { + padHBox.indexProperty.removeListener(listener); + } + + padHBox.styleListeners.clear(); + + for (Node child : padHBox.getChildren()) { + StyleIndexListener listener = new StyleIndexListener(child, styleClasses); + padHBox.indexProperty.addListener(listener); + padHBox.styleListeners.add(listener); + + listener.changed(padHBox.indexProperty, null, padHBox.indexProperty.get()); + } + }); + + return padHBox; + } + + public PadHBox(String... styleClasses) { + this(0, styleClasses); + } + + public PadHBox(double spacing, String... styleClasses) { + super(spacing); + indexProperty = new SimpleObjectProperty<>(); + indexProperty.addListener(new StyleIndexListener(this, styleClasses)); + } + + public PadIndex getIndex() { + return indexProperty.get(); + } + + public void setIndex(PadIndex index) { + indexProperty.set(index); + } +} diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadIndexable.java b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadIndexable.java new file mode 100644 index 0000000000000000000000000000000000000000..c50a5cc70ee1604eeeb280636e8b3ae561480790 --- /dev/null +++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadIndexable.java @@ -0,0 +1,9 @@ +package de.tobias.playpad.view.pad; + +import de.tobias.playpad.project.page.PadIndex; + +public interface PadIndexable { + PadIndex getIndex(); + + void setIndex(PadIndex index); +} diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadLabel.java b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadLabel.java new file mode 100644 index 0000000000000000000000000000000000000000..7f8c900767cf4eabf9f011d91533a1712f3afc3c --- /dev/null +++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadLabel.java @@ -0,0 +1,57 @@ +package de.tobias.playpad.view.pad; + +import de.thecodelabs.utils.ui.icon.FontIcon; +import de.tobias.playpad.project.page.PadIndex; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.scene.control.Label; + +import static de.tobias.playpad.view.pad.PadStyleClasses.STYLE_CLASS_PAD_ICON; +import static de.tobias.playpad.view.pad.PadStyleClasses.STYLE_CLASS_PAD_ICON_INDEX; + +public class PadLabel extends Label implements PadIndexable { + + private final ObjectProperty<PadIndex> indexProperty; + private StyleIndexListener graphicsListener; + + public static PadLabel empty(String... styleClasses) { + return new PadLabel("", styleClasses); + } + + public PadLabel(FontIcon icon, String... styleClasses) { + this("", styleClasses); + setGraphic(icon); + } + + public PadLabel(String text, String... styleClasses) { + super(text); + + indexProperty = new SimpleObjectProperty<>(); + indexProperty.addListener(new StyleIndexListener(this, styleClasses)); + initStyleGraphicsListener(); + + graphicProperty().addListener(observable -> { + if (graphicsListener != null) { + indexProperty.removeListener(graphicsListener); + graphicsListener = null; + + initStyleGraphicsListener(); + } + }); + } + + private void initStyleGraphicsListener() { + if (getGraphic() != null) { + graphicsListener = new StyleIndexListener(getGraphic(), STYLE_CLASS_PAD_ICON, STYLE_CLASS_PAD_ICON_INDEX); + indexProperty.addListener(graphicsListener); + } + } + + public PadIndex getIndex() { + return indexProperty.get(); + } + + public void setIndex(PadIndex index) { + indexProperty.set(index); + } +} diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadProgressBar.java b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadProgressBar.java new file mode 100644 index 0000000000000000000000000000000000000000..1d366b8cfcf4ab58d695c76e24bbe2ada13b6a54 --- /dev/null +++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadProgressBar.java @@ -0,0 +1,25 @@ +package de.tobias.playpad.view.pad; + +import de.tobias.playpad.project.page.PadIndex; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.scene.control.ProgressBar; + +public class PadProgressBar extends ProgressBar implements PadIndexable { + + private final ObjectProperty<PadIndex> indexProperty; + + public PadProgressBar(double progress, String... styleClasses) { + super(progress); + indexProperty = new SimpleObjectProperty<>(); + indexProperty.addListener(new StyleIndexListener(this, styleClasses)); + } + + public PadIndex getIndex() { + return indexProperty.get(); + } + + public void setIndex(PadIndex index) { + indexProperty.set(index); + } +} diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadStackPane.java b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadStackPane.java new file mode 100644 index 0000000000000000000000000000000000000000..94d5670789563c8e01f906399bef0187cfc9a5f8 --- /dev/null +++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadStackPane.java @@ -0,0 +1,24 @@ +package de.tobias.playpad.view.pad; + +import de.tobias.playpad.project.page.PadIndex; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.scene.layout.StackPane; + +public class PadStackPane extends StackPane implements PadIndexable { + + private final ObjectProperty<PadIndex> indexProperty; + + public PadStackPane(String... styleClasses) { + indexProperty = new SimpleObjectProperty<>(); + indexProperty.addListener(new StyleIndexListener(this, styleClasses)); + } + + public PadIndex getIndex() { + return indexProperty.get(); + } + + public void setIndex(PadIndex index) { + indexProperty.set(index); + } +} diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadStyleClasses.java b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadStyleClasses.java new file mode 100644 index 0000000000000000000000000000000000000000..b610e4391e05d21ea51949856af096c0bd021648 --- /dev/null +++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadStyleClasses.java @@ -0,0 +1,37 @@ +package de.tobias.playpad.view.pad; + +import de.tobias.playpad.project.page.PadIndex; + +public class PadStyleClasses { + + private PadStyleClasses() { + } + + public static final String STYLE_CLASS_PAD = "pad"; + public static final String STYLE_CLASS_PAD_INDEX = "pad${index}"; + + public static final String STYLE_CLASS_PAD_BUTTON = "pad-button"; + public static final String STYLE_CLASS_PAD_BUTTON_INDEX = "pad${index}-button"; + + public static final String STYLE_CLASS_PAD_ICON = "pad-icon"; + public static final String STYLE_CLASS_PAD_ICON_INDEX = "pad${index}-icon"; + + public static final String STYLE_CLASS_PAD_INFO = "pad-info"; + public static final String STYLE_CLASS_PAD_INFO_INDEX = "pad${index}-info"; + + public static final String STYLE_CLASS_PAD_TITLE = "pad-title"; + public static final String STYLE_CLASS_PAD_TITLE_INDEX = "pad${index}-title"; + + public static final String STYLE_CLASS_PAD_BUTTON_BOX = "pad-button-box"; + public static final String STYLE_CLASS_PAD_BUTTON_ROOT = "pad-root"; + + public static final String STYLE_CLASS_PAD_PLAYBAR = "pad-playbar"; + public static final String STYLE_CLASS_PAD_PLAYBAR_INDEX = "pad${index}-playbar"; + + public static final String STYLE_CLASS_PAD_CUE_IN = "pad-cue-in"; + public static final String STYLE_CLASS_PAD_CUE_IN_INDEX = "pad${index}-cue-in"; + + public static String replaceIndex(String styleClass, PadIndex index) { + return styleClass.replace("${index}", String.valueOf(index)); + } +} diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadVBox.java b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadVBox.java new file mode 100644 index 0000000000000000000000000000000000000000..33d999dc7349e03010453853977619ba086e468d --- /dev/null +++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadVBox.java @@ -0,0 +1,29 @@ +package de.tobias.playpad.view.pad; + +import de.tobias.playpad.project.page.PadIndex; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.scene.layout.VBox; + +public class PadVBox extends VBox implements PadIndexable { + + private final ObjectProperty<PadIndex> indexProperty; + + public PadVBox(String... styleClasses) { + this(0, styleClasses); + } + + public PadVBox(double spacing, String... styleClasses) { + super(spacing); + indexProperty = new SimpleObjectProperty<>(); + indexProperty.addListener(new StyleIndexListener(this, styleClasses)); + } + + public PadIndex getIndex() { + return indexProperty.get(); + } + + public void setIndex(PadIndex index) { + indexProperty.set(index); + } +} diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/pad/StyleIndexListener.java b/PlayWall/src/main/java/de/tobias/playpad/view/pad/StyleIndexListener.java new file mode 100644 index 0000000000000000000000000000000000000000..de3acf0ce609fbed673a2aba820c1aef0cf0ffc7 --- /dev/null +++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/StyleIndexListener.java @@ -0,0 +1,32 @@ +package de.tobias.playpad.view.pad; + +import de.tobias.playpad.project.page.PadIndex; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.scene.Node; + +public class StyleIndexListener implements ChangeListener<PadIndex> { + + private final Node node; + private final String[] styleClasses; + + public StyleIndexListener(Node node, String... styleClasses) { + this.node = node; + this.styleClasses = styleClasses; + } + + @Override + public void changed(ObservableValue<? extends PadIndex> observable, PadIndex oldValue, PadIndex newValue) { + if (oldValue != null) { + for (String styleClass : styleClasses) { + node.getStyleClass().remove(PadStyleClasses.replaceIndex(styleClass, oldValue)); + } + } + + if (newValue != null) { + for (String styleClass : styleClasses) { + node.getStyleClass().add(PadStyleClasses.replaceIndex(styleClass, newValue)); + } + } + } +}