From ed3b79a36cc8b09c401edce6e0622a7099e7306e Mon Sep 17 00:00:00 2001 From: Ronny Date: Fri, 3 Feb 2023 21:56:36 -0600 Subject: [PATCH 1/3] Implemented search on the playlist also now the playlist scrolls to the selected item in the playlist when changing song/video --- .../MediaPlayerFXMLController.java | 95 +++++++++++++++++-- .../wmediaplayer/MediaPlayerFXML.fxml | 56 ++++++----- 2 files changed, 116 insertions(+), 35 deletions(-) diff --git a/src/main/java/controllers/MediaPlayerFXMLController.java b/src/main/java/controllers/MediaPlayerFXMLController.java index 9928200..42918b5 100644 --- a/src/main/java/controllers/MediaPlayerFXMLController.java +++ b/src/main/java/controllers/MediaPlayerFXMLController.java @@ -6,6 +6,7 @@ import java.util.ResourceBundle; import java.io.File; +import java.util.ArrayList; import java.util.Map; import java.util.Random; import java.util.TreeMap; @@ -22,11 +23,13 @@ import javafx.scene.control.ListView; import javafx.scene.control.ProgressBar; import javafx.scene.control.Slider; +import javafx.scene.control.TextField; import javafx.scene.control.ToggleButton; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.input.KeyCode; import javafx.scene.input.MouseEvent; +import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.media.Media; @@ -45,6 +48,9 @@ */ public class MediaPlayerFXMLController implements Initializable { + @FXML + private BorderPane mainScene; + @FXML private Text fileNameText; @@ -96,6 +102,8 @@ public class MediaPlayerFXMLController implements Initializable { private ListView playList; @FXML private Label lblPlaylist; + @FXML + private TextField searchPlaylist; @FXML private ToggleButton nowPlayingButton; @@ -120,31 +128,32 @@ public class MediaPlayerFXMLController implements Initializable { public void initialize(URL url, ResourceBundle rb) { visualSyncProgressSliderBar(progressSlider, progressBar); visualSyncProgressSliderBar(volumeSlider, volumeBar); + searchPlaylistItems(); smallAlbumArt.fitHeightProperty().bind(smallAlbumArtBackground.heightProperty()); smallAlbumArt.fitWidthProperty().bind(smallAlbumArtBackground.widthProperty()); // Play tracks in the playlist List using the mouse playList.setOnMouseClicked((MouseEvent click) -> { + if (click.getClickCount() == 2 && !playList.getItems().isEmpty()) { - //Use ListView's getSelected Item - fileNumber = playList.getSelectionModel().getSelectedIndex(); - - updateNextPreviousButtonsState(); - initiateMediaPlayer(filePlayList.keySet().toArray()[fileNumber].toString()); + playSelectedItem(); } }); // same but with Enter key playList.setOnKeyPressed((key) -> { if (key.getCode() == KeyCode.ENTER && !playList.getItems().isEmpty()) { - fileNumber = playList.getSelectionModel().getSelectedIndex(); - - updateNextPreviousButtonsState(); - initiateMediaPlayer(filePlayList.keySet().toArray()[fileNumber].toString()); - + playSelectedItem(); } }); } + private void playSelectedItem() { + //Use ListView's getSelected Item + fileNumber = playList.getSelectionModel().getSelectedIndex(); + + updateNextPreviousButtonsState(); + initiateMediaPlayer(filePlayList.keySet().toArray()[fileNumber].toString()); + } public void nextButtonClicked(ActionEvent e) { @@ -177,6 +186,7 @@ public void previousButtonClicked(ActionEvent e) { } initiateMediaPlayer(filePlayList.keySet().toArray()[fileNumber].toString()); playList.getSelectionModel().select(fileNumber); + playList.scrollTo(fileNumber); playList.getFocusModel().focus(oldValue); } @@ -297,6 +307,50 @@ public void nowPlayingButtonClicked(ActionEvent e) { } } + public void searchPlaylistItems() { + + mainScene.setOnKeyTyped((t) -> { + if (searchPlaylist.getText().isBlank()) { + searchPlaylist.setVisible(true); + } + searchPlaylist.setText(t.getCharacter()); + searchPlaylist.requestFocus(); + searchPlaylist.positionCaret(searchPlaylist.getLength()); + }); + + searchPlaylist.setOnKeyPressed((t) -> { + if (t.getCode().equals(KeyCode.ESCAPE)) { + searchPlaylist.clear(); + } + + if (!playList.getItems().isEmpty()) { + int index = findKeyIndex(filePlayList, searchPlaylist.getText()); + if (index != -1) { + playList.requestFocus(); + playList.getSelectionModel().select(index); + playList.scrollTo(index); + searchPlaylist.requestFocus(); + searchPlaylist.positionCaret(searchPlaylist.getLength()); + } + + if (t.getCode().equals(KeyCode.ENTER)) { + playSelectedItem(); + searchPlaylist.clear(); + } + } + if (searchPlaylist.getText().isBlank()) { + searchPlaylist.setVisible(false); + } + + }); + } + + + + + + + public void getAllFiles(File directory) { files = directory.listFiles(); @@ -579,8 +633,10 @@ private void playNextMedia() { if (randomButton.isSelected()) { fileNumber = new Random().nextInt(filePlayList.size()); + playList.scrollTo(fileNumber); } else { + playList.scrollTo(oldValue); fileNumber++; } initiateMediaPlayer(filePlayList.keySet().toArray()[fileNumber].toString()); @@ -589,6 +645,25 @@ private void playNextMedia() { } + public static int findKeyIndex(Map map, String searchString) { + ArrayList keys = new ArrayList<>(map.keySet()); + if (searchString == null || searchString.isEmpty()) { + return -1; + } + System.out.println("Keys list size: " + keys.size()); + for (File key : keys) { + System.out.println("Checking key: " + key.toString()); + System.out.println("Search string: " + searchString); + if (key.toString().toLowerCase().contains(searchString.toLowerCase())) { + System.out.println("Found match: " + key.toString()); + return keys.indexOf(key); + } + } + System.out.println("No match found"); + return -1; + } + + private void setStageName(String track) { wmediaplayer.WMediaPlayer.getStage().setTitle(track + " - Media Player 11"); } diff --git a/src/main/resources/wmediaplayer/MediaPlayerFXML.fxml b/src/main/resources/wmediaplayer/MediaPlayerFXML.fxml index 0434283..933bc7a 100644 --- a/src/main/resources/wmediaplayer/MediaPlayerFXML.fxml +++ b/src/main/resources/wmediaplayer/MediaPlayerFXML.fxml @@ -8,6 +8,7 @@ + @@ -22,18 +23,18 @@ - + - -