976 lines
33 KiB
Java
976 lines
33 KiB
Java
package application;
|
||
|
||
import java.awt.Graphics2D;
|
||
import java.awt.image.BufferedImage;
|
||
import java.io.File;
|
||
import java.io.FileInputStream;
|
||
import java.io.FileOutputStream;
|
||
import java.io.IOException;
|
||
import java.io.InputStream;
|
||
import java.io.OutputStream;
|
||
import java.math.BigInteger;
|
||
import java.sql.SQLException;
|
||
import java.time.LocalDate;
|
||
import java.time.format.DateTimeFormatter;
|
||
import java.util.ArrayList;
|
||
import java.util.Optional;
|
||
import java.util.Properties;
|
||
import javax.imageio.ImageIO;
|
||
|
||
import org.apache.commons.io.FileUtils;
|
||
|
||
import com.jfoenix.controls.JFXButton;
|
||
import com.jfoenix.controls.JFXColorPicker;
|
||
import com.jfoenix.controls.JFXHamburger;
|
||
import com.jfoenix.controls.JFXTextField;
|
||
import com.jfoenix.controls.JFXToggleButton;
|
||
import com.jfoenix.transitions.hamburger.HamburgerBackArrowBasicTransition;
|
||
import javafx.animation.FadeTransition;
|
||
import javafx.animation.ParallelTransition;
|
||
import javafx.animation.TranslateTransition;
|
||
import javafx.event.ActionEvent;
|
||
import javafx.event.EventHandler;
|
||
import javafx.fxml.FXML;
|
||
import javafx.geometry.Insets;
|
||
import javafx.scene.control.Alert;
|
||
import javafx.scene.control.Alert.AlertType;
|
||
import javafx.scene.control.ButtonType;
|
||
import javafx.scene.control.ContextMenu;
|
||
import javafx.scene.control.Label;
|
||
import javafx.scene.control.MenuItem;
|
||
import javafx.scene.control.ScrollPane;
|
||
import javafx.scene.control.TextInputDialog;
|
||
import javafx.scene.image.Image;
|
||
import javafx.scene.image.ImageView;
|
||
import javafx.scene.input.MouseEvent;
|
||
import javafx.scene.layout.AnchorPane;
|
||
import javafx.scene.layout.HBox;
|
||
import javafx.scene.layout.VBox;
|
||
import javafx.scene.paint.Color;
|
||
import javafx.scene.paint.Paint;
|
||
import javafx.scene.text.Font;
|
||
import javafx.scene.text.FontWeight;
|
||
import javafx.stage.DirectoryChooser;
|
||
import javafx.stage.FileChooser;
|
||
import javafx.util.Duration;
|
||
|
||
public class MainWindowController {
|
||
|
||
@FXML
|
||
private JFXButton aboutBtn;
|
||
|
||
@FXML
|
||
private JFXButton settingsBtn;
|
||
|
||
@FXML
|
||
private JFXButton addBtn;
|
||
|
||
@FXML
|
||
private JFXButton reloadRomsBtn;
|
||
|
||
@FXML
|
||
private JFXButton cemuTFBtn;
|
||
|
||
@FXML
|
||
private JFXButton romTFBtn;
|
||
|
||
@FXML
|
||
private JFXButton playBtn;
|
||
|
||
@FXML
|
||
JFXButton timePlayedBtn;
|
||
|
||
@FXML
|
||
private JFXButton lastTimePlayedBtn;
|
||
|
||
@FXML
|
||
private JFXHamburger menuHam;
|
||
|
||
@FXML
|
||
private JFXTextField cemuTextField;
|
||
|
||
@FXML
|
||
private JFXTextField romTextField;
|
||
|
||
@FXML
|
||
private JFXColorPicker colorPicker;
|
||
|
||
@FXML
|
||
private JFXToggleButton fullscreenToggleBtn;
|
||
|
||
@FXML
|
||
private AnchorPane settingsAnchorPane;
|
||
|
||
@FXML
|
||
private AnchorPane gamesAnchorPane;
|
||
|
||
@FXML
|
||
private ScrollPane scrollPaneMain;
|
||
|
||
@FXML
|
||
private VBox sideMenuVBox;
|
||
|
||
@FXML
|
||
private HBox topHBox;
|
||
|
||
Main main;
|
||
dbController dbController;
|
||
playGame playGame;
|
||
private boolean menuTrue = false;
|
||
private boolean settingsTrue = false;
|
||
private boolean playTrue = false;
|
||
private boolean fullscreen;
|
||
private String cemuPath;
|
||
private String romPath;
|
||
private String gameExecutePath;
|
||
private String selectedGameTitleID;
|
||
private String selectedGameTitle;
|
||
private String color;
|
||
private String version = "0.1.2";
|
||
private String buildNumber = "001";
|
||
@SuppressWarnings("unused")
|
||
private String versionName = "";
|
||
private int xPos = -200;
|
||
private int yPos = 17;
|
||
private int xPosHelper;
|
||
private FileChooser fileChooser = new FileChooser();
|
||
private DirectoryChooser directoryChooser = new DirectoryChooser();
|
||
private File dirWin = new File(System.getProperty("user.home") + "/Documents/cemu_UI");
|
||
private File dirLinux = new File(System.getProperty("user.home") + "/cemu_UI");
|
||
private File fileWin = new File(dirWin + "/config.xml");
|
||
private File fileLinux = new File(dirLinux + "/config.xml");
|
||
File pictureCacheWin = new File(dirWin+"/picture_cache");
|
||
File pictureCacheLinux = new File(dirLinux+"/picture_cache");
|
||
private ArrayList<JFXButton> gameCover = new ArrayList<JFXButton>();
|
||
private ArrayList<Label> gameLabel = new ArrayList<Label>();
|
||
private ArrayList<VBox> gameVBox = new ArrayList<VBox>();
|
||
Properties props = new Properties();
|
||
Properties gameProps = new Properties();
|
||
private MenuItem edit = new MenuItem("edit");
|
||
private MenuItem remove = new MenuItem("remove");
|
||
private MenuItem update = new MenuItem("update");
|
||
private MenuItem addDLC = new MenuItem("add DLC");
|
||
private ContextMenu gameContextMenu = new ContextMenu(edit, remove, update, addDLC);
|
||
private MouseEvent selectedEvent;
|
||
private Label lastGameLabel = new Label();
|
||
|
||
private ImageView add_circle_black = new ImageView(new Image("recources/icons/ic_add_circle_black_24dp_1x.png"));
|
||
private ImageView info_black = new ImageView(new Image("recources/icons/ic_info_black_24dp_1x.png"));
|
||
private ImageView settings_black = new ImageView(new Image("recources/icons/ic_settings_black_24dp_1x.png"));
|
||
private ImageView cached_black = new ImageView(new Image("recources/icons/ic_cached_black_24dp_1x.png"));
|
||
private ImageView add_circle_white = new ImageView(new Image("recources/icons/ic_add_circle_white_24dp_1x.png"));
|
||
private ImageView info_white = new ImageView(new Image("recources/icons/ic_info_white_24dp_1x.png"));
|
||
private ImageView settings_white = new ImageView(new Image("recources/icons/ic_settings_white_24dp_1x.png"));
|
||
private ImageView cached_white = new ImageView(new Image("recources/icons/ic_cached_white_24dp_1x.png"));
|
||
|
||
public void setMain(Main main) {
|
||
this.main = main;
|
||
dbController = new dbController(this);
|
||
}
|
||
|
||
void initUI(){
|
||
cemuTextField.setText(cemuPath);
|
||
romTextField.setText(romPath);
|
||
colorPicker.setValue(Color.valueOf(getColor()));
|
||
fullscreenToggleBtn.setSelected(isFullscreen());
|
||
edit.setDisable(true);
|
||
applyColor();
|
||
}
|
||
|
||
void initActions() {
|
||
System.out.print("initializing Actions... ");
|
||
|
||
HamburgerBackArrowBasicTransition burgerTask = new HamburgerBackArrowBasicTransition(menuHam);
|
||
menuHam.addEventHandler(MouseEvent.MOUSE_PRESSED, (e)->{
|
||
if(playTrue){
|
||
playBtnSlideOut();
|
||
}
|
||
if(menuTrue == false){
|
||
sideMenuSlideIn();
|
||
burgerTask.setRate(1.0);
|
||
burgerTask.play();
|
||
menuTrue = true;
|
||
}else{
|
||
sideMenuSlideOut();
|
||
burgerTask.setRate(-1.0);
|
||
burgerTask.play();
|
||
menuTrue = false;
|
||
}
|
||
if(settingsTrue == true){
|
||
settingsAnchorPane.setVisible(false);
|
||
// setPath(tfPath.getText());
|
||
saveSettings();
|
||
settingsTrue = false;
|
||
}
|
||
});
|
||
|
||
edit.setOnAction(new EventHandler<ActionEvent>() {
|
||
@Override
|
||
public void handle(ActionEvent event) {
|
||
System.out.println("edit "+selectedGameTitleID);
|
||
if(selectedGameTitleID == null){
|
||
System.out.println("trying to edit null! null is not valid!");
|
||
Alert alert = new Alert(AlertType.WARNING);
|
||
alert.setTitle("edit");
|
||
alert.setHeaderText("cemu_UI");
|
||
alert.setContentText("please select a game, \""+selectedGameTitleID+"\" is not a valid type");
|
||
alert.initOwner(main.primaryStage);
|
||
alert.showAndWait();
|
||
}else{
|
||
System.out.println("show edit window TODO!"); //TODO
|
||
}
|
||
}
|
||
});
|
||
|
||
remove.setOnAction(new EventHandler<ActionEvent>() {
|
||
@Override
|
||
public void handle(ActionEvent event) {
|
||
System.out.println("remove "+selectedGameTitleID);
|
||
if(selectedGameTitleID == null){
|
||
System.out.println("trying to remove null! null is not valid!");
|
||
Alert alert = new Alert(AlertType.WARNING);
|
||
alert.setTitle("remove");
|
||
alert.setHeaderText("cemu_UI");
|
||
alert.setContentText("please select a game, \""+selectedGameTitleID+"\" is not a valid type");
|
||
|
||
alert.initOwner(main.primaryStage);
|
||
alert.showAndWait();
|
||
}
|
||
else{
|
||
int i = gameCover.indexOf((selectedEvent).getSource());
|
||
|
||
Alert alert = new Alert(AlertType.CONFIRMATION);
|
||
alert.setTitle("remove");
|
||
alert.setHeaderText("cemu_UI");
|
||
alert.setContentText("Are you sure you want to delete "+selectedGameTitle+" ?");
|
||
alert.initOwner(main.primaryStage);
|
||
|
||
Optional<ButtonType> result = alert.showAndWait();
|
||
if (result.get() == ButtonType.OK){
|
||
try {
|
||
gameVBox.remove(i);
|
||
gameCover.remove(i);
|
||
gameLabel.remove(i);
|
||
dbController.removeRom(selectedGameTitleID);
|
||
gamesAnchorPane.getChildren().remove(i);
|
||
|
||
//TODO remove if animations are done
|
||
Runtime.getRuntime().exec("java -jar cemu_UI.jar"); //start again (preventing Bugs)
|
||
System.exit(0); //finishes itself
|
||
|
||
} catch (SQLException | IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
|
||
//TODO nachr<68>ck animation
|
||
// platz(i)/4 -> aufrunden = Reihe; plath(i)-(platz(i)/4 -> abrunden*4)
|
||
// jetzt haben wir den platz des gel<65>schten elements und l<>nnen alle nachfolgenden nachr<68>cken
|
||
// double a = 13;
|
||
// double b = 4;
|
||
// a = a/b;
|
||
// System.out.println(Math.ceil(a)); //aufrunden
|
||
// System.out.println(Math.floor(a)); //abrunden
|
||
}
|
||
}
|
||
});
|
||
|
||
update.setOnAction(new EventHandler<ActionEvent>() {
|
||
@Override
|
||
public void handle(ActionEvent event) {
|
||
String titleID = selectedGameTitleID;
|
||
String updatePath;
|
||
System.out.println("update: "+selectedGameTitleID);
|
||
if(selectedGameTitleID == null){
|
||
System.out.println("trying to update null! null is not valid!");
|
||
Alert alert = new Alert(AlertType.WARNING);
|
||
alert.setTitle("edit");
|
||
alert.setHeaderText("cemu_UI");
|
||
alert.setContentText("please select a game, \""+selectedGameTitleID+"\" is not a valid type");
|
||
alert.initOwner(main.primaryStage);
|
||
alert.showAndWait();
|
||
}else{
|
||
Alert updateAlert = new Alert(AlertType.CONFIRMATION); //new alert with file-chooser
|
||
updateAlert.setTitle("cemu_UI");
|
||
updateAlert.setHeaderText("update "+selectedGameTitle);
|
||
updateAlert.setContentText("pleas select the update root directory");
|
||
updateAlert.initOwner(main.primaryStage);
|
||
|
||
Optional<ButtonType> result = updateAlert.showAndWait();
|
||
if (result.get() == ButtonType.OK){
|
||
DirectoryChooser directoryChooser = new DirectoryChooser();
|
||
File selectedDirecroty = directoryChooser.showDialog(main.primaryStage);
|
||
updatePath = selectedDirecroty.getAbsolutePath();
|
||
String[] parts = titleID.split("-"); //split string into 2 parts at "-"
|
||
|
||
File srcDir = new File(updatePath);
|
||
File destDir = new File(cemuPath+"\\mlc01\\usr\\title\\"+parts[0]+"\\"+parts[1]);
|
||
|
||
System.out.println(updatePath);
|
||
System.out.println(destDir.toString());
|
||
|
||
if(destDir.exists() != true){
|
||
destDir.mkdir();
|
||
}
|
||
|
||
try {
|
||
System.out.println("copying files...");
|
||
playBtn.setText("updating...");
|
||
playBtn.setDisable(true);
|
||
FileUtils.copyDirectory(srcDir, destDir); //TODO progress indicator
|
||
playBtn.setText("play");
|
||
playBtn.setDisable(false);
|
||
System.out.println("done!");
|
||
} catch (IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
} else {
|
||
updatePath = null;
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
addDLC.setOnAction(new EventHandler<ActionEvent>() {
|
||
@Override
|
||
public void handle(ActionEvent event) {
|
||
String titleID = selectedGameTitleID;
|
||
String dlcPath;
|
||
|
||
System.out.println("add DLC: "+selectedGameTitleID);
|
||
if(selectedGameTitleID == null){
|
||
System.out.println("trying to add a dlc to null! null is not valid!");
|
||
Alert alert = new Alert(AlertType.WARNING);
|
||
alert.setTitle("add DLC");
|
||
alert.setHeaderText("cemu_UI");
|
||
alert.setContentText("please select a game, \""+selectedGameTitleID+"\" is not a valid type");
|
||
alert.initOwner(main.primaryStage);
|
||
alert.showAndWait();
|
||
}else{
|
||
Alert updateAlert = new Alert(AlertType.CONFIRMATION); //new alert with file-chooser
|
||
updateAlert.setTitle("cemu_UI");
|
||
updateAlert.setHeaderText("add a DLC to "+selectedGameTitle);
|
||
updateAlert.setContentText("pleas select the DLC root directory");
|
||
updateAlert.initOwner(main.primaryStage);
|
||
|
||
Optional<ButtonType> result = updateAlert.showAndWait();
|
||
if (result.get() == ButtonType.OK){
|
||
DirectoryChooser directoryChooser = new DirectoryChooser();
|
||
File selectedDirecroty = directoryChooser.showDialog(main.primaryStage);
|
||
dlcPath = selectedDirecroty.getAbsolutePath();
|
||
String[] parts = titleID.split("-"); //split string into 2 parts at "-"
|
||
|
||
File srcDir = new File(dlcPath);
|
||
File destDir = new File(cemuPath+"\\mlc01\\usr\\title\\"+parts[0]+"\\"+parts[1]+"\\aoc");
|
||
|
||
System.out.println(dlcPath);
|
||
System.out.println(destDir.toString());
|
||
|
||
if(destDir.exists() != true){
|
||
destDir.mkdir();
|
||
}
|
||
|
||
try {
|
||
System.out.println("copying files...");
|
||
playBtn.setText("copying files...");
|
||
playBtn.setDisable(true);
|
||
FileUtils.copyDirectory(srcDir, destDir); //TODO progress indicator
|
||
playBtn.setText("play");
|
||
playBtn.setDisable(false);
|
||
System.out.println("done!");
|
||
} catch (IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
} else {
|
||
dlcPath = null;
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
gamesAnchorPane.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
|
||
@Override
|
||
public void handle(MouseEvent event) {
|
||
if (playTrue) {
|
||
playBtnSlideOut();
|
||
}
|
||
}
|
||
});
|
||
|
||
topHBox.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
|
||
@Override
|
||
public void handle(MouseEvent event) {
|
||
if (playTrue) {
|
||
playBtnSlideOut();
|
||
}
|
||
}
|
||
});
|
||
System.out.println("done!");
|
||
}
|
||
|
||
@FXML
|
||
void detailsSlideoutBtnAction(ActionEvent event){
|
||
playBtnSlideOut();
|
||
}
|
||
|
||
@FXML
|
||
void aboutBtnAction(){
|
||
Alert alert = new Alert(AlertType.INFORMATION);
|
||
alert.setTitle("about");
|
||
alert.setHeaderText("cemu_UI");
|
||
alert.setContentText("cemu_UI by @Seil0 \npre release "+version+" ("+buildNumber+") \nwww.kellerkinder.xyz");
|
||
alert.initOwner(main.primaryStage);
|
||
alert.showAndWait();
|
||
}
|
||
|
||
@FXML
|
||
void settingsBtnAction(ActionEvent event) {
|
||
if(settingsTrue == false){
|
||
settingsAnchorPane.setVisible(true);
|
||
settingsTrue = true;
|
||
}else{
|
||
settingsAnchorPane.setVisible(false);
|
||
saveSettings();
|
||
settingsTrue = false;
|
||
}
|
||
}
|
||
|
||
@FXML
|
||
void reloadRomsBtnAction() throws IOException{
|
||
reloadRomsBtn.setText("reloading...");
|
||
dbController.loadRomDirectory(getRomPath()); //TODO own thread
|
||
Runtime.getRuntime().exec("java -jar cemu_UI.jar"); //start again (preventing Bugs)
|
||
System.exit(0); //finishes itself
|
||
}
|
||
|
||
@FXML
|
||
void playBtnAction(ActionEvent event) throws InterruptedException, IOException{
|
||
dbController.setLastPlayed(selectedGameTitleID);
|
||
playGame = new playGame(this,dbController);
|
||
|
||
playGame.start();
|
||
}
|
||
|
||
@FXML
|
||
void timePlayedBtnAction(ActionEvent event){
|
||
|
||
}
|
||
|
||
@FXML
|
||
void lastTimePlayedBtnAction(ActionEvent event){
|
||
|
||
}
|
||
|
||
@FXML
|
||
void cemuTFBtnAction(ActionEvent event) {
|
||
File cemuDirectory = fileChooser.showOpenDialog(main.primaryStage);
|
||
if(cemuDirectory == null){
|
||
System.out.println("No Directory selected");
|
||
}else{
|
||
setCemuPath(cemuDirectory.getAbsolutePath());
|
||
saveSettings();
|
||
cemuTextField.setText(getCemuPath());
|
||
try {
|
||
Runtime.getRuntime().exec("java -jar ProjectHomeFlix.jar"); //start again
|
||
System.exit(0); //finishes itself
|
||
} catch (IOException e) {
|
||
System.out.println("es ist ein Fehler aufgetreten");
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
}
|
||
|
||
@FXML
|
||
void romTFBtnAction(ActionEvent event) {
|
||
File romDirectory = directoryChooser.showDialog(main.primaryStage);
|
||
if(romDirectory == null){
|
||
System.out.println("No Directory selected");
|
||
}else{
|
||
setRomPath(romDirectory.getAbsolutePath());
|
||
saveSettings();
|
||
cemuTextField.setText(getCemuPath());
|
||
try {
|
||
Runtime.getRuntime().exec("java -jar ProjectHomeFlix.jar"); //start again
|
||
System.exit(0); //finishes itself
|
||
} catch (IOException e) {
|
||
System.out.println("es ist ein Fehler aufgetreten");
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
}
|
||
|
||
@FXML
|
||
void cemuTextFieldAction(ActionEvent event){
|
||
setCemuPath(cemuTextField.getText());
|
||
saveSettings();
|
||
}
|
||
|
||
@FXML
|
||
void romTextFieldAction(ActionEvent event){
|
||
setRomPath(romTextField.getText());
|
||
saveSettings();
|
||
}
|
||
|
||
@FXML
|
||
void fullscreenToggleBtnAction(ActionEvent event){
|
||
if(fullscreen){
|
||
fullscreen = false;
|
||
}else{
|
||
fullscreen = true;
|
||
}
|
||
saveSettings();
|
||
}
|
||
|
||
@FXML
|
||
void colorPickerAction(ActionEvent event){
|
||
editColor(colorPicker.getValue().toString());
|
||
applyColor();
|
||
}
|
||
|
||
@FXML
|
||
void addBtnAction(ActionEvent event){
|
||
boolean exit = false;
|
||
String romPath = null;
|
||
String coverPath = null;
|
||
String coverName = null;
|
||
String title = null;
|
||
String titleID = null;
|
||
File pictureCache;
|
||
|
||
TextInputDialog titleDialog = new TextInputDialog();
|
||
titleDialog.setTitle("cemu_UI");
|
||
titleDialog.setHeaderText("add new Game");
|
||
titleDialog.setContentText("Please enter the name of the game you want to add:");
|
||
titleDialog.initOwner(main.primaryStage);
|
||
|
||
Optional<String> titleResult = titleDialog.showAndWait();
|
||
if (titleResult.isPresent()){
|
||
title = titleResult.get();
|
||
}else{
|
||
exit = true;
|
||
}
|
||
|
||
if(exit == false){
|
||
TextInputDialog titleIDDialog = new TextInputDialog();
|
||
titleIDDialog.setTitle("cemu_UI");
|
||
titleIDDialog.setHeaderText("add new Game");
|
||
titleIDDialog.setContentText("Please enter the title-ID (12345678-12345678) \nof the game you want to add:");
|
||
titleIDDialog.initOwner(main.primaryStage);
|
||
|
||
Optional<String> titleIDResult = titleIDDialog.showAndWait();
|
||
if (titleIDResult.isPresent()){
|
||
titleID = titleIDResult.get();
|
||
}else{
|
||
exit = true;
|
||
}
|
||
}
|
||
|
||
if(exit == false){
|
||
Alert romAlert = new Alert(AlertType.CONFIRMATION); //new alert with file-chooser
|
||
romAlert.setTitle("cemu_UI");
|
||
romAlert.setHeaderText("add new Game");
|
||
romAlert.setContentText("Please select the .rpx file from the game you want to add.");
|
||
romAlert.initOwner(main.primaryStage);
|
||
|
||
Optional<ButtonType> result = romAlert.showAndWait();
|
||
if (result.get() == ButtonType.OK){
|
||
FileChooser directoryChooser = new FileChooser();
|
||
File selectedDirectory = directoryChooser.showOpenDialog(main.primaryStage);
|
||
romPath = selectedDirectory.getAbsolutePath();
|
||
} else {
|
||
exit = true;
|
||
}
|
||
}
|
||
|
||
if(exit == false){
|
||
Alert coverAlert = new Alert(AlertType.CONFIRMATION); //new alert with file-chooser
|
||
coverAlert.setTitle("cemu_UI");
|
||
coverAlert.setHeaderText("add new Game");
|
||
coverAlert.setContentText("Please select the cover for the game you want to add.");
|
||
coverAlert.initOwner(main.primaryStage);
|
||
|
||
Optional<ButtonType> coverResult = coverAlert.showAndWait();
|
||
if (coverResult.get() == ButtonType.OK){
|
||
FileChooser directoryChooser = new FileChooser();
|
||
File selectedDirectory = directoryChooser.showOpenDialog(main.primaryStage);
|
||
coverPath = selectedDirectory.getAbsolutePath();
|
||
} else {
|
||
exit = true;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* if exit == true then don't add a rom
|
||
* else convert the cover to .png add copy it into the picture cache
|
||
* then add the rom to the local_roms database
|
||
*/
|
||
if(exit){
|
||
System.out.println("No parameter set!");
|
||
}else{
|
||
coverName = new File(coverPath).getName();
|
||
try {
|
||
if(System.getProperty("os.name").equals("Linux")){
|
||
pictureCache = pictureCacheLinux;
|
||
}else{
|
||
pictureCache = pictureCacheWin;
|
||
}
|
||
|
||
BufferedImage originalImage = ImageIO.read(new File(coverPath));//load cover
|
||
int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
|
||
BufferedImage resizeImagePNG = resizeImage(originalImage, type, 400, 600);
|
||
ImageIO.write(resizeImagePNG, "png", new File(pictureCache+"\\"+coverName)); //save image to pictureCache
|
||
coverPath = pictureCache+"\\"+coverName;
|
||
} catch (IOException e) {
|
||
System.out.println("Ops something went wrong!");
|
||
}
|
||
|
||
try {
|
||
dbController.addRom(title, coverPath, romPath, titleID, "", "", "", "0");
|
||
dbController.loadSingleRom(titleID);
|
||
} catch (SQLException e) {
|
||
// Auto-generated catch block
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
}
|
||
|
||
void addGame(String title, String coverPath, String romPath, String titleID){
|
||
ImageView imageView = new ImageView();
|
||
Label gameTitleLabel = new Label(title);
|
||
File coverFile = new File(coverPath);
|
||
VBox VBox = new VBox();
|
||
JFXButton gameBtn = new JFXButton();
|
||
Image coverImage = new Image(coverFile.toURI().toString());
|
||
|
||
generatePosition();
|
||
gameVBox.add(VBox);
|
||
gameCover.add(gameBtn);
|
||
gameLabel.add(gameTitleLabel);
|
||
gameTitleLabel.setMaxWidth(200);
|
||
gameTitleLabel.setPadding(new Insets(0,0,0,8));
|
||
imageView.setImage(coverImage);
|
||
imageView.setFitHeight(300);
|
||
imageView.setFitWidth(200);
|
||
gameBtn.setGraphic(imageView);
|
||
gameBtn.setContextMenu(gameContextMenu);
|
||
gameBtn.setStyle("-fx-effect: dropshadow(three-pass-box, rgba(0,0,0,0.8), 10, 0, 0, 3); ");
|
||
gameBtn.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
|
||
@Override
|
||
public void handle(MouseEvent event) {
|
||
System.out.println("selected: "+title+"; ID: "+titleID);
|
||
|
||
gameExecutePath = romPath;
|
||
selectedGameTitleID = titleID;
|
||
selectedGameTitle = title;
|
||
selectedEvent = event;
|
||
|
||
lastGameLabel.setStyle("-fx-underline: false;");
|
||
gameLabel.get(gameCover.indexOf(event.getSource())).setStyle("-fx-underline: true;");
|
||
lastGameLabel = gameLabel.get(gameCover.indexOf(event.getSource()));
|
||
|
||
if(dbController.getLastPlayed(titleID).equals("") || dbController.getLastPlayed(titleID).equals(null)){
|
||
lastTimePlayedBtn.setText("Last played, never");
|
||
timePlayedBtn.setText(dbController.getTimePlayed(titleID)+ " min");
|
||
}else{
|
||
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
||
|
||
int localInt = Integer.parseInt(dtf.format(LocalDate.now()).replaceAll("-", ""));
|
||
int lastInt = Integer.parseInt(dbController.getLastPlayed(titleID).replaceAll("-", ""));
|
||
|
||
if(localInt == lastInt){
|
||
lastTimePlayedBtn.setText("Last played, today");
|
||
}else if(localInt-1 == lastInt){
|
||
lastTimePlayedBtn.setText("Last played, yesterday");
|
||
}else{
|
||
lastTimePlayedBtn.setText("Last played, "+dbController.getLastPlayed(titleID));
|
||
}
|
||
if(Integer.parseInt(dbController.getTimePlayed(titleID)) > 60){
|
||
int hoursPlayed = (int) Math.floor(Integer.parseInt(dbController.getTimePlayed(titleID))/60);
|
||
int minutesPlayed = Integer.parseInt(dbController.getTimePlayed(titleID))-60*hoursPlayed;
|
||
timePlayedBtn.setText(hoursPlayed+"h "+minutesPlayed+"min");
|
||
}else{
|
||
timePlayedBtn.setText(dbController.getTimePlayed(titleID)+ " min");
|
||
}
|
||
}
|
||
|
||
if(playTrue == false){
|
||
playBtnSlideIn();
|
||
}
|
||
}
|
||
});
|
||
|
||
gameTitleLabel.setFont(Font.font("System", FontWeight.BOLD, 14));
|
||
VBox.getChildren().addAll(gameTitleLabel,gameBtn);
|
||
VBox.setLayoutX(getxPos());
|
||
VBox.setLayoutY(getyPos());
|
||
gamesAnchorPane.getChildren().add(VBox);
|
||
}
|
||
|
||
|
||
private void generatePosition(){
|
||
if(xPosHelper == 4){
|
||
xPos = 17;
|
||
yPos = yPos + 345;
|
||
xPosHelper = 1;
|
||
}else{
|
||
xPos = xPos + 217;
|
||
xPosHelper++;
|
||
}
|
||
}
|
||
|
||
private void applyColor(){
|
||
String boxStyle = "-fx-background-color: #"+getColor()+";";
|
||
String btnStyleBlack = "-fx-button-type: RAISED; -fx-background-color: #"+getColor()+"; -fx-text-fill: BLACK;";
|
||
String btnStyleWhite = "-fx-button-type: RAISED; -fx-background-color: #"+getColor()+"; -fx-text-fill: WHITE;";
|
||
BigInteger icolor = new BigInteger(getColor(),16);
|
||
BigInteger ccolor = new BigInteger("78909cff",16);
|
||
getColor();
|
||
|
||
sideMenuVBox.setStyle(boxStyle);
|
||
topHBox.setStyle(boxStyle);
|
||
cemuTextField.setFocusColor(Color.valueOf(getColor()));
|
||
romTextField.setFocusColor(Color.valueOf(getColor()));
|
||
|
||
if(icolor.compareTo(ccolor) == -1){
|
||
aboutBtn.setStyle("-fx-text-fill: WHITE;");
|
||
settingsBtn.setStyle("-fx-text-fill: WHITE;");
|
||
addBtn.setStyle("-fx-text-fill: WHITE;");
|
||
reloadRomsBtn.setStyle("-fx-text-fill: WHITE;");
|
||
playBtn.setStyle("-fx-text-fill: WHITE; -fx-font-family: Roboto Medium;");
|
||
cemuTFBtn.setStyle(btnStyleWhite);
|
||
romTFBtn.setStyle(btnStyleWhite);
|
||
playBtn.setStyle(btnStyleWhite);
|
||
|
||
aboutBtn.setGraphic(info_white);
|
||
settingsBtn.setGraphic(settings_white);
|
||
addBtn.setGraphic(add_circle_white);
|
||
reloadRomsBtn.setGraphic(cached_white);
|
||
|
||
menuHam.getStyleClass().add("jfx-hamburgerW");
|
||
}else{
|
||
aboutBtn.setStyle("-fx-text-fill: BLACK;");
|
||
settingsBtn.setStyle("-fx-text-fill: BLACK;");
|
||
addBtn.setStyle("-fx-text-fill: BLACK;");
|
||
reloadRomsBtn.setStyle("-fx-text-fill: BLACK;");
|
||
playBtn.setStyle("-fx-text-fill: BLACK; -fx-font-family: Roboto Medium;");
|
||
cemuTFBtn.setStyle(btnStyleBlack);
|
||
romTFBtn.setStyle(btnStyleBlack);
|
||
playBtn.setStyle(btnStyleBlack);
|
||
|
||
aboutBtn.setGraphic(info_black);
|
||
settingsBtn.setGraphic(settings_black);
|
||
addBtn.setGraphic(add_circle_black);
|
||
reloadRomsBtn.setGraphic(cached_black);
|
||
|
||
menuHam.getStyleClass().add("jfx-hamburgerB");
|
||
}
|
||
|
||
for(int i=0; i<gameCover.size(); i++){
|
||
gameCover.get(i).setRipplerFill(Paint.valueOf(getColor()));
|
||
}
|
||
}
|
||
|
||
void saveSettings(){
|
||
System.out.print("saving Settings... ");
|
||
OutputStream outputStream; //new output-stream
|
||
try {
|
||
props.setProperty("cemuPath", getCemuPath());
|
||
props.setProperty("romPath", getRomPath());
|
||
props.setProperty("color", getColor());
|
||
props.setProperty("fullscreen", String.valueOf(isFullscreen()));
|
||
if(System.getProperty("os.name").equals("Linux")){
|
||
outputStream = new FileOutputStream(fileLinux);
|
||
}else{
|
||
outputStream = new FileOutputStream(fileWin);
|
||
}
|
||
props.storeToXML(outputStream, "cemu_UI settings"); //write new .xml
|
||
outputStream.close();
|
||
System.out.println("done!");
|
||
} catch (IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
|
||
void loadSettings(){
|
||
System.out.print("loading settings... ");
|
||
InputStream inputStream;
|
||
try {
|
||
if(System.getProperty("os.name").equals("Linux")){
|
||
inputStream = new FileInputStream(fileLinux);
|
||
}else{
|
||
inputStream = new FileInputStream(fileWin);
|
||
}
|
||
props.loadFromXML(inputStream); //new input-stream from .xml
|
||
setCemuPath(props.getProperty("cemuPath"));
|
||
setRomPath(props.getProperty("romPath"));
|
||
setColor(props.getProperty("color"));
|
||
setFullscreen(Boolean.parseBoolean(props.getProperty("fullscreen")));
|
||
inputStream.close();
|
||
System.out.println("done!");
|
||
} catch (IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
|
||
private void sideMenuSlideIn(){
|
||
sideMenuVBox.setVisible(true);
|
||
//fade in from 40% to 100% opacity in 400ms
|
||
FadeTransition fadeTransition = new FadeTransition(Duration.millis(400), sideMenuVBox);
|
||
fadeTransition.setFromValue(0.4);
|
||
fadeTransition.setToValue(1.0);
|
||
//slide in in 400ms
|
||
TranslateTransition translateTransition = new TranslateTransition(Duration.millis(400), sideMenuVBox);
|
||
translateTransition.setFromX(-175);
|
||
translateTransition.setToX(0);
|
||
//in case both animations are used (add (fadeTransition, translateTransition) in the second line under this command)
|
||
ParallelTransition parallelTransition = new ParallelTransition();
|
||
parallelTransition.getChildren().addAll(translateTransition);//(fadeTransition, translateTransition);
|
||
parallelTransition.play();
|
||
}
|
||
|
||
private void sideMenuSlideOut(){
|
||
// sideMenuVBox.setVisible(false);
|
||
//fade out from 100% to 40% opacity in 400ms
|
||
FadeTransition fadeTransition = new FadeTransition(Duration.millis(400), sideMenuVBox);
|
||
fadeTransition.setFromValue(1.0);
|
||
fadeTransition.setToValue(0.4);
|
||
//slide out in 400ms
|
||
TranslateTransition translateTransition = new TranslateTransition(Duration.millis(400), sideMenuVBox);
|
||
translateTransition.setFromX(0);
|
||
translateTransition.setToX(-175);
|
||
//in case both animations are used (add (fadeTransition, translateTransition) in the second line under this command)
|
||
ParallelTransition parallelTransition = new ParallelTransition();
|
||
parallelTransition.getChildren().addAll(translateTransition);//(fadeTransition, translateTransition);
|
||
parallelTransition.play();
|
||
}
|
||
|
||
private void playBtnSlideIn(){
|
||
playBtn.setVisible(true);
|
||
lastTimePlayedBtn.setVisible(true);
|
||
timePlayedBtn.setVisible(true);
|
||
playTrue = true;
|
||
|
||
TranslateTransition playBtnTransition = new TranslateTransition(Duration.millis(300), playBtn);
|
||
playBtnTransition.setFromY(55);
|
||
playBtnTransition.setToY(0);
|
||
playBtnTransition.play();
|
||
|
||
TranslateTransition lastTimePlayedBtnTransition = new TranslateTransition(Duration.millis(300), lastTimePlayedBtn);
|
||
lastTimePlayedBtnTransition.setFromY(55);
|
||
lastTimePlayedBtnTransition.setToY(0);
|
||
lastTimePlayedBtnTransition.play();
|
||
|
||
TranslateTransition timePlayedBtnTransition = new TranslateTransition(Duration.millis(300), timePlayedBtn);
|
||
timePlayedBtnTransition.setFromY(55);
|
||
timePlayedBtnTransition.setToY(0);
|
||
timePlayedBtnTransition.play();
|
||
}
|
||
|
||
void playBtnSlideOut(){
|
||
playTrue = false;
|
||
TranslateTransition playBtnTransition = new TranslateTransition(Duration.millis(300), playBtn);
|
||
playBtnTransition.setFromY(0);
|
||
playBtnTransition.setToY(56);
|
||
playBtnTransition.play();
|
||
|
||
TranslateTransition lastTimePlayedBtnTransition = new TranslateTransition(Duration.millis(300), lastTimePlayedBtn);
|
||
lastTimePlayedBtnTransition.setFromY(0);
|
||
lastTimePlayedBtnTransition.setToY(56);
|
||
lastTimePlayedBtnTransition.play();
|
||
|
||
TranslateTransition timePlayedBtnTransition = new TranslateTransition(Duration.millis(300), timePlayedBtn);
|
||
timePlayedBtnTransition.setFromY(0);
|
||
timePlayedBtnTransition.setToY(56);
|
||
timePlayedBtnTransition.play();
|
||
}
|
||
|
||
private void editColor(String input){
|
||
StringBuilder sb = new StringBuilder(input);
|
||
sb.delete(0, 2);
|
||
this.color = sb.toString();
|
||
saveSettings();
|
||
}
|
||
|
||
private static BufferedImage resizeImage(BufferedImage originalImage, int type, int imgWidth, int imgHeigth) {
|
||
BufferedImage resizedImage = new BufferedImage(imgWidth, imgHeigth, type);
|
||
Graphics2D g = resizedImage.createGraphics();
|
||
g.drawImage(originalImage, 0, 0, imgWidth, imgHeigth, null);
|
||
g.dispose();
|
||
|
||
return resizedImage;
|
||
}
|
||
|
||
public String getCemuPath() {
|
||
return cemuPath;
|
||
}
|
||
|
||
public void setCemuPath(String cemuPath) {
|
||
this.cemuPath = cemuPath;
|
||
}
|
||
|
||
public String getRomPath() {
|
||
return romPath;
|
||
}
|
||
|
||
public void setRomPath(String romPath) {
|
||
this.romPath = romPath;
|
||
}
|
||
|
||
public String getColor() {
|
||
return color;
|
||
}
|
||
|
||
public void setColor(String color) {
|
||
this.color = color;
|
||
}
|
||
|
||
public int getxPos() {
|
||
return xPos;
|
||
}
|
||
|
||
public void setxPos(int xPos) {
|
||
this.xPos = xPos;
|
||
}
|
||
|
||
public int getyPos() {
|
||
return yPos;
|
||
}
|
||
|
||
public void setyPos(int yPos) {
|
||
this.yPos = yPos;
|
||
}
|
||
|
||
public int getxPosHelper() {
|
||
return xPosHelper;
|
||
}
|
||
|
||
public void setxPosHelper(int xPosHelper) {
|
||
this.xPosHelper = xPosHelper;
|
||
}
|
||
|
||
public boolean isFullscreen() {
|
||
return fullscreen;
|
||
}
|
||
|
||
public void setFullscreen(boolean fullscreen) {
|
||
this.fullscreen = fullscreen;
|
||
}
|
||
|
||
public String getGameExecutePath() {
|
||
return gameExecutePath;
|
||
}
|
||
|
||
public void setGameExecutePath(String gameExecutePath) {
|
||
this.gameExecutePath = gameExecutePath;
|
||
}
|
||
|
||
public String getSelectedGameTitleID() {
|
||
return selectedGameTitleID;
|
||
}
|
||
|
||
public void setSelectedGameTitleID(String selectedGameTitleID) {
|
||
this.selectedGameTitleID = selectedGameTitleID;
|
||
}
|
||
|
||
}
|