diff --git a/.classpath b/.classpath index 9454e24..c7307ff 100644 --- a/.classpath +++ b/.classpath @@ -18,12 +18,12 @@ - + - + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 13b3428..6f1d295 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,13 +1,13 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=9 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.compliance=9 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.8 +org.eclipse.jdt.core.compiler.source=9 diff --git a/.travis.yml b/.travis.yml index 3e193cc..78fa8d1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1 +1,3 @@ -language: java +language: java +jdk: + - oraclejdk9 diff --git a/README.md b/README.md index 7b6dd00..3c24aac 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ # cemu_UI ![Total Downloads](https://img.shields.io/github/downloads/Seil0/cemu_UI/total.svg?style=flat-square) -[![](https://img.shields.io/travis/Seil0/cemu_UI/master.svg?style=flat-square)](https://travis-ci.org/Seil0/cemu_UI) +[![Build](https://img.shields.io/travis/Seil0/cemu_UI/master.svg?style=flat-square)](https://travis-ci.org/Seil0/cemu_UI) [![Latest](https://img.shields.io/github/release/Seil0/cemu_UI/all.svg?style=flat-square)](https://github.com/Seil0/cemu_UI/releases) +[![HitCount](http://hits.dwyl.io/Seil0/cemu_UI.svg)](http://hits.dwyl.io/Seil0/cemu_UI) [![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg?style=flat-square)](https://www.gnu.org/licenses/gpl-3.0) cemu_UI is a simple, material design graphical frontend for [cemu](http://cemu.info/), a Wii U emulator. Downloads can be found [here](https://github.com/Seil0/cemu_UI/releases). @@ -28,7 +29,6 @@ If you want to use the cloud sync function read the [wiki](https://github.com/Se ## [planed Features](https://github.com/Seil0/cemu_UI/projects/1) (no ETA) * Controller support -* support more rom file formats in automatic detection ### If you have another idea, make a "new issue" with the ![#f03c15](https://placehold.it/15/fbca04/000000?text=+)`idea` lable diff --git a/pom.xml b/pom.xml index c52bdad..95157e7 100644 --- a/pom.xml +++ b/pom.xml @@ -4,16 +4,14 @@ com cemu_UI - 0.2.3-SNAPSHOT + 0.3.0-SNAPSHOT jar - cemu_UI + cemu_UI is a simple, material design graphical frontend for cemu, a Wii U emulator http://www.kellerkinder.xyz UTF-8 - 1.8 - 1.8 @@ -21,20 +19,20 @@ junit junit - 3.8.1 + 4.11 test com.jfoenix jfoenix - 1.11.1 + 9.0.3 com.eclipsesource.minimal-json minimal-json - 0.9.4 + 0.9.5 @@ -43,22 +41,22 @@ 3.21.0.1 - - org.apache.logging.log4j - log4j-api - 2.9.1 - - - - org.apache.logging.log4j - log4j-core - 2.9.1 - + + org.apache.logging.log4j + log4j-api + 2.11.0 + + + + org.apache.logging.log4j + log4j-core + 2.11.0 + commons-io commons-io - 2.5 + 2.6 @@ -109,7 +107,7 @@ com.google.apis google-api-services-drive - v3-rev87-1.23.0 + v3-rev99-1.23.0 @@ -152,14 +150,14 @@ com.fasterxml.jackson.core jackson-core - 2.9.2 + 2.9.4 javax.servlet javax.servlet-api - 4.0.0-b01 + 4.0.0 provided @@ -180,13 +178,24 @@ - - - - org.apache.maven.plugins - maven-shade-plugin - 3.1.0 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 9 + 9 + true + true + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.1.0 package @@ -194,18 +203,18 @@ shade + cemu_UI true - - com.cemu_UI.application.Main - + + com.cemu_UI.application.Main + - - + diff --git a/src/main/java/com/cemu_UI/application/Main.java b/src/main/java/com/cemu_UI/application/Main.java index 652b049..6879180 100644 --- a/src/main/java/com/cemu_UI/application/Main.java +++ b/src/main/java/com/cemu_UI/application/Main.java @@ -1,7 +1,7 @@ /** * cemu_UI * - * Copyright 2017 <@Seil0> + * Copyright 2017-2018 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,7 +18,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ - package com.cemu_UI.application; import java.io.File; @@ -116,7 +115,7 @@ public class Main extends Application { } // startup checks - // check if client_secret.jason is present + // check if client_secret.json is present if (Main.class.getResourceAsStream("/client_secret.json") == null) { LOGGER.error("client_secret is missing!!!!!"); @@ -142,11 +141,9 @@ public class Main extends Application { mainWindowController.setLastLocalSync(0); mainWindowController.setxPosHelper(0); mainWindowController.saveSettings(); - Runtime.getRuntime().exec("java -jar cemu_UI.jar"); //start again (preventing Bugs) - System.exit(0); //finishes itself } - if (pictureCache.exists() != true) { + if (!pictureCache.exists()) { pictureCache.mkdir(); } @@ -168,27 +165,30 @@ public class Main extends Application { } } - // loading settings and initialize UI, dbController.main() loads all databases + // generate window + scene = new Scene(pane); // create new scene, append pane to scene + scene.getStylesheets().add(Main.class.getResource("/css/MainWindows.css").toExternalForm()); + primaryStage.setMinWidth(265.00); + primaryStage.setMinHeight(425.00); + primaryStage.setScene(scene); // append scene to stage + primaryStage.show(); // show stage + + // init here as it loads the games to the mwc and the gui, therefore the window must exist mainWindowController.init(); - mainWindowController.dbController.init(); + mainWindowController.getDbController().init(); // if cloud sync is activated start sync if(mainWindowController.isCloudSync()) { cloudController.initializeConnection(mainWindowController.getCloudService(), mainWindowController.getCemuPath()); cloudController.sync(mainWindowController.getCloudService(), mainWindowController.getCemuPath(), directory.getPath()); - } - mainWindowController.addUIData(); + } - scene = new Scene(pane); // create new scene, append pane to scene - scene.getStylesheets().add(Main.class.getResource("/css/MainWindows.css").toExternalForm()); - primaryStage.setScene(scene); // append scene to stage - primaryStage.show(); // show stage } catch (IOException e) { e.printStackTrace(); } } - private void firstStart(){ + private void firstStart() { Alert alert = new Alert(AlertType.CONFIRMATION); // new alert with file-chooser alert.setTitle("cemu_UI"); alert.setHeaderText("cemu installation"); @@ -212,11 +212,10 @@ public class Main extends Application { Optional result2 = alert2.showAndWait(); if (result2.get() == ButtonType.OK) { DirectoryChooser directoryChooser = new DirectoryChooser(); - File selectedDirectory = directoryChooser.showDialog(primaryStage); - mainWindowController.setRomPath(selectedDirectory.getAbsolutePath()); - + File selectedDirectory = directoryChooser.showDialog(primaryStage); + mainWindowController.setRomDirectoryPath(selectedDirectory.getAbsolutePath()); } else { - mainWindowController.setRomPath(null); + mainWindowController.setRomDirectoryPath(null); } } @@ -241,7 +240,7 @@ public class Main extends Application { saveTask = new TimerTask() { @Override - public void run() { + public void run() { mainWindowController.saveSettings(); } }; @@ -262,7 +261,7 @@ public class Main extends Application { saveTask = new TimerTask() { @Override - public void run() { + public void run() { mainWindowController.saveSettings(); } }; @@ -295,11 +294,11 @@ public class Main extends Application { public static void main(String[] args) { // delete old log file and create new - if(osName.equals("Linux")){ + if (osName.equals("Linux")) { System.setProperty("logFilename", userHome + "/cemu_UI/app.log"); File logFile = new File(userHome + "/cemu_UI/app.log"); logFile.delete(); - }else{ + } else { System.setProperty("logFilename", userHome + "/Documents/cemu_UI/app.log"); File logFile = new File(userHome + "/Documents/cemu_UI/app.log"); logFile.delete(); @@ -341,7 +340,19 @@ public class Main extends Application { return directory; } - public void setDirectory(File directory) { - this.directory = directory; + public File getConfigFile() { + return configFile; + } + + public File getGamesDBFile() { + return gamesDBFile; + } + + public File getReference_gamesFile() { + return reference_gamesFile; + } + + public File getPictureCache() { + return pictureCache; } } diff --git a/src/main/java/com/cemu_UI/application/MainWindowController.java b/src/main/java/com/cemu_UI/application/MainWindowController.java index 55fb730..3a90c41 100644 --- a/src/main/java/com/cemu_UI/application/MainWindowController.java +++ b/src/main/java/com/cemu_UI/application/MainWindowController.java @@ -1,7 +1,7 @@ /** * cemu_UI * - * Copyright 2017 <@Seil0> + * Copyright 2017-2018 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,7 +18,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ - package com.cemu_UI.application; import java.awt.Desktop; @@ -54,9 +53,9 @@ import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import com.cemu_UI.controller.DBController; import com.cemu_UI.controller.SmmdbAPIController; import com.cemu_UI.controller.UpdateController; -import com.cemu_UI.controller.DBController; import com.cemu_UI.datatypes.CourseTableDataType; import com.cemu_UI.datatypes.SmmdbApiDataType; import com.cemu_UI.datatypes.UIROMDataType; @@ -157,6 +156,9 @@ public class MainWindowController { @FXML private JFXTextField courseSearchTextFiled; + + @FXML + private JFXTextField executeCommandTextFiled; @FXML private TextFlow smmdbTextFlow; @@ -262,11 +264,16 @@ public class MainWindowController { @FXML private JFXTreeTableColumn timeColumn = new JFXTreeTableColumn<>("time"); + + @SuppressWarnings("unused") + private enum CloudService { + GoogleDrive, Dropbox + } - Main main; - DBController dbController; - SmmdbAPIController smmdbAPIController; - playGame playGame; + private Main main; + private DBController dbController; + private SmmdbAPIController smmdbAPIController; + private playGame playGame; private static MainWindowController MWC; private UpdateController updateController; private boolean menuTrue = false; @@ -279,16 +286,16 @@ public class MainWindowController { private boolean cloudSync; private String cloudService = ""; // set cloud provider (at the moment only GoogleDrive, Dropbox is planed) private String cemuPath; - private String romPath; + private String romDirectoryPath; private String gameExecutePath; private String color; private String dialogBtnStyle; private String selectedGameTitleID; private String selectedGameTitle; private String id; - private String version = "0.2.3"; - private String buildNumber = "071"; - private String versionName = "Puzzle Plank Galaxy"; + private String version = "0.3.0"; + private String buildNumber = "077"; + private String versionName = "Purple Comet"; private int xPos = -200; private int yPos = 17; private int xPosHelper; @@ -299,15 +306,9 @@ public class MainWindowController { private double windowWidth; private double windowHeight; 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 configFileWin = new File(dirWin + "/config.xml"); - private File configFileLinux = new File(dirLinux + "/config.xml"); - private File pictureCacheWin = new File(dirWin + "/picture_cache"); - private File pictureCacheLinux = new File(dirLinux + "/picture_cache"); private ObservableList branches = FXCollections.observableArrayList("stable", "beta"); private ObservableList languages = FXCollections.observableArrayList("English (en_US)", "Deutsch (de_DE)"); - private ObservableList smmIDs = FXCollections.observableArrayList("fe31b7f2", "44fc5929"); // TODO add more IDs + private ObservableList smmIDs = FXCollections.observableArrayList("fe31b7f2", "44fc5929"); private ObservableList games = FXCollections.observableArrayList(); ObservableList courses = FXCollections.observableArrayList(); ObservableList filteredCourses = FXCollections.observableArrayList(); @@ -373,7 +374,7 @@ public class MainWindowController { public void setMain(Main m) { this.main = m; - dbController = new DBController(this); + dbController = new DBController(main, this); smmdbAPIController = new SmmdbAPIController(); } @@ -399,7 +400,7 @@ public class MainWindowController { } cemuTextField.setText(cemuPath); - romTextField.setText(romPath); + romTextField.setText(romDirectoryPath); colorPicker.setValue(Color.valueOf(getColor())); fullscreenToggleBtn.setSelected(isFullscreen()); cloudSyncToggleBtn.setSelected(isCloudSync()); @@ -722,7 +723,7 @@ public class MainWindowController { try { Desktop.getDesktop().browse(new URI("https://github.com/Seil0/cemu_UI/issues/3")); } catch (IOException | URISyntaxException e) { - e.printStackTrace(); + LOGGER.error("An error ocoured while trying to open a Website.", e); } } }); @@ -800,12 +801,43 @@ public class MainWindowController { } } }); + + cemuTextField.textProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, String oldValue, String newValue) { + if (new File(newValue).exists()) { + setCemuPath(newValue); + saveSettings(); + } else { + String bodyText = newValue + ": No such file or directory"; + JFXInfoDialog fileErrorDialog = new JFXInfoDialog("Waring!", bodyText, dialogBtnStyle, 190, 150, main.getPane()); + fileErrorDialog.show(); + LOGGER.warn(newValue + ": No such file or directory"); + } + } + }); + + romTextField.textProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, String oldValue, String newValue) { + if (new File(newValue).exists()) { + setRomDirectoryPath(newValue); + saveSettings(); + reloadRoms(); + } else { + String bodyText = newValue + ": No such file or directory"; + JFXInfoDialog fileErrorDialog = new JFXInfoDialog("Waring!", bodyText, dialogBtnStyle, 190, 150, main.getPane()); + fileErrorDialog.show(); + LOGGER.warn(newValue + ": No such file or directory"); + } + } + }); LOGGER.info("initializing Actions done!"); } @FXML - void detailsSlideoutBtnAction(ActionEvent event) { + void detailsSlideoutBtnAction() { playBtnSlideOut(); } @@ -818,7 +850,7 @@ public class MainWindowController { } @FXML - void settingsBtnAction(ActionEvent event) { + void settingsBtnAction() { if (smmdbTrue) { smmdbAnchorPane.setVisible(false); smmdbTrue = false; @@ -835,26 +867,7 @@ public class MainWindowController { @FXML void reloadRomsBtnAction() throws IOException { - - JFXSpinner spinner = new JFXSpinner(); - spinner.setPrefSize(30, 30); - spinner.setStyle(" -fx-background-color: #f4f4f4;"); - main.getPane().getChildren().add(spinner); - AnchorPane.setTopAnchor(spinner, (main.getPane().getHeight()-spinner.getPrefHeight())/2); - AnchorPane.setLeftAnchor(spinner, (main.getPane().getWidth()-spinner.getPrefWidth())/2); - - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - dbController.loadRomDirectory(getRomPath()); // reload the rom directory - - Platform.runLater(() -> { - refreshUIData(); // refresh the list of games displayed on screen - main.getPane().getChildren().remove(spinner); - }); - } - }); - thread.start(); + reloadRoms(); } @FXML @@ -897,7 +910,7 @@ public class MainWindowController { } @FXML - void playBtnAction(ActionEvent event) throws InterruptedException, IOException { + void playBtnAction() throws InterruptedException, IOException { dbController.setLastPlayed(selectedGameTitleID); playGame = new playGame(this, dbController); @@ -905,53 +918,33 @@ public class MainWindowController { } @FXML - void totalPlaytimeBtnAction(ActionEvent event) { - + void totalPlaytimeBtnAction() { + } @FXML - void lastTimePlayedBtnAction(ActionEvent event) { - + void lastTimePlayedBtnAction() { + } @FXML - void cemuTFBtnAction(ActionEvent event) { + void cemuTFBtnAction() { File cemuDirectory = directoryChooser.showDialog(main.getPrimaryStage()); - if (cemuDirectory == null) { - LOGGER.info("No Directory selected"); - } else { - setCemuPath(cemuDirectory.getAbsolutePath()); - saveSettings(); - cemuTextField.setText(getCemuPath()); - try { - Runtime.getRuntime().exec("java -jar cemu_UI.jar"); // start again - System.exit(0); // finishes itself - } catch (IOException e) { - LOGGER.error("an error occurred", e); - } + if (cemuDirectory != null) { + cemuTextField.setText(cemuDirectory.getAbsolutePath()); } } @FXML - void romTFBtnAction(ActionEvent event) { + void romTFBtnAction() { File romDirectory = directoryChooser.showDialog(main.getPrimaryStage()); - if (romDirectory == null) { - LOGGER.info("No Directory selected"); - } else { - setRomPath(romDirectory.getAbsolutePath()); - saveSettings(); - cemuTextField.setText(getCemuPath()); - try { - Runtime.getRuntime().exec("java -jar cemu_UI.jar"); // start again - System.exit(0); // finishes itself - } catch (IOException e) { - LOGGER.error("an error occurred", e); - } + if (romDirectory != null) { + romTextField.setText(romDirectory.getAbsolutePath()); } } @FXML - void updateBtnAction(ActionEvent event) { + void updateBtnAction() { updateController = new UpdateController(this, buildNumber, useBeta); Thread updateThread = new Thread(updateController); updateThread.setName("Updater"); @@ -959,7 +952,7 @@ public class MainWindowController { } @FXML - void autoUpdateToggleBtnAction(ActionEvent event) { + void autoUpdateToggleBtnAction() { if (isAutoUpdate()) { setAutoUpdate(false); } else { @@ -969,12 +962,12 @@ public class MainWindowController { } @FXML - void courseSearchTextFiledAction(ActionEvent event) { + void courseSearchTextFiledAction() { // not in use } @FXML - void smmdbDownloadBtnAction(ActionEvent event) { + void smmdbDownloadBtnAction() { String downloadUrl = "http://smmdb.ddns.net/api/downloadcourse?id=" + id + "&type=zip"; String downloadFileURL = getCemuPath() + "/" + id + ".zip"; // getCemuPath() + "/" + smmID + "/" + id + ".rar" String outputFile = getCemuPath() + "/"; @@ -1042,19 +1035,7 @@ public class MainWindowController { } @FXML - void cemuTextFieldAction(ActionEvent event) { - setCemuPath(cemuTextField.getText()); - saveSettings(); - } - - @FXML - void romTextFieldAction(ActionEvent event) { - setRomPath(romTextField.getText()); - saveSettings(); - } - - @FXML - void fullscreenToggleBtnAction(ActionEvent event) { + void fullscreenToggleBtnAction() { if (fullscreen) { fullscreen = false; } else { @@ -1064,7 +1045,7 @@ public class MainWindowController { } @FXML - void cloudSyncToggleBtnAction(ActionEvent event) { + void cloudSyncToggleBtnAction() { if(cloudSync) { cloudSync = false; } else { @@ -1073,27 +1054,28 @@ public class MainWindowController { public void handle(ActionEvent event){ cloudSync = true; //TODO rework for other cloud services +// CloudService service = CloudService.GoogleDrive; cloudService = "GoogleDrive"; // start cloud sync in new thread - Thread thread = new Thread(new Runnable() { - @Override + Thread thread = new Thread(new Runnable() { + @Override public void run() { - - if (main.getCloudController().initializeConnection(getCloudService(), getCemuPath())) { - main.getCloudController().sync(getCloudService(), getCemuPath(), main.getDirectory().getPath()); - saveSettings(); - } else { - cloudSyncToggleBtn.setSelected(false); - //cloud sync init error dialog + if (main.getCloudController().initializeConnection(getCloudService(), getCemuPath())) { + main.getCloudController().sync(getCloudService(), getCemuPath(), main.getDirectory().getPath()); + saveSettings(); + } else { + cloudSyncToggleBtn.setSelected(false); + + // cloud sync init error dialog JFXInfoDialog cloudSyncErrorDialog = new JFXInfoDialog(cloudSyncErrorHeadingText, cloudSyncErrorBodyText, dialogBtnStyle, 450, 170, main.getPane()); cloudSyncErrorDialog.show(); - } - - } - }); + } + + } + }); thread.start(); } }; @@ -1113,13 +1095,13 @@ public class MainWindowController { } @FXML - void colorPickerAction(ActionEvent event) { + void colorPickerAction() { editColor(colorPicker.getValue().toString()); applyColor(); } @FXML - void addBtnAction(ActionEvent event) { + void addBtnAction() { String headingText = addGameBtnHeadingText; String bodyText = addGameBtnBodyText; JFXEditGameDialog addGameDialog = new JFXEditGameDialog(headingText, bodyText, dialogBtnStyle, 450, 300, 0, @@ -1146,15 +1128,9 @@ public class MainWindowController { errorDialog.show(); } else { - File pictureCache; + File pictureCache = main.getPictureCache(); String coverName = new File(coverPath).getName(); try { - if (System.getProperty("os.name").equals("Linux")) { - pictureCache = getPictureCacheLinux(); - } else { - pictureCache = getPictureCacheWin(); - } - 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); @@ -1293,15 +1269,39 @@ public class MainWindowController { games.add(uiROMElement); } - // add all games saved in games(ArrayList) to gamesAnchorPane - void addUIData() { - for (int i = 0; i < games.size(); i++) { - gamesAnchorPane.getChildren().add(games.get(i).getVBox()); - } - } + /** + * reload all ROMs from the ROM directory + */ + public void reloadRoms() { + JFXSpinner spinner = new JFXSpinner(); + spinner.setPrefSize(30, 30); + AnchorPane.setTopAnchor(spinner, (main.getPane().getPrefHeight()-spinner.getPrefHeight())/2); + AnchorPane.setLeftAnchor(spinner, (main.getPane().getPrefWidth()-spinner.getPrefWidth())/2); + + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + Platform.runLater(() -> { + //remove all games form gamesAnchorPane + gamesAnchorPane.getChildren().removeAll(gamesAnchorPane.getChildren()); + main.getPane().getChildren().add(spinner); // add spinner to pane + }); + + dbController.loadRomDirectory(getRomDirectoryPath()); // reload the ROM directory + games.removeAll(games); // remove all games from the mwc game list + dbController.loadAllGames(); // load all games from the database to the mwc + + Platform.runLater(() -> { + refreshUIData(); // refresh the list of games displayed on screen + main.getPane().getChildren().remove(spinner); + }); + } + }); + thread.start(); + } //remove all games from gamesAnchorPane and add them afterwards - void refreshUIData() { + public void refreshUIData() { //remove all games form gamesAnchorPane gamesAnchorPane.getChildren().removeAll(gamesAnchorPane.getChildren()); @@ -1319,6 +1319,7 @@ public class MainWindowController { } } + // set the selected local strings to all needed elements void setUILanguage(){ switch(getLanguage()){ case "en_US": @@ -1401,6 +1402,7 @@ public class MainWindowController { smmdbDownloadBtnDownload = bundle.getString("smmdbDownloadBtnDownload"); } + // if AutoUpdate, then check for updates private void checkAutoUpdate() { if (isAutoUpdate()) { @@ -1542,16 +1544,7 @@ public class MainWindowController { * calculates how many games can be displayed in one row */ private void generatePosition() { - int xPosHelperMax; - - /**FIXME somehow the window width is set to 8, if we can find a way to get always the real window with - *(at the beginning we have to use prefWidth after resizing Width) we can remove this - */ - if (mainAnchorPane.getWidth() < 10) { - xPosHelperMax = (int) Math.floor((mainAnchorPane.getPrefWidth() - 36) / 217); - } else { - xPosHelperMax = (int) Math.floor((mainAnchorPane.getWidth() - 36) / 217); - } + int xPosHelperMax = (int) Math.floor((mainAnchorPane.getWidth() - 36) / 217); if(xPosHelper == xPosHelperMax){ oldXPosHelper = xPosHelper; @@ -1562,14 +1555,9 @@ public class MainWindowController { xPos = xPos + 217; xPosHelper++; } - -// System.out.println("Breit: " + main.pane.getWidth()); -// System.out.println("Breit2: " + mainAnchorPane.getWidth()); -// System.out.println("xPosHelper: " + xPosHelper); -// System.out.println("yPos: " + yPos); -// System.out.println("xPos: " + xPos); } + // change the color of all needed GUI elements private void applyColor() { String boxStyle = "-fx-background-color: #"+getColor()+";"; String btnStyleBlack = "-fx-button-type: RAISED; -fx-background-color: #"+getColor()+"; -fx-text-fill: BLACK;"; @@ -1632,13 +1620,16 @@ public class MainWindowController { games.get(i).getButton().setRipplerFill(Paint.valueOf(getColor())); } } - - public void saveSettings(){ - LOGGER.info("saving Settings ..."); - OutputStream outputStream; //new output-stream - try { - props.setProperty("cemuPath", getCemuPath()); - props.setProperty("romPath", getRomPath()); + + /** + * save settings to the config.xml file + */ + public void saveSettings() { + LOGGER.info("saving Settings ..."); + + try { + props.setProperty("cemuPath", getCemuPath()); + props.setProperty("romPath", getRomDirectoryPath()); props.setProperty("color", getColor()); props.setProperty("language", getLanguage()); props.setProperty("fullscreen", String.valueOf(isFullscreen())); @@ -1654,97 +1645,89 @@ public class MainWindowController { props.setProperty("lastLocalSync", String.valueOf(getLastLocalSync())); props.setProperty("windowWidth", String.valueOf(mainAnchorPane.getWidth())); props.setProperty("windowHeight", String.valueOf(mainAnchorPane.getHeight())); - if(System.getProperty("os.name").equals("Linux")){ - outputStream = new FileOutputStream(configFileLinux); - }else{ - outputStream = new FileOutputStream(configFileWin); - } - props.storeToXML(outputStream, "cemu_UI settings"); //write new .xml - outputStream.close(); - LOGGER.info("saving Settings done!"); - } catch (IOException e) { - LOGGER.error("an error occured", e); - } - } + + OutputStream outputStream = new FileOutputStream(main.getConfigFile()); // new output-stream + props.storeToXML(outputStream, "cemu_UI settings"); // write new .xml + outputStream.close(); + LOGGER.info("saving Settings done!"); + } catch (IOException e) { + LOGGER.error("an error occured", e); + } + } /** * loading saved settings from the config.xml file * if a value is not present, default is used instead */ - private void loadSettings(){ - LOGGER.info("loading settings ..."); - InputStream inputStream; + private void loadSettings() { + LOGGER.info("loading settings ..."); try { - if(System.getProperty("os.name").equals("Linux")){ - inputStream = new FileInputStream(configFileLinux); - }else{ - inputStream = new FileInputStream(configFileWin); - } - props.loadFromXML(inputStream); //new input-stream from .xml - + InputStream inputStream = new FileInputStream(main.getConfigFile()); + props.loadFromXML(inputStream); // new input-stream from .xml + try { setCemuPath(props.getProperty("cemuPath")); } catch (Exception e) { LOGGER.error("cloud not load cemuPath", e); setCemuPath(""); } - + try { - setRomPath(props.getProperty("romPath")); + setRomDirectoryPath(props.getProperty("romPath")); } catch (Exception e) { LOGGER.error("could not load romPath", e); - setRomPath(""); + setRomDirectoryPath(""); } - + try { setColor(props.getProperty("color")); } catch (Exception e) { LOGGER.error("could not load color value, setting default instead", e); setColor("00a8cc"); } - + if (props.getProperty("language") == null) { LOGGER.error("cloud not load language, setting default instead"); setLanguage("en_US"); } else { setLanguage(props.getProperty("language")); } - + try { setFullscreen(Boolean.parseBoolean(props.getProperty("fullscreen"))); } catch (Exception e) { LOGGER.error("could not load fullscreen, setting default instead", e); setFullscreen(false); } - + try { setCloudSync(Boolean.parseBoolean(props.getProperty("cloudSync"))); } catch (Exception e) { LOGGER.error("could not load cloudSync, setting default instead", e); setCloudSync(false); } - + try { setAutoUpdate(Boolean.parseBoolean(props.getProperty("autoUpdate"))); } catch (Exception e) { LOGGER.error("cloud not load autoUpdate", e); setAutoUpdate(false); } - + try { setUseBeta(Boolean.parseBoolean(props.getProperty("useBeta"))); } catch (Exception e) { LOGGER.error("cloud not load autoUpdate", e); setUseBeta(false); } - + try { setCloudService(props.getProperty("cloudService")); } catch (Exception e) { LOGGER.error("could not load cloudSync", e); setCloudService(""); } - + try { main.getCloudController().setFolderID(props.getProperty("folderID"), getCloudService()); } catch (Exception e) { @@ -1758,27 +1741,27 @@ public class MainWindowController { LOGGER.error("could not load lastSuccessSync, setting default instead", e); setLastLocalSync(0); } - + try { setWindowWidth(Double.parseDouble(props.getProperty("windowWidth"))); } catch (Exception e) { LOGGER.error("could not load windowWidth, setting default instead", e); setWindowWidth(904); } - + try { setWindowHeight(Double.parseDouble(props.getProperty("windowHeight"))); } catch (Exception e) { LOGGER.error("could not load windowHeight, setting default instead", e); setWindowHeight(600); } - + inputStream.close(); - LOGGER.info("loading settings done!"); + LOGGER.info("loading settings done!"); } catch (IOException e) { LOGGER.error("an error occured", e); } - } + } private void sideMenuSlideIn(){ sideMenuVBox.setVisible(true); @@ -1854,6 +1837,18 @@ public class MainWindowController { return resizedImage; } + public Main getMain() { + return main; + } + + public DBController getDbController() { + return dbController; + } + + public void setMainAnchorPane(AnchorPane mainAnchorPane) { + this.mainAnchorPane = mainAnchorPane; + } + public String getCemuPath() { return cemuPath; } @@ -1862,14 +1857,14 @@ public class MainWindowController { this.cemuPath = cemuPath; } - public String getRomPath() { - return romPath; + public String getRomDirectoryPath() { + return romDirectoryPath; } - public void setRomPath(String romPath) { - this.romPath = romPath; + public void setRomDirectoryPath(String romDirectoryPath) { + this.romDirectoryPath = romDirectoryPath; } - + public String getColor() { return color; } @@ -1878,22 +1873,6 @@ public class MainWindowController { this.color = color; } - public File getPictureCacheLinux() { - return pictureCacheLinux; - } - - public void setPictureCacheLinux(File pictureCacheLinux) { - this.pictureCacheLinux = pictureCacheLinux; - } - - public File getPictureCacheWin() { - return pictureCacheWin; - } - - public void setPictureCacheWin(File pictureCacheWin) { - this.pictureCacheWin = pictureCacheWin; - } - public int getxPos() { return xPos; } diff --git a/src/main/java/com/cemu_UI/application/playGame.java b/src/main/java/com/cemu_UI/application/playGame.java index b6afd6b..651504a 100644 --- a/src/main/java/com/cemu_UI/application/playGame.java +++ b/src/main/java/com/cemu_UI/application/playGame.java @@ -1,7 +1,7 @@ /** * cemu_UI * - * Copyright 2017 <@Seil0> + * Copyright 2017-2018 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,7 +18,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ - package com.cemu_UI.application; import java.io.IOException; @@ -33,19 +32,20 @@ import javafx.application.Platform; public class playGame extends Thread{ - MainWindowController mainWindowController; - DBController dbController; + private MainWindowController mainWindowController; + private DBController dbController; private static final Logger LOGGER = LogManager.getLogger(playGame.class.getName()); - public playGame(MainWindowController m, com.cemu_UI.controller.DBController db){ + public playGame(MainWindowController m, com.cemu_UI.controller.DBController db) { mainWindowController = m; dbController = db; } - + @Override - public void run(){ + public void run() { String selectedGameTitleID = mainWindowController.getSelectedGameTitleID(); - String executeComand; + String cemuBin = mainWindowController.getCemuPath() + "/Cemu.exe"; + String gameExec = "\"" + mainWindowController.getGameExecutePath() + "\""; long startTime; long endTime; int timePlayedNow; @@ -53,52 +53,50 @@ public class playGame extends Thread{ Process p; Platform.runLater(() -> { - mainWindowController.main.getPrimaryStage().setIconified(true); // minimize cemu_UI + mainWindowController.getMain().getPrimaryStage().setIconified(true); // minimize cemu_UI }); startTime = System.currentTimeMillis(); - try{ - if(mainWindowController.isFullscreen()){ - if(System.getProperty("os.name").equals("Linux")){ - executeComand = "wine "+mainWindowController.getCemuPath()+"/Cemu.exe -f -g \""+mainWindowController.getGameExecutePath()+"\""; + try { + if (System.getProperty("os.name").equals("Linux")) { + if(mainWindowController.isFullscreen()){ + p = new ProcessBuilder("wine", cemuBin, "-f", "-g", gameExec).start(); } else { - executeComand = mainWindowController.getCemuPath()+"\\Cemu.exe -f -g \""+mainWindowController.getGameExecutePath()+"\""; + p = new ProcessBuilder("wine", cemuBin, "-g", gameExec).start(); } - }else{ - if(System.getProperty("os.name").equals("Linux")){ - executeComand = "wine "+mainWindowController.getCemuPath()+"/Cemu.exe -g \""+mainWindowController.getGameExecutePath()+"\""; + } else { + if(mainWindowController.isFullscreen()){ + p = new ProcessBuilder(cemuBin, "-f", "-g", gameExec).start(); } else { - executeComand = mainWindowController.getCemuPath()+"\\Cemu.exe -g \""+mainWindowController.getGameExecutePath()+"\""; + p = new ProcessBuilder(cemuBin, "-g", gameExec).start(); } - } - LOGGER.info(executeComand); + } - p = Runtime.getRuntime().exec(executeComand); - p.waitFor(); + p.waitFor(); // wait until cemu is closed so we can calculate the played time endTime = System.currentTimeMillis(); timePlayedNow = (int) Math.floor(((endTime - startTime)/1000/60)); timePlayed = Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID))+timePlayedNow; - dbController.setTotalPlaytime(Integer.toString(timePlayed), selectedGameTitleID); - Platform.runLater(() -> { - if(Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID)) > 60){ - int hoursPlayed = (int) Math.floor(Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID))/60); - int minutesPlayed = Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID))-60*hoursPlayed; - mainWindowController.totalPlaytimeBtn.setText(hoursPlayed+"h "+minutesPlayed+"min"); - }else{ - mainWindowController.totalPlaytimeBtn.setText(dbController.getTotalPlaytime(selectedGameTitleID)+ " min"); - } - mainWindowController.main.getPrimaryStage().setIconified(false); // maximize cemu_UI - }); + dbController.setTotalPlaytime(Integer.toString(timePlayed), selectedGameTitleID); + Platform.runLater(() -> { + if (Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID)) > 60) { + int hoursPlayed = (int) Math.floor(Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID)) / 60); + int minutesPlayed = Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID)) - 60 * hoursPlayed; + mainWindowController.totalPlaytimeBtn.setText(hoursPlayed + "h " + minutesPlayed + "min"); + } else { + mainWindowController.totalPlaytimeBtn.setText(dbController.getTotalPlaytime(selectedGameTitleID) + " min"); + } + mainWindowController.getMain().getPrimaryStage().setIconified(false); // maximize cemu_UI + }); //sync savegame with cloud service if (mainWindowController.isCloudSync()) { mainWindowController.setLastLocalSync(Instant.now().getEpochSecond()); - mainWindowController.main.getCloudController().sync(mainWindowController.getCloudService(), - mainWindowController.getCemuPath(), mainWindowController.main.getDirectory().getPath()); + mainWindowController.getMain().getCloudController().sync(mainWindowController.getCloudService(), + mainWindowController.getCemuPath(), mainWindowController.getMain().getDirectory().getPath()); } - }catch (IOException | InterruptedException e){ - e.printStackTrace(); + } catch (IOException | InterruptedException e) { + LOGGER.error(e); } } diff --git a/src/main/java/com/cemu_UI/controller/CloudController.java b/src/main/java/com/cemu_UI/controller/CloudController.java index 3358eb4..6e3f385 100644 --- a/src/main/java/com/cemu_UI/controller/CloudController.java +++ b/src/main/java/com/cemu_UI/controller/CloudController.java @@ -1,7 +1,7 @@ /** * cemu_UI * - * Copyright 2017 <@Seil0> + * Copyright 2017-2018 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,7 +18,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ - package com.cemu_UI.controller; import java.io.File; diff --git a/src/main/java/com/cemu_UI/controller/DBController.java b/src/main/java/com/cemu_UI/controller/DBController.java index 394b7ca..e4422c3 100644 --- a/src/main/java/com/cemu_UI/controller/DBController.java +++ b/src/main/java/com/cemu_UI/controller/DBController.java @@ -1,7 +1,7 @@ /** * cemu_UI * - * Copyright 2017 <@Seil0> + * Copyright 2017-2018 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,7 +18,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ - package com.cemu_UI.controller; import java.awt.Graphics2D; @@ -45,14 +44,17 @@ import org.apache.logging.log4j.Logger; import org.w3c.dom.Document; import org.xml.sax.SAXException; +import com.cemu_UI.application.Main; import com.cemu_UI.application.MainWindowController; public class DBController { - public DBController(MainWindowController mwc) { - mainWindowController = mwc; + public DBController(Main main, MainWindowController mainWindowController) { + this.main = main; + this.mainWindowController = mainWindowController; } + private Main main; private MainWindowController mainWindowController; private ArrayList entries = new ArrayList<>(); private String DB_PATH_localRoms; @@ -66,14 +68,12 @@ public class DBController { * load ROM and games database * load all games */ - public void init(){ - LOGGER.info("<==========starting loading sql==========>"); + public void init() { + LOGGER.info("<========== starting loading sql ==========>"); loadRomDatabase(); loadGamesDatabase(); createRomDatabase(); - loadAllGames(); - checkRemoveEntry(); - LOGGER.info("<==========finished loading sql==========>"); + LOGGER.info("<========== finished loading sql ==========>"); } /** @@ -81,18 +81,18 @@ public class DBController { * * TODO this should be called LocalGames */ - private void loadRomDatabase(){ + private void loadRomDatabase() { if (System.getProperty("os.name").equals("Linux")) { DB_PATH_localRoms = System.getProperty("user.home") + "/cemu_UI/localRoms.db"; - }else{ + } else { DB_PATH_localRoms = System.getProperty("user.home") + "\\Documents\\cemu_UI" + "\\" + "localRoms.db"; } try { // create a database connection connection = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH_localRoms); - connection.setAutoCommit(false); //AutoCommit to false -> manual commit is active + connection.setAutoCommit(false); // AutoCommit to false -> manual commit is active } catch (SQLException e) { - // if the error message is "out of memory", it probably means no database file is found + // if the error message is "out of memory", probably no database file is found LOGGER.error("error while loading the ROM database", e); } LOGGER.info("ROM database loaded successfull"); @@ -100,16 +100,10 @@ public class DBController { /** * set the path to the localRoms.db file and initialize the connection - * - * games.dbcontains a reverence list to for the automatic detection mode - * TODO rework paths + * games.db contains a reverence list to for the automatic detection mode */ private void loadGamesDatabase() { - if (System.getProperty("os.name").equals("Linux")) { - DB_PATH_games = System.getProperty("user.home") + "/cemu_UI/reference_games.db"; - } else { - DB_PATH_games = System.getProperty("user.home") + "\\Documents\\cemu_UI" + "\\" + "reference_games.db"; - } + DB_PATH_games = main.getReference_gamesFile().getAbsolutePath(); try { // create a database connection connectionGames = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH_games); @@ -149,11 +143,14 @@ public class DBController { LOGGER.error("error while loading ROMs from ROM database, local_roms table", e); } if (entries.size() == 0) { - loadRomDirectory(mainWindowController.getRomPath()); + mainWindowController.reloadRoms(); + } else { + loadAllGames(); + mainWindowController.refreshUIData(); } } - // add a Ggame to the database + // add a game to the database public void addGame(String title, String coverPath, String romPath, String titleID, String productCode, String region, String lastPlayed, String timePlayed) throws SQLException{ Statement stmt = connection.createStatement(); stmt.executeUpdate("insert into local_roms values ('"+title+"','"+coverPath+"','"+romPath+"','"+titleID+"'," @@ -163,6 +160,7 @@ public class DBController { LOGGER.info("added \""+title+"\" to ROM database"); } + // remove a game from the database public void removeGame(String titleID) throws SQLException{ Statement stmt = connection.createStatement(); stmt.executeUpdate("delete from local_roms where titleID = '"+titleID+"'"); @@ -171,8 +169,8 @@ public class DBController { LOGGER.info("removed \""+titleID+"\" from ROM database"); } - //load all ROMs on startup to the mainWindowController - void loadAllGames(){ + //load all ROMs to the mainWindowController + public void loadAllGames(){ LOGGER.info("loading all games on startup into the mainWindowController ..."); try { Statement stmt = connection.createStatement(); @@ -187,7 +185,7 @@ public class DBController { } } - //load one single ROM after manual adding into the mainWindowController + //load a single ROM to the mainWindowController public void loadSingleGame(String titleID){ LOGGER.info("loading a single game (ID: "+titleID+") into the mainWindowController ..."); try { @@ -211,18 +209,12 @@ public class DBController { File dir = new File(directory); File appFile; String[] extensions = new String[] { "rpx", "jsp" }; - File pictureCache; - String coverPath; - - if(System.getProperty("os.name").equals("Linux")){ - pictureCache = mainWindowController.getPictureCacheLinux(); - }else{ - pictureCache = mainWindowController.getPictureCacheWin(); - } - + File pictureCache = main.getPictureCache(); + String coverPath; try { Statement stmt = connectionGames.createStatement(); List files = (List) FileUtils.listFiles(dir, extensions, true); + LOGGER.info("<============================== start loading ROM Directory ==============================>"); LOGGER.info("Getting all .rpx files in " + dir.getCanonicalPath()+" including those in subdirectories"); // for all files in dir get the app.xml for (File file : files) { @@ -237,7 +229,7 @@ public class DBController { // for all elements in the games table check if it's already present, else add it while (rs.next()) { - if (checkEntry(rs.getString(2))) { + if (checkAddEntry(rs.getString(2))) { LOGGER.info(rs.getString(2) + ": game already in database"); } else { LOGGER.info("adding cover to cache ..."); @@ -253,12 +245,19 @@ public class DBController { } } } + LOGGER.info("<============================= finished loading ROM Directory ============================>"); } catch (IOException | SQLException | ParserConfigurationException | SAXException e) { LOGGER.error("error while loading ROMs from directory", e); } } - private boolean checkEntry(String title) throws SQLException{ + /** + * check if there is a game with the given name already in the database + * @param title game title + * @return true if the game exists, false if not + * @throws SQLException + */ + private boolean checkAddEntry(String title) throws SQLException{ Statement stmt = connection.createStatement(); boolean check = false; ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms WHERE title = '"+title+"';"); @@ -268,6 +267,7 @@ public class DBController { return check; } + @SuppressWarnings("unused") private void checkRemoveEntry() { /** * TODO needs to be implemented! diff --git a/src/main/java/com/cemu_UI/controller/SmmdbAPIController.java b/src/main/java/com/cemu_UI/controller/SmmdbAPIController.java index bf14b95..d683f83 100644 --- a/src/main/java/com/cemu_UI/controller/SmmdbAPIController.java +++ b/src/main/java/com/cemu_UI/controller/SmmdbAPIController.java @@ -1,7 +1,7 @@ /** * cemu_UI * - * Copyright 2017 <@Seil0> + * Copyright 2017-2018 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,7 +18,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ - package com.cemu_UI.controller; import java.io.BufferedReader; diff --git a/src/main/java/com/cemu_UI/controller/UpdateController.java b/src/main/java/com/cemu_UI/controller/UpdateController.java index a7d69be..d214505 100644 --- a/src/main/java/com/cemu_UI/controller/UpdateController.java +++ b/src/main/java/com/cemu_UI/controller/UpdateController.java @@ -1,7 +1,7 @@ /** * cemu_UI * - * Copyright 2017 <@Seil0> + * Copyright 2017-2018 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,7 +18,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ - package com.cemu_UI.controller; import java.io.BufferedReader; @@ -59,8 +58,7 @@ public class UpdateController implements Runnable { private static final Logger LOGGER = LogManager.getLogger(UpdateController.class.getName()); /** - * updater for cemu_UI based on Project HomeFlix checks for Updates and download - * it in case there is one + * updater for cemu_UI, checks for Updates and download it */ public UpdateController(MainWindowController mwc, String buildNumber, boolean useBeta) { mainWindowController = mwc; @@ -149,7 +147,7 @@ public class UpdateController implements Runnable { FileUtils.copyInputStreamToFile(pmis, new File("cemu_UI_update.jar")); // download update org.apache.commons.io.FileUtils.copyFile(new File("cemu_UI_update.jar"), new File("cemu_UI.jar")); org.apache.commons.io.FileUtils.deleteQuietly(new File("cemu_UI_update.jar")); // delete update - Runtime.getRuntime().exec("java -jar cemu_UI.jar"); // start again + Runtime.getRuntime().exec("java -jar cemu_UI.jar"); // start again TODO consider ProcessBuilder to execute System.exit(0); // finishes itself } catch (IOException e) { Platform.runLater(() -> { diff --git a/src/main/java/com/cemu_UI/datatypes/CourseTableDataType.java b/src/main/java/com/cemu_UI/datatypes/CourseTableDataType.java index 81f2176..f1f79f1 100644 --- a/src/main/java/com/cemu_UI/datatypes/CourseTableDataType.java +++ b/src/main/java/com/cemu_UI/datatypes/CourseTableDataType.java @@ -1,7 +1,7 @@ /** * cemu_UI * - * Copyright 2017 <@Seil0> + * Copyright 2017-2018 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,7 +18,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ - package com.cemu_UI.datatypes; import com.jfoenix.controls.datamodels.treetable.RecursiveTreeObject; diff --git a/src/main/java/com/cemu_UI/datatypes/SmmdbApiDataType.java b/src/main/java/com/cemu_UI/datatypes/SmmdbApiDataType.java index 8b79697..749fa3a 100644 --- a/src/main/java/com/cemu_UI/datatypes/SmmdbApiDataType.java +++ b/src/main/java/com/cemu_UI/datatypes/SmmdbApiDataType.java @@ -1,7 +1,7 @@ /** * cemu_UI * - * Copyright 2017 <@Seil0> + * Copyright 2017-2018 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,7 +18,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ - package com.cemu_UI.datatypes; import javafx.beans.property.IntegerProperty; diff --git a/src/main/java/com/cemu_UI/datatypes/UIROMDataType.java b/src/main/java/com/cemu_UI/datatypes/UIROMDataType.java index 23a46f6..2a66c6e 100644 --- a/src/main/java/com/cemu_UI/datatypes/UIROMDataType.java +++ b/src/main/java/com/cemu_UI/datatypes/UIROMDataType.java @@ -1,7 +1,7 @@ /** * cemu_UI * - * Copyright 2017 <@Seil0> + * Copyright 2017-2018 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,7 +18,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ - package com.cemu_UI.datatypes; import com.jfoenix.controls.JFXButton; diff --git a/src/main/java/com/cemu_UI/uiElements/JFXEditGameDialog.java b/src/main/java/com/cemu_UI/uiElements/JFXEditGameDialog.java index c5cdb67..0487b14 100644 --- a/src/main/java/com/cemu_UI/uiElements/JFXEditGameDialog.java +++ b/src/main/java/com/cemu_UI/uiElements/JFXEditGameDialog.java @@ -1,7 +1,7 @@ /** * cemu_UI * - * Copyright 2017 <@Seil0> + * Copyright 2017-2018 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,8 +18,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ - - package com.cemu_UI.uiElements; import java.io.File; diff --git a/src/main/java/com/cemu_UI/uiElements/JFXInfoDialog.java b/src/main/java/com/cemu_UI/uiElements/JFXInfoDialog.java index 9c2b710..ee2513a 100644 --- a/src/main/java/com/cemu_UI/uiElements/JFXInfoDialog.java +++ b/src/main/java/com/cemu_UI/uiElements/JFXInfoDialog.java @@ -1,7 +1,7 @@ /** * cemu_UI * - * Copyright 2017 <@Seil0> + * Copyright 2017-2018 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,7 +18,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ - package com.cemu_UI.uiElements; import com.jfoenix.controls.JFXButton; diff --git a/src/main/java/com/cemu_UI/uiElements/JFXOkayCancelDialog.java b/src/main/java/com/cemu_UI/uiElements/JFXOkayCancelDialog.java index 5dd4d1a..47d2ff8 100644 --- a/src/main/java/com/cemu_UI/uiElements/JFXOkayCancelDialog.java +++ b/src/main/java/com/cemu_UI/uiElements/JFXOkayCancelDialog.java @@ -1,7 +1,7 @@ /** * cemu_UI * - * Copyright 2017 <@Seil0> + * Copyright 2017-2018 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,8 +18,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ - - package com.cemu_UI.uiElements; import java.util.ResourceBundle; diff --git a/src/main/java/com/cemu_UI/uiElements/JFXTextAreaInfoDialog.java b/src/main/java/com/cemu_UI/uiElements/JFXTextAreaInfoDialog.java index fd8ff2f..2831162 100644 --- a/src/main/java/com/cemu_UI/uiElements/JFXTextAreaInfoDialog.java +++ b/src/main/java/com/cemu_UI/uiElements/JFXTextAreaInfoDialog.java @@ -1,7 +1,7 @@ /** * cemu_UI * - * Copyright 2017 <@Seil0> + * Copyright 2017-2018 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,7 +18,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ - package com.cemu_UI.uiElements; import com.jfoenix.controls.JFXButton; diff --git a/src/main/java/com/cemu_UI/vendorCloudController/GoogleDriveController.java b/src/main/java/com/cemu_UI/vendorCloudController/GoogleDriveController.java index 485ceef..65289bf 100644 --- a/src/main/java/com/cemu_UI/vendorCloudController/GoogleDriveController.java +++ b/src/main/java/com/cemu_UI/vendorCloudController/GoogleDriveController.java @@ -1,7 +1,7 @@ /** * cemu_UI * - * Copyright 2017 <@Seil0> + * Copyright 2017-2018 <@Seil0> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,7 +18,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ - package com.cemu_UI.vendorCloudController; import java.io.FileOutputStream; diff --git a/src/main/resources/css/MainWindows.css b/src/main/resources/css/MainWindows.css index db8b365..2712b11 100644 --- a/src/main/resources/css/MainWindows.css +++ b/src/main/resources/css/MainWindows.css @@ -81,6 +81,38 @@ -fx-background-color: -fx-tree-table-color, -fx-box-border, -fx-control-inner-background; -fx-background-insets: -1.4, 0, 1; -fx-background-radius: 1.4, 0, 0; - /*....*/ -fx-padding: 1; /* 0.083333em; */ -} \ No newline at end of file +} + +/* + * ChoiceBox + */ + + +.choice-box { + -fx-background-color: transparent; + -fx-border-color: #000000; + -fx-border-width: 0 0 1 0; + -fx-background-radius: 0; + -fx-border-radius: 0; +} + +.choice-box:focused { + -fx-border-color: #9E9E9E; +} + +.choice-box>.open-button>.arrow { + -fx-background-color: #757575; +} + +.menu-item:focused { + -fx-background-color: #00A8CC; +} + +/* + * Spinner + */ +.spinner { + -fx-background-color: #f4f4f4; +} + diff --git a/src/main/resources/fxml/MainWindow.fxml b/src/main/resources/fxml/MainWindow.fxml index d67e830..c9dde2c 100644 --- a/src/main/resources/fxml/MainWindow.fxml +++ b/src/main/resources/fxml/MainWindow.fxml @@ -18,7 +18,7 @@ - + @@ -91,12 +91,12 @@ - + - + - + - + diff --git a/src/main/resources/locals/cemu_UI-Local_en_US.properties b/src/main/resources/locals/cemu_UI-Local_en_US.properties index f93fce9..043d926 100644 --- a/src/main/resources/locals/cemu_UI-Local_en_US.properties +++ b/src/main/resources/locals/cemu_UI-Local_en_US.properties @@ -2,7 +2,7 @@ # Buttons aboutBtn = About -settingsBtn = Setting +settingsBtn = Settings addBtn = Add new Game reloadRomsBtn = reload ROMs smmdbBtn = smmdb @@ -33,7 +33,7 @@ timeColumn = time # Strings editHeadingText = edit -editBodyText = You can edit the tile and rom/cover path. +editBodyText = You can edit the tile and ROM/cover path. removeHeadingText = remove removeBodyText = Are you sure you want to delete addUpdateHeadingText = update @@ -49,15 +49,15 @@ aboutBtnHeadingText = cemu_UI aboutBtnBodyText = This Application is made with free Software\nand licensed under the terms of GNU GPL 3.\n\nwww.kellerkinder.xyz cloudSyncWaringHeadingText = activate cloud savegame sync (beta) -cloudSyncWaringBodyText = WARNING this is a completly WIP cloud save integration,\nit's NOT recomended to use this!!\n\nUse it on your own risk and backup everthing before! +cloudSyncWaringBodyText = WARNING this is a completely WIP cloud save integration,\nit's NOT recommended to use this!!\n\nUse it on your own risk and backup everything before! cloudSyncErrorHeadingText = Error while initializing cloud sync! -cloudSyncErrorBodyText = There was some truble while initializing cloud sync.\nPlease upload the app.log (which can be found in the cemu_UI directory)\nto \"https://github.com/Seil0/cemu_UI/issues\" so we can fix this. +cloudSyncErrorBodyText = There was some trouble while initializing cloud sync.\nPlease upload the app.log (which can be found in the cemu_UI directory)\nto \"https://github.com/Seil0/cemu_UI/issues\" so we can fix this. addGameBtnHeadingText = add a new game to cemu_UI addGameBtnBodyText = addBtnReturnErrorHeadingText = Error while adding a new Game! -addBtnReturnErrorBodyText = There was some truble adding your game.\nOne of the needed values was empty, please try again to add your game. +addBtnReturnErrorBodyText = There was some trouble adding your game.\nOne of the needed values was empty, please try again to add your game. lastPlayed = Last played, today = today yesterday = yesterday @@ -82,6 +82,6 @@ titleID = title ID romPath = ROM path coverPath = cover path editGameDialogHeadingTextError = Error while adding a new Game! -editGameDialogBodyTextError = There was some truble adding your game.\nOne of the needed values was empty, please try again to add your game. +editGameDialogBodyTextError = There was some trouble adding your game.\nOne of the needed values was empty, please try again to add your game. editGameDialogSelectPathBtn = select .rpx file editGameDialogSelectCoverBtn = select cover file diff --git a/src/test/main/com/cemu_UI/test/AppTest.java b/src/test/main/com/cemu_UI/test/AppTest.java index 5040382..feb266c 100644 --- a/src/test/main/com/cemu_UI/test/AppTest.java +++ b/src/test/main/com/cemu_UI/test/AppTest.java @@ -1,8 +1,5 @@ package com.cemu_UI.test; -import java.io.File; - -import junit.framework.Assert; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; @@ -24,8 +21,7 @@ public class AppTest extends TestCase { @SuppressWarnings("unused") private void testClientsSecret() { - File client_secret = new File("/client_secret.json"); - Assert.assertTrue(client_secret.exists()); + } /**