new player part 2
* homeflix now saves the progress you made for all films * added icons for the player * added a slider to set the play time for the player * disable contols and cursor if mous is not moved for 5sec, enable it if moved * autoplay, WIP needs testing
This commit is contained in:
@ -10,29 +10,34 @@ import javafx.scene.layout.AnchorPane;
|
||||
import javafx.stage.Stage;
|
||||
import javafx.stage.WindowEvent;
|
||||
import kellerkinder.HomeFlix.application.Main;
|
||||
import kellerkinder.HomeFlix.controller.DBController;
|
||||
|
||||
public class Player {
|
||||
|
||||
private PlayerController playerController;
|
||||
private Stage stage;
|
||||
private AnchorPane pane;
|
||||
private Scene scene;
|
||||
|
||||
public Player(String file) {
|
||||
public Player(String file, String currentEp, DBController dbController) {
|
||||
try {
|
||||
FXMLLoader fxmlLoader = new FXMLLoader(ClassLoader.getSystemResource("fxml/PlayerWindow.fxml"));
|
||||
pane = (AnchorPane) fxmlLoader.load();
|
||||
stage = new Stage();
|
||||
stage.setScene(new Scene(pane));
|
||||
scene = new Scene(pane);
|
||||
stage.setScene(scene);
|
||||
stage.setTitle("HomeFlix");
|
||||
stage.getIcons().add(new Image(Main.class.getResourceAsStream("/icons/Homeflix_Icon_64x64.png")));
|
||||
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
|
||||
public void handle(WindowEvent we) {
|
||||
dbController.setCurrentTime(file, playerController.getCurrentTime());
|
||||
playerController.getMediaPlayer().stop();
|
||||
stage.close();
|
||||
}
|
||||
});
|
||||
|
||||
playerController = fxmlLoader.getController();
|
||||
playerController.init(file, this);
|
||||
playerController.init(file, currentEp, this, dbController);
|
||||
|
||||
stage.setFullScreen(true);
|
||||
stage.show();
|
||||
@ -49,4 +54,8 @@ public class Player {
|
||||
return pane;
|
||||
}
|
||||
|
||||
public Scene getScene() {
|
||||
return scene;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,27 +1,49 @@
|
||||
package kellerkinder.HomeFlix.player;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import com.jfoenix.controls.JFXButton;
|
||||
import com.jfoenix.controls.JFXSlider;
|
||||
|
||||
import javafx.beans.binding.Bindings;
|
||||
import javafx.beans.property.DoubleProperty;
|
||||
import javafx.beans.value.ChangeListener;
|
||||
import javafx.beans.value.ObservableValue;
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.event.EventHandler;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.Cursor;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.scene.image.ImageView;
|
||||
import javafx.scene.input.MouseEvent;
|
||||
import javafx.scene.layout.HBox;
|
||||
import javafx.scene.layout.VBox;
|
||||
import javafx.scene.media.Media;
|
||||
import javafx.scene.media.MediaPlayer;
|
||||
import javafx.scene.media.MediaPlayer.Status;
|
||||
import javafx.scene.media.MediaView;
|
||||
import javafx.util.Duration;
|
||||
import kellerkinder.HomeFlix.controller.DBController;
|
||||
|
||||
public class PlayerController {
|
||||
|
||||
@FXML
|
||||
private MediaView mediaView;
|
||||
|
||||
@FXML
|
||||
private VBox bottomVBox;
|
||||
|
||||
@FXML
|
||||
private HBox controllsHBox;
|
||||
private HBox controlsHBox;
|
||||
|
||||
@FXML
|
||||
private JFXSlider timeSlider;
|
||||
|
||||
@FXML
|
||||
private JFXButton stopBtn;
|
||||
|
||||
@FXML
|
||||
private JFXButton playBtn;
|
||||
|
||||
@ -29,14 +51,39 @@ public class PlayerController {
|
||||
private JFXButton fullscreenBtn;
|
||||
|
||||
private Player player;
|
||||
private DBController dbController;
|
||||
private Media media;
|
||||
private MediaPlayer mediaPlayer;
|
||||
|
||||
private double currentTime = 0;
|
||||
private double futureTime= 0;
|
||||
private double duration = 0;
|
||||
private boolean mousePressed = false;
|
||||
private boolean showControls = true;
|
||||
private String file;
|
||||
private int nextEp;
|
||||
|
||||
private ImageView stop_black = new ImageView(new Image("icons/ic_stop_black_24dp_1x.png"));
|
||||
private ImageView play_arrow_black = new ImageView(new Image("icons/ic_play_arrow_black_24dp_1x.png"));
|
||||
private ImageView pause_black = new ImageView(new Image("icons/ic_pause_black_24dp_1x.png"));
|
||||
private ImageView fullscreen_black = new ImageView(new Image("icons/ic_fullscreen_black_24dp_1x.png"));
|
||||
private ImageView fullscreen_exit_black = new ImageView(new Image("icons/ic_fullscreen_exit_black_24dp_1x.png"));
|
||||
|
||||
public void init(String file, Player player) {
|
||||
public void init(String file, String currentEp, Player player, DBController dbController) {
|
||||
this.file = file;
|
||||
this.player = player;
|
||||
this.dbController = dbController;
|
||||
initActions();
|
||||
|
||||
if (currentEp.length() > 0) {
|
||||
nextEp = Integer.parseInt(currentEp) + 1;
|
||||
} else {
|
||||
nextEp = 0;
|
||||
}
|
||||
|
||||
media = new Media(new File(file).toURI().toString());
|
||||
mediaPlayer = new MediaPlayer(media);
|
||||
mediaView.setPreserveRatio(true);
|
||||
mediaView.setMediaPlayer(mediaPlayer);
|
||||
|
||||
final DoubleProperty width = mediaView.fitWidthProperty();
|
||||
@ -44,17 +91,123 @@ public class PlayerController {
|
||||
|
||||
width.bind(Bindings.selectDouble(mediaView.sceneProperty(), "width"));
|
||||
height.bind(Bindings.selectDouble(mediaView.sceneProperty(), "height"));
|
||||
|
||||
mediaPlayer.setOnReady(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
duration = media.getDuration().toMillis();
|
||||
|
||||
timeSlider.setMax((duration/1000)/60);
|
||||
|
||||
mediaView.setPreserveRatio(true);
|
||||
mediaPlayer.play();
|
||||
mediaPlayer.setStartTime(Duration.millis(dbController.getCurrentTime(file)));
|
||||
mediaPlayer.play();
|
||||
}
|
||||
});
|
||||
|
||||
mediaPlayer.currentTimeProperty().addListener(new ChangeListener<Duration>() {
|
||||
@Override
|
||||
public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
|
||||
|
||||
|
||||
currentTime = newValue.toMillis();
|
||||
|
||||
if (duration - currentTime < 10000) {
|
||||
if (nextEp != 0) {
|
||||
dbController.getNextEpisode(file, nextEp);
|
||||
System.out.println("next episode is: " + dbController.getNextEpisode(file, nextEp));
|
||||
} else {
|
||||
if (duration - currentTime < 100) {
|
||||
dbController.setCurrentTime(file, 0);
|
||||
mediaPlayer.stop();
|
||||
player.getStage().close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!mousePressed) {
|
||||
timeSlider.setValue((currentTime/1000)/60);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
stopBtn.setGraphic(stop_black);
|
||||
playBtn.setGraphic(play_arrow_black);
|
||||
fullscreenBtn.setGraphic(fullscreen_exit_black);
|
||||
}
|
||||
|
||||
private void initActions() {
|
||||
|
||||
player.getScene().addEventFilter(MouseEvent.MOUSE_MOVED, new EventHandler<MouseEvent>() {
|
||||
// hide controls timer init
|
||||
final Timer timer = new Timer();
|
||||
TimerTask controlAnimationTask = null; // task to execute save operation
|
||||
final long delayTime = 5000;
|
||||
|
||||
@Override
|
||||
public void handle(MouseEvent mouseEvent) {
|
||||
|
||||
// show controls
|
||||
if (!showControls) {
|
||||
player.getScene().setCursor(Cursor.DEFAULT);
|
||||
bottomVBox.setVisible(true);
|
||||
}
|
||||
|
||||
// hide controls
|
||||
if (controlAnimationTask != null)
|
||||
controlAnimationTask.cancel();
|
||||
|
||||
controlAnimationTask = new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
bottomVBox.setVisible(false);
|
||||
player.getScene().setCursor(Cursor.NONE);
|
||||
showControls = false;
|
||||
}
|
||||
};
|
||||
timer.schedule(controlAnimationTask, delayTime);
|
||||
}
|
||||
});
|
||||
|
||||
timeSlider.setOnMouseReleased(new EventHandler<MouseEvent>() {
|
||||
@Override
|
||||
public void handle(MouseEvent event) {
|
||||
mediaPlayer.seek(new Duration(futureTime));
|
||||
mousePressed = false;
|
||||
}
|
||||
});
|
||||
|
||||
timeSlider.setOnMousePressed(new EventHandler<MouseEvent>() {
|
||||
@Override
|
||||
public void handle(MouseEvent event) {
|
||||
mousePressed = true;
|
||||
}
|
||||
});
|
||||
|
||||
timeSlider.valueProperty().addListener(new ChangeListener<Number>() {
|
||||
@Override
|
||||
public void changed(ObservableValue<? extends Number> ov, Number old_val, Number new_val) {
|
||||
futureTime = (double) new_val*1000*60;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@FXML
|
||||
void stopBtnAction(ActionEvent event) {
|
||||
|
||||
dbController.setCurrentTime(file, currentTime);
|
||||
|
||||
mediaPlayer.stop();
|
||||
player.getStage().close();
|
||||
}
|
||||
|
||||
@FXML
|
||||
void fullscreenBtnAction(ActionEvent event) {
|
||||
if (player.getStage().isFullScreen()) {
|
||||
player.getStage().setFullScreen(false);
|
||||
fullscreenBtn.setGraphic(fullscreen_black);
|
||||
} else {
|
||||
player.getStage().setFullScreen(true);
|
||||
fullscreenBtn.setGraphic(fullscreen_exit_black);
|
||||
}
|
||||
}
|
||||
|
||||
@ -63,8 +216,10 @@ public class PlayerController {
|
||||
|
||||
if (mediaPlayer.getStatus().equals(Status.PLAYING)) {
|
||||
mediaPlayer.pause();
|
||||
playBtn.setGraphic(play_arrow_black);
|
||||
} else {
|
||||
mediaPlayer.play();
|
||||
playBtn.setGraphic(pause_black);
|
||||
}
|
||||
}
|
||||
|
||||
@ -72,4 +227,8 @@ public class PlayerController {
|
||||
return mediaPlayer;
|
||||
}
|
||||
|
||||
public double getCurrentTime() {
|
||||
return currentTime;
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user