added FilmDetailView

* implemented the PosterMode basics
* added some new 48dp icons
This commit is contained in:
2019-06-16 21:44:42 +02:00
parent 2bbbfff532
commit 656c22d48a
13 changed files with 443 additions and 33 deletions

View File

@ -1,43 +1,198 @@
package kellerkinder.HomeFlix.application;
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.jfoenix.controls.JFXButton;
import javafx.animation.FadeTransition;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.text.Text;
import javafx.util.Duration;
import kellerkinder.HomeFlix.controller.DBController;
import kellerkinder.HomeFlix.controller.XMLController;
public class FilmDetailView {
@FXML private AnchorPane filmDVPane;
@FXML private Label lblTitle;
@FXML private Label lblYear;
@FXML private Label lblScore;
@FXML private JFXButton btnWhishlist;
@FXML private Label lblCrew;
@FXML private Label lblDirectors;
@FXML private Label lblDirectorsInfo;
@FXML private Label lblWriters;
@FXML private Label lblWritersInfo;
@FXML private Label lblActors;
@FXML private Label lblActorsInfo;
@FXML private Label lblInfo;
@FXML private Label lblRuntimeInfo;
@FXML private Label lblRuntime;
@FXML private Label lblLanguageInfo;
@FXML private Label lblLanguage;
@FXML private Label lblRevenueInfo;
@FXML private Label lblRevenue;
@FXML private Label lblRatingInfo;
@FXML private Label lblRating;
@FXML private JFXButton btnWishlist;
@FXML private JFXButton btnFavourite;
@FXML private JFXButton btnHide;
@FXML private JFXButton btnPlay;
@FXML private JFXButton btnDirectory;
@FXML private ImageView wishListIcon;
@FXML private ImageView favoriteIcon;
@FXML private ImageView imgPoster;
@FXML private Text textPlot;
public void initialize() {
System.out.println("init nested controller");
filmDVPane.setStyle("-fx-background-color: rgba(89,89,89,0.9);");
btnWhishlist.setGraphic(new ImageView(new Image("icons/ic_play_arrow_black_18dp_1x.png")));
}
private DBController dbController;
private static final Logger LOGGER = LogManager.getLogger(FilmDetailView.class.getName());
private String currentStreamURL;
public void foo() {
System.out.println("test");
public void initialize() {
dbController = DBController.getInstance();
filmDVPane.setStyle("-fx-background-color: rgba(89,89,89,0.9);");
}
@FXML
private void btnWhishlistAction() {
private void btnWishlistAction() {
}
@FXML
private void btnFavouriteAction() {
dbController.toggleFavoriteState(currentStreamURL);
// update the favorite icon
if(dbController.getFavoriteState(currentStreamURL) == 1) {
favoriteIcon.setImage(new Image("icons/baseline_favorite_black_48dp.png"));
} else {
favoriteIcon.setImage(new Image("icons/baseline_favorite_border_black_48dp.png"));
}
}
@FXML
private void btnHideAction() {
hidePane();
}
@FXML
private void btnPlayAction() {
playFilm();
}
@FXML
private void btnDirectoryAction() {
File dest = new File(currentStreamURL).getParentFile();
if (!System.getProperty("os.name").contains("Linux")) {
try {
Desktop.getDesktop().open(dest);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* set the cached data of a stream to the FilmDetailView
* @param streamURL URL of the stream
*/
public void setFilm(String streamURL) {
currentStreamURL = streamURL;
String[] cacheInfo = dbController.readCache(streamURL); // get the cache data from the database
// add the cache data to the GUI
lblTitle.setText(cacheInfo[0]);
lblYear.setText("(" + cacheInfo[1] + ")");
lblScore.setText(XMLController.getLocalBundle().getString("score") + ": " + cacheInfo[15] + "%");
textPlot.setText(cacheInfo[11]);
lblDirectors.setText(cacheInfo[8]);
lblWriters.setText(cacheInfo[9]);
lblActors.setText(cacheInfo[10]);
lblRuntime.setText(cacheInfo[6]);
lblLanguage.setText(cacheInfo[12]);
lblRevenue.setText(cacheInfo[18]);
lblRating.setText(cacheInfo[2]);
try {
if (new File(cacheInfo[20]).isFile()) {
imgPoster.setImage(new Image(new File(cacheInfo[20]).toURI().toString()));
} else {
imgPoster.setImage(new Image(cacheInfo[20]));
}
} catch (Exception e) {
imgPoster.setImage(new Image("icons/Homeflix_Poster.png"));
LOGGER.error("No Poster found, useing default.");
}
// set the favorite correct icon
if(dbController.getFavoriteState(streamURL) == 1) {
favoriteIcon.setImage(new Image("icons/baseline_favorite_black_48dp.png"));
} else {
favoriteIcon.setImage(new Image("icons/baseline_favorite_border_black_48dp.png"));
}
}
/**
* update the text of all static GUI elements of FilmDeatilView
*/
public void updateGUILocal() {
lblCrew.setText(XMLController.getLocalBundle().getString("crew"));
lblDirectorsInfo.setText(XMLController.getLocalBundle().getString("directors"));
lblWritersInfo.setText(XMLController.getLocalBundle().getString("writers"));
lblActorsInfo.setText(XMLController.getLocalBundle().getString("actors"));
lblInfo.setText(XMLController.getLocalBundle().getString("info"));
lblRuntimeInfo.setText(XMLController.getLocalBundle().getString("runtime"));
lblLanguageInfo.setText(XMLController.getLocalBundle().getString("language"));
lblRevenueInfo.setText(XMLController.getLocalBundle().getString("boxOffice"));
lblRatingInfo.setText(XMLController.getLocalBundle().getString("rated"));
}
/**
* show the FilmDVpane
*/
public void showPane() {
filmDVPane.setVisible(true);
FadeTransition fadeIn = new FadeTransition(Duration.millis(300), filmDVPane);
fadeIn.setFromValue(0.3);
fadeIn.setToValue(1.0);
fadeIn.play();
}
/**
* hide the FilmDVpane
*/
private void hidePane() {
FadeTransition fadeOut = new FadeTransition(Duration.millis(200), filmDVPane);
fadeOut.setFromValue(1.0);
fadeOut.setToValue(0.3);
fadeOut.play();
filmDVPane.setVisible(false);
MainWindowController.getInstance().disableBlur(); // disable blur
}
private void playFilm() {
}

View File

@ -168,6 +168,7 @@ public class MainWindowController {
// FilmDetailView
@FXML private FilmDetailView filmDetailViewController;
private static MainWindowController instance = null;
private DBController dbController;
private UpdateController updateController;
private XMLController xmlController;
@ -195,16 +196,26 @@ public class MainWindowController {
private ObservableList<PosterModeElement> posterEmenents = FXCollections.observableArrayList();
private static ObservableList<SourceDataType> sourcesList = FXCollections.observableArrayList();
private MenuItem like = new MenuItem("like");
private MenuItem dislike = new MenuItem("dislike"); // TODO one option (like or dislike)
private MenuItem dislike = new MenuItem("dislike");
private ContextMenu menu = new ContextMenu(like, dislike);
private LocalDate lastValidCache = LocalDate.now().minusDays(30); // current date - 30 days is the last valid cache date
public MainWindowController() {
// the constructor
}
public static MainWindowController getInstance() {
if (instance == null) {
LOGGER.error("There was a fatal error: instance is null!");
instance = new MainWindowController();
}
return instance;
}
@FXML
public void initialize() {
instance = this;
xmlController = new XMLController();
dbController = DBController.getInstance();
}
@ -226,7 +237,7 @@ public class MainWindowController {
// load sources list in gui
addSourceToTable();
posterModeStartup(); // TODO testing DO NOT USE THIS!!
// posterModeStartup(); // TODO testing DO NOT USE THIS!!
}
// Initialize general UI elements
@ -254,11 +265,11 @@ public class MainWindowController {
setLocalUI();
applyColor();
BoxBlur boxBlur = new BoxBlur();
boxBlur.setWidth(9);
boxBlur.setHeight(7);
boxBlur.setIterations(3);
posterModeFlowPane.setEffect(boxBlur);
// BoxBlur boxBlur = new BoxBlur();
// boxBlur.setWidth(9);
// boxBlur.setHeight(7);
// boxBlur.setIterations(3);
// posterModeFlowPane.setEffect(boxBlur);
}
/**
@ -491,7 +502,7 @@ public class MainWindowController {
}
}
}
@FXML
private void openfolderbtnclicked() {
File dest = new File(getCurrentStreamUrl()).getParentFile();
@ -508,7 +519,6 @@ public class MainWindowController {
@FXML
private void returnBtnclicked() {
filmsTreeTable.getSelectionModel().select(last);
filmDetailViewController.foo(); // TODO
}
@FXML
@ -783,6 +793,9 @@ public class MainWindowController {
languageChoisBox.getSelectionModel().select(0);
break;
}
filmDetailViewController.updateGUILocal();
aboutBtn.setText(XMLController.getLocalBundle().getString("info"));
settingsBtn.setText(XMLController.getLocalBundle().getString("settings"));
searchTextField.setPromptText(XMLController.getLocalBundle().getString("tfSearch"));
@ -818,8 +831,8 @@ public class MainWindowController {
nameText[5] = new Text(XMLController.getLocalBundle().getString("episode") + ": ");
nameText[6] = new Text(XMLController.getLocalBundle().getString("runtime") + ": ");
nameText[7] = new Text(XMLController.getLocalBundle().getString("genre") + ": ");
nameText[8] = new Text(XMLController.getLocalBundle().getString("director") + ": ");
nameText[9] = new Text(XMLController.getLocalBundle().getString("writer") + ": ");
nameText[8] = new Text(XMLController.getLocalBundle().getString("directors") + ": ");
nameText[9] = new Text(XMLController.getLocalBundle().getString("writers") + ": ");
nameText[10] = new Text(XMLController.getLocalBundle().getString("actors") + ": ");
nameText[11] = new Text(XMLController.getLocalBundle().getString("plot") + ": ");
nameText[12] = new Text(XMLController.getLocalBundle().getString("language") + ": ");
@ -916,6 +929,7 @@ public class MainWindowController {
executor.shutdown();
// TODO show loading screen
// we might need this as otherwise it would load before all tasks are finished
try {
executor.awaitTermination(1, TimeUnit.MINUTES);
@ -936,11 +950,41 @@ public class MainWindowController {
posterEmenents.clear();
posterEmenents = dbController.getPosterElementsList(); // returns a list of all PosterElements stored in the database
// add button onAction
for (PosterModeElement element : posterEmenents) {
element.getButton().addEventHandler(MouseEvent.MOUSE_CLICKED, (event) -> {
enableBlur(); // blur the FlowPane
// if the selected element is a file it's a film, else a series
if (new File(element.getStreamURL()).isFile()) {
filmDetailViewController.setFilm(element.getStreamURL());
filmDetailViewController.showPane();
} else {
filmDetailViewController.setFilm(element.getStreamURL());
filmDetailViewController.showPane();
}
System.out.println("selected: " + element.getStreamURL());
});
}
posterModeFlowPane.getChildren().clear(); // remove all GUIElements from the posterModeFlowPane
posterModeFlowPane.getChildren().addAll(posterEmenents); // add all films/series as new GUIElements to the posterModeFlowPane
System.out.println("added gui elements");
}
private void enableBlur() {
BoxBlur boxBlur = new BoxBlur();
boxBlur.setWidth(9);
boxBlur.setHeight(7);
boxBlur.setIterations(3);
posterModeFlowPane.setEffect(boxBlur);
}
public void disableBlur() {
posterModeFlowPane.setEffect(null);
}
// getter and setter

View File

@ -353,6 +353,50 @@ public class DBController {
}
}
/**
* return the favorite state for a stream
* @param streamURL URL of the stream
* @return 0 if it's not a favorite, else 1
*/
public int getFavoriteState(String streamURL) {
int favoriteState = 0;
PreparedStatement ps;
try {
ps = connection.prepareStatement("SELECT favorite FROM films WHERE streamUrl = ?");
ps.setString(1, streamURL);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
favoriteState = rs.getInt("favorite");
}
rs.close();
ps.close();
} catch (SQLException e) {
LOGGER.error("Ups! an error occured!", e);
}
return favoriteState;
}
public void toggleFavoriteState(String streamURL) {
PreparedStatement ps;
try {
if (getFavoriteState(streamURL) == 0) {
ps = connection.prepareStatement("UPDATE films SET favorite = 1 WHERE streamUrl = ?");
} else {
ps = connection.prepareStatement("UPDATE films SET favorite = 0 WHERE streamUrl = ?");
}
ps.setString(1, streamURL);
ps.executeUpdate();
connection.commit();
ps.close();
} catch (SQLException e) {
LOGGER.error("Ups! an error occured!", e);
}
}
/**
* update the database entry for the given film, favorite = 0
* @param streamUrl URL of the film