From 656c22d48a56dd2b12bea9374476cbed87a520e7 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Sun, 16 Jun 2019 21:44:42 +0200 Subject: [PATCH] added FilmDetailView * implemented the PosterMode basics * added some new 48dp icons --- .../HomeFlix/application/FilmDetailView.java | 173 ++++++++++++++++- .../application/MainWindowController.java | 66 +++++-- .../HomeFlix/controller/DBController.java | 44 +++++ src/main/resources/fxml/FilmDetailView.fxml | 175 +++++++++++++++++- .../icons/baseline_favorite_black_48dp.png | Bin 0 -> 429 bytes .../baseline_favorite_border_black_48dp.png | Bin 0 -> 652 bytes .../icons/baseline_folder_black_48dp.png | Bin 0 -> 194 bytes ...aseline_keyboard_arrow_down_black_48dp.png | Bin 0 -> 223 bytes ...aseline_keyboard_arrow_down_white_48dp.png | Bin 0 -> 224 bytes .../icons/baseline_list_black_48dp.png | Bin 0 -> 110 bytes .../icons/baseline_play_arrow_black_48dp.png | Bin 0 -> 199 bytes .../locals/HomeFlix-Local_de_DE.properties | 8 +- .../locals/HomeFlix-Local_en_US.properties | 10 +- 13 files changed, 443 insertions(+), 33 deletions(-) create mode 100755 src/main/resources/icons/baseline_favorite_black_48dp.png create mode 100755 src/main/resources/icons/baseline_favorite_border_black_48dp.png create mode 100755 src/main/resources/icons/baseline_folder_black_48dp.png create mode 100755 src/main/resources/icons/baseline_keyboard_arrow_down_black_48dp.png create mode 100755 src/main/resources/icons/baseline_keyboard_arrow_down_white_48dp.png create mode 100755 src/main/resources/icons/baseline_list_black_48dp.png create mode 100755 src/main/resources/icons/baseline_play_arrow_black_48dp.png diff --git a/src/main/java/kellerkinder/HomeFlix/application/FilmDetailView.java b/src/main/java/kellerkinder/HomeFlix/application/FilmDetailView.java index 9db14e6..e8f4299 100644 --- a/src/main/java/kellerkinder/HomeFlix/application/FilmDetailView.java +++ b/src/main/java/kellerkinder/HomeFlix/application/FilmDetailView.java @@ -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() { } diff --git a/src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java b/src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java index e8febb7..e9f324e 100644 --- a/src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java +++ b/src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java @@ -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 posterEmenents = FXCollections.observableArrayList(); private static ObservableList 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 diff --git a/src/main/java/kellerkinder/HomeFlix/controller/DBController.java b/src/main/java/kellerkinder/HomeFlix/controller/DBController.java index 3ecd905..0312c29 100644 --- a/src/main/java/kellerkinder/HomeFlix/controller/DBController.java +++ b/src/main/java/kellerkinder/HomeFlix/controller/DBController.java @@ -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 diff --git a/src/main/resources/fxml/FilmDetailView.fxml b/src/main/resources/fxml/FilmDetailView.fxml index 3faf40e..0674e8f 100644 --- a/src/main/resources/fxml/FilmDetailView.fxml +++ b/src/main/resources/fxml/FilmDetailView.fxml @@ -2,16 +2,18 @@ + + - + @@ -20,7 +22,7 @@ - @@ -50,12 +69,152 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - diff --git a/src/main/resources/icons/baseline_favorite_black_48dp.png b/src/main/resources/icons/baseline_favorite_black_48dp.png new file mode 100755 index 0000000000000000000000000000000000000000..41caa7ebba76bc34c30331db90c1a0ec6e975afb GIT binary patch literal 429 zcmV;e0aE^nP)_%lY+#L4yVj zkd<~h@2Rf--ngm7NaaRpamy=R{(9z|-Bu`MrejK?tl#z;0bry({)n!>W5;gi^kt!y6C+gJOU)1TXNsu}sGIfO1WSt^YohD1P zij1{NoEI6pAn{sc?6pLv$XKUDhsaom#8Z*6rxKS%#;!>05EHj$x=s+!=lXtGYr)UZaW$>rUqj(wtu4k+ME6L;tk1q^dXG@fV1C}^B^ z(O|zUP@G8~iQ@TYg$7M6{t53b)HqW;5e0f`rvEhE(*m!bq6t$x5H)&WiY86eE~?aS zq6|j6D$-mvS|&r&dsdsFvii4jf>8hf XLGa<15zUyF00000NkvXXu0mjf2U5hs literal 0 HcmV?d00001 diff --git a/src/main/resources/icons/baseline_favorite_border_black_48dp.png b/src/main/resources/icons/baseline_favorite_border_black_48dp.png new file mode 100755 index 0000000000000000000000000000000000000000..a696cfd15fb3f8b6c4a61893c6fa3dc8a46ceabf GIT binary patch literal 652 zcmV;70(1R|P)A!H%%s(j6N?OsgAa2tW%`{7ztwsyV=clLNU@`rL0HenkwbQiX1BC z8XDhJDG)0HWiM&GRi$vO2vI3-(YUBe#j&D*O1X%}CRG}Y6&+Q|W;A-K(oL+mpi+9F z5hF)=4V+a;GNRG3TdpOZIOm*7*p04IGXFT7(M*m0NgfPrke2FB+y&pM(X%m>Nt)g{ zct!_tQ;obwASP6*vGD_L1T@=Ig|T2o*A5nA~9_3fY} sQM3JvIJ~9`9zXKf{a1+Lu{|Fc;vY?^@$}Q540IHOr>mdKI;Vst096o1q5uE@ literal 0 HcmV?d00001 diff --git a/src/main/resources/icons/baseline_keyboard_arrow_down_black_48dp.png b/src/main/resources/icons/baseline_keyboard_arrow_down_black_48dp.png new file mode 100755 index 0000000000000000000000000000000000000000..f984862cd070abc9c760527a310400fd47932327 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0DWu7jMAr*{o&o;8P1PHi2WEK%B zlCR z)LGI}W=xHZP0Fl?pQkTYjPm|*&!cdH{C|7hi$c5Zwm28{* literal 0 HcmV?d00001 diff --git a/src/main/resources/icons/baseline_keyboard_arrow_down_white_48dp.png b/src/main/resources/icons/baseline_keyboard_arrow_down_white_48dp.png new file mode 100755 index 0000000000000000000000000000000000000000..f31e4c8e4b0b7bb3a69297e0832386526db3022b GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0D<(@8%Ar*{o&oZ*L1c*3XWET+< ze5kLiaADGIM+TOI?h`IbDK%I(R|@#vd&2x)=RsUy`JCc&7lTglaz*{*m$epN`p4nq z5kK{^FER{gLW&x@BpaIJ)<^_Qe5E8G*c>s@aFNp1IRV0f$}>-FKI&9^O8@zv&#ubx zCT)8XHwryzK9F@vT1>j}K-xKJG5zX$J3J;_cRjR6Pv}|cM1%F*XVsnj^wQ2*KEES< Xahs}9rs_?Q9~eAc{an^LB{Ts5^8r+r literal 0 HcmV?d00001 diff --git a/src/main/resources/icons/baseline_list_black_48dp.png b/src/main/resources/icons/baseline_list_black_48dp.png new file mode 100755 index 0000000000000000000000000000000000000000..3351e6fbd862df92c866a3143c54fd07fcc5746d GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCQ%@JikP61PS2l7oFmNzCevgl; zj&=;X<4r literal 0 HcmV?d00001 diff --git a/src/main/resources/icons/baseline_play_arrow_black_48dp.png b/src/main/resources/icons/baseline_play_arrow_black_48dp.png new file mode 100755 index 0000000000000000000000000000000000000000..30967bc288ed3f74c90ae186e25eaa9c00d2c162 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0DK2I0NkP61P(+mY03w#tUz?%N6oc x?yd_C_bEJ%wP2C_c1it2fqfjyO+C*^A}(r1mptpL_5oeS;OXk;vd$@?2>`K|MZN$4 literal 0 HcmV?d00001 diff --git a/src/main/resources/locals/HomeFlix-Local_de_DE.properties b/src/main/resources/locals/HomeFlix-Local_de_DE.properties index f93973c..5363deb 100644 --- a/src/main/resources/locals/HomeFlix-Local_de_DE.properties +++ b/src/main/resources/locals/HomeFlix-Local_de_DE.properties @@ -43,8 +43,8 @@ season = Staffel episode = Episode runtime = Laufzeit genre = Gener -director = Regisseur -writer = Autor +directors = Regisseur +writers = Autoren actors = Schauspieler plot = Beschreibung language = Original Sprache @@ -60,3 +60,7 @@ website = Webseite addSourceHeader = Neue Quelle hinzuf\u00FCgen addSourceBody = HomeFlix konnte keine Quelle finden. \nFüge eine loakels Verzeichniss oder eine Sreaming Datei als neue Quelle hinzu. cancelBtnText = Abbrechen + +#DetailView +crew = Haupt-Crew +score = Benutzerbewertung diff --git a/src/main/resources/locals/HomeFlix-Local_en_US.properties b/src/main/resources/locals/HomeFlix-Local_en_US.properties index a3db43f..c303d44 100644 --- a/src/main/resources/locals/HomeFlix-Local_en_US.properties +++ b/src/main/resources/locals/HomeFlix-Local_en_US.properties @@ -41,10 +41,10 @@ rated = Rating released = published on season = Season episode = Episode -runtime = Duration +runtime = Runtime genre = Gener -director = Director -writer = Writer +directors = Directors +writers = Writers actors = Actors plot = Plot language = Language @@ -60,3 +60,7 @@ website = Website addSourceHeader = add a new source addSourceBody = HomeFlix was not able to load a source. \nAdd a new local directory oa a streaming file as new source. cancelBtnText = cancel + +#DetailView +crew = Featured Crew +score = User Score