diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 573656f6b552ab704fd9f1ad893286475dda5049..eccafc183acbddc53097dae4f91cf41f05d2b421 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -32,6 +32,7 @@ <file url="file://$PROJECT_DIR$/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/resources" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/PlayWallPlugins/PlayWallPluginWebAPI" charset="UTF-8" /> + <file url="file://$PROJECT_DIR$/PlayWallPlugins/PlayWallPluginWebAPI/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/PlayWallPlugins/PlayWallPluginWebAPI/src/main/resources" charset="UTF-8" /> <file url="PROJECT" charset="UTF-8" /> </component> 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 6d0b659e2464756bf60529e5533697aa164c9611..c0b51ccd73d4745c67319e4b96adfef30e5cd181 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,12 @@ 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.PadButton; +import de.tobias.playpad.view.pad.PadIndexable; +import de.tobias.playpad.view.pad.PadLabel; import javafx.beans.property.Property; import javafx.css.PseudoClass; import javafx.geometry.Pos; @@ -33,15 +37,18 @@ import javafx.scene.control.ProgressBar; import javafx.scene.layout.*; import javafx.scene.paint.Color; +import static de.tobias.playpad.view.pad.PadStyleClasses.STYLE_CLASS_PAD_INFO; +import static de.tobias.playpad.view.pad.PadStyleClasses.STYLE_CLASS_PAD_INFO_INDEX; + public class DesktopPadView implements IPadView { - private Label indexLabel; - private Label loopLabel; - private Label triggerLabel; - private Label errorLabel; + private PadLabel indexLabel; + private PadLabel loopLabel; + private PadLabel triggerLabel; + private PadLabel errorLabel; private HBox infoBox; - private Label timeLabel; + private PadLabel timeLabel; private HBox preview; private IPadContentView previewContent; @@ -49,11 +56,11 @@ public class DesktopPadView implements IPadView { private FontIcon notFoundLabel; private ProgressBar playBar; - private Button playButton; - private Button pauseButton; - private Button stopButton; - private Button newButton; - private Button settingsButton; + private PadButton playButton; + private PadButton pauseButton; + private PadButton stopButton; + private PadButton newButton; + private PadButton settingsButton; private HBox buttonBox; private StackPane superRoot; @@ -79,18 +86,12 @@ public class DesktopPadView implements IPadView { 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)); - - errorLabel = new Label(); - errorLabel.setGraphic(new FontIcon(FontAwesomeType.WARNING)); + indexLabel = new PadLabel("", STYLE_CLASS_PAD_INFO, STYLE_CLASS_PAD_INFO_INDEX); + timeLabel = new PadLabel("", 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); @@ -107,21 +108,11 @@ public class DesktopPadView implements IPadView { 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); @@ -215,25 +206,8 @@ public class DesktopPadView 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); - - 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 @@ -303,6 +277,7 @@ public class DesktopPadView implements IPadView { } else { buttonBox.getChildren().setAll(newButton, settingsButton); } + applyStyleClasses(pad.getPadIndex()); } infoBox.getChildren().setAll(indexLabel, loopLabel, triggerLabel, errorLabel, timeLabel); @@ -328,30 +303,17 @@ public class DesktopPadView implements IPadView { 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 @@ -359,30 +321,17 @@ public class DesktopPadView implements IPadView { 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/util/NodeWalker.java b/PlayWall/src/main/java/de/tobias/playpad/util/NodeWalker.java new file mode 100644 index 0000000000000000000000000000000000000000..420edf917dc277773e56a49841ef2b4be0f17b3b --- /dev/null +++ b/PlayWall/src/main/java/de/tobias/playpad/util/NodeWalker.java @@ -0,0 +1,28 @@ +package de.tobias.playpad.util; + +import javafx.scene.Node; +import javafx.scene.Parent; + +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 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..fcfdf84bccddb734e29b49c45e3a239d72d17ee9 --- /dev/null +++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadButton.java @@ -0,0 +1,44 @@ +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((observable, oldValue, newValue) -> { + if (oldValue != null) { + getStyleClass().removeAll(STYLE_CLASS_PAD_BUTTON, replaceIndex(STYLE_CLASS_PAD_BUTTON_INDEX, oldValue)); + getGraphic().getStyleClass().removeAll(STYLE_CLASS_PAD_ICON, replaceIndex(STYLE_CLASS_PAD_ICON_INDEX, oldValue)); + } + + if (newValue != null) { + getStyleClass().addAll(STYLE_CLASS_PAD_BUTTON, replaceIndex(STYLE_CLASS_PAD_BUTTON_INDEX, newValue)); + getGraphic().getStyleClass().addAll(STYLE_CLASS_PAD_ICON, replaceIndex(STYLE_CLASS_PAD_ICON_INDEX, newValue)); + } + }); + } + + 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..abbee135b2d7ca76b0d7a5425b9dd3ed29b0f1f2 --- /dev/null +++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadLabel.java @@ -0,0 +1,52 @@ +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.*; + +public class PadLabel extends Label implements PadIndexable { + + private final ObjectProperty<PadIndex> indexProperty; + + public PadLabel(FontIcon icon, String... styleClasses) { + this("", styleClasses); + setGraphic(icon); + } + + public PadLabel(String text, String... styleClasses) { + super(text); + + indexProperty = new SimpleObjectProperty<>(); + indexProperty.addListener((observable, oldValue, newValue) -> { + if (oldValue != null) { + for (String styleClass : styleClasses) { + getStyleClass().remove(PadStyleClasses.replaceIndex(styleClass, oldValue)); + } + if (getGraphic() != null) { + getGraphic().getStyleClass().removeAll(STYLE_CLASS_PAD_ICON, replaceIndex(STYLE_CLASS_PAD_ICON_INDEX, oldValue)); + } + } + + if (newValue != null) { + for (String styleClass : styleClasses) { + getStyleClass().add(PadStyleClasses.replaceIndex(styleClass, newValue)); + } + if (getGraphic() != null) { + getGraphic().getStyleClass().addAll(STYLE_CLASS_PAD_ICON, replaceIndex(STYLE_CLASS_PAD_ICON_INDEX, newValue)); + } + } + }); + } + + 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..65a22399e48a33ead9035eb7de6c7fd64febb56e --- /dev/null +++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadStyleClasses.java @@ -0,0 +1,25 @@ +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_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 String replaceIndex(String styleClass, PadIndex index) { + return styleClass.replace("${index}", String.valueOf(index)); + } +}