From 3f6eeece7d9cb3bd0b4094c7be39f8f3cd5713e5 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Sun, 2 Dec 2018 23:51:14 +0100 Subject: [PATCH 01/19] updated some libs, code clean up * openjfx 11 -> 11.0.1 * jfoenix 9.0.6 -> 9.0.8 * sqlite-jdbc 3.23.2 -> 3.25.2 * google-api-services-drive rev129 -> rev136 * jackson-core 2.9.6 -> 2.9.7 --- pom.xml | 62 +----- .../application/MainWindowController.java | 189 +++++++----------- .../cemu_UI/controller/CloudController.java | 51 +++-- .../cemu_UI/datatypes/GlobalDataTypes.java | 29 +++ 4 files changed, 134 insertions(+), 197 deletions(-) create mode 100644 src/main/java/com/cemu_UI/datatypes/GlobalDataTypes.java diff --git a/pom.xml b/pom.xml index b340728..9d4e913 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com cemu_UI - 0.3.1-SNAPSHOT + 0.3.2-SNAPSHOT jar cemu_UI cemu_UI is a simple, material design graphical frontend for cemu, a Wii U emulator @@ -27,25 +27,25 @@ org.openjfx javafx-controls - 11 + 11.0.1 org.openjfx javafx-fxml - 11 + 11.0.1 org.openjfx javafx-media - 11 + 11.0.1 com.jfoenix jfoenix - 9.0.6 + 9.0.8 @@ -57,7 +57,7 @@ org.xerial sqlite-jdbc - 3.23.1 + 3.25.2 @@ -92,14 +92,6 @@ 1.11 - - - io.datafx - flow - 8.0.1 - - - net.lingala.zip4j @@ -115,18 +107,11 @@ 1.1.1 - - - com.google.api-client - google-api-client - 1.25.0 - - com.google.apis google-api-services-drive - v3-rev129-1.25.0 + v3-rev136-1.25.0 @@ -143,20 +128,6 @@ 1.25.0 - - - com.google.oauth-client - google-oauth-client - 1.25.0 - - - - - com.google.oauth-client - google-oauth-client-java6 - 1.25.0 - - com.google.oauth-client @@ -168,15 +139,7 @@ com.fasterxml.jackson.core jackson-core - 2.9.6 - - - - - javax.servlet - javax.servlet-api - 4.0.1 - provided + 2.9.7 @@ -186,13 +149,6 @@ 6.1.26 - - - org.mortbay.jetty - jetty-util - 6.1.26 - - @@ -229,7 +185,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.1.1 + 3.2.1 package diff --git a/src/main/java/com/cemu_UI/application/MainWindowController.java b/src/main/java/com/cemu_UI/application/MainWindowController.java index 99e6640..dd5b480 100644 --- a/src/main/java/com/cemu_UI/application/MainWindowController.java +++ b/src/main/java/com/cemu_UI/application/MainWindowController.java @@ -57,6 +57,7 @@ import com.cemu_UI.controller.DBController; import com.cemu_UI.controller.SmmdbAPIController; import com.cemu_UI.controller.UpdateController; import com.cemu_UI.datatypes.CourseTableDataType; +import com.cemu_UI.datatypes.GlobalDataTypes.CloudService; import com.cemu_UI.datatypes.SmmdbApiDataType; import com.cemu_UI.datatypes.UIROMDataType; import com.cemu_UI.uiElements.JFXEditGameDialog; @@ -109,130 +110,73 @@ import net.lingala.zip4j.exception.ZipException; public class MainWindowController { - @FXML - private JFXButton aboutBtn; - @FXML - private JFXButton settingsBtn; - @FXML - private JFXButton addBtn; - @FXML - private JFXButton reloadRomsBtn; - @FXML - private JFXButton smmdbBtn; - @FXML - private JFXButton cemuTFBtn; - @FXML - private JFXButton romTFBtn; - @FXML - private JFXButton updateBtn; - @FXML - private JFXButton smmdbDownloadBtn; - @FXML - private JFXButton playBtn; - @FXML - private JFXButton lastTimePlayedBtn; - @FXML - JFXButton totalPlaytimeBtn; + @FXML private JFXButton aboutBtn; + @FXML private JFXButton settingsBtn; + @FXML private JFXButton addBtn; + @FXML private JFXButton reloadRomsBtn; + @FXML private JFXButton smmdbBtn; + @FXML private JFXButton cemuTFBtn; + @FXML private JFXButton romTFBtn; + @FXML private JFXButton updateBtn; + @FXML private JFXButton smmdbDownloadBtn; + @FXML private JFXButton playBtn; + @FXML private JFXButton lastTimePlayedBtn; + @FXML JFXButton totalPlaytimeBtn; - @FXML - private JFXHamburger menuHam; + @FXML private JFXHamburger menuHam; - @FXML - private JFXTextField cemuTextField; - @FXML - private JFXTextField romTextField; - @FXML - private JFXTextField courseSearchTextFiled; - @FXML - private JFXTextField executeCommandTextFiled; + @FXML private JFXTextField cemuTextField; + @FXML private JFXTextField romTextField; + @FXML private JFXTextField courseSearchTextFiled; + @FXML private JFXTextField executeCommandTextFiled; - @FXML - private TextFlow smmdbTextFlow; + @FXML private TextFlow smmdbTextFlow; - @FXML - private JFXColorPicker colorPicker; + @FXML private JFXColorPicker colorPicker; - @FXML - private JFXToggleButton cloudSyncToggleBtn; - @FXML - private JFXToggleButton autoUpdateToggleBtn; - @FXML - private JFXToggleButton fullscreenToggleBtn; + @FXML private JFXToggleButton cloudSyncToggleBtn; + @FXML private JFXToggleButton autoUpdateToggleBtn; + @FXML private JFXToggleButton fullscreenToggleBtn; - @FXML - private ChoiceBox languageChoisBox; - @FXML - private ChoiceBox branchChoisBox; + @FXML private ChoiceBox languageChoisBox; + @FXML private ChoiceBox branchChoisBox; - @FXML - private AnchorPane mainAnchorPane; - @FXML - private AnchorPane gamesAnchorPane; - @FXML - private AnchorPane settingsAnchorPane; - @FXML - private AnchorPane smmdbAnchorPane; + @FXML private AnchorPane mainAnchorPane; + @FXML private AnchorPane gamesAnchorPane; + @FXML private AnchorPane settingsAnchorPane; + @FXML private AnchorPane smmdbAnchorPane; - @FXML - private ScrollPane mainScrollPane; - @FXML - private ScrollPane settingsScrollPane; - @FXML - private ScrollPane smmdbScrollPane; - @FXML - private ScrollPane smmdbImageViewScrollPane; + @FXML private ScrollPane mainScrollPane; + @FXML private ScrollPane settingsScrollPane; + @FXML private ScrollPane smmdbScrollPane; + @FXML private ScrollPane smmdbImageViewScrollPane; - @FXML - private VBox sideMenuVBox; + @FXML private VBox sideMenuVBox; - @FXML - private HBox topHBox; - @FXML - private HBox bottomHBox; + @FXML private HBox topHBox; + @FXML private HBox bottomHBox; - @FXML - private ImageView smmdbImageView; + @FXML private ImageView smmdbImageView; - @FXML - private Label helpLbl; - @FXML - private Label cemu_UISettingsLbl; - @FXML - private Label cemuDirectoryLbl; - @FXML - private Label romDirectoryLbl; - @FXML - private Label mainColorLbl; - @FXML - private Label languageLbl; - @FXML - private Label updateLbl; - @FXML - private Label branchLbl; - @FXML - private Label cemuSettingsLbl; - @FXML - private Label licensesLbl; + @FXML private Label helpLbl; + @FXML private Label cemu_UISettingsLbl; + @FXML private Label cemuDirectoryLbl; + @FXML private Label romDirectoryLbl; + @FXML private Label mainColorLbl; + @FXML private Label languageLbl; + @FXML private Label updateLbl; + @FXML private Label branchLbl; + @FXML private Label cemuSettingsLbl; + @FXML private Label licensesLbl; - @FXML - private JFXTreeTableView courseTreeTable = new JFXTreeTableView(); + @FXML private JFXTreeTableView courseTreeTable = new JFXTreeTableView(); - @FXML - private TreeItem root = new TreeItem<>(new CourseTableDataType("", "", 0, 0)); + @FXML private TreeItem root = new TreeItem<>(new CourseTableDataType("", "", 0, 0)); - @FXML - private JFXTreeTableColumn titleColumn = new JFXTreeTableColumn<>("title"); - @FXML - private JFXTreeTableColumn idColumn = new JFXTreeTableColumn<>("id"); - @FXML - private JFXTreeTableColumn starsColumn = new JFXTreeTableColumn<>("stars"); - @FXML - private JFXTreeTableColumn timeColumn = new JFXTreeTableColumn<>("time"); - - @SuppressWarnings("unused") - private enum CloudService { - GoogleDrive, Dropbox - } + @FXML private JFXTreeTableColumn titleColumn = new JFXTreeTableColumn<>("title"); + @FXML private JFXTreeTableColumn idColumn = new JFXTreeTableColumn<>("id"); + @FXML private JFXTreeTableColumn starsColumn = new JFXTreeTableColumn<>("stars"); + @FXML private JFXTreeTableColumn timeColumn = new JFXTreeTableColumn<>("time"); private Main main; private DBController dbController; @@ -248,7 +192,7 @@ public class MainWindowController { private boolean useBeta = false; private boolean fullscreen; private boolean cloudSync; - private String cloudService = ""; // set cloud provider (at the moment only GoogleDrive, Dropbox is planed) + private CloudService cloudService; private String cemuPath; private String romDirectoryPath; private String gameExecutePath; @@ -257,8 +201,8 @@ public class MainWindowController { private String selectedGameTitleID; private String selectedGameTitle; private String id; - private String version = "0.3.1"; - private String buildNumber = "081"; + private String version = "0.3.2"; + private String buildNumber = "085"; private String versionName = "Purple Comet"; private int xPos = -200; private int yPos = 17; @@ -1020,7 +964,7 @@ public class MainWindowController { cloudSync = true; //TODO rework for other cloud services // CloudService service = CloudService.GoogleDrive; - cloudService = "GoogleDrive"; + cloudService = CloudService.GoogleDrive; // start cloud sync in new thread Thread thread = new Thread(new Runnable() { @@ -1606,7 +1550,7 @@ public class MainWindowController { if (getCloudService() == null) { props.setProperty("cloudService", ""); } else { - props.setProperty("cloudService", getCloudService()); + props.setProperty("cloudService", getCloudService().toString()); } props.setProperty("folderID", main.getCloudController().getFolderID(getCloudService())); props.setProperty("lastLocalSync", String.valueOf(getLastLocalSync())); @@ -1689,10 +1633,19 @@ public class MainWindowController { } try { - setCloudService(props.getProperty("cloudService")); + switch (props.getProperty("cloudService")) { + case "GoogleDrive": + setCloudService(CloudService.GoogleDrive); + break; + case "Dropbox": + setCloudService(CloudService.Dropbox); + break; + default: + break; + } } catch (Exception e) { LOGGER.error("could not load cloudSync", e); - setCloudService(""); + setCloudService(null); } try { @@ -1920,11 +1873,11 @@ public class MainWindowController { this.selectedGameTitleID = selectedGameTitleID; } - public String getCloudService() { + public CloudService getCloudService() { return cloudService; } - public void setCloudService(String cloudService) { + public void setCloudService(CloudService cloudService) { this.cloudService = cloudService; } diff --git a/src/main/java/com/cemu_UI/controller/CloudController.java b/src/main/java/com/cemu_UI/controller/CloudController.java index 6e3f385..829a059 100644 --- a/src/main/java/com/cemu_UI/controller/CloudController.java +++ b/src/main/java/com/cemu_UI/controller/CloudController.java @@ -32,6 +32,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.cemu_UI.application.MainWindowController; +import com.cemu_UI.datatypes.GlobalDataTypes.CloudService; import com.cemu_UI.vendorCloudController.GoogleDriveController; import javafx.application.Platform; @@ -48,11 +49,11 @@ public class CloudController { private GoogleDriveController googleDriveController = new GoogleDriveController(); private static final Logger LOGGER = LogManager.getLogger(CloudController.class.getName()); - public boolean initializeConnection(String cloudService, String cemuDirectory) { + public boolean initializeConnection(CloudService cloudService, String cemuDirectory) { boolean success = false; LOGGER.info("sartting cloud initialisation ..."); - if(cloudService.equals("GoogleDrive")) { + if(cloudService == CloudService.GoogleDrive) { LOGGER.info("selected service is Google Drive"); try { googleDriveController.main(cemuDirectory); @@ -63,7 +64,7 @@ public class CloudController { success = true; } - if(cloudService.equals("Dropbox")) { + if(cloudService == CloudService.Dropbox) { LOGGER.info("selected service is Dropbox"); } LOGGER.info("cloud initialisation done!"); @@ -76,7 +77,7 @@ public class CloudController { * @param cemuDirectory * @param cemu_UIDirectory */ - public void sync(String cloudService, String cemuDirectory, String cemu_UIDirectory) { + public void sync(CloudService cloudService, String cemuDirectory, String cemu_UIDirectory) { // running sync in a new thread, instead of blocking the main thread Thread thread = new Thread(new Runnable() { @@ -88,18 +89,18 @@ public class CloudController { mwc.getPlayBtn().setText("syncing..."); }); LOGGER.info("starting synchronization in new thread ..."); - + // zip the saves folder File zipFile = zipSavegames(cemu_UIDirectory, cemuDirectory); // upload the zip switch (cloudService) { - + // use GoogleDriveController - case "GoogleDrive": + case GoogleDrive: LOGGER.info("using GoogleDriveController"); long lastCloudSync = googleDriveController.getLastCloudSync(); - + if (!googleDriveController.checkFolder()) { LOGGER.info("cloud sync folder dosen't exist, creating one!"); googleDriveController.creatFolder(); @@ -107,7 +108,7 @@ public class CloudController { } else if (mwc.getLastLocalSync() > lastCloudSync) { LOGGER.info("local is new, going to upload zip"); googleDriveController.uploadZipFile(zipFile); - } else if(mwc.getLastLocalSync() < lastCloudSync) { + } else if (mwc.getLastLocalSync() < lastCloudSync) { LOGGER.info("cloud is new, going to download zip"); unzipSavegames(cemuDirectory, googleDriveController.downloadZipFile(cemu_UIDirectory)); mwc.setLastLocalSync(lastCloudSync); @@ -116,21 +117,18 @@ public class CloudController { LOGGER.info("nothing to do"); break; } - mwc.setLastLocalSync(Long.parseLong(zipFile.getName().substring(0, zipFile.getName().length()-4))); // set time of last sucessfull sync - break; - - - - case "Dropbox": - + mwc.setLastLocalSync(Long.parseLong(zipFile.getName().substring(0, zipFile.getName().length() - 4))); // set time of last sucessfull sync + break; + + case Dropbox: + // do the thing break; - default: LOGGER.warn("no cloud vendor found!"); break; } - + zipFile.delete(); // delete zipfile in cem_UI directory Platform.runLater(() -> { @@ -138,11 +136,12 @@ public class CloudController { mwc.getPlayBtn().setDisable(false); mwc.saveSettings(); }); - LOGGER.info("synchronization successful!"); } catch (Exception e) { - LOGGER.error("There was an error during syncronisation! Please open a new issue on the cemu_UI github page:", e); + LOGGER.error( + "There was an error during syncronisation! Please open a new issue on the cemu_UI github page:", + e); } } }); @@ -199,25 +198,25 @@ public class CloudController { } } - public String getFolderID(String cloudService) { + public String getFolderID(CloudService cloudService) { String folderID = ""; if (cloudService != null) { - if (cloudService.equals("GoogleDrive")) { + if (cloudService == CloudService.GoogleDrive) { folderID = googleDriveController.getFolderID(); } - if (cloudService.equals("Dropbox")) { + if (cloudService == CloudService.Dropbox) { } } return folderID; } - public void setFolderID(String folderID, String cloudService) { + public void setFolderID(String folderID, CloudService cloudService) { if (cloudService != null) { - if (cloudService.equals("GoogleDrive")) { + if (cloudService == CloudService.GoogleDrive) { googleDriveController.setFolderID(folderID); } - if (cloudService.equals("Dropbox")) { + if (cloudService == CloudService.Dropbox) { } } diff --git a/src/main/java/com/cemu_UI/datatypes/GlobalDataTypes.java b/src/main/java/com/cemu_UI/datatypes/GlobalDataTypes.java new file mode 100644 index 0000000..2d37806 --- /dev/null +++ b/src/main/java/com/cemu_UI/datatypes/GlobalDataTypes.java @@ -0,0 +1,29 @@ +/** + * cemu_UI + * + * 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 + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +package com.cemu_UI.datatypes; + +public class GlobalDataTypes { + + public enum CloudService { + GoogleDrive, Dropbox + } +} From 38421599a3feeaa276ce5a02c1896bee5725adb8 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Mon, 3 Dec 2018 00:09:02 +0100 Subject: [PATCH 02/19] the updater now uses gitea --- .../cemu_UI/controller/UpdateController.java | 86 ++++++++----------- .../locals/cemu_UI-Local_en_US.properties | 8 +- 2 files changed, 40 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/cemu_UI/controller/UpdateController.java b/src/main/java/com/cemu_UI/controller/UpdateController.java index 03aed13..4fa6929 100644 --- a/src/main/java/com/cemu_UI/controller/UpdateController.java +++ b/src/main/java/com/cemu_UI/controller/UpdateController.java @@ -44,16 +44,16 @@ import javafx.application.Platform; public class UpdateController implements Runnable { private MainWindowController mainWindowController; - private String buildNumber; + private int buildNumber; + private int updateBuildNumber; // tag_name from gitea private String apiOutput; - private String updateBuildNumber; // tag_name from Github -// private String updateName; -// private String updateChanges; - private String browserDownloadUrl; // update download link - private String githubApiRelease = "https://api.github.com/repos/Seil0/cemu_UI/releases/latest"; - private String githubApiBeta = "https://api.github.com/repos/Seil0/cemu_UI/releases"; - - private URL githubApiUrl; + @SuppressWarnings("unused") + private String updateName; + @SuppressWarnings("unused") + private String updateChanges; + private String browserDownloadUrl; // update download link + private String giteaApiRelease = "https://git.mosad.xyz/api/v1/repos/Seil0/cemu_UI/releases"; + private URL giteaApiUrl; private boolean useBeta; private static final Logger LOGGER = LogManager.getLogger(UpdateController.class.getName()); @@ -62,7 +62,7 @@ public class UpdateController implements Runnable { */ public UpdateController(MainWindowController mwc, String buildNumber, boolean useBeta) { mainWindowController = mwc; - this.buildNumber = buildNumber; + this.buildNumber = Integer.parseInt(buildNumber); this.useBeta = useBeta; } @@ -74,15 +74,9 @@ public class UpdateController implements Runnable { }); try { - - if (useBeta) { - githubApiUrl = new URL(githubApiBeta); - } else { - githubApiUrl = new URL(githubApiRelease); - } - - // URL githubApiUrl = new URL(githubApiRelease); - BufferedReader ina = new BufferedReader(new InputStreamReader(githubApiUrl.openStream())); + giteaApiUrl = new URL(giteaApiRelease); + + BufferedReader ina = new BufferedReader(new InputStreamReader(giteaApiUrl.openStream())); apiOutput = ina.readLine(); ina.close(); } catch (IOException e) { @@ -90,41 +84,32 @@ public class UpdateController implements Runnable { LOGGER.error("could not check update version", e); }); } - - if (useBeta) { - JsonArray objectArray = Json.parse("{\"items\": " + apiOutput + "}").asObject().get("items").asArray(); - JsonValue object = objectArray.get(0); - JsonArray objectAssets = object.asObject().get("assets").asArray(); - - updateBuildNumber = object.asObject().getString("tag_name", ""); -// updateName = object.asObject().getString("name", ""); -// updateChanges = object.asObject().getString("body", ""); - - for (JsonValue asset : objectAssets) { - browserDownloadUrl = asset.asObject().getString("browser_download_url", ""); - } - - } else { - JsonObject object = Json.parse(apiOutput).asObject(); - JsonArray objectAssets = Json.parse(apiOutput).asObject().get("assets").asArray(); - - updateBuildNumber = object.getString("tag_name", ""); -// updateName = object.getString("name", ""); -// updateChanges = object.getString("body", ""); - for (JsonValue asset : objectAssets) { - browserDownloadUrl = asset.asObject().getString("browser_download_url", ""); - + + JsonArray objectArray = Json.parse("{\"items\": " + apiOutput + "}").asObject().get("items").asArray(); + JsonValue object = objectArray.get(0).asObject(); // set to the latest release as default + JsonObject objectAsset = object.asObject().get("assets").asArray().get(0).asObject(); + + for(JsonValue objectIt : objectArray) { + // TODO note this will download still the pre-release if there's a more recent stable version + if(objectIt.asObject().getBoolean("prerelease", false) == useBeta) { + // we found the needed release either beta or not + object = objectIt; + objectAsset = objectIt.asObject().get("assets").asArray().get(0).asObject(); + break; } } + + updateBuildNumber = Integer.parseInt(object.asObject().getString("tag_name", "")); + updateName = object.asObject().getString("name", ""); + updateChanges = object.asObject().getString("body", ""); LOGGER.info("Build: " + buildNumber + ", Update: " + updateBuildNumber); - // Compares the program BuildNumber with the current BuildNumber if program - // BuildNumber < current BuildNumber then perform a update - int iversion = Integer.parseInt(buildNumber); - int iaktVersion = Integer.parseInt(updateBuildNumber.replace(".", "")); - - if (iversion >= iaktVersion) { + /** + * Compare the program BuildNumber with the current BuildNumber + * if buildNumber < updateBuildNumber then perform a update + */ + if (buildNumber >= updateBuildNumber) { Platform.runLater(() -> { mainWindowController.getUpdateBtn().setText(mainWindowController.getBundle().getString("updateBtnNoUpdateAvailable")); }); @@ -134,6 +119,7 @@ public class UpdateController implements Runnable { mainWindowController.getUpdateBtn().setText(mainWindowController.getBundle().getString("updateBtnUpdateAvailable")); }); LOGGER.info("update available"); + browserDownloadUrl = objectAsset.getString("browser_download_url", ""); LOGGER.info("download link: " + browserDownloadUrl); try { // open new Http connection, ProgressMonitorInputStream for downloading the data @@ -148,7 +134,7 @@ public class UpdateController implements Runnable { 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 new ProcessBuilder("java", "-jar", "cemu_UI.jar").start(); // start the new application - System.exit(0); // finishes itself + System.exit(0); // close the current application } catch (IOException e) { Platform.runLater(() -> { LOGGER.info("could not download update files", e); 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 4a335a1..c309cd6 100644 --- a/src/main/resources/locals/cemu_UI-Local_en_US.properties +++ b/src/main/resources/locals/cemu_UI-Local_en_US.properties @@ -18,10 +18,10 @@ fullscreenToggleBtn = start game in fullscreen cemu_UISettingsLbl = cemu_UI Settings cemuDirectoryLbl = cemu directory romDirectoryLbl = ROM directory -mainColorLbl = main color -languageLbl = language -updateLbl = updates -branchLbl = branch +mainColorLbl = primary color +languageLbl = Language +updateLbl = Updates +branchLbl = Branch cemuSettingsLbl = cemu Settings licensesLbl = Licenses From 360badb841a6ce4938c5094a6b08c3bf71d1e196 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Fri, 4 Jan 2019 23:35:50 +0100 Subject: [PATCH 03/19] removed travis.yml --- .travis.yml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 2b01596..0000000 --- a/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: java -jdk: - - oraclejdk9 - - oraclejdk10 From 7434d0be2561fe710b96f87bdb57ea65f9438953 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Mon, 14 Jan 2019 20:16:19 +0100 Subject: [PATCH 04/19] minor clean up --- src/main/java/com/cemu_UI/application/Main.java | 6 ++++++ .../cemu_UI/application/MainWindowController.java | 14 +------------- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/cemu_UI/application/Main.java b/src/main/java/com/cemu_UI/application/Main.java index caf7a6a..df994a0 100644 --- a/src/main/java/com/cemu_UI/application/Main.java +++ b/src/main/java/com/cemu_UI/application/Main.java @@ -49,6 +49,7 @@ import javafx.scene.layout.AnchorPane; public class Main extends Application { + private static Main main; private Stage primaryStage; private MainWindowController mainWindowController; private CloudController cloudController; @@ -79,6 +80,7 @@ public class Main extends Application { this.primaryStage = primaryStage; mainWindowController = new MainWindowController(this); + main = this; mainWindow(); initActions(); @@ -299,6 +301,10 @@ public class Main extends Application { primaryStage.heightProperty().addListener(heightListener); primaryStage.maximizedProperty().addListener(maximizeListener); } + + public static Main getMain() { + return main; + } public Stage getPrimaryStage() { return primaryStage; diff --git a/src/main/java/com/cemu_UI/application/MainWindowController.java b/src/main/java/com/cemu_UI/application/MainWindowController.java index dd5b480..54fe219 100644 --- a/src/main/java/com/cemu_UI/application/MainWindowController.java +++ b/src/main/java/com/cemu_UI/application/MainWindowController.java @@ -20,7 +20,6 @@ */ package com.cemu_UI.application; -import java.awt.Desktop; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.BufferedReader; @@ -34,7 +33,6 @@ import java.io.OutputStream; import java.math.BigInteger; import java.net.HttpURLConnection; import java.net.MalformedURLException; -import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.sql.SQLException; @@ -625,17 +623,7 @@ public class MainWindowController { @Override public void handle(MouseEvent mouseEvent) { if (mouseEvent.getButton().equals(MouseButton.PRIMARY)) { - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - try { - Desktop.getDesktop().browse(new URI("https://git.mosad.xyz/Seil0/cemu_UI/issues/3")); - } catch (IOException | URISyntaxException e) { - LOGGER.error("An error ocoured while trying to open a Website.", e); - } - } - }); - thread.start(); + Main.getMain().getHostServices().showDocument("https://git.mosad.xyz/Seil0/cemu_UI/issues/3"); } } }); From db8fcd4bdc84d480b04344fd5be38f12216e1c71 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Tue, 22 Jan 2019 19:21:38 +0100 Subject: [PATCH 05/19] major code clean up --- .../java/com/cemu_UI/application/Main.java | 126 ++--- .../application/MainWindowController.java | 432 ++++-------------- .../com/cemu_UI/application/playGame.java | 19 +- .../cemu_UI/controller/CloudController.java | 22 +- .../com/cemu_UI/controller/DBController.java | 11 +- .../com/cemu_UI/controller/XMLController.java | 404 ++++++++++++++++ .../GoogleDriveController.java | 57 ++- 7 files changed, 572 insertions(+), 499 deletions(-) create mode 100644 src/main/java/com/cemu_UI/controller/XMLController.java diff --git a/src/main/java/com/cemu_UI/application/Main.java b/src/main/java/com/cemu_UI/application/Main.java index df994a0..8671dd5 100644 --- a/src/main/java/com/cemu_UI/application/Main.java +++ b/src/main/java/com/cemu_UI/application/Main.java @@ -34,6 +34,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.cemu_UI.controller.CloudController; +import com.cemu_UI.controller.XMLController; import javafx.application.Application; import javafx.beans.value.ChangeListener; @@ -53,30 +54,18 @@ public class Main extends Application { private Stage primaryStage; private MainWindowController mainWindowController; private CloudController cloudController; + private static XMLController xmlController; private AnchorPane pane; private Scene scene; - private static String userHome = System.getProperty("user.home"); - private static String userName = System.getProperty("user.name"); - private static String osName = System.getProperty("os.name"); - private static String osArch = System.getProperty("os.arch"); - private static String osVers = System.getProperty("os.version"); - private static String javaVers = System.getProperty("java.version"); - private static String javaVend= System.getProperty("java.vendor"); private String gamesDBdownloadURL = "https://git.mosad.xyz/Seil0/cemu_UI/raw/branch/master/downloadContent/games.db"; - private static String dirCemuUI; - private static File directory; - private static File configFile; - private static File gamesDBFile; - private static File reference_gamesFile; - private static File pictureCache; private static Logger LOGGER; @Override public void start(Stage primaryStage) { try { - LOGGER.info("OS: " + osName + " " + osVers + " " + osArch); - LOGGER.info("Java: " + javaVend + " " + javaVers); - LOGGER.info("User: " + userName + " " + userHome); + LOGGER.info("OS: " + XMLController.getOsName() + " " + XMLController.getOsVers() + " " + XMLController.getOsVers()); + LOGGER.info("Java: " + XMLController.getJavaVend() + " " + XMLController.getJavaVers()); + LOGGER.info("User: " + XMLController.getUserName() + " " + XMLController.getUserHome()); this.primaryStage = primaryStage; mainWindowController = new MainWindowController(this); @@ -122,37 +111,32 @@ public class Main extends Application { alert.showAndWait(); } - if (!directory.exists()) { + if (!XMLController.getDirCemuUI().exists()) { LOGGER.info("creating cemu_UI directory"); - directory.mkdir(); - pictureCache.mkdir(); + XMLController.getDirCemuUI().mkdir(); + XMLController.getPictureCache().mkdir(); } - if (!configFile.exists()) { + if (!XMLController.getConfigFile().exists()) { LOGGER.info("firststart, setting default values"); firstStart(); - mainWindowController.setColor("00a8cc"); - mainWindowController.setAutoUpdate(false); - mainWindowController.setLanguage("en_US"); - mainWindowController.setLastLocalSync(0); - mainWindowController.setxPosHelper(0); - mainWindowController.saveSettings(); + xmlController.saveSettings(); } - if (!pictureCache.exists()) { - pictureCache.mkdir(); + if (!XMLController.getPictureCache().exists()) { + XMLController.getPictureCache().mkdir(); } - if (!reference_gamesFile.exists()) { - if (gamesDBFile.exists()) { - gamesDBFile.delete(); + if (!XMLController.getRference_gamesFile().exists()) { + if (XMLController.getGamesDBFile().exists()) { + XMLController.getGamesDBFile().delete(); } try { LOGGER.info("downloading ReferenceGameList.db... "); URL website = new URL(gamesDBdownloadURL); ReadableByteChannel rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(reference_gamesFile); + FileOutputStream fos = new FileOutputStream(XMLController.getRference_gamesFile()); fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); fos.close(); LOGGER.info("finished downloading games.db"); @@ -166,9 +150,11 @@ public class Main extends Application { 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()); + if (XMLController.isCloudSync()) { + cloudController.initializeConnection(XMLController.getCloudService(), + XMLController.getCemuPath()); + cloudController.sync(XMLController.getCloudService(), XMLController.getCemuPath(), + XMLController.getDirCemuUIPath()); } } catch (IOException e) { @@ -177,24 +163,20 @@ public class Main extends Application { } public static void main(String[] args) { + String logPath = ""; - if (osName.contains("Windows")) { - dirCemuUI = userHome + "/Documents/cemu_UI"; + if (System.getProperty("os.name").contains("Windows")) { + logPath = System.getProperty("user.home") + "/Documents/cemu_UI/app.log"; } else { - dirCemuUI = userHome + "/cemu_UI"; + logPath = System.getProperty("user.home") + "/cemu_UI/app.log"; } - directory = new File(dirCemuUI); - configFile = new File(dirCemuUI + "/config.xml"); - gamesDBFile = new File(dirCemuUI + "/games.db"); - reference_gamesFile = new File(dirCemuUI + "/reference_games.db"); - pictureCache= new File(dirCemuUI+"/picture_cache"); - - // delete old log file and create new - System.setProperty("logFilename", dirCemuUI + "/app.log"); - File logFile = new File(dirCemuUI + "/app.log"); + System.setProperty("logFilename", logPath); + File logFile = new File(logPath); logFile.delete(); LOGGER = LogManager.getLogger(Main.class.getName()); + + xmlController = new XMLController(); launch(args); } @@ -208,10 +190,10 @@ public class Main extends Application { if (result.get() == ButtonType.OK) { DirectoryChooser directoryChooser = new DirectoryChooser(); File selectedDirectory = directoryChooser.showDialog(primaryStage); - mainWindowController.setCemuPath(selectedDirectory.getAbsolutePath()); + XMLController.setCemuPath(selectedDirectory.getAbsolutePath()); } else { - mainWindowController.setCemuPath(null); + XMLController.setCemuPath(null); } Alert alert2 = new Alert(AlertType.CONFIRMATION); // new alert with file-chooser @@ -223,9 +205,9 @@ public class Main extends Application { if (result2.get() == ButtonType.OK) { DirectoryChooser directoryChooser = new DirectoryChooser(); File selectedDirectory = directoryChooser.showDialog(primaryStage); - mainWindowController.setRomDirectoryPath(selectedDirectory.getAbsolutePath()); + XMLController.setRomDirectoryPath(selectedDirectory.getAbsolutePath()); } else { - mainWindowController.setRomDirectoryPath(null); + XMLController.setRomDirectoryPath(null); } } @@ -251,7 +233,8 @@ public class Main extends Application { saveTask = new TimerTask() { @Override public void run() { - mainWindowController.saveSettings(); + XMLController.setWindowWidth(mainWindowController.getMainAnchorPane().getWidth()); + xmlController.saveSettings(); } }; timer.schedule(saveTask, delayTime); @@ -272,7 +255,8 @@ public class Main extends Application { saveTask = new TimerTask() { @Override public void run() { - mainWindowController.saveSettings(); + XMLController.setWindowHeight(mainWindowController.getMainAnchorPane().getHeight()); + xmlController.saveSettings(); } }; timer.schedule(saveTask, delayTime); @@ -306,47 +290,11 @@ public class Main extends Application { return main; } - public Stage getPrimaryStage() { - return primaryStage; - } - - public void setPrimaryStage(Stage primaryStage) { - this.primaryStage = primaryStage; - } - public CloudController getCloudController() { return cloudController; } - public void setCloudController(CloudController cloudController) { - this.cloudController = cloudController; - } - public AnchorPane getPane() { return pane; } - - public void setPane(AnchorPane pane) { - this.pane = pane; - } - - public File getDirectory() { - return 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 54fe219..96d415e 100644 --- a/src/main/java/com/cemu_UI/application/MainWindowController.java +++ b/src/main/java/com/cemu_UI/application/MainWindowController.java @@ -24,12 +24,8 @@ import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; -import java.io.OutputStream; import java.math.BigInteger; import java.net.HttpURLConnection; import java.net.MalformedURLException; @@ -54,6 +50,7 @@ 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.XMLController; import com.cemu_UI.datatypes.CourseTableDataType; import com.cemu_UI.datatypes.GlobalDataTypes.CloudService; import com.cemu_UI.datatypes.SmmdbApiDataType; @@ -102,6 +99,7 @@ import javafx.scene.text.FontWeight; import javafx.scene.text.Text; import javafx.scene.text.TextFlow; import javafx.stage.DirectoryChooser; +import javafx.stage.Stage; import javafx.util.Duration; import net.lingala.zip4j.core.ZipFile; import net.lingala.zip4j.exception.ZipException; @@ -182,19 +180,13 @@ public class MainWindowController { private playGame playGame; private static MainWindowController MWC; private UpdateController updateController; + private XMLController xmlController; + private Stage primaryStage; private boolean menuTrue = false; private boolean settingsTrue = false; private boolean playTrue = false; private boolean smmdbTrue = false; - private boolean autoUpdate = false; - private boolean useBeta = false; - private boolean fullscreen; - private boolean cloudSync; - private CloudService cloudService; - private String cemuPath; - private String romDirectoryPath; private String gameExecutePath; - private String color; private String dialogBtnStyle; private String selectedGameTitleID; private String selectedGameTitle; @@ -204,13 +196,10 @@ public class MainWindowController { private String versionName = "Purple Comet"; private int xPos = -200; private int yPos = 17; - private int xPosHelper; + private int xPosHelper = 0; private int oldXPosHelper; private int selectedUIDataIndex; private int selected; - private long lastLocalSync; - private double windowWidth; - private double windowHeight; private DirectoryChooser directoryChooser = new DirectoryChooser(); private ObservableList branches = FXCollections.observableArrayList("stable", "beta"); private ObservableList languages = FXCollections.observableArrayList("English (en_US)", "Deutsch (de_DE)"); @@ -279,8 +268,9 @@ public class MainWindowController { private String smmdbDownloadBtnDownload; public MainWindowController(Main main) { + xmlController = new XMLController(); this.main = main; - dbController = new DBController(main, this); + dbController = new DBController(this); smmdbAPIController = new SmmdbAPIController(); } @@ -289,7 +279,7 @@ public class MainWindowController { * loadSettings, checkAutoUpdate, initUI and initActions */ public void init() { - loadSettings(); + xmlController.loadSettings(); // load settings checkAutoUpdate(); initUI(); initActions(); @@ -301,21 +291,24 @@ public class MainWindowController { private void initUI() { LOGGER.info("initializing UI ..."); - if (getWindowWidth() > 100 && getWindowHeight() > 100) { - mainAnchorPane.setPrefSize(getWindowWidth(), getWindowHeight()); + primaryStage = (Stage) mainAnchorPane.getScene().getWindow(); // set primary stage for dialogs + + // TODO this is broken + if (XMLController.getWindowWidth() > 100 && XMLController.getWindowHeight() > 100) { + mainAnchorPane.setPrefSize(XMLController.getWindowWidth(), XMLController.getWindowHeight()); } - cemuTextField.setText(cemuPath); - romTextField.setText(romDirectoryPath); - colorPicker.setValue(Color.valueOf(getColor())); - fullscreenToggleBtn.setSelected(isFullscreen()); - cloudSyncToggleBtn.setSelected(isCloudSync()); - autoUpdateToggleBtn.setSelected(isAutoUpdate()); + cemuTextField.setText(XMLController.getCemuPath()); + romTextField.setText(XMLController.getRomDirectoryPath()); + colorPicker.setValue(Color.valueOf(XMLController.getColor())); + fullscreenToggleBtn.setSelected(XMLController.isFullscreen()); + cloudSyncToggleBtn.setSelected(XMLController.isCloudSync()); + autoUpdateToggleBtn.setSelected(XMLController.isAutoUpdate()); branchChoisBox.setItems(branches); languageChoisBox.setItems(languages); bottomHBox.setPickOnBounds(false); - if (isUseBeta()) { + if (XMLController.isUseBeta()) { branchChoisBox.getSelectionModel().select(1); } else { branchChoisBox.getSelectionModel().select(0); @@ -373,7 +366,7 @@ public class MainWindowController { } if (settingsTrue) { settingsScrollPane.setVisible(false); - saveSettings(); + xmlController.saveSettings(); settingsTrue = false; } if (smmdbTrue) { @@ -393,7 +386,7 @@ public class MainWindowController { // new edit dialog String headingText = editHeadingText + " \"" + selectedGameTitle + "\""; JFXEditGameDialog editGameDialog = new JFXEditGameDialog(headingText, editBodyText, dialogBtnStyle, 450, - 300, 1, MWC, main.getPrimaryStage(), main.getPane()); + 300, 1, MWC, primaryStage, main.getPane()); editGameDialog.setTitle(gameInfo[0]); editGameDialog.setCoverPath(gameInfo[1]); editGameDialog.setRomPath(gameInfo[2]); @@ -451,11 +444,11 @@ public class MainWindowController { @Override public void handle(ActionEvent event) { DirectoryChooser directoryChooser = new DirectoryChooser(); - File selectedDirecroty = directoryChooser.showDialog(main.getPrimaryStage()); + File selectedDirecroty = directoryChooser.showDialog(primaryStage); String updatePath = selectedDirecroty.getAbsolutePath(); String[] parts = selectedGameTitleID.split("-"); // split string into 2 parts at "-" File srcDir = new File(updatePath); - File destDir = new File(cemuPath + "/mlc01/usr/title/" + parts[0] + "/" + parts[1]); + File destDir = new File(XMLController.getCemuPath() + "/mlc01/usr/title/" + parts[0] + "/" + parts[1]); // if directory doesn't exist create it if (destDir.exists() != true) { @@ -502,11 +495,11 @@ public class MainWindowController { @Override public void handle(ActionEvent event) { DirectoryChooser directoryChooser = new DirectoryChooser(); - File selectedDirecroty = directoryChooser.showDialog(main.getPrimaryStage()); + File selectedDirecroty = directoryChooser.showDialog(primaryStage); String dlcPath = selectedDirecroty.getAbsolutePath(); String[] parts = selectedGameTitleID.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"); + File destDir = new File(XMLController.getCemuPath() + "/mlc01/usr/title/" + parts[0] + "/" + parts[1] + "/aoc"); // if directory doesn't exist create it if (destDir.exists() != true) { @@ -628,26 +621,27 @@ public class MainWindowController { } }); - languageChoisBox.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue ov, Number value, Number new_value) { - String language = languageChoisBox.getItems().get((int) new_value).toString(); - language = language.substring(language.length()-6,language.length()-1); //reading only en_US from English (en_US) - setLanguage(language); - setUILanguage(); - saveSettings(); - } - }); + languageChoisBox.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue ov, Number value, Number new_value) { + String language = languageChoisBox.getItems().get((int) new_value).toString(); + language = language.substring(language.length() - 6, language.length() - 1); // reading only en_US from + // English (en_US) + XMLController.setUsrLocal(language); + setUILanguage(); + xmlController.saveSettings(); + } + }); branchChoisBox.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue ov, Number value, Number new_value) { if (branchChoisBox.getItems().get((int) new_value).toString() == "beta") { - setUseBeta(true); + XMLController.setUseBeta(true); } else { - setUseBeta(false); + XMLController.setUseBeta(false); } - saveSettings(); + xmlController.saveSettings(); } }); @@ -702,11 +696,11 @@ public class MainWindowController { @Override public void changed(ObservableValue observable, String oldValue, String newValue) { if (new File(newValue).exists()) { - setCemuPath(newValue); - saveSettings(); + XMLController.setCemuPath(newValue); + xmlController.saveSettings(); } else { String bodyText = newValue + ": No such file or directory"; - JFXInfoAlert fileErrorDialog = new JFXInfoAlert("Waring!", bodyText, dialogBtnStyle, main.getPrimaryStage()); + JFXInfoAlert fileErrorDialog = new JFXInfoAlert("Waring!", bodyText, dialogBtnStyle, primaryStage); fileErrorDialog.showAndWait(); LOGGER.warn(newValue + ": No such file or directory"); } @@ -717,12 +711,12 @@ public class MainWindowController { @Override public void changed(ObservableValue observable, String oldValue, String newValue) { if (new File(newValue).exists()) { - setRomDirectoryPath(newValue); - saveSettings(); + XMLController.setRomDirectoryPath(newValue); + xmlController.saveSettings(); reloadRoms(); } else { String bodyText = newValue + ": No such file or directory"; - JFXInfoAlert fileErrorDialog = new JFXInfoAlert("Waring!", bodyText, dialogBtnStyle, main.getPrimaryStage()); + JFXInfoAlert fileErrorDialog = new JFXInfoAlert("Waring!", bodyText, dialogBtnStyle, primaryStage); fileErrorDialog.showAndWait(); LOGGER.warn(newValue + ": No such file or directory"); } @@ -742,7 +736,7 @@ public class MainWindowController { String bodyText = "cemu_UI by @Seil0 \nVersion: " + version + " (" + buildNumber + ") \"" + versionName + "\" \n" + aboutBtnBodyText; - JFXInfoAlert infoAlert = new JFXInfoAlert(aboutBtnHeadingText, bodyText, dialogBtnStyle, main.getPrimaryStage()); + JFXInfoAlert infoAlert = new JFXInfoAlert(aboutBtnHeadingText, bodyText, dialogBtnStyle, primaryStage); infoAlert.showAndWait(); } @@ -755,7 +749,7 @@ public class MainWindowController { if (settingsTrue) { settingsScrollPane.setVisible(false); settingsTrue = false; - saveSettings(); + xmlController.saveSettings(); } else { settingsScrollPane.setVisible(true); settingsTrue = true; @@ -826,7 +820,7 @@ public class MainWindowController { @FXML private void cemuTFBtnAction() { - File cemuDirectory = directoryChooser.showDialog(main.getPrimaryStage()); + File cemuDirectory = directoryChooser.showDialog(primaryStage); if (cemuDirectory != null) { cemuTextField.setText(cemuDirectory.getAbsolutePath()); } @@ -834,7 +828,7 @@ public class MainWindowController { @FXML private void romTFBtnAction() { - File romDirectory = directoryChooser.showDialog(main.getPrimaryStage()); + File romDirectory = directoryChooser.showDialog(primaryStage); if (romDirectory != null) { romTextField.setText(romDirectory.getAbsolutePath()); } @@ -842,7 +836,7 @@ public class MainWindowController { @FXML private void updateBtnAction() { - updateController = new UpdateController(this, buildNumber, useBeta); + updateController = new UpdateController(this, buildNumber, XMLController.isUseBeta()); Thread updateThread = new Thread(updateController); updateThread.setName("Updater"); updateThread.start(); @@ -850,12 +844,8 @@ public class MainWindowController { @FXML private void autoUpdateToggleBtnAction() { - if (isAutoUpdate()) { - setAutoUpdate(false); - } else { - setAutoUpdate(true); - } - saveSettings(); + XMLController.setAutoUpdate(!XMLController.isAutoUpdate()); + xmlController.saveSettings(); } @FXML @@ -866,8 +856,8 @@ public class MainWindowController { @FXML private 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() + "/"; + String downloadFileURL = XMLController.getCemuPath() + "/" + id + ".zip"; // getCemuPath() + "/" + smmID + "/" + id + ".rar" + String outputFile = XMLController.getCemuPath() + "/"; try { LOGGER.info("beginning download ..."); @@ -933,41 +923,36 @@ public class MainWindowController { @FXML private void fullscreenToggleBtnAction() { - if (fullscreen) { - fullscreen = false; - } else { - fullscreen = true; - } - saveSettings(); + XMLController.setFullscreen(!XMLController.isFullscreen()); + xmlController.saveSettings(); } @FXML private void cloudSyncToggleBtnAction() { - if(cloudSync) { - cloudSync = false; - } else { + XMLController.setCloudSync(!XMLController.isCloudSync()); + + if(XMLController.isCloudSync()) { EventHandler okayAction = new EventHandler(){ @Override public void handle(ActionEvent event){ - cloudSync = true; //TODO rework for other cloud services // CloudService service = CloudService.GoogleDrive; - cloudService = CloudService.GoogleDrive; + XMLController.setCloudService(CloudService.GoogleDrive); // start cloud sync in new thread 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(); + if (main.getCloudController().initializeConnection(XMLController.getCloudService(), XMLController.getCemuPath())) { + main.getCloudController().sync(XMLController.getCloudService(), XMLController.getCemuPath(), XMLController.getDirCemuUIPath()); + xmlController.saveSettings(); } else { cloudSyncToggleBtn.setSelected(false); // cloud sync init error dialog JFXInfoAlert cloudSyncErrorDialog = new JFXInfoAlert(cloudSyncErrorHeadingText, - cloudSyncErrorBodyText, dialogBtnStyle, main.getPrimaryStage()); + cloudSyncErrorBodyText, dialogBtnStyle, primaryStage); cloudSyncErrorDialog.showAndWait(); } @@ -1002,7 +987,7 @@ public class MainWindowController { String headingText = addGameBtnHeadingText; String bodyText = addGameBtnBodyText; JFXEditGameDialog addGameDialog = new JFXEditGameDialog(headingText, bodyText, dialogBtnStyle, 450, 300, 0, - this, main.getPrimaryStage(), main.getPane()); + this, primaryStage, main.getPane()); addGameDialog.show(); } @@ -1021,11 +1006,11 @@ public class MainWindowController { //addGame error dialog JFXInfoAlert errorDialog = new JFXInfoAlert(addBtnReturnErrorHeadingText, addBtnReturnErrorBodyText, - dialogBtnStyle, main.getPrimaryStage()); + dialogBtnStyle, primaryStage); errorDialog.showAndWait(); } else { - File pictureCache = main.getPictureCache(); + File pictureCache = XMLController.getPictureCache(); String coverName = new File(coverPath).getName(); try { BufferedImage originalImage = ImageIO.read(new File(coverPath)); //load cover @@ -1184,7 +1169,7 @@ public class MainWindowController { main.getPane().getChildren().add(spinner); // add spinner to pane }); - dbController.loadRomDirectory(getRomDirectoryPath()); // reload the ROM directory + dbController.loadRomDirectory(XMLController.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 @@ -1218,7 +1203,7 @@ public class MainWindowController { // set the selected local strings to all needed elements void setUILanguage(){ - switch(getLanguage()){ + switch(XMLController.getUsrLocal()){ case "en_US": bundle = ResourceBundle.getBundle("locals.cemu_UI-Local", Locale.US); //us_English languageChoisBox.getSelectionModel().select(0); @@ -1302,10 +1287,10 @@ public class MainWindowController { // if AutoUpdate, then check for updates private void checkAutoUpdate() { - if (isAutoUpdate()) { + if (XMLController.isAutoUpdate()) { try { LOGGER.info("AutoUpdate: looking for updates on startup ..."); - updateController = new UpdateController(this, buildNumber, useBeta); + updateController = new UpdateController(this, buildNumber, XMLController.isUseBeta()); Thread updateThread = new Thread(updateController); updateThread.setName("Updater"); updateThread.start(); @@ -1456,16 +1441,16 @@ public class MainWindowController { // 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;"; - String btnStyleWhite = "-fx-button-type: RAISED; -fx-background-color: #"+getColor()+"; -fx-text-fill: WHITE;"; - BigInteger icolor = new BigInteger(getColor(),16); + String boxStyle = "-fx-background-color: #" + XMLController.getColor() + ";"; + String btnStyleBlack = "-fx-button-type: RAISED; -fx-background-color: #" + XMLController.getColor() + "; -fx-text-fill: BLACK;"; + String btnStyleWhite = "-fx-button-type: RAISED; -fx-background-color: #" + XMLController.getColor() + "; -fx-text-fill: WHITE;"; + BigInteger icolor = new BigInteger(XMLController.getColor(),16); BigInteger ccolor = new BigInteger("78909cff",16); sideMenuVBox.setStyle(boxStyle); topHBox.setStyle(boxStyle); - cemuTextField.setFocusColor(Color.valueOf(getColor())); - romTextField.setFocusColor(Color.valueOf(getColor())); + cemuTextField.setFocusColor(Color.valueOf(XMLController.getColor())); + romTextField.setFocusColor(Color.valueOf(XMLController.getColor())); if (icolor.compareTo(ccolor) == -1) { dialogBtnStyle = btnStyleWhite; @@ -1516,158 +1501,7 @@ public class MainWindowController { } for (int i = 0; i < games.size(); i++) { - games.get(i).getButton().setRipplerFill(Paint.valueOf(getColor())); - } - } - - /** - * 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())); - props.setProperty("cloudSync", String.valueOf(isCloudSync())); - props.setProperty("autoUpdate", String.valueOf(isAutoUpdate())); - props.setProperty("useBeta", String.valueOf(isUseBeta())); - if (getCloudService() == null) { - props.setProperty("cloudService", ""); - } else { - props.setProperty("cloudService", getCloudService().toString()); - } - props.setProperty("folderID", main.getCloudController().getFolderID(getCloudService())); - props.setProperty("lastLocalSync", String.valueOf(getLastLocalSync())); - props.setProperty("windowWidth", String.valueOf(mainAnchorPane.getWidth())); - props.setProperty("windowHeight", String.valueOf(mainAnchorPane.getHeight())); - - 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 ..."); - try { - 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 { - setRomDirectoryPath(props.getProperty("romPath")); - } catch (Exception e) { - LOGGER.error("could not load romPath", e); - 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 { - switch (props.getProperty("cloudService")) { - case "GoogleDrive": - setCloudService(CloudService.GoogleDrive); - break; - case "Dropbox": - setCloudService(CloudService.Dropbox); - break; - default: - break; - } - } catch (Exception e) { - LOGGER.error("could not load cloudSync", e); - setCloudService(null); - } - - try { - main.getCloudController().setFolderID(props.getProperty("folderID"), getCloudService()); - } catch (Exception e) { - LOGGER.error("could not load folderID, disable cloud sync. Please contact an developer", e); - setCloudSync(false); - } - - try { - setLastLocalSync(Long.parseLong(props.getProperty("lastLocalSync"))); - } catch (Exception e) { - 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!"); - } catch (IOException e) { - LOGGER.error("an error occured", e); + games.get(i).getButton().setRipplerFill(Paint.valueOf(XMLController.getColor())); } } @@ -1709,8 +1543,8 @@ public class MainWindowController { private void editColor(String input){ StringBuilder sb = new StringBuilder(input); sb.delete(0, 2); - this.color = sb.toString(); - saveSettings(); + XMLController.setColor(sb.toString()); + xmlController.saveSettings(); } @SuppressWarnings("unused") @@ -1718,8 +1552,8 @@ public class MainWindowController { * @return the main color in hexadecimal format */ private String hexToRgb() { - LOGGER.info(getColor()); - int hex = Integer.parseInt(getColor().substring(0, 5), 16); + LOGGER.info(XMLController.getColor()); + int hex = Integer.parseInt(XMLController.getColor().substring(0, 5), 16); int r = (hex & 0xFF0000) >> 16; int g = (hex & 0xFF00) >> 8; @@ -1752,33 +1586,9 @@ public class MainWindowController { public DBController getDbController() { return dbController; } - - public void setMainAnchorPane(AnchorPane mainAnchorPane) { - this.mainAnchorPane = mainAnchorPane; - } - - public String getCemuPath() { - return cemuPath; - } - - public void setCemuPath(String cemuPath) { - this.cemuPath = cemuPath; - } - public String getRomDirectoryPath() { - return romDirectoryPath; - } - - public void setRomDirectoryPath(String romDirectoryPath) { - this.romDirectoryPath = romDirectoryPath; - } - - public String getColor() { - return color; - } - - public void setColor(String color) { - this.color = color; + public Stage getPrimaryStage() { + return primaryStage; } public int getxPos() { @@ -1805,46 +1615,6 @@ public class MainWindowController { this.xPosHelper = xPosHelper; } - public long getLastLocalSync() { - return lastLocalSync; - } - - public void setLastLocalSync(long lastLocalSync) { - this.lastLocalSync = lastLocalSync; - } - - public boolean isFullscreen() { - return fullscreen; - } - - public void setFullscreen(boolean fullscreen) { - this.fullscreen = fullscreen; - } - - public boolean isCloudSync() { - return cloudSync; - } - - public void setCloudSync(boolean cloudSync) { - this.cloudSync = cloudSync; - } - - public boolean isAutoUpdate() { - return autoUpdate; - } - - public void setAutoUpdate(boolean autoUpdate) { - this.autoUpdate = autoUpdate; - } - - public boolean isUseBeta() { - return useBeta; - } - - public void setUseBeta(boolean useBeta) { - this.useBeta = useBeta; - } - public String getGameExecutePath() { return gameExecutePath; } @@ -1861,14 +1631,6 @@ public class MainWindowController { this.selectedGameTitleID = selectedGameTitleID; } - public CloudService getCloudService() { - return cloudService; - } - - public void setCloudService(CloudService cloudService) { - this.cloudService = cloudService; - } - public JFXButton getPlayBtn() { return playBtn; } @@ -1876,31 +1638,11 @@ public class MainWindowController { public void setPlayBtn(JFXButton playBtn) { this.playBtn = playBtn; } - - public double getWindowWidth() { - return windowWidth; - } - - public void setWindowWidth(double windowWidth) { - this.windowWidth = windowWidth; - } - - public double getWindowHeight() { - return windowHeight; - } - - public void setWindowHeight(double windowHeight) { - this.windowHeight = windowHeight; - } public int getOldXPosHelper() { return oldXPosHelper; } - public void setOldXPosHelper(int oldXPosHelper) { - this.oldXPosHelper = oldXPosHelper; - } - public String getLanguage() { return language; } @@ -1913,10 +1655,6 @@ public class MainWindowController { return bundle; } - public void setBundle(ResourceBundle bundle) { - this.bundle = bundle; - } - public AnchorPane getMainAnchorPane() { return mainAnchorPane; } diff --git a/src/main/java/com/cemu_UI/application/playGame.java b/src/main/java/com/cemu_UI/application/playGame.java index 651504a..78ec3e6 100644 --- a/src/main/java/com/cemu_UI/application/playGame.java +++ b/src/main/java/com/cemu_UI/application/playGame.java @@ -27,6 +27,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.cemu_UI.controller.DBController; +import com.cemu_UI.controller.XMLController; import javafx.application.Platform; @@ -44,7 +45,7 @@ public class playGame extends Thread{ @Override public void run() { String selectedGameTitleID = mainWindowController.getSelectedGameTitleID(); - String cemuBin = mainWindowController.getCemuPath() + "/Cemu.exe"; + String cemuBin = XMLController.getCemuPath() + "/Cemu.exe"; String gameExec = "\"" + mainWindowController.getGameExecutePath() + "\""; long startTime; long endTime; @@ -53,18 +54,18 @@ public class playGame extends Thread{ Process p; Platform.runLater(() -> { - mainWindowController.getMain().getPrimaryStage().setIconified(true); // minimize cemu_UI + mainWindowController.getPrimaryStage().setIconified(true); // minimize cemu_UI }); startTime = System.currentTimeMillis(); try { if (System.getProperty("os.name").equals("Linux")) { - if(mainWindowController.isFullscreen()){ + if(XMLController.isFullscreen()){ p = new ProcessBuilder("wine", cemuBin, "-f", "-g", gameExec).start(); } else { p = new ProcessBuilder("wine", cemuBin, "-g", gameExec).start(); } } else { - if(mainWindowController.isFullscreen()){ + if(XMLController.isFullscreen()){ p = new ProcessBuilder(cemuBin, "-f", "-g", gameExec).start(); } else { p = new ProcessBuilder(cemuBin, "-g", gameExec).start(); @@ -85,14 +86,14 @@ public class playGame extends Thread{ } else { mainWindowController.totalPlaytimeBtn.setText(dbController.getTotalPlaytime(selectedGameTitleID) + " min"); } - mainWindowController.getMain().getPrimaryStage().setIconified(false); // maximize cemu_UI + mainWindowController.getPrimaryStage().setIconified(false); // maximize cemu_UI }); //sync savegame with cloud service - if (mainWindowController.isCloudSync()) { - mainWindowController.setLastLocalSync(Instant.now().getEpochSecond()); - mainWindowController.getMain().getCloudController().sync(mainWindowController.getCloudService(), - mainWindowController.getCemuPath(), mainWindowController.getMain().getDirectory().getPath()); + if (XMLController.isCloudSync()) { + XMLController.setLastLocalSync(Instant.now().getEpochSecond()); + mainWindowController.getMain().getCloudController().sync(XMLController.getCloudService(), + XMLController.getCemuPath(), XMLController.getDirCemuUIPath()); } } catch (IOException | InterruptedException e) { diff --git a/src/main/java/com/cemu_UI/controller/CloudController.java b/src/main/java/com/cemu_UI/controller/CloudController.java index 829a059..1c21507 100644 --- a/src/main/java/com/cemu_UI/controller/CloudController.java +++ b/src/main/java/com/cemu_UI/controller/CloudController.java @@ -46,6 +46,7 @@ public class CloudController { } private MainWindowController mwc; + private XMLController xmlController = new XMLController(); private GoogleDriveController googleDriveController = new GoogleDriveController(); private static final Logger LOGGER = LogManager.getLogger(CloudController.class.getName()); @@ -105,19 +106,19 @@ public class CloudController { LOGGER.info("cloud sync folder dosen't exist, creating one!"); googleDriveController.creatFolder(); googleDriveController.uploadZipFile(zipFile); - } else if (mwc.getLastLocalSync() > lastCloudSync) { + } else if (XMLController.getLastLocalSync() > lastCloudSync) { LOGGER.info("local is new, going to upload zip"); googleDriveController.uploadZipFile(zipFile); - } else if (mwc.getLastLocalSync() < lastCloudSync) { + } else if (XMLController.getLastLocalSync() < lastCloudSync) { LOGGER.info("cloud is new, going to download zip"); unzipSavegames(cemuDirectory, googleDriveController.downloadZipFile(cemu_UIDirectory)); - mwc.setLastLocalSync(lastCloudSync); + XMLController.setLastLocalSync(lastCloudSync); break; } else { LOGGER.info("nothing to do"); break; } - mwc.setLastLocalSync(Long.parseLong(zipFile.getName().substring(0, zipFile.getName().length() - 4))); // set time of last sucessfull sync + XMLController.setLastLocalSync(Long.parseLong(zipFile.getName().substring(0, zipFile.getName().length() - 4))); // set time of last sucessfull sync break; case Dropbox: @@ -134,7 +135,7 @@ public class CloudController { Platform.runLater(() -> { mwc.getPlayBtn().setText("play"); mwc.getPlayBtn().setDisable(false); - mwc.saveSettings(); + xmlController.saveSettings(); }); LOGGER.info("synchronization successful!"); @@ -210,16 +211,5 @@ public class CloudController { } return folderID; } - - public void setFolderID(String folderID, CloudService cloudService) { - if (cloudService != null) { - if (cloudService == CloudService.GoogleDrive) { - googleDriveController.setFolderID(folderID); - } - if (cloudService == CloudService.Dropbox) { - - } - } - } } diff --git a/src/main/java/com/cemu_UI/controller/DBController.java b/src/main/java/com/cemu_UI/controller/DBController.java index e4422c3..9b739e9 100644 --- a/src/main/java/com/cemu_UI/controller/DBController.java +++ b/src/main/java/com/cemu_UI/controller/DBController.java @@ -44,17 +44,14 @@ 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(Main main, MainWindowController mainWindowController) { - this.main = main; + public DBController(MainWindowController mainWindowController) { this.mainWindowController = mainWindowController; } - - private Main main; + private MainWindowController mainWindowController; private ArrayList entries = new ArrayList<>(); private String DB_PATH_localRoms; @@ -103,7 +100,7 @@ public class DBController { * games.db contains a reverence list to for the automatic detection mode */ private void loadGamesDatabase() { - DB_PATH_games = main.getReference_gamesFile().getAbsolutePath(); + DB_PATH_games = XMLController.getRference_gamesFile().getAbsolutePath(); try { // create a database connection connectionGames = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH_games); @@ -209,7 +206,7 @@ public class DBController { File dir = new File(directory); File appFile; String[] extensions = new String[] { "rpx", "jsp" }; - File pictureCache = main.getPictureCache(); + File pictureCache = XMLController.getPictureCache(); String coverPath; try { Statement stmt = connectionGames.createStatement(); diff --git a/src/main/java/com/cemu_UI/controller/XMLController.java b/src/main/java/com/cemu_UI/controller/XMLController.java new file mode 100644 index 0000000..8a1180b --- /dev/null +++ b/src/main/java/com/cemu_UI/controller/XMLController.java @@ -0,0 +1,404 @@ +/** + * cemu_UI + * + * Copyright 2019 <@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 + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ +package com.cemu_UI.controller; + +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.util.Properties; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.cemu_UI.datatypes.GlobalDataTypes.CloudService; + +public class XMLController { + + private static final String userHome = System.getProperty("user.home"); + private static final String userName = System.getProperty("user.name"); + private static final String osName = System.getProperty("os.name"); + private static final String osArch = System.getProperty("os.arch"); + private static final String osVers = System.getProperty("os.version"); + private static final String javaVers = System.getProperty("java.version"); + private static final String javaVend = System.getProperty("java.vendor"); + private static final String sysLocal = System.getProperty("user.language") + "_" + System.getProperty("user.country"); + private static String dirCemuUIPath; + private static File dirCemuUI; + private static File configFile; + private static File gamesDBFile; + private static File reference_gamesFile; + private static File pictureCache; + + // user settings + private static String color = "00a8cc"; + private static String usrLocal = sysLocal; + private static boolean autoUpdate = false; + private static boolean useBeta = false; + private static boolean fullscreen = false; + private static boolean cloudSync = false; + + private static String cemuPath; + private static String romDirectoryPath; + private static String folderID; + private static CloudService cloudService; + private static long lastLocalSync; + private static double windowWidth; + private static double windowHeight; + + + private static final Logger LOGGER = LogManager.getLogger(XMLController.class.getName()); + private Properties props = new Properties(); + + public XMLController() { + + if (osName.contains("Windows")) { + dirCemuUIPath = userHome + "/Documents/cemu_UI"; + } else { + dirCemuUIPath = userHome + "/cemu_UI"; + } + + // set the concrete files + dirCemuUI = new File(dirCemuUIPath); + configFile = new File(dirCemuUI + "/config.xml"); + gamesDBFile = new File(dirCemuUI + "/games.db"); + reference_gamesFile = new File(dirCemuUI + "/reference_games.db"); + pictureCache= new File(dirCemuUI+"/picture_cache"); + } + + /** + * 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", getUsrLocal()); + props.setProperty("fullscreen", String.valueOf(isFullscreen())); + props.setProperty("cloudSync", String.valueOf(isCloudSync())); + props.setProperty("autoUpdate", String.valueOf(isAutoUpdate())); + props.setProperty("useBeta", String.valueOf(isUseBeta())); + if (getCloudService() == null) { + props.setProperty("cloudService", ""); + } else { + props.setProperty("cloudService", getCloudService().toString()); + } + props.setProperty("folderID", getFolderID()); + props.setProperty("lastLocalSync", Long.toString(getLastLocalSync())); + props.setProperty("windowWidth", Double.toString(getWindowWidth())); + props.setProperty("windowHeight", Double.toString(getWindowHeight())); + + OutputStream outputStream = new FileOutputStream(XMLController.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 + */ + public void loadSettings() { + LOGGER.info("loading settings ..."); + try { + InputStream inputStream = new FileInputStream(XMLController.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 { + setRomDirectoryPath(props.getProperty("romPath")); + } catch (Exception e) { + LOGGER.error("could not load romPath", e); + 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"); + setUsrLocal("en_US"); + } else { + setUsrLocal(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 { + switch (props.getProperty("cloudService")) { + case "GoogleDrive": + setCloudService(CloudService.GoogleDrive); + break; + case "Dropbox": + setCloudService(CloudService.Dropbox); + break; + default: + break; + } + } catch (Exception e) { + LOGGER.error("could not load cloudSync", e); + setCloudService(null); + } + + try { + setFolderID(props.getProperty("folderID")); + } catch (Exception e) { + LOGGER.error("could not load folderID, disable cloud sync. Please contact an developer", e); + setCloudSync(false); + } + + try { + setLastLocalSync(Long.parseLong(props.getProperty("lastLocalSync"))); + } catch (Exception e) { + 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!"); + } catch (IOException e) { + LOGGER.error("an error occured", e); + } + } + + // getters for application variables + + public static String getUserHome() { + return userHome; + } + + public static String getUserName() { + return userName; + } + + public static String getOsName() { + return osName; + } + + public static String getOsArch() { + return osArch; + } + + public static String getOsVers() { + return osVers; + } + + public static String getJavaVers() { + return javaVers; + } + + public static String getJavaVend() { + return javaVend; + } + + public static String getSysLocal() { + return sysLocal; + } + + public static String getDirCemuUIPath() { + return dirCemuUIPath; + } + + public static File getDirCemuUI() { + return dirCemuUI; + } + + public static File getConfigFile() { + return configFile; + } + + public static File getGamesDBFile() { + return gamesDBFile; + } + + public static File getRference_gamesFile() { + return reference_gamesFile; + } + + public static File getPictureCache() { + return pictureCache; + } + + // getters & setters for user settings + + public static String getColor() { + return color; + } + + public static void setColor(String color) { + XMLController.color = color; + } + + public static String getUsrLocal() { + return usrLocal; + } + + public static void setUsrLocal(String usrLocal) { + XMLController.usrLocal = usrLocal; + } + + public static boolean isAutoUpdate() { + return autoUpdate; + } + + public static void setAutoUpdate(boolean autoUpdate) { + XMLController.autoUpdate = autoUpdate; + } + + public static boolean isUseBeta() { + return useBeta; + } + + public static void setUseBeta(boolean useBeta) { + XMLController.useBeta = useBeta; + } + + public static boolean isFullscreen() { + return fullscreen; + } + + public static void setFullscreen(boolean fullscreen) { + XMLController.fullscreen = fullscreen; + } + + public static boolean isCloudSync() { + return cloudSync; + } + + public static void setCloudSync(boolean cloudSync) { + XMLController.cloudSync = cloudSync; + } + + public static String getCemuPath() { + return cemuPath; + } + + public static void setCemuPath(String cemuPath) { + XMLController.cemuPath = cemuPath; + } + + public static String getRomDirectoryPath() { + return romDirectoryPath; + } + + public static void setRomDirectoryPath(String romDirectoryPath) { + XMLController.romDirectoryPath = romDirectoryPath; + } + + + public static String getFolderID() { + return folderID; + } + + public static void setFolderID(String folderID) { + XMLController.folderID = folderID; + } + + public static CloudService getCloudService() { + return cloudService; + } + + public static void setCloudService(CloudService cloudService) { + XMLController.cloudService = cloudService; + } + + public static long getLastLocalSync() { + return lastLocalSync; + } + + public static void setLastLocalSync(long lastLocalSync) { + XMLController.lastLocalSync = lastLocalSync; + } + + public static double getWindowWidth() { + return windowWidth; + } + + public static void setWindowWidth(double windowWidth) { + XMLController.windowWidth = windowWidth; + } + + public static double getWindowHeight() { + return windowHeight; + } + + public static void setWindowHeight(double windowHeight) { + XMLController.windowHeight = windowHeight; + } +} diff --git a/src/main/java/com/cemu_UI/vendorCloudController/GoogleDriveController.java b/src/main/java/com/cemu_UI/vendorCloudController/GoogleDriveController.java index 65289bf..b62e2de 100644 --- a/src/main/java/com/cemu_UI/vendorCloudController/GoogleDriveController.java +++ b/src/main/java/com/cemu_UI/vendorCloudController/GoogleDriveController.java @@ -29,6 +29,7 @@ import java.util.Collections; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import com.cemu_UI.controller.XMLController; import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -50,7 +51,7 @@ import com.google.api.services.drive.model.FileList; public class GoogleDriveController { Drive service; - private String folderID; + private String folderID = XMLController.getFolderID(); private File downloadFile; private static final Logger LOGGER = LogManager.getLogger(GoogleDriveController.class.getName()); @@ -77,43 +78,41 @@ public class GoogleDriveController { try { HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); - folderID = ""; + folderID = ""; // TODO why do we do this? } catch (Throwable t) { LOGGER.error("error", t); System.exit(1); } } - /** - * Creates an authorized Credential object. - * @return an authorized Credential object. - * @throws IOException - */ - public Credential authorize() throws IOException { - // Load client secrets. - InputStream in = getClass().getClassLoader().getResourceAsStream("client_secret.json"); - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(DATA_STORE_FACTORY) - .setAccessType("offline") - .build(); - - Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); - LOGGER.info("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); - return credential; - } + /** + * Creates an authorized Credential object. + * + * @return an authorized Credential object. + * @throws IOException + */ + public Credential authorize() throws IOException { + // Load client secrets. + InputStream in = getClass().getClassLoader().getResourceAsStream("client_secret.json"); + GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, + clientSecrets, SCOPES).setDataStoreFactory(DATA_STORE_FACTORY).setAccessType("offline").build(); + + Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + LOGGER.info("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); + return credential; + } /** * Build and return an authorized Drive client service. + * * @return an authorized Drive client service * @throws IOException */ - public Drive getDriveService() throws IOException { - Credential credential = authorize(); - return new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) - .setApplicationName(APPLICATION_NAME) - .build(); - } + public Drive getDriveService() throws IOException { + Credential credential = authorize(); + return new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build(); + } public void main(String cemuDirectory) throws IOException { service = getDriveService(); @@ -211,7 +210,7 @@ public class GoogleDriveController { try { LOGGER.info("FolderID: " + files.getFiles().get(0).getId()); - setFolderID(files.getFiles().get(0).getId()); + folderID = files.getFiles().get(0).getId(); } catch (Exception e) { LOGGER.error("Oops, something went wrong! It seems that you have more than one folder called 'cemu_savegames'!", e); } @@ -220,9 +219,5 @@ public class GoogleDriveController { public String getFolderID() { return folderID; } - - public void setFolderID(String folderID) { - this.folderID = folderID; -} } From 648d101c8ee69bc698f3a030844007bb8b5d25f3 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Fri, 1 Mar 2019 19:03:30 +0100 Subject: [PATCH 06/19] updated year --- src/main/java/com/cemu_UI/application/Main.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cemu_UI/application/Main.java b/src/main/java/com/cemu_UI/application/Main.java index 8671dd5..d4d5294 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-2018 <@Seil0> + * Copyright 2017-2019 <@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 From e59b14074e4616f65a3d74f8e41b9c29cf749134 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Sun, 17 Mar 2019 00:35:54 +0100 Subject: [PATCH 07/19] added a few new games, updated some Japanese titles --- downloadContent/games.csv | 266 +++++++++++++++++++------------------- 1 file changed, 136 insertions(+), 130 deletions(-) diff --git a/downloadContent/games.csv b/downloadContent/games.csv index d664a0e..3c414fc 100644 --- a/downloadContent/games.csv +++ b/downloadContent/games.csv @@ -32,34 +32,34 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-101AE900,コナミ ワイワイレーシング アドバンス,WUP-N-PCTJ,v0,JAP, 00050000-101C5800,ポッ拳 POKKÉN TOURNAMENT,WUP-N-APKJ,v16,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/APKJ2P.jpg?1454770411 00050000-1015CA00,出たな!! ツインビー,WUP-N-PNXJ,v0,JAP, -00050000-1016BA00,???!!????,WUP-N-FC2J,v0,JAP, -00050000-10113600,???!???!???!,WUP-P-ATKJ,v0,JAP, -00050000-1012F200,???!???!???! (DL),WUP-N-WAKJ,v0,JAP, -00050000-101B8800,???!????,WUP-N-DAQJ,v0,JAP, -00050000-10188B00,???!???? ?????????,WUP-N-AXYJ,v16,JAP, -00050000-101B4100,???!amiibo ?????????????,WUP-N-AAVJ,v0,JAP, -00050000-1015C800,????,WUP-N-PNVJ,v0,JAP, -00050000-101D0D00,????,WUP-N-PDHJ,,JAP, -00050000-10197000,????,WUP-N-PB3J,v0,JAP, -00050000-10195200,????,WUP-N-MNXJ,,JAP, -00050000-10168B00,????,WUP-N-MNLJ,,JAP, -00050000-10168800,????,WUP-N-MNHJ,v0,JAP, -00050000-10168600,????,WUP-N-MNFJ,v0,JAP, -00050000-10191000,????,WUP-N-JC9J,v0,JAP, -00050000-10134600,????,WUP-N-JBCJ,v0,JAP, -00050000-10119F00,????,WUP-N-JATJ,v0,JAP, -00050000-10116400,????,WUP-N-HNAJ,v114,JAP, -00050000-10171100,????,WUP-N-FDAJ,v0,JAP, -00050000-1018B700,????,WUP-N-FD8J,v0,JAP, -00050000-1018B100,????,WUP-N-FD3J,v0,JAP, -00050000-10160400,????,WUP-N-FCPJ,v0,JAP, -00050000-1015F700,????,WUP-N-FCKJ,v0,JAP, -00050000-1015F600,????,WUP-N-FCJJ,v0,JAP, -00050000-10170E00,????,WUP-N-FC9J,v0,JAP, -00050000-10113E00,????,WUP-N-FALJ,v0,JAP, -00050000-1012E200,????,WUP-N-FA6J,v0,JAP, -00050000-1012A100,????,WUP-N-FA2J,v0,JAP, -00050000-101F3A00,????,WUP-N-BTXJ,,JAP, +00050000-1016BA00,燃えろ!!プロ野球,WUP-N-FC2J,v0,JAP, +00050000-10113600,タンク!タンク!タンク!,WUP-P-ATKJ,v0,JAP, +00050000-1012F200,タンク!タンク!タンク! (DL),WUP-N-WAKJ,v0,JAP, +00050000-101B8800,タッチ!カービィ ,WUP-N-DAQJ,v0,JAP, +00050000-10188B00,タッチ!カービィ スーパーレインボー,WUP-N-AXYJ,v16,JAP, +00050000-101B4100,タッチ!amiibo いきなりファミコン名シーン,WUP-N-AAVJ,v0,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/AAVJ.jpg +00050000-1015C800,沙羅曼蛇,WUP-N-PNVJ,v0,JAP, +00050000-101D0D00,グランボ,WUP-N-PDHJ,,JAP, +00050000-10197000,逆転裁判,WUP-N-PB3J,v0,JAP, +00050000-10195200,ウシャス,WUP-N-MNXJ,,JAP, +00050000-10168B00,沙羅曼蛇,WUP-N-MNLJ,,JAP, +00050000-10168800,魔城伝説,WUP-N-MNHJ,v0,JAP, +00050000-10168600,クォース,WUP-N-MNFJ,v0,JAP, +00050000-10191000,魔神転生,WUP-N-JC9J,v0,JAP, +00050000-10134600,三國志Ⅳ,WUP-N-JBCJ,v0,JAP, +00050000-10119F00,超魔界村,WUP-N-JATJ,v0,JAP, +00050000-10116400,ニコニコ,WUP-N-HNAJ,v114,JAP, +00050000-10171100,へべれけ,WUP-N-FDAJ,v0,JAP, +00050000-1018B700,セクロス,WUP-N-FD8J,v0,JAP, +00050000-1018B100,月風魔伝,WUP-N-FD3J,v0,JAP, +00050000-10160400,サッカー,WUP-N-FCPJ,v0,JAP, +00050000-1015F700,影の伝説,WUP-N-FCKJ,v0,JAP, +00050000-1015F600,半熟英雄,WUP-N-FCJJ,v0,JAP, +00050000-10170E00,沙羅曼蛇,WUP-N-FC9J,v0,JAP, +00050000-10113E00,ゼビウス,WUP-N-FALJ,v0,JAP, +00050000-1012E200,ギャラガ,WUP-N-FA6J,v0,JAP, +00050000-1012A100,マッピー,WUP-N-FA2J,v0,JAP, +00050000-101F3A00,テラリア,WUP-N-BTXJ,,JAP, 00050000-101C9800,????,124,v0,JAP, 00050000-10194F00,???? ???,WUP-N-MNUJ,v0,JAP, 00050000-1014C300,???? ????,WUP-N-WKEJ,v0,JAP, @@ -81,7 +81,7 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-101AEA00,???? 2,WUP-N-PCUJ,v0,JAP, 00050000-101C3B00,???? 3,WUP-N-PC6J,,JAP, 00050000-1018E300,???? R,WUP-N-PBSJ,v0,JAP, -00050000-101D2C00,???? Ultra DX - ?????,WUP-N-ATXJ,v1,JAP, +00050000-101D2C00,チャリ走 Ultra DX – 世界ツアー,WUP-N-ATXJ,v1,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/ATXJ.jpg 00050000-10179D00,????!???!????!,98,v16,JAP, 00050000-101C8600,????!????,WUP-N-DAVJ,v0,JAP, 00050000-1016A600,????!?????????,WUP-N-WB6J,v17,JAP, @@ -199,22 +199,22 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-101C3600,?????? ??????,105,v0,JAP, 00050000-10192200,?????? ??????!,WUP-P-BRSJ,v18,JAP, 00050000-1015E300,?????? ???????,WUP-N-PAKJ,v0,JAP, -00050000-101BAE00,?????? ???????,WUP-N-NANJ,,JAP, -00050000-1015D200,?????? ????????,WUP-N-PN7J,v0,JAP, -00050000-1016F300,?????? ????????,WUP-N-PATJ,v0,JAP, -00050000-101B1200,?????? ?????????,WUP-N-VAPJ,v0,JAP, -00050000-10109C00,?????? ?????????,WUP-N-JAEJ,v0,JAP, -00050000-10199000,?????? ?????????,WUP-N-AVXJ,v16,JAP, -00050000-10109700,?????? ??????????,WUP-N-JADJ,v0,JAP, -00050000-10170700,?????? ??????????,WUP-N-ABWJ,v17,JAP, -00050000-1019C800,?????? ??????????? HD,WUP-N-AZAJ,v82,JAP, -00050000-10153E00,?????? ???2,WUP-N-JB5J,v0,JAP, -00050000-10159300,?????? ???3,WUP-N-JB9J,v0,JAP, -00050000-1020AA00,?????? '93,WUP-N-PPTJ,,JAP, -00050000-1015C900,?????? '94,WUP-N-PNWJ,v0,JAP, -00050000-1015FE00,?????? ~????????~,WUP-N-JCCJ,v0,JAP, -00050000-10169800,?????? ~?????~,WUP-N-PANJ,v0,JAP, -00050000-101C5900,?????? 3-in-1,WUP-N-ATYJ,v0,JAP, +00050000-101BAE00,ゼルダの伝説 ムジュラの仮面,WUP-N-NANJ,,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/NANJ.jpg +00050000-1015D200,ボンバーマン ぱにっくボンバー,WUP-N-PN7J,v0,JAP, +00050000-1016F300,星のカービィ 夢の泉デラックス,WUP-N-PATJ,v0,JAP, +00050000-101B1200,パンドラの塔 君のもとへ帰るまで,WUP-N-VAPJ,v0,JAP, +00050000-10109C00,星のカービィ スーパーデラックス,WUP-N-JAEJ,v0,JAP, +00050000-10199000,マリオテニス ウルトラスマッシュ,WUP-N-AVXJ,v16,JAP, +00050000-10109700,ゼルダの伝説 神々のトライフォース,WUP-N-JADJ,v0,JAP, +00050000-10170700,仮面ライダー バトライド・ウォーⅡ,WUP-N-ABWJ,v17,JAP, +00050000-1019C800,ゼルダの伝説 トワイライトプリンセス HD,WUP-N-AZAJ,v82,JAP, +00050000-10153E00,ロマンシング サ・ガ2,WUP-N-JB5J,v0,JAP, +00050000-10159300,ロマンシング サ・ガ3,WUP-N-JB9J,v0,JAP, +00050000-1020AA00,ボンバーマン '93,WUP-N-PPTJ,,JAP, +00050000-1015C900,ボンバーマン '94,WUP-N-PNWJ,v0,JAP, +00050000-1015FE00,マーヴェラス ~もうひとつの宝島~,WUP-N-JCCJ,v0,JAP, +00050000-10169800,風のクロノア ~夢見る帝国~,WUP-N-PANJ,v0,JAP, +00050000-101C5900,サイコロの森 3-in-1,WUP-N-ATYJ,v0,JAP, 00050000-101DA100,?????? 3on3,WUP-N-DA2J,,JAP, 00050000-10190100,?????? amiibo???????,WUP-P-AALJ,v0,JAP, 00050000-101D2B00,?????? AND CO.,WUP-N-ATCJ,v1,JAP, @@ -250,24 +250,24 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-101CE300,???????,WUP-N-BNAJ,v0,JAP, 00050000-10112700,???????,WUP-N-ARBJ,v0,JAP, 00050000-1014F300,???????,WUP-N-APCJ,v0,JAP, -00050000-101A7900,???????,99,v0,JAP, -00050000-10186200,???????,116,v0,JAP, -00050000-10186B00,??????? ? ???,WUP-N-JC4J,v0,JAP, -00050000-10157C00,??????? ?????,WUP-N-WGEJ,v1,JAP, -00050000-1014F400,??????? ?????,WUP-N-WCKJ,v0,JAP, -00050000-1019CE00,??????? ?????,WUP-N-VABJ,v0,JAP, -00050000-101D8B00,??????? ?????,WUP-N-AP8J,v0,JAP, -00050000-10190700,??????? ??????,WUP-N-FECJ,v0,JAP, -00050000-1018B600,??????? ????????,WUP-N-FD7J,v0,JAP, -00050000-10113100,??????? ???????? ?????? ??????,WUP-N-ABHJ,v16,JAP, -00050000-101A5A00,??????? ?????????,WUP-N-NAHJ,v0,JAP, -00050000-1F600900,??????? ?????????,WUP-N-CNFJ,,JAP, -00050000-10144800,??????? ?????????,WUP-N-ARKJ,v17,JAP, -00050000-101A5200,??????? ??????????,WUP-N-DAJJ,v1,JAP, -00050000-10188000,??????? ???????????,WUP-N-PBMJ,v0,JAP, -00050000-10113000,??????? 3 - ??? -,WUP-P-AMEJ,v16,JAP, -00050000-10106100,??????? 3D????,WUP-N-ARDJ,v1,JAP, -00050000-101E9C00,???????:??????????,WUP-N-ACUJ,,JAP, +00050000-101A7900,キングスナイト,99,v0,JAP, +00050000-10186200,マッド・シティ,116,v0,JAP, +00050000-10186B00,コズモギャング ザ パズル,WUP-N-JC4J,v0,JAP, +00050000-10157C00,アルファディア ジェネシス,WUP-N-WGEJ,v1,JAP, +00050000-1014F400,クラウドベリー キングダム,WUP-N-WCKJ,v0,JAP, +00050000-1019CE00,ドンキーコング リターンズ,WUP-N-VABJ,v0,JAP, +00050000-101D8B00,ヒラメキパズル テトグラム,WUP-N-AP8J,v0,JAP, +00050000-10190700,バイオミラクル ぼくってウパ,WUP-N-FECJ,v0,JAP, +00050000-10190700,すごろクエスト ダイスの戦士たち,WUP-N-FD7J,v0,JAP, +00050000-10113100,バイオハザード リベレーションズ アンベールド エディション,WUP-N-ABHJ,v16,JAP, +00050000-101A5A00,テン・エイティ スノーボーディング,WUP-N-NAHJ,v0,JAP, +00050000-1F600900,ペーパーマリオ カラースプラッシュ,WUP-N-CNFJ,,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/CNFJ01.jpg +00050000-10144800,ドンキーコング トロピカルフリーズ,WUP-N-ARKJ,v17,JAP, +00050000-101A5200,ドンキーコング ジャングルクライマ,WUP-N-DAJJ,v1,JAP, +00050000-10188000,ことばのパズル もじぴったんアドバンス,WUP-N-PBMJ,v0,JAP, +00050000-10113000,マスエフェクト 3 - 特別版 -,WUP-P-AMEJ,v16,JAP, +00050000-10106100,スーパーマリオ 3Dワールド,WUP-N-ARDJ,v1,JAP, +00050000-101E9C00,キューブライフ:アイランドサバイバル,WUP-N-ACUJ,,JAP, 00050000-10176700,???????!,WUP-N-WKMJ,v0,JAP, 00050000-101CAA00,???????!????VS????,WUP-N-WMMJ,v0,JAP, 00050000-101B3000,???????!(??????????2014 ?????),WUP-N-BMJJ,v0,JAP, @@ -527,12 +527,12 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-101AC300,????????64,104,v0,JAP, 00050000-10163F00,????????II,WUP-N-PPFJ,,JAP, 00050000-1017B800,????????SP,WUP-N-WBWJ,v1,JAP, -00050000-101FD300,????????U,WUP-N-WBUJ,,JAP, -00050000-101B3400,????????X ????????? ?????,WUP-P-BDLJ,,JAP, -00050000-10115E00,????????X ????????? ?????,WUP-N-ADQJ,v1312,JAP, -00050000-10155F00,????????X ??????????? ?????,WUP-P-ANYJ,,JAP, -00050000-1015FF00,????????XX,WUP-N-JCDJ,v0,JAP, -00050000-101A0200,????????Z,112,v0,JAP, +00050000-101FD300,ブロークドロップU,WUP-N-WBUJ,,JAP,https://art.gametdb.com/wiiu/coverM/JA/WBUJ.jpg +00050000-101B3400,ドラゴンクエストⅩ いにしえの竜の伝承 オンライン,WUP-P-BDLJ,,JAP, +00050000-10115E00,ドラゴンクエストⅩ 目覚めし五つの種族 オンライン,WUP-N-ADQJ,v1312,JAP, +00050000-10155F00,ドラゴンクエストⅩ 眠れる勇者と導きの盟友 オンライン,WUP-P-ANYJ,,JAP, +00050000-1015FF00,悪魔城ドラキュラXX,WUP-N-JCDJ,v0,JAP, +00050000-101A0200,フォーメーションZ,112,v0,JAP, 00050000-101B3100,???????(??????????2014 ?????),WUP-N-BYSJ,v0,JAP, 00050000-101B3600,???????(??????????2014 ?????),WUP-N-ALTJ,v0,JAP, 00050000-10161F00,???????10,WUP-N-ABAJ,v16,JAP, @@ -569,7 +569,7 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-10184200,??????G2 ???????????????,WUP-N-PBKJ,v0,JAP, 00050000-10141500,??????if...,WUP-N-JBSJ,v0,JAP, 00050000-1015C000,??????II,WUP-N-PNMJ,v0,JAP, -00050000-101C5E00,??????V2,WUP-N-NARJ,,JAP, +00050000-101C5E00,カスタムロボV2,WUP-N-NARJ,,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/NARJ.jpg 00050000-1018E600,?????&????,WUP-N-PBTJ,v0,JAP, 00050000-1011B900,?????2,WUP-N-AQUJ,v1,JAP, 00050000-10114700,?????2 Dr.??????,WUP-N-FAPJ,v0,JAP, @@ -686,8 +686,8 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-101DBF00,Angry Video Game Nerd Adventures,WUP-P-AVGP,,EUR,https://art.gametdb.com/wiiu/coverHQ/US/AVGE.jpg?1475529340 00050000-1018F400,Angry Video Game Nerd Adventures,WUP-N-AVGE,v1,USA,https://art.gametdb.com/wiiu/coverHQ/US/AVGE.jpg?1475529340 00050000-10145600,Animal Crossing Plaza,WUP-U-ADBA,v16,all,https://art.gametdb.com/wiiu/coverHQ/EN/ADBP.jpg?1463010434 -00050000-101C6500,Animal Crossing: amiibo Festival,WUP-P-AALP,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/AALE01.jpg?1451062877 -00050000-101C6400,Animal Crossing: amiibo Festival,WUP-P-AALE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/AALE01.jpg?1451062877 +00050000-101C6500,Animal Crossing: amiibo Festival,WUP-P-AALP,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/EN/AALP01.jpg +00050000-101C6400,Animal Crossing: amiibo Festival,WUP-P-AALE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/AALE01.jpg 00050000-101D2100,Animal Crossing: Wild World,WUP-N-DAYP,,EUR, 00050000-101D2000,Animal Crossing: Wild World,WUP-N-DAYE,,USA, 00050000-10173200,Another World - 20th Anniversary Edition,WUP-P-WEUP,v16,EUR,https://art.gametdb.com/wiiu/coverHQ/US/WEUE.jpg?1469834113 @@ -955,15 +955,15 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-10174700,Dig Dug,WUP-N-FDEE,v0,USA, 00050000-101A7800,Dig Dug II,WUP-N-FEWP,v0,EUR, 00050000-101A7700,Dig Dug II,WUP-N-FEWE,,USA, -00050000-1018A700,Dinox,WUP-P-BDNP,,EUR,https://art.gametdb.com/wiiu/coverHQ/US/BDNE.jpg?1476388120 -00050000-1018F500,Dinox,WUP-N-BDNE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/BDNE.jpg?1476388120 -00050000-101E8300,Discovery,WUP-P-ADUP,,EUR, -00050000-101D9B00,Discovery,WUP-N-ADUE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/AEME4Q.jpg?1355066365 -00050000-10112E00,Disney Epic Mickey 2,18,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/AEME4Q.jpg?1355066365 -00050000-1012C400,Disney Epic Mickey 2,19,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/AEME4Q.jpg?1355066365 -00050000-10136D00,Disney Epic Mickey 2,20,v0,JAP,https://art.gametdb.com/wiiu/coverHQ/US/AEME4Q.jpg?1355066365 -00050000-1011B000,Disney Epic Mickey 2: The Power of Two,WUP-P-AEMS,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/AEME4Q.jpg?1355066365 -00050000-1010DB00,Disney Epic Mickey 2: The Power of Two,WUP-N-AEME,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/AEME4Q.jpg?1355066365 +00050000-1018A700,Dinox,WUP-P-BDNP,,EUR,https://art.gametdb.com/wiiu/coverHQ/US/BDNE.jpg +00050000-1018F500,Dinox,WUP-N-BDNE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/BDNE.jpg +00050000-101E8300,Discovery,WUP-P-ADUP,,EUR,https://art.gametdb.com/wiiu/coverHQ/EN/ADUP.jpg +00050000-101D9B00,Discovery,WUP-N-ADUE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/ADUE.jpg +00050000-10112E00,Disney Epic Mickey 2,18,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/AEME4Q.jpg +00050000-1012C400,Disney Epic Mickey 2,19,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/AEME4Q.jpg +00050000-10136D00,Disney Epic Mickey 2,20,v0,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/AEMJ91.jpg +00050000-1011B000,Disney Epic Mickey 2: The Power of Two,WUP-P-AEMS,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/EN/AEMS4Q.jpg +00050000-1010DB00,Disney Epic Mickey 2: The Power of Two,WUP-N-AEME,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/AEME4Q.jpg 00050000-10137000,Disney Infinity,WUP-U-ADSZ,v49,EUR,https://art.gametdb.com/wiiu/coverHQ/US/ADSE4Q.jpg?1385299887 00050000-10136F00,Disney Infinity,WUP-U-ADSP,v49,EUR,https://art.gametdb.com/wiiu/coverHQ/US/ADSE4Q.jpg?1385299887 00050000-10132900,Disney Infinity,WUP-P-ADSE,v49,USA,https://art.gametdb.com/wiiu/coverHQ/US/ADSE4Q.jpg?1385299887 @@ -981,12 +981,12 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-101A5300,DK Jungle Climber,WUP-N-DAJE,v1,USA, 00050000-1017D700,DK: King of Swing,WUP-N-PBCP,v0,EUR, 00050000-1017D600,DK: King of Swing,WUP-N-PBCE,v0,USA, -00050000-101A8100,Dodge Club Party,WUP-N-BDGE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/BDGE.jpg?1488459948 -00050000-1017DB00,Dolphin Up,WUP-N-WUPE,v16,USA, -00050000-101D2800,DON'T CRASH,WUP-N-AC5E,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/AC5E.jpg?1475792756 -00050000-101C9A00,Don't Starve: Giant Edition,WUP-P-ADAP,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/ADAE.jpg?1475792710 -00050000-101C4300,Don't Starve: Giant Edition,WUP-N-ADAE,v1,USA,https://art.gametdb.com/wiiu/coverHQ/US/ADAE.jpg?1475792710 -00050000-1018EE00,Don't Touch Anything Red,WUP-N-ANTE,v1,USA,https://art.gametdb.com/wiiu/coverHQ/US/ANTE.jpg?1488461986 +00050000-101A8100,Dodge Club Party,WUP-N-BDGE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/BDGE.jpg +00050000-1017DB00,Dolphin Up,WUP-N-WUPE,v16,USA,https://art.gametdb.com/wiiu/coverHQ/US/WUPE.jpg +00050000-101D2800,DON'T CRASH,WUP-N-AC5E,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/AC5E.jpg +00050000-101C9A00,Don't Starve: Giant Edition,WUP-P-ADAP,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/ADAE.jpg +00050000-101C4300,Don't Starve: Giant Edition,WUP-N-ADAE,v1,USA,https://art.gametdb.com/wiiu/coverHQ/US/ADAE.jpg +00050000-1018EE00,Don't Touch Anything Red,WUP-N-ANTE,v1,USA,https://art.gametdb.com/wiiu/coverHQ/US/ANTE.jpg 00050000-10108000,Donkey Kong,WUP-N-FAFP,v0,EUR, 00050000-10107F00,Donkey Kong,WUP-N-FAFE,v0,USA, 00050000-1014A900,Donkey Kong 3,WUP-N-FBRP,v0,EUR, @@ -1025,7 +1025,7 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-10152A00,Dr. Luigi,WUP-N-WAQE,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/WAQE.jpg?1476819557 00050000-10153200,Dr. Mario,WUP-N-FB5P,v0,EUR,https://art.gametdb.com/wii/cover/US/WDME.png?1353446316 00050000-10153100,Dr. Mario,WUP-N-FB5E,v0,USA,https://art.gametdb.com/wii/cover/US/WDME.png?1353446316 -00050000-10150300,Dr.LUIGI & 細菌撲滅,WUP-N-WAQJ,v0,JAP,https://art.gametdb.com/wiiu/coverHQ/US/WAQE.jpg?1476819557 +00050000-10150300,Dr.LUIGI & 細菌撲滅,WUP-N-WAQJ,v0,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/WAQJ.jpg 00050000-101F4F00,Dracula's Legacy,WUP-P-AGJP,,EUR,https://art.gametdb.com/wiiu/coverM/US/AGJE.jpg?1476537791 00050000-101F5000,Dracula's Legacy,WUP-N-AGJE,,USA,https://art.gametdb.com/wiiu/coverM/US/AGJE.jpg?1476537791 00050000-101B2900,Dragon Fantasy: The Black Tome of Ice,WUP-N-AFYE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/AFYE.jpg?1475792823 @@ -1040,17 +1040,17 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-10203B00,Dreamals: Dream Quest,WUP-N-AQBE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/AQBE.jpg?1488462612 00050000-101CAF00,Drill Dozer,WUP-N-PDEP,,EUR, 00050000-101CB000,Drill Dozer,WUP-N-PDEE,,USA, -00050000-101F7600,Dual Core,WUP-P-BD8P,,EUR,https://art.gametdb.com/wiiu/coverHQ/US/BD8E.jpg?1475793254 -00050000-101E3800,Dual Core,WUP-N-BD8E,,USA,https://art.gametdb.com/wiiu/coverHQ/US/BD8E.jpg?1475793254 +00050000-101F7600,Dual Core,WUP-P-BD8P,,EUR,https://art.gametdb.com/wiiu/coverHQ/US/BD8E.jpg +00050000-101E3800,Dual Core,WUP-N-BD8E,,USA,https://art.gametdb.com/wiiu/coverHQ/US/BD8E.jpg 00050000-10192600,Duck Hunt,WUP-N-FEHP,v1,EUR, 00050000-10192500,Duck Hunt,WUP-N-FEHE,v1,USA, -00050000-10129200,DuckTales: Remastered,WUP-P-WDKP,v32,EUR,https://art.gametdb.com/wiiu/coverHQ/US/WDKE08.jpg?1458757418 -00050000-10129000,DuckTales: Remastered,WUP-N-WDKE,v32,USA,https://art.gametdb.com/wiiu/coverHQ/US/WDKE08.jpg?1458757418 +00050000-10129200,DuckTales: Remastered,WUP-P-WDKP,v32,EUR,https://art.gametdb.com/wiiu/coverHQ/US/WDKE08.jpg +00050000-10129000,DuckTales: Remastered,WUP-N-WDKE,v32,USA,https://art.gametdb.com/wiiu/coverHQ/US/WDKE08.jpg 00050000-10167700,Dungeon Explorer,WUP-N-PN3E,,USA, 00050000-101F8A00,Dungeon Hearts DX,WUP-N-BXDE,,USA, -00050000-1012BF00,Dungeons & Dragons: Chronicles of Mystara,WUP-P-WDDP,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/WDDE.jpg?1475793358 -00050000-1012C000,Dungeons & Dragons: Chronicles of Mystara,WUP-N-WDDE,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/WDDE.jpg?1475793358 -00050000-1010D900,EA SPORTS FIFA Soccer 13,WUP-N-AF3E,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/AF3E69.jpg?1355512715 +00050000-1012BF00,Dungeons & Dragons: Chronicles of Mystara,WUP-P-WDDP,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/WDDE.jpg +00050000-1012C000,Dungeons & Dragons: Chronicles of Mystara,WUP-N-WDDE,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/WDDE.jpg +00050000-1010D900,EA SPORTS FIFA Soccer 13,WUP-N-AF3E,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/AF3E69.jpg 00050000-10133500,EarthBound,WUP-N-JBBP,v0,EUR, 00050000-10133400,EarthBound,WUP-N-JBBE,v0,USA, 00050000-10133200,EarthBound Beginnings,WUP-N-FBDP,v0,EUR, @@ -1117,7 +1117,7 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-1012F000,FAST Racing NEO,WUP-N-WFSE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/WFSE.jpg?1475794541 00050000-101FED00,FAST Racing NEO,WUP-P-BR5P,,EUR,https://art.gametdb.com/wiiu/coverHQ/US/WFSE.jpg?1475794541 00050000-10182D00,Fat City,WUP-N-AFTE,v1,USA, -00050000-101D0600,Fatal Frame: Maiden of Black Water,WUP-N-AL5E,v0,USA, +00050000-101D0600,Fatal Frame: Maiden of Black Water,WUP-N-AL5E,v0,USA,https://art.gametdb.com/wiiu/coverM/US/AL5E.jpg 00050000-1FBF1000,FBF10,WUP-P-ABCD,"v0, v32 ",all, 00050000-1010EE00,FIFA 13,WUP-P-AF3P,v16,EUR,https://art.gametdb.com/wiiu/coverHQ/EN/AF3P69.jpg?1458686491 00050000-10110C00,FIFA 13 ワールドクラスサッカー,WUP-N-AF3J,v0,JAP,https://art.gametdb.com/wiiu/coverHQ/EN/AF3P69.jpg?1458686491 @@ -1278,8 +1278,8 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-10150500,Ice Hockey,WUP-N-FBUE,v0,USA, 00050000-10184400,Infinity Runner,WUP-P-BRNP,,EUR,https://art.gametdb.com/wiiu/coverHQ/US/BRNE.jpg?1475871864 00050000-10183C00,Infinity Runner,WUP-N-BRNE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/BRNE.jpg?1475871864 -00050000-10111A00,Injustice: Gods Among Us,WUP-P-AJSP,v16,EUR,https://art.gametdb.com/wiiu/coverHQ/EN/AJSPWR.jpg?1384898050 -00050000-10111700,Injustice: Gods Among Us,WUP-N-AJSE,v16,USA,https://art.gametdb.com/wiiu/coverHQ/EN/AJSPWR.jpg?1384898050 +00050000-10111A00,Injustice: Gods Among Us,WUP-P-AJSP,v16,EUR,https://art.gametdb.com/wiiu/coverHQ/EN/AJSPWR.jpg +00050000-10111700,Injustice: Gods Among Us,WUP-N-AJSE,v16,USA,https://art.gametdb.com/wiiu/coverHQ/US/AJSEWR.jpg 00050000-101E5800,Inside My Radio,WUP-P-ARQP,,EUR,https://art.gametdb.com/wiiu/coverHQ/US/ARQE.jpg?1475872012 00050000-101E5A00,Inside My Radio,WUP-N-ARQE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/ARQE.jpg?1475872012 00050000-10179300,Internal Invasion,WUP-N-WG9E,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/WG9E.jpg?1469833806 @@ -1399,12 +1399,12 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-101DAB00,LEGO Star Wars: The Force Awakens,WUP-N-BLGE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/BLGEWR.jpg?1471068273 00050000-10168D00,LEGO The Hobbit,WUP-P-ALHP,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/ALHEWR.jpg?1447095190 00050000-1016A700,LEGO The Hobbit,WUP-N-ALHE,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/ALHEWR.jpg?1447095190 -00050000-10192100,LEGO ムービー ザ・ゲーム,WUP-N-ALAJ,v0,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/ALAJWR.jpg?1458328106 -00050000-101EA100,LEGO マーベル アベンジャーズ,WUP-N-ALRJ,,JAP,https://art.gametdb.com/wiiu/coverHQ/US/ALREWR.jpg?1454429385 -00050000-101A2D00,LEGO マーベル スーパー・ヒーローズ ザ・ゲーム,WUP-N-ALMJ,v1,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/ALMJWR.jpg?1458326377 -00050000-101CDF00,LEGO ジュラシック・ワールド,WUP-N-ALJJ,v0,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/ALJJWR.jpg?1458326309 -00050000-101EA000,LEGO スター・ウォーズ/フォースの覚醒,WUP-N-BLGJ,,JAP,https://art.gametdb.com/wiiu/coverM/JA/BLGJWR.jpg?1476282662 -00050000-101B2700,LEGO バットマン3 ザ・ゲーム ゴッサムから宇宙へ,WUP-N-BTMJ,v0,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/BTMJWR.jpg?1458326334 +00050000-10192100,LEGO ムービー ザ・ゲーム,WUP-N-ALAJ,v0,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/ALAJWR.jpg +00050000-101EA100,LEGO マーベル アベンジャーズ,WUP-N-ALRJ,,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/ALRJWR.jpg +00050000-101A2D00,LEGO マーベル スーパー・ヒーローズ ザ・ゲーム,WUP-N-ALMJ,v1,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/ALMJWR.jpg +00050000-101CDF00,LEGO ジュラシック・ワールド,WUP-N-ALJJ,v0,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/ALJJWR.jpg +00050000-101EA000,LEGO スター・ウォーズ/フォースの覚醒,WUP-N-BLGJ,,JAP,https://art.gametdb.com/wiiu/coverM/JA/BLGJWR.jpg +00050000-101B2700,LEGO バットマン3 ザ・ゲーム ゴッサムから宇宙へ,WUP-N-BTMJ,v0,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/BTMJWR.jpg 00050000-101F6400,Letter Quest Remastered,WUP-P-AG8P,,EUR, 00050000-101F5500,Letter Quest: Remastered,WUP-N-AG8E,,USA, 00050000-101D3B00,Level 22,WUP-P-AL2P,,EUR, @@ -1436,8 +1436,8 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-101EAE00,Lucentek Beyond,WUP-P-WLBE,,USA, 00050000-10154E00,Luv Me Buddies Wonderland,WUP-P-ALVP,v1,EUR,https://art.gametdb.com/wiiu/coverHQ/EN/ALVPYF.jpg?1475665205 00050000-10177400,Luv Me Buddies Wonderland,WUP-N-ALVE,v0,USA,https://art.gametdb.com/wiiu/coverHQ/EN/ALVPYF.jpg?1475665205 -00050000-10190300,Mario & Sonic at the Rio 2016 Olympic Games,WUP-U-ABJJ,48,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/ABJJ01.jpg?1463240667 -00050000-101E5300,Mario & Sonic at the Rio 2016 Olympic Games,WUP-U-ABJE,16,USA,https://art.gametdb.com/wiiu/coverHQ/JA/ABJJ01.jpg?1463240667 +00050000-10190300,Mario & Sonic at the Rio 2016 Olympic Games,WUP-U-ABJJ,48,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/ABJJ01.jpg +00050000-101E5300,Mario & Sonic at the Rio 2016 Olympic Games,WUP-U-ABJE,16,USA,https://art.gametdb.com/wiiu/coverHQ/EN/ABJP01.jpg 00050000-10160900,Mach Rider,WUP-N-FCQP,v0,EUR, 00050000-10160800,Mach Rider,WUP-N-FCQE,v0,USA, 00050000-1010D800,Madden NFL 13,WUP-N-AMDE,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/AMDE69.jpg?1354294756 @@ -1449,7 +1449,7 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-101A2200,Mario & Luigi: Partners in Time,WUP-N-DAHE,v0,USA, 00050000-10157500,Mario & Luigi: Superstar Saga,WUP-N-PAEP,v0,EUR, 00050000-10157400,Mario & Luigi: Superstar Saga,WUP-N-PAEE,v1,USA, -00050000-101E5400,Mario & Sonic at the Rio 2016 Olympic Games,WUP-P-ABJP,,EUR,https://art.gametdb.com/wiiu/coverHQ/JA/ABJJ01.jpg?1463240667 +00050000-101E5400,Mario & Sonic at the Rio 2016 Olympic Games,WUP-P-ABJP,,EUR,https://art.gametdb.com/wiiu/coverHQ/EN/ABJP01.jpg 00050000-1010C800,Mario & Sonic at the Sochi 2014 Olympic Winter Games,WUP-P-AURP,v32,EUR,https://art.gametdb.com/wiiu/coverHQ/EN/AURP01.jpg?1384710496 00050000-1010C700,Mario & Sonic at the Sochi 2014 Olympic Winter Games,WUP-P-AURE,v32,USA,https://art.gametdb.com/wiiu/coverHQ/EN/AURP01.jpg?1384710496 00050000-10107C00,Mario Bros.,WUP-N-FAEE,v0,USA, @@ -1595,8 +1595,8 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-101C5A00,Mighty No. 9,WUP-P-AMQP,,EUR,https://art.gametdb.com/wiiu/coverHQ/EN/AMQPKM.jpg?1466700278 00050000-101DD900,Mighty No. 9,WUP-N-AMQJ,,JAP,https://art.gametdb.com/wiiu/coverHQ/EN/AMQPKM.jpg?1466700278 00050000-101C9600,Mighty No. 9,WUP-N-AMQE,,USA,https://art.gametdb.com/wiiu/coverHQ/EN/AMQPKM.jpg?1466700278 -00050000-1014F100,Mighty Switch Force! 2,WUP-P-WM2P,v0,EUR,https://art.gametdb.com/wiiu/coverM/US/WM2E.jpg?1404311990 -00050000-1014FC00,Mighty Switch Force! 2,WUP-N-WM2E,v0,USA,https://art.gametdb.com/wiiu/coverM/US/WM2E.jpg?1404311990 +00050000-1014F100,Mighty Switch Force! 2,WUP-P-WM2P,v0,EUR,https://art.gametdb.com/wiiu/coverM/US/WM2E.jpg +00050000-1014FC00,Mighty Switch Force! 2,WUP-N-WM2E,v0,USA,https://art.gametdb.com/wiiu/coverM/US/WM2E.jpg 00050000-10128200,Mighty Switch Force! Hyper Drive Edition,WUP-P-WHYP,v32,EUR,https://art.gametdb.com/wiiu/coverHQ/US/WHYE.jpg?1469834303 00050000-1011B100,Mighty Switch Force! Hyper Drive Edition,WUP-N-WHYE,v16,USA,https://art.gametdb.com/wiiu/coverHQ/US/WHYE.jpg?1469834303 00050000-10205500,MikroGame: Rotator,WUP-P-BR7P,,EUR,https://art.gametdb.com/wiiu/coverHQ/US/BR7E.jpg?1475874112 @@ -1741,7 +1741,7 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-10175C00,One Piece: Unlimited World Red,WUP-N-AUNE,v0,USA,https://art.gametdb.com/wiiu/coverHQ/JA/AUNJAF.jpg?1459438484 00050000-101A9200,Onimusha Tactics,WUP-N-PCKP,,EUR, 00050000-101A9300,Onimusha Tactics,WUP-N-PCKE,v0,USA, -00050000-101AB100,Outer World 20th Anniversary Edition,WUP-N-WEUJ,v0,JAP, +00050000-101AB100,Outer World 20th Anniversary Edition,WUP-N-WEUJ,v0,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/WEUJ.jpg 00050000-101D0800,Outside the Realm,WUP-N-ARLE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/ARLE.jpg?1488257330 00050000-10202100,Overworld Defender Remix,WUP-N-BR8E,,USA, 00050000-10186D00,Pac-Attack,WUP-N-JC4P,v0,EUR, @@ -2104,23 +2104,23 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-10135200,Star Wars Pinball,WUP-N-WA2E,v33,USA,https://art.gametdb.com/wiiu/coverHQ/US/WA2E.jpg?1476384312 00050000-101B5B00,StarTropics,WUP-N-FE2P,v0,EUR, 00050000-101B5A00,StarTropics,WUP-N-FE2E,,USA, -00050000-101D4700,STARWHAL,WUP-P-BJTP,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/BJTE.jpg?1476043031 -00050000-1019ED00,STARWHAL,WUP-N-BJTE,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/BJTE.jpg?1476043031 -00050000-10173300,Stealth Inc 2: A Game of Clones,WUP-P-WCGP,v16,EUR,https://art.gametdb.com/wiiu/coverHQ/US/WCGE.jpg?1476043150 -00050000-10176500,Stealth Inc 2: A Game of Clones,WUP-N-WCGE,v16,USA,https://art.gametdb.com/wiiu/coverHQ/US/WCGE.jpg?1476043150 -00050000-1018D800,SteamWorld Dig,WUP-P-ADGP,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/ADGE.jpg?1476043255 -00050000-1018F100,SteamWorld Dig,WUP-N-ADGE,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/ADGE.jpg?1476043255 -00050000-101A3700,SteamWorld Heist,WUP-P-AY5P,,EUR,https://art.gametdb.com/wiiu/coverHQ/US/AY5E.jpg?1476052479 -00050000-101A4000,SteamWorld Heist,WUP-N-AY5E,,USA,https://art.gametdb.com/wiiu/coverHQ/US/AY5E.jpg?1476052479 -00050000-101FDE00,STEEL LORDS,WUP-P-ALQP,,EUR,https://art.gametdb.com/wiiu/coverHQ/US/ALQE.jpg?1476559837 -00050000-101FE500,STEEL LORDS,WUP-N-ALQE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/ALQE.jpg?1476559837 -00050000-101F1600,STEEL RIVALS,WUP-P-BRCP,,EUR,https://art.gametdb.com/wiiu/coverHQ/US/BRCE.jpg?1476800242 -00050000-101D9500,STEEL RIVALS,WUP-N-BRCE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/BRCE.jpg?1476800242 -00050000-1016D400,Stick it to the Man,WUP-P-WMNP,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/WMNE.jpg?1476043351 -00050000-1016E000,Stick it to the Man,WUP-N-WMNE,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/WMNE.jpg?1476043351 +00050000-101D4700,STARWHAL,WUP-P-BJTP,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/BJTE.jpg +00050000-1019ED00,STARWHAL,WUP-N-BJTE,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/BJTE.jpg +00050000-10173300,Stealth Inc 2: A Game of Clones,WUP-P-WCGP,v16,EUR,https://art.gametdb.com/wiiu/coverHQ/US/WCGE.jpg +00050000-10176500,Stealth Inc 2: A Game of Clones,WUP-N-WCGE,v16,USA,https://art.gametdb.com/wiiu/coverHQ/US/WCGE.jpg +00050000-1018D800,SteamWorld Dig,WUP-P-ADGP,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/ADGE.jpg +00050000-1018F100,SteamWorld Dig,WUP-N-ADGE,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/ADGE.jpg +00050000-101A3700,SteamWorld Heist,WUP-P-AY5P,,EUR,https://art.gametdb.com/wiiu/coverHQ/US/AY5E.jpg +00050000-101A4000,SteamWorld Heist,WUP-N-AY5E,,USA,https://art.gametdb.com/wiiu/coverHQ/US/AY5E.jpg +00050000-101FDE00,STEEL LORDS,WUP-P-ALQP,,EUR,https://art.gametdb.com/wiiu/coverHQ/US/ALQE.jpg +00050000-101FE500,STEEL LORDS,WUP-N-ALQE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/ALQE.jpg +00050000-101F1600,STEEL RIVALS,WUP-P-BRCP,,EUR,https://art.gametdb.com/wiiu/coverHQ/US/BRCE.jpg +00050000-101D9500,STEEL RIVALS,WUP-N-BRCE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/BRCE.jpg +00050000-1016D400,Stick it to the Man,WUP-P-WMNP,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/WMNE.jpg +00050000-1016E000,Stick it to the Man,WUP-N-WMNE,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/WMNE.jpg 00050000-1018B500,STINGER,WUP-N-FD6E,v0,USA, -00050000-101D5100,Stone Shire,WUP-P-BSVP,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/BSVE.jpg?1475925595 -00050000-101A4C00,Stone Shire,WUP-N-BSVE,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/BSVE.jpg?1475925595 +00050000-101D5100,Stone Shire,WUP-P-BSVP,v0,EUR,https://art.gametdb.com/wiiu/coverHQ/US/BSVE.jpg +00050000-101A4C00,Stone Shire,WUP-N-BSVE,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/BSVE.jpg 00050000-10177F00,Street Fighter 2010: The Final Fight,WUP-N-FDLP,v0,EUR, 00050000-10177E00,Street Fighter 2010: The Final Fight,WUP-N-FDLE,v0,USA, 00050000-1016C600,Street Fighter Alpha 2,WUP-N-JCGP,v0,EUR, @@ -2139,8 +2139,8 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-10130B00,Super Castlevania IV,WUP-N-JA9P,v0,EUR, 00050000-10130A00,Super Castlevania IV,WUP-N-JA9E,v0,USA, 00050000-101B9600,Super Destronaut,WUP-N-ASJE,v0,USA,https://art.gametdb.com/wiiu/coverHQ/US/ASJE.jpg?1476907451 -00050000-101FB000,Super Destronaut 2: Go Duck Yourself,WUP-P-AJNP,,EUR,https://art.gametdb.com/wiiu/coverHQ/US/AJNE.jpg?1477517957 -00050000-101F9400,Super Destronaut 2: Go Duck Yourself,WUP-N-AJNE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/AJNE.jpg?1477517957 +00050000-101FB000,Super Destronaut 2: Go Duck Yourself,WUP-P-AJNP,,EUR,https://art.gametdb.com/wiiu/coverHQ/EN/AJNP.jpg +00050000-101F9400,Super Destronaut 2: Go Duck Yourself,WUP-N-AJNE,,USA,https://art.gametdb.com/wiiu/coverHQ/US/AJNE.jpg 00050000-10151200,Super Dodge Ball,WUP-N-FB2P,v0,EUR, 00050000-10151100,Super Dodge Ball,WUP-N-FB2E,v0,USA, 00050000-10191100,SUPER E.D.F. Earth Defense Force,WUP-N-JDAJ,v0,JAP, @@ -2480,8 +2480,8 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-1012F100,Wii Sports Club,WUP-N-AWSJ,v112,JAP,https://art.gametdb.com/wiiu/coverHQ/US/AWSE01.jpg?1469542427 00050000-10144D00,Wii Sports Club,WUP-N-AWSE,v112,USA,https://art.gametdb.com/wiiu/coverHQ/US/AWSE01.jpg?1469542427 00050000-10171E00,Wii Sports Club Lite,90,v0,JAP,https://art.gametdb.com/wiiu/coverHQ/US/AWSE01.jpg?1469542427 -00050000-1012D300,Wii Street U powered by Google,WUP-N-WHXJ,v144,JAP,https://art.gametdb.com/wiiu/coverHQ/US/WHXE.jpg?1476395180 -00050000-10132000,Wii Street U powered by Google,91,v144,USA,https://art.gametdb.com/wiiu/coverHQ/US/WHXE.jpg?1476395180 +00050000-1012D300,Wii Street U powered by Google,WUP-N-WHXJ,v144,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/WHXJ.jpg +00050000-10132000,Wii Street U powered by Google,WUP-N-WHXE,v144,USA,https://art.gametdb.com/wiiu/coverHQ/US/WHXE.jpg 00050000-10132100,Wii Street U powered by Google,92,v144,EUR,https://art.gametdb.com/wiiu/coverHQ/US/WHXE.jpg?1476395180 00050000-10129600,Wii U Panorama View 予告編,WUP-N-SPGJ,v1,JAP,https://art.gametdb.com/wiiu/coverM/JA/SPGJ.jpg?1419725497 00050000-1012D500,Wii U Panorama View 鳥の飛行隊,WUP-N-WETJ,v1,JAP,https://art.gametdb.com/wiiu/coverM/JA/WETJ.jpg?1419725020 @@ -2576,3 +2576,9 @@ TitleID,Description,ProductCode,Version,Region,CoverURL 00050000-10112300,ZombiU(ゾンビU),WUP-N-AZUJ,v32,JAP,https://art.gametdb.com/wiiu/coverHQ/US/AZUE41.jpg?1354294751 00050000-1014E300,Zumba Fitness World Party,WUP-U-AZBP,v16,EUR,https://art.gametdb.com/wii/cover/EN/SZ3PGT.png?1385155346 00050000-10142A00,Zumba Fitness World Party,WUP-N-AZBE,v16,USA,https://art.gametdb.com/wii/cover/EN/SZ3PGT.png?1385155346 +00050000-10217000,JUST DANCE® 2019,WUP-P-HJDP,16,EUR,https://art.gametdb.com/wiiu/coverHQ/EN/HJDP41.jpg +00050000-10217300,JUST DANCE® 2019,WUP-P-HJDE,"16, 32, 48, 64, 80, 96, 113, 128, 144, 160, 176, 192, 208, 224 ",USA,https://art.gametdb.com/wiiu/coverHQ/EN/HJDP41.jpg +00050000-10209900,Cars 3: Driven to Win,WUP-N-BA4E,,USA,https://art.gametdb.com/wiiu/coverHQ/DE/BA4PWR.jpg +00050000-1020A400,Cars 3: Driven to Win,WUP-P-BA4P,,EUR,https://art.gametdb.com/wiiu/coverHQ/DE/BA4PWR.jpg +00050000-10211F00,ドラゴンクエストⅩ 5000年の旅路 遙かなる故郷へ オンライン,WUP-P-AXTJ ,,JAP,https://art.gametdb.com/wiiu/coverHQ/JA/AXTJGD.jpg +00050000-10210C00,Just Dance 2018®,WUP-P-BJ8P,,EUR,https://art.gametdb.com/wiiu/coverHQ/EN/BJ8P41.jpg From df33c218268e2260cca2ae9d0fac23d4905b906c Mon Sep 17 00:00:00 2001 From: Seil0 Date: Tue, 9 Apr 2019 00:42:39 +0200 Subject: [PATCH 08/19] some code clean up * library updates * dialog -> alert --- pom.xml | 12 +- .../java/com/cemu_UI/application/Main.java | 26 +-- .../application/MainWindowController.java | 211 +++++++----------- .../com/cemu_UI/application/playGame.java | 2 +- .../cemu_UI/controller/UpdateController.java | 7 +- .../com/cemu_UI/controller/XMLController.java | 11 + .../cemu_UI/uiElements/JFXEditGameDialog.java | 35 +-- .../com/cemu_UI/uiElements/JFXInfoAlert.java | 3 +- .../uiElements/JFXOkayCancelAlert.java | 127 +++++++++++ .../uiElements/JFXOkayCancelDialog.java | 140 ------------ .../uiElements/JFXTextAreaInfoDialog.java | 3 +- 11 files changed, 262 insertions(+), 315 deletions(-) create mode 100644 src/main/java/com/cemu_UI/uiElements/JFXOkayCancelAlert.java delete mode 100644 src/main/java/com/cemu_UI/uiElements/JFXOkayCancelDialog.java diff --git a/pom.xml b/pom.xml index 9d4e913..f085e5a 100644 --- a/pom.xml +++ b/pom.xml @@ -27,19 +27,19 @@ org.openjfx javafx-controls - 11.0.1 + 12 org.openjfx javafx-fxml - 11.0.1 + 12 org.openjfx javafx-media - 11.0.1 + 12 @@ -57,19 +57,19 @@ org.xerial sqlite-jdbc - 3.25.2 + 3.27.2.1 org.apache.logging.log4j log4j-api - 2.11.1 + 2.11.2 org.apache.logging.log4j log4j-core - 2.11.1 + 2.11.2 diff --git a/src/main/java/com/cemu_UI/application/Main.java b/src/main/java/com/cemu_UI/application/Main.java index d4d5294..4c42fb6 100644 --- a/src/main/java/com/cemu_UI/application/Main.java +++ b/src/main/java/com/cemu_UI/application/Main.java @@ -50,14 +50,15 @@ import javafx.scene.layout.AnchorPane; public class Main extends Application { + private final String gamesDBdownloadURL = "https://git.mosad.xyz/Seil0/cemu_UI/raw/branch/master/downloadContent/games.db"; private static Main main; - private Stage primaryStage; + private static XMLController xmlController; private MainWindowController mainWindowController; private CloudController cloudController; - private static XMLController xmlController; + private Stage primaryStage; private AnchorPane pane; private Scene scene; - private String gamesDBdownloadURL = "https://git.mosad.xyz/Seil0/cemu_UI/raw/branch/master/downloadContent/games.db"; + private static Logger LOGGER; @Override @@ -103,12 +104,12 @@ public class Main extends Application { // check if client_secret.json is present if (Main.class.getResourceAsStream("/client_secret.json") == null) { LOGGER.error("client_secret is missing!!!!!"); - + Alert alert = new Alert(AlertType.ERROR); - alert.setTitle("cemu_UI"); - alert.setHeaderText("Error"); - alert.setContentText("client_secret is missing! Please contact the maintainer. \nIf you compiled cemu_UI by yourself see: \nhttps://git.mosad.xyz/Seil0/cemu_UI/wiki/Documantation"); - alert.showAndWait(); + alert.setTitle("cemu_UI"); + alert.setHeaderText("Error"); + alert.setContentText("client_secret is missing! Please contact the maintainer. \nIf you compiled cemu_UI by yourself see: \nhttps://git.mosad.xyz/Seil0/cemu_UI/wiki/Documantation"); + alert.showAndWait(); } if (!XMLController.getDirCemuUI().exists()) { @@ -151,10 +152,8 @@ public class Main extends Application { // if cloud sync is activated start sync if (XMLController.isCloudSync()) { - cloudController.initializeConnection(XMLController.getCloudService(), - XMLController.getCemuPath()); - cloudController.sync(XMLController.getCloudService(), XMLController.getCemuPath(), - XMLController.getDirCemuUIPath()); + cloudController.initializeConnection(XMLController.getCloudService(), XMLController.getCemuPath()); + cloudController.sync(XMLController.getCloudService(), XMLController.getCemuPath(), XMLController.getDirCemuUIPath()); } } catch (IOException e) { @@ -190,8 +189,7 @@ public class Main extends Application { if (result.get() == ButtonType.OK) { DirectoryChooser directoryChooser = new DirectoryChooser(); File selectedDirectory = directoryChooser.showDialog(primaryStage); - XMLController.setCemuPath(selectedDirectory.getAbsolutePath()); - + XMLController.setCemuPath(selectedDirectory.getAbsolutePath()); } else { XMLController.setCemuPath(null); } diff --git a/src/main/java/com/cemu_UI/application/MainWindowController.java b/src/main/java/com/cemu_UI/application/MainWindowController.java index 96d415e..f7ed5ca 100644 --- a/src/main/java/com/cemu_UI/application/MainWindowController.java +++ b/src/main/java/com/cemu_UI/application/MainWindowController.java @@ -57,7 +57,7 @@ import com.cemu_UI.datatypes.SmmdbApiDataType; import com.cemu_UI.datatypes.UIROMDataType; import com.cemu_UI.uiElements.JFXEditGameDialog; import com.cemu_UI.uiElements.JFXInfoAlert; -import com.cemu_UI.uiElements.JFXOkayCancelDialog; +import com.cemu_UI.uiElements.JFXOkayCancelAlert; import com.cemu_UI.uiElements.JFXTextAreaInfoDialog; import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXColorPicker; @@ -183,9 +183,7 @@ public class MainWindowController { private XMLController xmlController; private Stage primaryStage; private boolean menuTrue = false; - private boolean settingsTrue = false; private boolean playTrue = false; - private boolean smmdbTrue = false; private String gameExecutePath; private String dialogBtnStyle; private String selectedGameTitleID; @@ -235,38 +233,11 @@ public class MainWindowController { // language support private ResourceBundle bundle; private String language; - private String editHeadingText; - private String editBodyText; - private String removeHeadingText; - private String removeBodyText; - private String addUpdateHeadingText; - private String addUpdateBodyText; - private String addDLCHeadingText; - private String addDLCBodyText; - private String licensesLblHeadingText; - private String licensesLblBodyText; - private String showLicenses; - private String aboutBtnHeadingText; - private String aboutBtnBodyText; - private String cloudSyncWaringHeadingText; - private String cloudSyncWaringBodyText; - private String cloudSyncErrorHeadingText; - private String cloudSyncErrorBodyText; - private String addGameBtnHeadingText; - private String addGameBtnBodyText; - private String addBtnReturnErrorHeadingText; - private String addBtnReturnErrorBodyText; private String lastPlayed; private String today; private String yesterday; private String never; - private String playBtnPlay; - private String playBtnUpdating; - private String playBtnCopyingFiles; - private String smmdbDownloadBtnLoading; - private String smmdbDownloadBtnDownload; - public MainWindowController(Main main) { xmlController = new XMLController(); this.main = main; @@ -353,6 +324,7 @@ public class MainWindowController { if (playTrue) { playBtnSlideOut(); } + if (menuTrue) { sideMenuSlideOut(); burgerTask.setRate(-1.0); @@ -364,16 +336,15 @@ public class MainWindowController { burgerTask.play(); menuTrue = true; } - if (settingsTrue) { + + if (settingsScrollPane.isVisible()) { settingsScrollPane.setVisible(false); xmlController.saveSettings(); - settingsTrue = false; - } - if (smmdbTrue) { - smmdbAnchorPane.setVisible(false); - smmdbTrue = false; } + if (smmdbAnchorPane.isVisible()) { + smmdbAnchorPane.setVisible(false); + } }); edit.setOnAction(new EventHandler() { @@ -384,8 +355,8 @@ public class MainWindowController { String[] gameInfo = dbController.getGameInfo(selectedGameTitleID); // new edit dialog - String headingText = editHeadingText + " \"" + selectedGameTitle + "\""; - JFXEditGameDialog editGameDialog = new JFXEditGameDialog(headingText, editBodyText, dialogBtnStyle, 450, + String headingText = bundle.getString("editHeadingText") + " \"" + selectedGameTitle + "\""; + JFXEditGameDialog editGameDialog = new JFXEditGameDialog(headingText, bundle.getString("editBodyText"), dialogBtnStyle, 450, 300, 1, MWC, primaryStage, main.getPane()); editGameDialog.setTitle(gameInfo[0]); editGameDialog.setCoverPath(gameInfo[1]); @@ -403,8 +374,8 @@ public class MainWindowController { public void handle(ActionEvent event) { try { LOGGER.info("remove " + selectedGameTitle + "(" + selectedGameTitleID + ")"); - String headingText = removeHeadingText + " \"" + selectedGameTitle + "\""; - String bodyText = removeBodyText + " " + selectedGameTitle + " ?"; + String headingText = bundle.getString("removeHeadingText") + " \"" + selectedGameTitle + "\""; + String bodyText = bundle.getString("removeBodyText") + " " + selectedGameTitle + " ?"; EventHandler okayAction = new EventHandler() { @Override public void handle(ActionEvent event) { @@ -424,10 +395,12 @@ public class MainWindowController { LOGGER.info("Action canceld by user!"); } }; - - JFXOkayCancelDialog removeGameDialog = new JFXOkayCancelDialog(headingText, bodyText, - dialogBtnStyle, 350, 170, okayAction, cancelAction, main.getPane(), bundle); - removeGameDialog.show(); + + JFXOkayCancelAlert removeGameAlert = new JFXOkayCancelAlert(headingText, + bodyText, dialogBtnStyle, primaryStage); + removeGameAlert.setOkayAction(okayAction); + removeGameAlert.setCancelAction(cancelAction); + removeGameAlert.showAndWait(); } catch (Exception e) { LOGGER.error("error while removing " + selectedGameTitle + "(" + selectedGameTitleID + ")", e); } @@ -439,7 +412,7 @@ public class MainWindowController { public void handle(ActionEvent event) { try { LOGGER.info("update: " + selectedGameTitleID); - String headingText = addUpdateHeadingText + " \"" + selectedGameTitle + "\""; + EventHandler okayAction = new EventHandler() { @Override public void handle(ActionEvent event) { @@ -457,10 +430,10 @@ public class MainWindowController { try { LOGGER.info("copying the content of " + updatePath + " to " + destDir.toString()); - playBtn.setText(playBtnUpdating); + playBtn.setText(bundle.getString("playBtnUpdating")); playBtn.setDisable(true); FileUtils.copyDirectory(srcDir, destDir); - playBtn.setText(playBtnPlay); + playBtn.setText(bundle.getString("playBtnPlay")); playBtn.setDisable(false); LOGGER.info("copying files done!"); } catch (IOException e) { @@ -476,9 +449,12 @@ public class MainWindowController { } }; - JFXOkayCancelDialog updateGameDialog = new JFXOkayCancelDialog(headingText, addUpdateBodyText, - dialogBtnStyle, 350, 170, okayAction, cancelAction, main.getPane(), bundle); - updateGameDialog.show(); + String headingText = bundle.getString("addUpdateHeadingText") + " \"" + selectedGameTitle + "\""; + JFXOkayCancelAlert updateGameAlert = new JFXOkayCancelAlert(headingText, + bundle.getString("addUpdateBodyText"), dialogBtnStyle, primaryStage); + updateGameAlert.setOkayAction(okayAction); + updateGameAlert.setCancelAction(cancelAction); + updateGameAlert.showAndWait(); } catch (Exception e) { LOGGER.warn("trying to update " + selectedGameTitleID + ",which is not a valid type!", e); } @@ -490,7 +466,7 @@ public class MainWindowController { public void handle(ActionEvent event) { try { LOGGER.info("add DLC: " + selectedGameTitleID); - String headingText = addDLCHeadingText + " \"" + selectedGameTitle + "\""; + String headingText = bundle.getString("addDLCHeadingText") + " \"" + selectedGameTitle + "\""; EventHandler okayAction = new EventHandler() { @Override public void handle(ActionEvent event) { @@ -508,10 +484,10 @@ public class MainWindowController { try { LOGGER.info("copying the content of " + dlcPath + " to " + destDir.toString()); - playBtn.setText(playBtnCopyingFiles); + playBtn.setText(bundle.getString("playBtnCopyingFiles")); playBtn.setDisable(true); FileUtils.copyDirectory(srcDir, destDir); - playBtn.setText(playBtnPlay); + playBtn.setText(bundle.getString("playBtnPlay")); playBtn.setDisable(false); LOGGER.info("copying files done!"); } catch (IOException e) { @@ -526,10 +502,12 @@ public class MainWindowController { LOGGER.info("Action canceld by user!"); } }; - - JFXOkayCancelDialog addDLCDialog = new JFXOkayCancelDialog(headingText, addDLCBodyText, dialogBtnStyle, - 350, 170, okayAction, cancelAction, main.getPane(), bundle); - addDLCDialog.show(); + + JFXOkayCancelAlert addDLCAlert = new JFXOkayCancelAlert(headingText, + bundle.getString("addDLCBodyText"), dialogBtnStyle, primaryStage); + addDLCAlert.setOkayAction(okayAction); + addDLCAlert.setCancelAction(cancelAction); + addDLCAlert.showAndWait(); } catch (Exception e) { LOGGER.warn("trying to add a dlc to " + selectedGameTitleID + ",which is not a valid type!", e); } @@ -562,9 +540,7 @@ public class MainWindowController { root.getChildren().remove(0, root.getChildren().size()); for (int i = 0; i < courses.size(); i++) { - if (courses.get(i).getTitle().toLowerCase() - .contains(courseSearchTextFiled.getText().toLowerCase())) { - + if (courses.get(i).getTitle().toLowerCase().contains(courseSearchTextFiled.getText().toLowerCase())) { // add data from courses to filteredCourses where title contains search input filteredCourses.add(courses.get(i)); } @@ -683,11 +659,13 @@ public class MainWindowController { } }; - JFXOkayCancelDialog licenseOverviewDialog = new JFXOkayCancelDialog(licensesLblHeadingText, - licensesLblBodyText, dialogBtnStyle, 350, 275, okayAction, cancelAction, main.getPane(), - bundle); - licenseOverviewDialog.setCancelText(showLicenses); - licenseOverviewDialog.show(); + JFXOkayCancelAlert licenseOverviewAlert = new JFXOkayCancelAlert( + bundle.getString("licensesLblHeadingText"), bundle.getString("licensesLblBodyText"), + dialogBtnStyle, primaryStage); + licenseOverviewAlert.setOkayAction(okayAction); + licenseOverviewAlert.setCancelAction(cancelAction); + licenseOverviewAlert.setCancelText(bundle.getString("showLicenses")); + licenseOverviewAlert.showAndWait(); } } }); @@ -734,26 +712,19 @@ public class MainWindowController { @FXML private void aboutBtnAction() { String bodyText = "cemu_UI by @Seil0 \nVersion: " + version + " (" + buildNumber + ") \"" + versionName + "\" \n" - + aboutBtnBodyText; + + bundle.getString("aboutBtnBodyText"); - JFXInfoAlert infoAlert = new JFXInfoAlert(aboutBtnHeadingText, bodyText, dialogBtnStyle, primaryStage); + JFXInfoAlert infoAlert = new JFXInfoAlert(bundle.getString("aboutBtnHeadingText"), bodyText, dialogBtnStyle, primaryStage); infoAlert.showAndWait(); } @FXML private void settingsBtnAction() { - if (smmdbTrue) { + if (smmdbAnchorPane.isVisible()) { smmdbAnchorPane.setVisible(false); - smmdbTrue = false; - } - if (settingsTrue) { - settingsScrollPane.setVisible(false); - settingsTrue = false; - xmlController.saveSettings(); - } else { - settingsScrollPane.setVisible(true); - settingsTrue = true; } + settingsScrollPane.setVisible(!settingsScrollPane.isVisible()); + xmlController.saveSettings(); // saving settings to be sure } @FXML @@ -764,19 +735,15 @@ public class MainWindowController { @FXML private void smmdbBtnAction() { // show smmdbAnchorPane - if (smmdbTrue) { - smmdbAnchorPane.setVisible(false); - smmdbTrue = false; - } else { - smmdbAnchorPane.setVisible(true); - smmdbTrue = true; - + smmdbAnchorPane.setVisible(!smmdbAnchorPane.isVisible()); + + if (smmdbAnchorPane.isVisible()) { // start query in new thread Thread thread = new Thread(new Runnable() { @Override public void run() { Platform.runLater(() -> { - smmdbDownloadBtn.setText(smmdbDownloadBtnLoading); + smmdbDownloadBtn.setText(bundle.getString("smmdbDownloadBtnLoading")); smmdbDownloadBtn.setDisable(true); root.getChildren().remove(0,root.getChildren().size()); }); @@ -790,7 +757,7 @@ public class MainWindowController { Platform.runLater(() -> { root.getChildren().add(new TreeItem(helpCourse)); // add data to root-node - smmdbDownloadBtn.setText(smmdbDownloadBtnDownload); + smmdbDownloadBtn.setText(bundle.getString("smmdbDownloadBtnDownload")); smmdbDownloadBtn.setDisable(false); }); } @@ -951,8 +918,9 @@ public class MainWindowController { cloudSyncToggleBtn.setSelected(false); // cloud sync init error dialog - JFXInfoAlert cloudSyncErrorDialog = new JFXInfoAlert(cloudSyncErrorHeadingText, - cloudSyncErrorBodyText, dialogBtnStyle, primaryStage); + JFXInfoAlert cloudSyncErrorDialog = new JFXInfoAlert( + bundle.getString("cloudSyncErrorHeadingText"), + bundle.getString("cloudSyncErrorBodyText"), dialogBtnStyle, primaryStage); cloudSyncErrorDialog.showAndWait(); } @@ -969,10 +937,12 @@ public class MainWindowController { } }; - JFXOkayCancelDialog cloudSyncWarningDialog = new JFXOkayCancelDialog(cloudSyncWaringHeadingText, - cloudSyncWaringBodyText, dialogBtnStyle, 419, 140, okayAction, cancelAction, main.getPane(), - bundle); - cloudSyncWarningDialog.show(); + JFXOkayCancelAlert cloudSyncWarningAlert = new JFXOkayCancelAlert( + bundle.getString("cloudSyncWaringHeadingText"), bundle.getString("cloudSyncWaringHeadingText"), + dialogBtnStyle, primaryStage); + cloudSyncWarningAlert.setOkayAction(okayAction); + cloudSyncWarningAlert.setCancelAction(cancelAction); + cloudSyncWarningAlert.showAndWait(); } } @@ -984,10 +954,9 @@ public class MainWindowController { @FXML private void addBtnAction() { - String headingText = addGameBtnHeadingText; - String bodyText = addGameBtnBodyText; - JFXEditGameDialog addGameDialog = new JFXEditGameDialog(headingText, bodyText, dialogBtnStyle, 450, 300, 0, - this, primaryStage, main.getPane()); + JFXEditGameDialog addGameDialog = new JFXEditGameDialog(bundle.getString("addGameBtnHeadingText"), + bundle.getString("addGameBtnBodyText"), dialogBtnStyle, 450, 300, 0, this, primaryStage, + main.getPane()); addGameDialog.show(); } @@ -1005,8 +974,8 @@ public class MainWindowController { LOGGER.info("No parameter set!"); //addGame error dialog - JFXInfoAlert errorDialog = new JFXInfoAlert(addBtnReturnErrorHeadingText, addBtnReturnErrorBodyText, - dialogBtnStyle, primaryStage); + JFXInfoAlert errorDialog = new JFXInfoAlert(bundle.getString("addBtnReturnErrorHeadingText"), + bundle.getString("addBtnReturnErrorBodyText"), dialogBtnStyle, primaryStage); errorDialog.showAndWait(); } else { @@ -1204,17 +1173,20 @@ public class MainWindowController { // set the selected local strings to all needed elements void setUILanguage(){ switch(XMLController.getUsrLocal()){ - case "en_US": - bundle = ResourceBundle.getBundle("locals.cemu_UI-Local", Locale.US); //us_English + case "en_US": + XMLController.setLocalBundle(ResourceBundle.getBundle("locals.cemu_UI-Local", Locale.US)); // us_English + bundle = ResourceBundle.getBundle("locals.cemu_UI-Local", Locale.US); // us_English languageChoisBox.getSelectionModel().select(0); break; - case "de_DE": - bundle = ResourceBundle.getBundle("locals.cemu_UI-Local", Locale.GERMAN); //German - languageChoisBox.getSelectionModel().select(1); + case "de_DE": + XMLController.setLocalBundle(ResourceBundle.getBundle("locals.cemu_UI-Local", Locale.GERMAN)); // German + bundle = ResourceBundle.getBundle("locals.cemu_UI-Local", Locale.GERMAN); // German + languageChoisBox.getSelectionModel().select(1); break; - default: - bundle = ResourceBundle.getBundle("locals.cemu_UI-Local", Locale.US); //default local - languageChoisBox.getSelectionModel().select(0); + default: + XMLController.setLocalBundle(ResourceBundle.getBundle("locals.cemu_UI-Local", Locale.US)); // default local + bundle = ResourceBundle.getBundle("locals.cemu_UI-Local", Locale.US); // default local + languageChoisBox.getSelectionModel().select(0); break; } @@ -1251,37 +1223,10 @@ public class MainWindowController { timeColumn.setText(bundle.getString("timeColumn")); // Strings - editHeadingText = bundle.getString("editHeadingText"); - editBodyText = bundle.getString("editBodyText"); - removeHeadingText = bundle.getString("removeHeadingText"); - removeBodyText = bundle.getString("removeBodyText"); - addUpdateHeadingText = bundle.getString("addUpdateHeadingText"); - addUpdateBodyText = bundle.getString("addUpdateBodyText"); - addDLCHeadingText = bundle.getString("addDLCHeadingText"); - addDLCBodyText = bundle.getString("addDLCBodyText"); - licensesLblHeadingText = bundle.getString("licensesLblHeadingText"); - licensesLblBodyText = bundle.getString("licensesLblBodyText"); - showLicenses = bundle.getString("showLicenses"); - aboutBtnHeadingText = bundle.getString("aboutBtnHeadingText"); - aboutBtnBodyText = bundle.getString("aboutBtnBodyText"); - cloudSyncWaringHeadingText = bundle.getString("cloudSyncWaringHeadingText"); - cloudSyncWaringBodyText = bundle.getString("cloudSyncWaringBodyText"); - cloudSyncErrorHeadingText = bundle.getString("cloudSyncErrorHeadingText"); - cloudSyncErrorBodyText = bundle.getString("cloudSyncErrorBodyText"); - addGameBtnHeadingText = bundle.getString("addGameBtnHeadingText"); - addGameBtnBodyText = bundle.getString("addGameBtnBodyText"); - addBtnReturnErrorHeadingText = bundle.getString("addBtnReturnErrorHeadingText"); - addBtnReturnErrorBodyText = bundle.getString("addBtnReturnErrorBodyText"); lastPlayed = bundle.getString("lastPlayed"); today = bundle.getString("today"); yesterday = bundle.getString("yesterday"); never = bundle.getString("never"); - - playBtnPlay = bundle.getString("playBtnPlay"); - playBtnUpdating = bundle.getString("playBtnUpdating"); - playBtnCopyingFiles = bundle.getString("playBtnCopyingFiles"); - smmdbDownloadBtnLoading = bundle.getString("smmdbDownloadBtnLoading"); - smmdbDownloadBtnDownload = bundle.getString("smmdbDownloadBtnDownload"); } // if AutoUpdate, then check for updates diff --git a/src/main/java/com/cemu_UI/application/playGame.java b/src/main/java/com/cemu_UI/application/playGame.java index 78ec3e6..8930493 100644 --- a/src/main/java/com/cemu_UI/application/playGame.java +++ b/src/main/java/com/cemu_UI/application/playGame.java @@ -31,7 +31,7 @@ import com.cemu_UI.controller.XMLController; import javafx.application.Platform; -public class playGame extends Thread{ +public class playGame extends Thread { private MainWindowController mainWindowController; private DBController dbController; diff --git a/src/main/java/com/cemu_UI/controller/UpdateController.java b/src/main/java/com/cemu_UI/controller/UpdateController.java index 4fa6929..074aa0e 100644 --- a/src/main/java/com/cemu_UI/controller/UpdateController.java +++ b/src/main/java/com/cemu_UI/controller/UpdateController.java @@ -39,6 +39,7 @@ import com.eclipsesource.json.Json; import com.eclipsesource.json.JsonArray; import com.eclipsesource.json.JsonObject; import com.eclipsesource.json.JsonValue; + import javafx.application.Platform; public class UpdateController implements Runnable { @@ -70,7 +71,7 @@ public class UpdateController implements Runnable { public void run() { LOGGER.info("beta:" + useBeta + "; checking for updates ..."); Platform.runLater(() -> { - mainWindowController.getUpdateBtn().setText(mainWindowController.getBundle().getString("updateBtnChecking")); + mainWindowController.getUpdateBtn().setText(XMLController.getLocalBundle().getString("updateBtnChecking")); }); try { @@ -111,12 +112,12 @@ public class UpdateController implements Runnable { */ if (buildNumber >= updateBuildNumber) { Platform.runLater(() -> { - mainWindowController.getUpdateBtn().setText(mainWindowController.getBundle().getString("updateBtnNoUpdateAvailable")); + mainWindowController.getUpdateBtn().setText(XMLController.getLocalBundle().getString("updateBtnNoUpdateAvailable")); }); LOGGER.info("no update available"); } else { Platform.runLater(() -> { - mainWindowController.getUpdateBtn().setText(mainWindowController.getBundle().getString("updateBtnUpdateAvailable")); + mainWindowController.getUpdateBtn().setText(XMLController.getLocalBundle().getString("updateBtnUpdateAvailable")); }); LOGGER.info("update available"); browserDownloadUrl = objectAsset.getString("browser_download_url", ""); diff --git a/src/main/java/com/cemu_UI/controller/XMLController.java b/src/main/java/com/cemu_UI/controller/XMLController.java index 8a1180b..210fcb6 100644 --- a/src/main/java/com/cemu_UI/controller/XMLController.java +++ b/src/main/java/com/cemu_UI/controller/XMLController.java @@ -26,7 +26,9 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.Locale; import java.util.Properties; +import java.util.ResourceBundle; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -57,6 +59,7 @@ public class XMLController { private static boolean useBeta = false; private static boolean fullscreen = false; private static boolean cloudSync = false; + private static ResourceBundle localBundle = ResourceBundle.getBundle("locals.cemu_UI-Local", Locale.US); private static String cemuPath; private static String romDirectoryPath; @@ -344,6 +347,14 @@ public class XMLController { public static void setCloudSync(boolean cloudSync) { XMLController.cloudSync = cloudSync; } + + public static ResourceBundle getLocalBundle() { + return localBundle; + } + + public static void setLocalBundle(ResourceBundle localBundle) { + XMLController.localBundle = localBundle; + } public static String getCemuPath() { return cemuPath; diff --git a/src/main/java/com/cemu_UI/uiElements/JFXEditGameDialog.java b/src/main/java/com/cemu_UI/uiElements/JFXEditGameDialog.java index 78ba990..8aef197 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-2018 <@Seil0> + * Copyright 2017-2019 <@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,11 +18,13 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ + package com.cemu_UI.uiElements; import java.io.File; import com.cemu_UI.application.MainWindowController; +import com.cemu_UI.controller.XMLController; import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXDialog; import com.jfoenix.controls.JFXDialogLayout; @@ -88,13 +90,13 @@ public class JFXEditGameDialog { JFXDialog dialog = new JFXDialog(stackPane, content, JFXDialog.DialogTransition.LEFT, true); TextField gameTitleTF = new TextField(); - gameTitleTF.setPromptText(mwc.getBundle().getString("gameTitle")); + gameTitleTF.setPromptText(XMLController.getLocalBundle().getString("gameTitle")); TextField gameTitleIDTF = new TextField(); - gameTitleIDTF.setPromptText(mwc.getBundle().getString("titleID")); + gameTitleIDTF.setPromptText(XMLController.getLocalBundle().getString("titleID")); TextField romPathTF = new TextField(); - romPathTF.setPromptText(mwc.getBundle().getString("romPath")); + romPathTF.setPromptText(XMLController.getLocalBundle().getString("romPath")); TextField gameCoverTF = new TextField(); - gameCoverTF.setPromptText(mwc.getBundle().getString("coverPath")); + gameCoverTF.setPromptText(XMLController.getLocalBundle().getString("coverPath")); if (mode == 1) { gameTitleTF.setText(title); @@ -105,7 +107,7 @@ public class JFXEditGameDialog { gameTitleIDTF.setEditable(false); } - JFXButton okayBtn = new JFXButton(mwc.getBundle().getString("okayBtnText")); + JFXButton okayBtn = new JFXButton(XMLController.getLocalBundle().getString("okayBtnText")); okayBtn.setOnAction(new EventHandler() { @Override public void handle(ActionEvent event) { @@ -115,9 +117,10 @@ public class JFXEditGameDialog { // LOGGER.info("No parameter set!"); // addGame error dialog - String headingTextError = mwc.getBundle().getString("editGameDialogHeadingTextError"); - String bodyTextError = mwc.getBundle().getString("editGameDialogBodyTextError"); - JFXInfoAlert errorDialog = new JFXInfoAlert(headingTextError, bodyTextError, dialogBtnStyle, stage); + JFXInfoAlert errorDialog = new JFXInfoAlert( + XMLController.getLocalBundle().getString("editGameDialogHeadingTextError"), + XMLController.getLocalBundle().getString("editGameDialogBodyTextError"), dialogBtnStyle, + stage); errorDialog.showAndWait(); } else { switch (mode) { @@ -144,7 +147,7 @@ public class JFXEditGameDialog { okayBtn.setPrefHeight(32); okayBtn.setStyle(dialogBtnStyle); - JFXButton cancelBtn = new JFXButton(mwc.getBundle().getString("cancelBtnText")); + JFXButton cancelBtn = new JFXButton(XMLController.getLocalBundle().getString("cancelBtnText")); cancelBtn.setOnAction(new EventHandler() { @Override public void handle(ActionEvent event) { @@ -155,7 +158,7 @@ public class JFXEditGameDialog { cancelBtn.setPrefHeight(32); cancelBtn.setStyle(dialogBtnStyle); - JFXButton selectPathBtn = new JFXButton(mwc.getBundle().getString("editGameDialogSelectPathBtn")); + JFXButton selectPathBtn = new JFXButton(XMLController.getLocalBundle().getString("editGameDialogSelectPathBtn")); selectPathBtn.setPrefWidth(110); selectPathBtn.setStyle(dialogBtnStyle); selectPathBtn.setOnAction(new EventHandler() { @@ -167,7 +170,7 @@ public class JFXEditGameDialog { } }); - JFXButton selectCoverBtn = new JFXButton(mwc.getBundle().getString("editGameDialogSelectCoverBtn")); + JFXButton selectCoverBtn = new JFXButton(XMLController.getLocalBundle().getString("editGameDialogSelectCoverBtn")); selectCoverBtn.setPrefWidth(110); selectCoverBtn.setStyle(dialogBtnStyle); selectCoverBtn.setOnAction(new EventHandler() { @@ -183,14 +186,14 @@ public class JFXEditGameDialog { grid.setHgap(10); grid.setVgap(10); grid.setPadding(new Insets(15, 10, 10, 10)); - grid.add(new Label(mwc.getBundle().getString("gameTitle") + ":"), 0, 0); + grid.add(new Label(XMLController.getLocalBundle().getString("gameTitle") + ":"), 0, 0); grid.add(gameTitleTF, 1, 0); - grid.add(new Label(mwc.getBundle().getString("titleID") + ":"), 0, 1); + grid.add(new Label(XMLController.getLocalBundle().getString("titleID") + ":"), 0, 1); grid.add(gameTitleIDTF, 1, 1); - grid.add(new Label(mwc.getBundle().getString("romPath") + ":"), 0, 2); + grid.add(new Label(XMLController.getLocalBundle().getString("romPath") + ":"), 0, 2); grid.add(romPathTF, 1, 2); grid.add(selectPathBtn, 2, 2); - grid.add(new Label(mwc.getBundle().getString("coverPath") + ":"), 0, 3); + grid.add(new Label(XMLController.getLocalBundle().getString("coverPath") + ":"), 0, 3); grid.add(gameCoverTF, 1, 3); grid.add(selectCoverBtn, 2, 3); diff --git a/src/main/java/com/cemu_UI/uiElements/JFXInfoAlert.java b/src/main/java/com/cemu_UI/uiElements/JFXInfoAlert.java index 04399aa..71b2b00 100644 --- a/src/main/java/com/cemu_UI/uiElements/JFXInfoAlert.java +++ b/src/main/java/com/cemu_UI/uiElements/JFXInfoAlert.java @@ -1,7 +1,7 @@ /** * Kellerkinder Framework Alerts * - * Copyright 2018 <@Seil0> + * Copyright 2017-2019 <@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,6 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ + package com.cemu_UI.uiElements; import com.jfoenix.controls.JFXAlert; diff --git a/src/main/java/com/cemu_UI/uiElements/JFXOkayCancelAlert.java b/src/main/java/com/cemu_UI/uiElements/JFXOkayCancelAlert.java new file mode 100644 index 0000000..cb90e58 --- /dev/null +++ b/src/main/java/com/cemu_UI/uiElements/JFXOkayCancelAlert.java @@ -0,0 +1,127 @@ +package com.cemu_UI.uiElements; + +import com.cemu_UI.controller.XMLController; +import com.jfoenix.controls.JFXAlert; +import com.jfoenix.controls.JFXButton; +import com.jfoenix.controls.JFXDialogLayout; + +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.scene.text.Text; +import javafx.stage.Stage; + +public class JFXOkayCancelAlert { + + private String headingText; + private String bodyText; + private String btnStyle; + private Stage stage; + + private EventHandler okayAction; + private EventHandler cancelAction; + + private String okayText = XMLController.getLocalBundle().getString("okayBtnText"); + private String cancelText = XMLController.getLocalBundle().getString("cancelBtnText"); + + public JFXOkayCancelAlert(String headingText, String bodyText, String btnStyle, Stage stage) { + setHeadingText(headingText); + setBodyText(bodyText); + setBtnStyle(btnStyle); + setStage(stage); + } + + public void showAndWait( ) { + JFXAlert alert = new JFXAlert<>(stage); + + JFXButton okayBtn = new JFXButton(okayText); + okayBtn.addEventHandler(ActionEvent.ACTION, (e)-> { + alert.close(); + }); + okayBtn.addEventHandler(ActionEvent.ACTION, okayAction); + okayBtn.setButtonType(com.jfoenix.controls.JFXButton.ButtonType.RAISED); + okayBtn.setPrefHeight(32); + okayBtn.setStyle(btnStyle); + + JFXButton cancelBtn = new JFXButton(cancelText); + cancelBtn.addEventHandler(ActionEvent.ACTION, (e)-> { + alert.close(); + }); + cancelBtn.addEventHandler(ActionEvent.ACTION, cancelAction); + cancelBtn.setButtonType(com.jfoenix.controls.JFXButton.ButtonType.RAISED); + cancelBtn.setPrefHeight(32); + cancelBtn.setStyle(btnStyle); + + + JFXDialogLayout content = new JFXDialogLayout(); + content.setActions(cancelBtn, okayBtn); + content.setHeading(new Text(headingText)); + content.setBody(new Text(bodyText)); + alert.setContent(content); + alert.showAndWait(); + } + + public String getHeadingText() { + return headingText; + } + + public void setHeadingText(String headingText) { + this.headingText = headingText; + } + + public String getBodyText() { + return bodyText; + } + + public void setBodyText(String bodyText) { + this.bodyText = bodyText; + } + + public String getBtnStyle() { + return btnStyle; + } + + public void setBtnStyle(String btnStyle) { + this.btnStyle = btnStyle; + } + + public String getOkayText() { + return okayText; + } + + public void setOkayText(String okayText) { + this.okayText = okayText; + } + + public String getCancelText() { + return cancelText; + } + + public void setCancelText(String cancelText) { + this.cancelText = cancelText; + } + + public Stage getStage() { + return stage; + } + + public void setStage(Stage stage) { + this.stage = stage; + } + + public EventHandler getOkayAction() { + return okayAction; + } + + public void setOkayAction(EventHandler okayAction) { + this.okayAction = okayAction; + } + + public EventHandler getCancelAction() { + return cancelAction; + } + + public void setCancelAction(EventHandler cancelAction) { + this.cancelAction = cancelAction; + } + +} diff --git a/src/main/java/com/cemu_UI/uiElements/JFXOkayCancelDialog.java b/src/main/java/com/cemu_UI/uiElements/JFXOkayCancelDialog.java deleted file mode 100644 index 47d2ff8..0000000 --- a/src/main/java/com/cemu_UI/uiElements/JFXOkayCancelDialog.java +++ /dev/null @@ -1,140 +0,0 @@ -/** - * cemu_UI - * - * 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 - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301, USA. - */ -package com.cemu_UI.uiElements; - -import java.util.ResourceBundle; - -import com.jfoenix.controls.JFXButton; -import com.jfoenix.controls.JFXDialog; -import com.jfoenix.controls.JFXDialogLayout; - -import javafx.event.ActionEvent; -import javafx.event.EventHandler; -import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.Pane; -import javafx.scene.layout.StackPane; -import javafx.scene.text.Text; - -public class JFXOkayCancelDialog { - - private String headingText; - private String bodyText; - private String dialogBtnStyle; - private String okayText; - private String cancelText; - private int dialogWidth; - private int dialogHeight; - private EventHandler okayAction; - private EventHandler cancelAction; - private Pane pane; - - /** - * Creates a new JFoenix Dialog to show some information with okay and cancel option - * @param headingText Heading Text, just the heading - * @param bodyText body Text, all other text belongs here - * @param dialogBtnStyle Style of the okay button - * @param dialogWidth dialog width - * @param dialogHeight dialog height - * @param okayAction action which is performed if the okay button is clicked - * @param cancelAction action which is performed if the cancel button is clicked - * @param pane pane to which the dialog belongs - */ - public JFXOkayCancelDialog(String headingText, String bodyText, String dialogBtnStyle, int dialogWidth, - int dialogHeight, EventHandler okayAction, EventHandler cancelAction, Pane pane, - ResourceBundle bundle) { - this.headingText = headingText; - this.bodyText = bodyText; - this.dialogBtnStyle = dialogBtnStyle; - this.dialogWidth = dialogWidth; - this.dialogHeight = dialogHeight; - this.okayAction = okayAction; - this.cancelAction = cancelAction; - this.pane = pane; - okayText = bundle.getString("okayBtnText"); - cancelText = bundle.getString("cancelBtnText"); - } - - public void show() { - - JFXDialogLayout content = new JFXDialogLayout(); - content.setHeading(new Text(headingText)); - content.setBody(new Text(bodyText)); - StackPane stackPane = new StackPane(); - stackPane.autosize(); - JFXDialog dialog = new JFXDialog(stackPane, content, JFXDialog.DialogTransition.LEFT, true); - JFXButton okayBtn = new JFXButton(okayText); - okayBtn.addEventHandler(ActionEvent.ACTION, (e)-> { - dialog.close(); - }); - okayBtn.addEventHandler(ActionEvent.ACTION, okayAction); - okayBtn.setButtonType(com.jfoenix.controls.JFXButton.ButtonType.RAISED); - okayBtn.setPrefHeight(32); - okayBtn.setStyle(dialogBtnStyle); - JFXButton cancelBtn = new JFXButton(cancelText); - cancelBtn.addEventHandler(ActionEvent.ACTION, (e)-> { - dialog.close(); - }); - cancelBtn.addEventHandler(ActionEvent.ACTION, cancelAction); - cancelBtn.setButtonType(com.jfoenix.controls.JFXButton.ButtonType.RAISED); - cancelBtn.setPrefHeight(32); - cancelBtn.setStyle(dialogBtnStyle); - content.setActions(cancelBtn, okayBtn); - content.setPrefSize(dialogWidth, dialogHeight); - pane.getChildren().add(stackPane); - AnchorPane.setTopAnchor(stackPane, (pane.getHeight()-content.getPrefHeight())/2); - AnchorPane.setLeftAnchor(stackPane, (pane.getWidth()-content.getPrefWidth())/2); - dialog.show(); - } - - public String getOkayText() { - return okayText; - } - - public void setOkayText(String okayText) { - this.okayText = okayText; - } - - public String getCancelText() { - return cancelText; - } - - public void setCancelText(String cancelText) { - this.cancelText = cancelText; - } - - public EventHandler getOkayAction() { - return okayAction; - } - - public void setOkayAction(EventHandler okayAction) { - this.okayAction = okayAction; - } - - public EventHandler getCancelAction() { - return cancelAction; - } - - public void setCancelAction(EventHandler cancelAction) { - this.cancelAction = cancelAction; - } - -} - diff --git a/src/main/java/com/cemu_UI/uiElements/JFXTextAreaInfoDialog.java b/src/main/java/com/cemu_UI/uiElements/JFXTextAreaInfoDialog.java index 2831162..4e191da 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-2018 <@Seil0> + * Copyright 2017-2019 <@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,6 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ + package com.cemu_UI.uiElements; import com.jfoenix.controls.JFXButton; From 05999450366a40b15d35816d98f7359d33e06cec Mon Sep 17 00:00:00 2001 From: Seil0 Date: Wed, 15 May 2019 16:19:31 +0200 Subject: [PATCH 09/19] clean up some mwc code + UIROMDataType it should be now much better to understand the generatePosition() method --- .../java/com/cemu_UI/application/Main.java | 4 +- .../application/MainWindowController.java | 84 +++------- .../com/cemu_UI/datatypes/UIROMDataType.java | 148 +++++++----------- 3 files changed, 81 insertions(+), 155 deletions(-) diff --git a/src/main/java/com/cemu_UI/application/Main.java b/src/main/java/com/cemu_UI/application/Main.java index 4c42fb6..cf5db89 100644 --- a/src/main/java/com/cemu_UI/application/Main.java +++ b/src/main/java/com/cemu_UI/application/Main.java @@ -218,10 +218,10 @@ public class Main extends Application { @Override public void changed(ObservableValue observable, Number oldValue, final Number newValue) { - int xPosHelperMax = (int) Math.floor((mainWindowController.getMainAnchorPane().getWidth() - 36) / 217); + int xMaxElements = (int) Math.floor((mainWindowController.getMainAnchorPane().getWidth() - 36) / 217); // call only if there is enough space for a new row - if (mainWindowController.getOldXPosHelper() != xPosHelperMax) { + if (mainWindowController.getOldXNextElement() != xMaxElements) { mainWindowController.refreshUIData(); } diff --git a/src/main/java/com/cemu_UI/application/MainWindowController.java b/src/main/java/com/cemu_UI/application/MainWindowController.java index f7ed5ca..cd52ced 100644 --- a/src/main/java/com/cemu_UI/application/MainWindowController.java +++ b/src/main/java/com/cemu_UI/application/MainWindowController.java @@ -78,7 +78,6 @@ import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.fxml.FXML; -import javafx.geometry.Insets; import javafx.scene.control.ChoiceBox; import javafx.scene.control.ContextMenu; import javafx.scene.control.Label; @@ -194,8 +193,8 @@ public class MainWindowController { private String versionName = "Purple Comet"; private int xPos = -200; private int yPos = 17; - private int xPosHelper = 0; - private int oldXPosHelper; + private int xNextElement = 0; + private int oldXNextElement; private int selectedUIDataIndex; private int selected; private DirectoryChooser directoryChooser = new DirectoryChooser(); @@ -1024,29 +1023,14 @@ public class MainWindowController { * @param titleID : game ID */ public void addGame(String title, String coverPath, String romPath, String titleID){ - VBox VBox = new VBox(); - Label gameTitleLabel = new Label(); - JFXButton gameBtn = new JFXButton(); - ImageView imageView = new ImageView(); Image coverImage = new Image(new File(coverPath).toURI().toString()); + UIROMDataType uiROMElement = new UIROMDataType(); generatePosition(); - - UIROMDataType uiROMElement = new UIROMDataType(VBox, gameTitleLabel, gameBtn, imageView, titleID, romPath); uiROMElement.getLabel().setText(title); - uiROMElement.getLabel().setMaxWidth(200); - uiROMElement.getLabel().setPadding(new Insets(0,0,0,8)); - uiROMElement.getLabel().setFont(Font.font("System", FontWeight.BOLD, 14)); - - // i think we can do this locally and remove the imageView from the data type since it's used as graphic uiROMElement.getImageView().setImage(coverImage); - uiROMElement.getImageView().setFitHeight(300); - uiROMElement.getImageView().setFitWidth(200); - - uiROMElement.getButton().setGraphic(uiROMElement.getImageView()); uiROMElement.getButton().setContextMenu(gameContextMenu); - uiROMElement.getButton().setStyle("-fx-effect: dropshadow(three-pass-box, rgba(0,0,0,0.8), 10, 0, 0, 3); "); uiROMElement.getButton().addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler() { @Override public void handle(MouseEvent event) { @@ -1112,10 +1096,6 @@ public class MainWindowController { } }); - uiROMElement.getVBox().setLayoutX(getxPos()); - uiROMElement.getVBox().setLayoutY(getyPos()); - uiROMElement.getVBox().getChildren().addAll(gameTitleLabel,gameBtn); - // add uiROMElement to games list games.add(uiROMElement); } @@ -1154,20 +1134,21 @@ public class MainWindowController { //remove all games from gamesAnchorPane and add them afterwards public void refreshUIData() { //remove all games form gamesAnchorPane - gamesAnchorPane.getChildren().removeAll(gamesAnchorPane.getChildren()); + gamesAnchorPane.getChildren().clear(); //reset position xPos = -200; yPos = 17; - xPosHelper = 0; + xNextElement = 0; //add all games to gamesAnchorPane (UI) - for(int i=0; i< games.size(); i++){ - generatePosition(); - games.get(i).getVBox().setLayoutX(getxPos()); - games.get(i).getVBox().setLayoutY(getyPos()); - gamesAnchorPane.getChildren().add(games.get(i).getVBox()); - } + for(UIROMDataType game : games) { + generatePosition(); + + game.setLayoutX(xPos); + game.setLayoutY(yPos); + gamesAnchorPane.getChildren().add(game); + } } // set the selected local strings to all needed elements @@ -1367,20 +1348,21 @@ public class MainWindowController { } /** - * xPosHelper based on window width = -24(Windows)/-36(Linux) + * xMaxElements based on window width -36 * calculates how many games can be displayed in one row */ private void generatePosition() { - int xPosHelperMax = (int) Math.floor((mainAnchorPane.getWidth() - 36) / 217); + int xMaxElements = (int) Math.floor((mainAnchorPane.getWidth() - 36) / 217); + System.out.println(xMaxElements); - if(xPosHelper == xPosHelperMax){ - oldXPosHelper = xPosHelper; + if(xNextElement >= xMaxElements){ + oldXNextElement = xNextElement; xPos = 17; yPos = yPos + 345; - xPosHelper = 1; + xNextElement = 1; }else{ xPos = xPos + 217; - xPosHelper++; + xNextElement++; } } @@ -1536,30 +1518,6 @@ public class MainWindowController { return primaryStage; } - 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 String getGameExecutePath() { return gameExecutePath; } @@ -1584,8 +1542,8 @@ public class MainWindowController { this.playBtn = playBtn; } - public int getOldXPosHelper() { - return oldXPosHelper; + public int getOldXNextElement() { + return oldXNextElement; } public String getLanguage() { diff --git a/src/main/java/com/cemu_UI/datatypes/UIROMDataType.java b/src/main/java/com/cemu_UI/datatypes/UIROMDataType.java index 2a66c6e..85f762f 100644 --- a/src/main/java/com/cemu_UI/datatypes/UIROMDataType.java +++ b/src/main/java/com/cemu_UI/datatypes/UIROMDataType.java @@ -22,105 +22,73 @@ package com.cemu_UI.datatypes; import com.jfoenix.controls.JFXButton; -import javafx.beans.property.SimpleObjectProperty; -import javafx.beans.property.SimpleStringProperty; -import javafx.beans.property.StringProperty; +import javafx.geometry.Insets; import javafx.scene.control.Label; import javafx.scene.image.ImageView; import javafx.scene.layout.VBox; +import javafx.scene.text.Font; +import javafx.scene.text.FontWeight; -public class UIROMDataType { +public class UIROMDataType extends VBox { + + private String titleID; + private String romPath; + private Label label = new Label(); + private JFXButton button = new JFXButton(); + private ImageView imageView = new ImageView(); + + public UIROMDataType() { + super.getChildren().addAll(label, button); + + label.setMaxWidth(200); + label.setPadding(new Insets(0,0,0,8)); + label.setFont(Font.font("System", FontWeight.BOLD, 14)); + + imageView.setFitHeight(300); + imageView.setFitWidth(200); + + button.setStyle("-fx-effect: dropshadow(three-pass-box, rgba(0,0,0,0.8), 10, 0, 0, 3); "); + button.setGraphic(imageView); + } - private final SimpleObjectProperty vBox = new SimpleObjectProperty<>(); - private final SimpleObjectProperty