diff --git a/app/src/main/java/org/toop/app/view/displays/SongDisplay.java b/app/src/main/java/org/toop/app/view/displays/SongDisplay.java new file mode 100644 index 0000000..8090e5b --- /dev/null +++ b/app/src/main/java/org/toop/app/view/displays/SongDisplay.java @@ -0,0 +1,90 @@ +package org.toop.app.view.displays; + +import javafx.application.Platform; +import javafx.scene.control.Button; +import javafx.scene.control.ProgressBar; +import javafx.scene.layout.VBox; +import javafx.scene.paint.Color; +import org.toop.framework.audio.AudioEventListener; +import org.toop.framework.audio.events.AudioEvents; +import org.toop.framework.eventbus.EventFlow; +import javafx.geometry.Pos; +import javafx.scene.text.Text; +import org.toop.framework.eventbus.GlobalEventBus; + +public class SongDisplay extends VBox { + + private final Text songTitle; + private final ProgressBar progressBar; + private final Text progressText; + + public SongDisplay() { + new EventFlow() + .listen(this::updateTheSong); + + setAlignment(Pos.CENTER); + getStyleClass().add("song-display"); + + // TODO ADD GOOD SONG TITLES WITH ARTISTS DISPLAYED + songTitle = new Text("song playing"); + songTitle.getStyleClass().add("song-title"); + + progressBar = new ProgressBar(0); + progressBar.getStyleClass().add("progress-bar"); + + progressText = new Text("0:00/0:00"); + progressText.getStyleClass().add("progress-text"); + + // TODO ADD BETTER CSS FOR THE SKIPBUTTON WHERE ITS AT A NICER POSITION + + Button skipButton = new Button(">>"); + skipButton.getStyleClass().setAll("skip-button"); + skipButton.setOnAction( event -> { + GlobalEventBus.post(new AudioEvents.SkipMusic()); + }); + + getChildren().addAll(songTitle, progressBar, progressText, skipButton); + } + + private void updateTheSong(AudioEvents.PlayingMusic event) { + Platform.runLater(() -> { + String text = event.name(); + text = text.substring(0, text.length() - 4); + songTitle.setText(text); + double currentPos = event.currentPosition(); + double duration = event.duration(); + if (currentPos / duration > 0.05) { + double progress = currentPos / duration; + progressBar.setProgress(progress); + } + else if (currentPos / duration < 0.05) { + progressBar.setProgress(0.05); + } + progressText.setText(getTimeString(event.currentPosition(), event.duration())); + }); + } + + private String getTimeString(long position, long duration) { + long positionMinutes = position / 60; + long durationMinutes = duration / 60; + long positionSeconds = position % 60; + long durationSeconds = duration % 60; + String positionSecondsStr = String.valueOf(positionSeconds); + String durationSecondsStr = String.valueOf(durationSeconds); + + if (positionSeconds < 10) { + positionSecondsStr = "0" + positionSeconds; + } + if (durationSeconds < 10) { + durationSecondsStr = "0" + durationSeconds; + } + + String time = positionMinutes + ":" + positionSecondsStr + " / " + durationMinutes + ":" + durationSecondsStr; + return time; + } +} + + + + + diff --git a/app/src/main/java/org/toop/app/view/views/ChallengeView.java b/app/src/main/java/org/toop/app/view/views/ChallengeView.java index f5ee907..55b526f 100644 --- a/app/src/main/java/org/toop/app/view/views/ChallengeView.java +++ b/app/src/main/java/org/toop/app/view/views/ChallengeView.java @@ -4,6 +4,7 @@ import org.toop.app.GameInformation; import org.toop.app.Server; import org.toop.app.view.View; import org.toop.app.view.ViewStack; +import org.toop.app.view.displays.SongDisplay; import org.toop.local.AppContext; import javafx.geometry.Pos; @@ -95,6 +96,14 @@ public final class ChallengeView extends View { nodes.add(vbox(computerDifficultyText, computerDifficultySlider)); } + final SongDisplay songdisplay = new SongDisplay(); + + + add(Pos.BOTTOM_RIGHT, + fit(vboxFill( + songdisplay + ))); + add(Pos.CENTER, fit(hboxFill( vboxFill( diff --git a/app/src/main/java/org/toop/app/view/views/CreditsView.java b/app/src/main/java/org/toop/app/view/views/CreditsView.java index 84da377..3f02ef8 100644 --- a/app/src/main/java/org/toop/app/view/views/CreditsView.java +++ b/app/src/main/java/org/toop/app/view/views/CreditsView.java @@ -3,6 +3,7 @@ package org.toop.app.view.views; import org.toop.app.App; import org.toop.app.view.View; import org.toop.app.view.ViewStack; +import org.toop.app.view.displays.SongDisplay; import org.toop.local.AppContext; import javafx.animation.KeyFrame; @@ -46,6 +47,14 @@ public final class CreditsView extends View { final Text openglHeader = header(); openglHeader.setText(AppContext.getString("opengl") + ": Omar"); + final SongDisplay songdisplay = new SongDisplay(); + + + add(Pos.BOTTOM_RIGHT, + fit(vboxFill( + songdisplay + ))); + add(Pos.CENTER, fit("credits-fit", vboxFill("credits-container", "credits-container", vbox("credits-spacer-top", ""), diff --git a/app/src/main/java/org/toop/app/view/views/GameView.java b/app/src/main/java/org/toop/app/view/views/GameView.java index 3834159..0ea669b 100644 --- a/app/src/main/java/org/toop/app/view/views/GameView.java +++ b/app/src/main/java/org/toop/app/view/views/GameView.java @@ -2,6 +2,7 @@ package org.toop.app.view.views; import org.toop.app.view.View; import org.toop.app.view.ViewStack; +import org.toop.app.view.displays.SongDisplay; import org.toop.local.AppContext; import javafx.geometry.Pos; @@ -85,6 +86,14 @@ public final class GameView extends View { forfeitButton = null; } + final SongDisplay songdisplay = new SongDisplay(); + + + add(Pos.BOTTOM_RIGHT, + fit(vboxFill( + songdisplay + ))); + if (onMessage != null) { chatListView = new ListView(); diff --git a/app/src/main/java/org/toop/app/view/views/LocalMultiplayerView.java b/app/src/main/java/org/toop/app/view/views/LocalMultiplayerView.java index 92759cd..e99de78 100644 --- a/app/src/main/java/org/toop/app/view/views/LocalMultiplayerView.java +++ b/app/src/main/java/org/toop/app/view/views/LocalMultiplayerView.java @@ -6,6 +6,7 @@ import org.toop.app.game.ReversiGame; import org.toop.app.game.TicTacToeGame; import org.toop.app.view.View; import org.toop.app.view.ViewStack; +import org.toop.app.view.displays.SongDisplay; import org.toop.local.AppContext; import javafx.geometry.Pos; @@ -51,6 +52,14 @@ public final class LocalMultiplayerView extends View { } }); + final SongDisplay songdisplay = new SongDisplay(); + + + add(Pos.BOTTOM_RIGHT, + fit(vboxFill( + songdisplay + ))); + add(Pos.CENTER, fit(vboxFill( hbox( diff --git a/app/src/main/java/org/toop/app/view/views/LocalView.java b/app/src/main/java/org/toop/app/view/views/LocalView.java index d0b81c5..c4a1c4b 100644 --- a/app/src/main/java/org/toop/app/view/views/LocalView.java +++ b/app/src/main/java/org/toop/app/view/views/LocalView.java @@ -3,6 +3,7 @@ package org.toop.app.view.views; import org.toop.app.GameInformation; import org.toop.app.view.View; import org.toop.app.view.ViewStack; +import org.toop.app.view.displays.SongDisplay; import org.toop.local.AppContext; import javafx.geometry.Pos; @@ -39,6 +40,14 @@ public final class LocalView extends View { backButton.setText(AppContext.getString("back")); backButton.setOnAction(_ -> { ViewStack.push(new MainView()); }); + final SongDisplay songdisplay = new SongDisplay(); + + + add(Pos.BOTTOM_RIGHT, + fit(vboxFill( + songdisplay + ))); + add(Pos.BOTTOM_LEFT, vboxFill( backButton diff --git a/app/src/main/java/org/toop/app/view/views/MainView.java b/app/src/main/java/org/toop/app/view/views/MainView.java index 93f9207..10fa0fc 100644 --- a/app/src/main/java/org/toop/app/view/views/MainView.java +++ b/app/src/main/java/org/toop/app/view/views/MainView.java @@ -4,7 +4,7 @@ import org.toop.app.App; import org.toop.app.view.View; import org.toop.app.view.ViewStack; import org.toop.local.AppContext; - +import org.toop.app.view.displays.SongDisplay; import javafx.geometry.Pos; import javafx.scene.control.Button; @@ -35,6 +35,13 @@ public final class MainView extends View { quitButton.setText(AppContext.getString("quit")); quitButton.setOnAction(_ -> { App.startQuit(); }); + final SongDisplay songdisplay = new SongDisplay(); + + add(Pos.BOTTOM_RIGHT, + fit(vboxFill( + songdisplay + ))); + add(Pos.CENTER, fit(vboxFill( localButton, diff --git a/app/src/main/java/org/toop/app/view/views/OnlineView.java b/app/src/main/java/org/toop/app/view/views/OnlineView.java index 2c5b783..3d7750d 100644 --- a/app/src/main/java/org/toop/app/view/views/OnlineView.java +++ b/app/src/main/java/org/toop/app/view/views/OnlineView.java @@ -3,6 +3,7 @@ package org.toop.app.view.views; import org.toop.app.Server; import org.toop.app.view.View; import org.toop.app.view.ViewStack; +import org.toop.app.view.displays.SongDisplay; import org.toop.local.AppContext; import javafx.geometry.Pos; @@ -44,6 +45,13 @@ public class OnlineView extends View { new Server(serverIPInput.getText(), serverPortInput.getText(), playerNameInput.getText()); }); + final SongDisplay songdisplay = new SongDisplay(); + + add(Pos.BOTTOM_RIGHT, + fit(vboxFill( + songdisplay + ))); + add(Pos.CENTER, fit(vboxFill( serverInformationHeader, diff --git a/app/src/main/java/org/toop/app/view/views/OptionsView.java b/app/src/main/java/org/toop/app/view/views/OptionsView.java index 3b8eaaa..d4af353 100644 --- a/app/src/main/java/org/toop/app/view/views/OptionsView.java +++ b/app/src/main/java/org/toop/app/view/views/OptionsView.java @@ -3,6 +3,7 @@ package org.toop.app.view.views; import org.toop.app.App; import org.toop.app.view.View; import org.toop.app.view.ViewStack; +import org.toop.app.view.displays.SongDisplay; import org.toop.framework.audio.VolumeControl; import org.toop.framework.audio.events.AudioEvents; import org.toop.framework.eventbus.EventFlow; @@ -99,6 +100,14 @@ public final class OptionsView extends View { backButton.setText(AppContext.getString("back")); backButton.setOnAction(_ -> { ViewStack.pop(); }); + final SongDisplay songdisplay = new SongDisplay(); + + + add(Pos.BOTTOM_RIGHT, + fit(vboxFill( + songdisplay + ))); + add(Pos.BOTTOM_LEFT, vboxFill( backButton diff --git a/app/src/main/java/org/toop/app/view/views/ServerView.java b/app/src/main/java/org/toop/app/view/views/ServerView.java index 36614eb..c819c14 100644 --- a/app/src/main/java/org/toop/app/view/views/ServerView.java +++ b/app/src/main/java/org/toop/app/view/views/ServerView.java @@ -2,6 +2,7 @@ package org.toop.app.view.views; import org.toop.app.view.View; import org.toop.app.view.ViewStack; +import org.toop.app.view.displays.SongDisplay; import org.toop.local.AppContext; import javafx.application.Platform; @@ -53,6 +54,14 @@ public final class ServerView extends View { listView = new ListView