diff --git a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadDragListener.java b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadDragListener.java index 67dfcc1425177a017202d444277022733bc6e987..86b126b0ab85bd7df370c4bbc36de56112877d8f 100644 --- a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadDragListener.java +++ b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadDragListener.java @@ -5,10 +5,11 @@ import de.tobias.playpad.layout.desktop.DesktopEditMode; import de.tobias.playpad.layout.desktop.DesktopMainLayoutFactory; import de.tobias.playpad.pad.Pad; import de.tobias.playpad.pad.PadStatus; -import de.tobias.playpad.pad.content.PadContentFactory; import de.tobias.playpad.pad.content.PadContentRegistry; import de.tobias.playpad.pad.content.Playlistable; +import de.tobias.playpad.pad.drag.ContentDragOption; import de.tobias.playpad.pad.drag.PadDragMode; +import de.tobias.playpad.pad.drag.PlaylistDragOption; import de.tobias.playpad.pad.view.IPadView; import de.tobias.playpad.profile.Profile; import de.tobias.playpad.project.Project; @@ -27,8 +28,9 @@ import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import java.io.File; +import java.util.ArrayList; import java.util.Collection; -import java.util.Set; +import java.util.List; public class DesktopPadDragListener implements EventHandler<DragEvent> { @@ -36,7 +38,7 @@ public class DesktopPadDragListener implements EventHandler<DragEvent> { private static final DataFormat dataFormat = new DataFormat(PAD_INDEX_DATATYPE); private final Pad currentPad; - private final Pane padView; // Node der PadView + private final Pane padViewNode; // Node der PadView private final DesktopMainLayoutFactory connect; @@ -47,21 +49,21 @@ public class DesktopPadDragListener implements EventHandler<DragEvent> { this.currentPad = currentPad; this.connect = connect; - this.padView = view.getRootNode(); + this.padViewNode = view.getRootNode(); } public void addListener() { - this.padView.setOnDragOver(this::dragOver); - this.padView.setOnDragExited(event -> dragExited()); - this.padView.setOnDragDropped(this::dragDropped); - this.padView.setOnDragDetected(this::dragDetected); + this.padViewNode.setOnDragOver(this::dragOver); + this.padViewNode.setOnDragExited(event -> dragExited()); + this.padViewNode.setOnDragDropped(this::dragDropped); + this.padViewNode.setOnDragDetected(this::dragDetected); } void removeListener() { - this.padView.setOnDragOver(null); - this.padView.setOnDragExited(null); - this.padView.setOnDragDropped(null); - this.padView.setOnDragDetected(null); + this.padViewNode.setOnDragOver(null); + this.padViewNode.setOnDragExited(null); + this.padViewNode.setOnDragDropped(null); + this.padViewNode.setOnDragDetected(null); } @Override @@ -94,11 +96,15 @@ public class DesktopPadDragListener implements EventHandler<DragEvent> { // built-in file support PadContentRegistry registry = PlayPadPlugin.getRegistries().getPadContents(); - Set<PadContentFactory> connects = registry.getPadContentConnectsForFile(file.toPath()); + List<ContentDragOption> connects = new ArrayList<>(registry.getPadContentConnectsForFile(file.toPath())); + + if (currentPad.getContent() instanceof Playlistable) { + connects.add(new PlaylistDragOption()); + } if (!connects.isEmpty()) { if (fileHud == null) { - fileHud = new FileDragOptionView(padView); + fileHud = new FileDragOptionView(padViewNode); } fileHud.showOptions(connects); @@ -115,7 +121,7 @@ public class DesktopPadDragListener implements EventHandler<DragEvent> { if (!connects.isEmpty()) { if (padHud == null) { - padHud = new PadDragOptionView(padView); + padHud = new PadDragOptionView(padViewNode); } padHud.showDropOptions(connects); @@ -142,52 +148,43 @@ public class DesktopPadDragListener implements EventHandler<DragEvent> { // File Handling if (dragboard.hasFiles()) { - handleFileDragDropped(dragboard); + success = handleFileDragDropped(dragboard); } // Pad DnD if (dragboard.hasContent(dataFormat)) { - success = handlePadDragDropped(project, dragboard, success); + success = handlePadDragDropped(project, dragboard); } // Event Completion event.setDropCompleted(success); event.consume(); } - private void handleFileDragDropped(Dragboard dragboard) { - File file = dragboard.getFiles().get(0); - - final PadContentFactory connect = fileHud.getSelectedConnect(); - if (connect != null) { + private boolean handleFileDragDropped(Dragboard dragboard) { + final ContentDragOption dragOption = fileHud.getSelectedConnect(); + if (dragOption != null) { // stop pad if playing if (currentPad.getContent() != null && currentPad.getStatus().equals(PadStatus.PLAY)) { currentPad.getContent().stop(); currentPad.stop(); } - if (currentPad.getContent() == null || !currentPad.getContent().getType().equals(connect.getType())) { - currentPad.setContentType(connect.getType()); - } - - if (currentPad.isPadVisible()) { - currentPad.getController().getView().showBusyView(true); - } - - if (currentPad.getContent() instanceof Playlistable) { - this.currentPad.addPath(file.toPath()); - } else { - this.currentPad.setPath(file.toPath()); - } + dragOption.handleDrop(currentPad, dragboard.getFiles()); if (currentPad.getController() != null) { final IPadView padView = currentPad.getController().getView(); padView.setContentView(currentPad); padView.addDefaultElements(currentPad); } + + return true; } + return false; } - private boolean handlePadDragDropped(Project project, Dragboard dragboard, boolean success) { + private boolean handlePadDragDropped(Project project, Dragboard dragboard) { + boolean success = false; + Object data = dragboard.getContent(dataFormat); if (data instanceof PadIndex) { PadIndex srcIndex = (PadIndex) data; @@ -215,12 +212,12 @@ public class DesktopPadDragListener implements EventHandler<DragEvent> { return; } - Dragboard dragboard = padView.startDragAndDrop(TransferMode.MOVE); + Dragboard dragboard = padViewNode.startDragAndDrop(TransferMode.MOVE); // Create Snapshot SnapshotParameters parameters = new SnapshotParameters(); parameters.setFill(Color.TRANSPARENT); - WritableImage snapshot = padView.snapshot(parameters, null); + WritableImage snapshot = padViewNode.snapshot(parameters, null); for (int x = 0; x < snapshot.getWidth(); x++) { for (int y = 0; y < snapshot.getHeight(); y++) { Color oldColor = snapshot.getPixelReader().getColor(x, y).darker().darker(); diff --git a/PlayWall/src/main/java/de/tobias/playpad/pad/drag/PlaylistDragOption.java b/PlayWall/src/main/java/de/tobias/playpad/pad/drag/PlaylistDragOption.java new file mode 100644 index 0000000000000000000000000000000000000000..f1917de12494d27f6a8f40bee657ec233d0b86dd --- /dev/null +++ b/PlayWall/src/main/java/de/tobias/playpad/pad/drag/PlaylistDragOption.java @@ -0,0 +1,38 @@ +package de.tobias.playpad.pad.drag; + +import de.thecodelabs.utils.ui.icon.FontAwesomeType; +import de.thecodelabs.utils.ui.icon.FontIcon; +import de.thecodelabs.utils.util.Localization; +import de.tobias.playpad.pad.Pad; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import javafx.scene.Node; + +import java.io.File; +import java.util.List; + +public class PlaylistDragOption implements ContentDragOption { + + private final StringProperty displayProperty = new SimpleStringProperty(Localization.getString("DndMode.Playlist")); + + @Override + public void handleDrop(Pad currentPad, List<File> files) { + if (currentPad.isPadVisible()) { + currentPad.getController().getView().showBusyView(true); + } + + for (File file : files) { + currentPad.addPath(file.toPath()); + } + } + + @Override + public StringProperty displayProperty() { + return displayProperty; + } + + @Override + public Node getGraphics() { + return new FontIcon(FontAwesomeType.PLUS_CIRCLE); + } +} diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/FileDragOptionView.java b/PlayWall/src/main/java/de/tobias/playpad/view/FileDragOptionView.java index 56510779c24c25d86b66f9872048e3173576364e..5c615be305f7c64ce3a0ad609ede7a39a25af899 100644 --- a/PlayWall/src/main/java/de/tobias/playpad/view/FileDragOptionView.java +++ b/PlayWall/src/main/java/de/tobias/playpad/view/FileDragOptionView.java @@ -1,6 +1,7 @@ package de.tobias.playpad.view; import de.tobias.playpad.pad.content.PadContentFactory; +import de.tobias.playpad.pad.drag.ContentDragOption; import javafx.animation.FadeTransition; import javafx.animation.ParallelTransition; import javafx.animation.ScaleTransition; @@ -14,7 +15,7 @@ import javafx.scene.layout.*; import javafx.scene.paint.Color; import javafx.scene.text.TextAlignment; -import java.util.Set; +import java.util.Collection; import java.util.function.Consumer; public class FileDragOptionView implements PadContentFactory.PadContentTypeChooser { @@ -76,9 +77,9 @@ public class FileDragOptionView implements PadContentFactory.PadContentTypeChoos return parallelTransition; } - private PadContentFactory selectedConnect; + private ContentDragOption selectedConnect; - public void showOptions(Set<PadContentFactory> options) { + public void showOptions(Collection<? extends ContentDragOption> options) { if (!parent.getChildren().contains(optionPane)) { selectedConnect = null; @@ -125,7 +126,7 @@ public class FileDragOptionView implements PadContentFactory.PadContentTypeChoos } - public void showOptions(Set<PadContentFactory> options, Consumer<PadContentFactory> onFinish) { + public void showOptions(Collection<PadContentFactory> options, Consumer<PadContentFactory> onFinish) { showOptions(options); for (Node node : optionPane.getChildren()) { @@ -143,7 +144,7 @@ public class FileDragOptionView implements PadContentFactory.PadContentTypeChoos } } - public PadContentFactory getSelectedConnect() { + public ContentDragOption getSelectedConnect() { return selectedConnect; } diff --git a/PlayWall/src/main/resources/lang/_de.properties b/PlayWall/src/main/resources/lang/_de.properties index 8dfe844adf363aedb9ab10cb44f41d700e0d1f79..991f98556e44d2739c485e37972b88461cc2736a 100755 --- a/PlayWall/src/main/resources/lang/_de.properties +++ b/PlayWall/src/main/resources/lang/_de.properties @@ -217,6 +217,7 @@ TriggerPoint.EOF=Ende (EoF) DnDMode.Replace=Ersetzen DnDMode.Duplicate=Duplizieren DnDMode.Move=Tauschen +DndMode.Playlist=Hinzuf\u00FCgen # Main Layout MainLayout.Desktop=Desktopmodus MainLayout.Touch=Touchmodus diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/Pad.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/Pad.java index 945446b6ab10714fe683fc012070fa9de5f3927b..a8f1b91048dc0f0ef9aec9d3a21f2bd655a7f31f 100644 --- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/Pad.java +++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/Pad.java @@ -323,6 +323,10 @@ public class Pad { createMediaPath(path); } else { setPath(path, 0); + + while (mediaPaths.size() > 1) { + mediaPaths.remove(mediaPaths.size() - 1); + } } } diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/content/PadContentFactory.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/content/PadContentFactory.java index e300c5a8b8f5f2c5a2c711bbce42629a541d51ef..71c86385f9fd163beabaa07da6a76c3ffb1cb161 100644 --- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/content/PadContentFactory.java +++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/content/PadContentFactory.java @@ -2,20 +2,23 @@ package de.tobias.playpad.pad.content; import de.thecodelabs.utils.io.PathUtils; import de.tobias.playpad.pad.Pad; +import de.tobias.playpad.pad.drag.ContentDragOption; import de.tobias.playpad.pad.view.IPadContentView; import de.tobias.playpad.registry.Component; import de.tobias.playpad.viewcontroller.PadSettingsTabViewController; import de.tobias.playpad.viewcontroller.option.ProfileSettingsTabViewController; import javafx.scene.layout.Pane; +import java.io.File; import java.nio.file.Path; -import java.util.Set; +import java.util.Collection; +import java.util.List; import java.util.function.Consumer; -public abstract class PadContentFactory extends Component implements Comparable<PadContentFactory> { +public abstract class PadContentFactory extends Component implements ContentDragOption { public interface PadContentTypeChooser { - void showOptions(Set<PadContentFactory> options, Consumer<PadContentFactory> onSelected); + void showOptions(Collection<PadContentFactory> options, Consumer<PadContentFactory> onSelected); } public PadContentFactory(String type) { @@ -36,11 +39,6 @@ public abstract class PadContentFactory extends Component implements Comparable< public abstract String[] getSupportedTypes(); - @Override - public int compareTo(PadContentFactory o) { - return getType().compareTo(o.getType()); - } - public static boolean isFileTypeSupported(Path path, PadContentFactory connect) { String extension = PathUtils.getFileExtension(path); for (String ex : connect.getSupportedTypes()) { @@ -50,4 +48,19 @@ public abstract class PadContentFactory extends Component implements Comparable< } return false; } + + // Generic Drag Option for all content types + + @Override + public void handleDrop(Pad currentPad, List<File> files) { + if (currentPad.getContent() == null || !currentPad.getContent().getType().equals(getType())) { + currentPad.setContentType(getType()); + } + + if (currentPad.isPadVisible()) { + currentPad.getController().getView().showBusyView(true); + } + + currentPad.setPath(files.get(0).toPath()); + } } diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/drag/ContentDragOption.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/drag/ContentDragOption.java new file mode 100644 index 0000000000000000000000000000000000000000..8af2e6d82227376781157fc2f9bd46b9073ce53f --- /dev/null +++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/drag/ContentDragOption.java @@ -0,0 +1,17 @@ +package de.tobias.playpad.pad.drag; + +import de.tobias.playpad.Displayable; +import de.tobias.playpad.pad.Pad; + +import java.io.File; +import java.util.List; + +public interface ContentDragOption extends Displayable, Comparable<ContentDragOption> { + + void handleDrop(Pad currentPad, List<File> files); + + @Override + default int compareTo(ContentDragOption o) { + return displayProperty().get().compareTo(o.displayProperty().get()); + } +} diff --git a/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerPadContentFactory.scala b/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerPadContentFactory.scala index 797d1b145e046964f60e9d27ceda67c0fd019d7f..2842c0feb5cd602c273c88192c41c320578e6c33 100644 --- a/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerPadContentFactory.scala +++ b/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerPadContentFactory.scala @@ -1,10 +1,12 @@ package de.tobias.playpad.plugin.content.pad +import de.thecodelabs.utils.ui.icon.{FontIcon, MaterialDesignIcon} import de.tobias.playpad.pad.Pad import de.tobias.playpad.pad.content.{PadContent, PadContentFactory} import de.tobias.playpad.pad.preview.PadTextPreview import de.tobias.playpad.pad.view.IPadContentView import de.tobias.playpad.viewcontroller.PadSettingsTabViewController +import javafx.scene.Node import javafx.scene.layout.Pane class ContentPlayerPadContentFactory(val `type`: String) extends PadContentFactory(`type`) { @@ -16,6 +18,8 @@ class ContentPlayerPadContentFactory(val `type`: String) extends PadContentFacto override def getSettingsViewController(pad: Pad): PadSettingsTabViewController = new ContentPlayerPadContentSettingsViewController(pad) override def getSupportedTypes: Array[String] = ContentPlayerPadContentFactory.FILE_EXTENSION + + override def getGraphics: Node = new FontIcon(MaterialDesignIcon.FONT_FILE, MaterialDesignIcon.MONITOR_MULTIPLE) } object ContentPlayerPadContentFactory {