Compare commits
16 Commits
Author | SHA1 | Date | |
---|---|---|---|
959963f9bc | |||
85fc66e8d6 | |||
6c1663f386 | |||
71cf0316ec | |||
dec767f553 | |||
a24783f18c | |||
9f0956a674 | |||
dbd52cbe9c | |||
4c8a0a51e9 | |||
7a2112a759 | |||
9930a4cb15 | |||
d36b869e80 | |||
43a7e22254 | |||
07d33df63a | |||
e394b1a573 | |||
a30def1fd0 |
@ -16,11 +16,14 @@
|
||||
<classpathentry kind="lib" path="src/libraries/google_apis/jetty-util-6.1.25.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/google_apis/jackson-core-2.8.8.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/commons-codec-1.10.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/jfoenix-1.4.0.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/sqlite-jdbc-3.18.0.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/minimal-json-0.9.4.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/junrar-0.7.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/commons-logging-api-1.1.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/commons-vfs2-2.1.1744488.2.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/flow-8.0.1.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/zip4j-1.3.2.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/log4j-api-2.8.2.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/log4j-core-2.8.2.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/jfoenix-1.8.0.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/sqlite-jdbc-3.20.0.jar"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
cemu_UI is a simple, material design graphical frontend for [cemu](http://cemu.info/), a Wii U emulator. Downloads can be found [here](https://github.com/Seil0/cemu_UI/releases).
|
||||
|
||||
## installation
|
||||
## Installation
|
||||
Simply download the cemu_UI.jar from [releases](https://github.com/Seil0/cemu_UI/releases), make sure you have the latest version of java 8 oracle jre/jdk installed, open the file. cemu_UI creats a new directory "C:\Users\USERNAME\Documents\cemu_UI", where the database, settings and covers are stored. **first start can take while!**
|
||||
|
||||
If you want to use the cloud sync function read the [wiki](https://github.com/Seil0/cemu_UI/wiki#cloud-savegame-syncronisation) carefully!
|
||||
@ -22,13 +22,13 @@ If you want to use the cloud sync function read the [wiki](https://github.com/Se
|
||||
* automatic rom detection (only .rpx files with a app.xml)
|
||||
* customisable UI
|
||||
* [sync savegames via google drive](https://github.com/Seil0/cemu_UI/wiki)
|
||||
* [smmdb api](http://smmdb.ddns.net/api) integration
|
||||
|
||||
## [planed Features](https://github.com/Seil0/cemu_UI/projects/1) (no ETA)
|
||||
|
||||
* Controller support
|
||||
* more UI improvements
|
||||
* support more rom file formats in automatic detection
|
||||
* [smmdb api](http://smmdb.ddns.net/api) integration
|
||||
|
||||
### If you have another idea, make a "new issue" with the `idea` lable
|
||||
|
||||
@ -41,7 +41,7 @@ If you want to use the cloud sync function read the [wiki](https://github.com/Se
|
||||
* I have another question
|
||||
* make a new issue and let me know
|
||||
|
||||
## screenshots
|
||||
## Screenshots
|
||||
|
||||

|
||||
|
||||
|
2
bin/.gitignore
vendored
2
bin/.gitignore
vendored
@ -1 +1,3 @@
|
||||
/application/
|
||||
/resources/
|
||||
/cloudControllerInstances/
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -110,7 +110,7 @@
|
||||
<Font name="System Bold" size="14.0" />
|
||||
</font>
|
||||
</JFXButton>
|
||||
<JFXButton fx:id="timePlayedBtn" buttonType="RAISED" maxHeight="32.0" minWidth="100.0" onAction="#timePlayedBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.rightAnchor="516.5" AnchorPane.topAnchor="558.0">
|
||||
<JFXButton fx:id="totalPlaytimeBtn" buttonType="RAISED" maxHeight="32.0" minWidth="100.0" onAction="#totalPlaytimeBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.rightAnchor="516.5" AnchorPane.topAnchor="558.0">
|
||||
</JFXButton>
|
||||
<JFXButton fx:id="lastTimePlayedBtn" buttonType="RAISED" maxHeight="32.0" minWidth="100.0" onAction="#lastTimePlayedBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="516.5" AnchorPane.topAnchor="558.0" />
|
||||
</children>
|
||||
|
Binary file not shown.
BIN
bin/application/MainWindowController$10.class
Normal file
BIN
bin/application/MainWindowController$10.class
Normal file
Binary file not shown.
BIN
bin/application/MainWindowController$11.class
Normal file
BIN
bin/application/MainWindowController$11.class
Normal file
Binary file not shown.
BIN
bin/application/MainWindowController$12.class
Normal file
BIN
bin/application/MainWindowController$12.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
bin/application/MainWindowController$8.class
Normal file
BIN
bin/application/MainWindowController$8.class
Normal file
Binary file not shown.
BIN
bin/application/MainWindowController$9.class
Normal file
BIN
bin/application/MainWindowController$9.class
Normal file
Binary file not shown.
Binary file not shown.
@ -17,7 +17,7 @@
|
||||
*/
|
||||
|
||||
.tree-table-view {
|
||||
-fx-tree-table-color: rgba(0, 168, 204, 0.2);
|
||||
-fx-tree-table-color: rgba(0, 168, 204, 0.2);
|
||||
-fx-tree-table-rippler-color: rgba(0, 168, 204, 0.4);
|
||||
}
|
||||
|
||||
@ -32,7 +32,7 @@
|
||||
}
|
||||
|
||||
.tree-table-view .jfx-rippler {
|
||||
-jfx-rippler-fill: -fx-tree-table-rippler-color;
|
||||
-jfx-rippler-fill: -fx-tree-table-rippler-color;
|
||||
}
|
||||
|
||||
.tree-table-view .column-header,
|
||||
|
BIN
bin/application/SmmdbApiQuery.class
Normal file
BIN
bin/application/SmmdbApiQuery.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
bin/libraries/flow-8.0.1.jar
Normal file
BIN
bin/libraries/flow-8.0.1.jar
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
bin/libraries/log4j-api-2.8.2.jar
Normal file
BIN
bin/libraries/log4j-api-2.8.2.jar
Normal file
Binary file not shown.
BIN
bin/libraries/log4j-core-2.8.2.jar
Normal file
BIN
bin/libraries/log4j-core-2.8.2.jar
Normal file
Binary file not shown.
Binary file not shown.
BIN
bin/libraries/sqlite-jdbc-3.20.0.jar
Normal file
BIN
bin/libraries/sqlite-jdbc-3.20.0.jar
Normal file
Binary file not shown.
BIN
bin/libraries/zip4j-1.3.2.jar
Normal file
BIN
bin/libraries/zip4j-1.3.2.jar
Normal file
Binary file not shown.
20
bin/log4j2.xml
Normal file
20
bin/log4j2.xml
Normal file
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Configuration status="INFO">
|
||||
<Appenders>
|
||||
|
||||
<Console name="console" target="SYSTEM_OUT">
|
||||
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] %c{1} - %msg%n" />
|
||||
</Console>
|
||||
|
||||
<File name="file" fileName="${sys:logFilename}" immediateFlush="true">
|
||||
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] %c{1} - %msg%n" />
|
||||
</File>
|
||||
|
||||
</Appenders>
|
||||
<Loggers>
|
||||
<Root level="debug" additivity="false">
|
||||
<AppenderRef ref="console" />
|
||||
<AppenderRef ref="file"/>
|
||||
</Root>
|
||||
</Loggers>
|
||||
</Configuration>
|
@ -16,6 +16,9 @@ package application;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import cloudControllerInstances.GoogleDriveController;
|
||||
import javafx.application.Platform;
|
||||
|
||||
@ -27,33 +30,35 @@ public class CloudController {
|
||||
|
||||
private Main main;
|
||||
private GoogleDriveController googleDriveController = new GoogleDriveController();
|
||||
private static final Logger LOGGER = LogManager.getLogger(CloudController.class.getName());
|
||||
|
||||
void initializeConnection(String cloudService, String cemuDirectory) {
|
||||
System.out.println("sartting cloud initialisation... ");
|
||||
LOGGER.info("sartting cloud initialisation ...");
|
||||
if(cloudService.equals("GoogleDrive")) {
|
||||
System.out.println("selected service is Google Drive");
|
||||
LOGGER.info("selected service is Google Drive");
|
||||
try {
|
||||
googleDriveController.main(cemuDirectory);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
LOGGER.error("error while initialize connection", e);
|
||||
}
|
||||
}
|
||||
if(cloudService.equals("Dropbox")) {
|
||||
System.out.println("selected service is Dropbox");
|
||||
LOGGER.info("selected service is Dropbox");
|
||||
}
|
||||
System.out.println("cloud initialisation done!");
|
||||
LOGGER.info("cloud initialisation done!");
|
||||
}
|
||||
|
||||
void stratupCheck(String cloudService, String cemuDirectory) {
|
||||
if(cloudService.equals("GoogleDrive")) {
|
||||
System.out.println("starting startup check google drive...");
|
||||
LOGGER.info("starting startup check google drive ...");
|
||||
try {
|
||||
if (!googleDriveController.checkFolder()) {
|
||||
googleDriveController.creatFolder();
|
||||
main.mainWindowController.saveSettings();
|
||||
|
||||
Thread thread = new Thread(new Runnable() {
|
||||
public void run() {
|
||||
@Override
|
||||
public void run() {
|
||||
Platform.runLater(() -> {
|
||||
main.mainWindowController.getPlayBtn().setText("syncing...");
|
||||
});
|
||||
@ -68,7 +73,7 @@ public class CloudController {
|
||||
sync(cloudService, cemuDirectory);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
LOGGER.error("google drive startup check failed", e);
|
||||
}
|
||||
}
|
||||
if(cloudService.equals("Dropbox")) {
|
||||
@ -82,17 +87,18 @@ public class CloudController {
|
||||
|
||||
//running sync in a new thread, instead of blocking the main thread
|
||||
Thread thread = new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Platform.runLater(() -> {
|
||||
main.mainWindowController.getPlayBtn().setText("syncing...");
|
||||
});
|
||||
System.out.println("starting sync in new thread...");
|
||||
LOGGER.info("starting synchronization in new thread ...");
|
||||
|
||||
if(cloudService.equals("GoogleDrive")) {
|
||||
try {
|
||||
googleDriveController.sync(cemuDirectory);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
LOGGER.error("google drive synchronization failed", e);
|
||||
}
|
||||
}
|
||||
if(cloudService.equals("Dropbox")) {
|
||||
@ -102,7 +108,7 @@ public class CloudController {
|
||||
main.mainWindowController.getPlayBtn().setText("play");
|
||||
});
|
||||
main.mainWindowController.saveSettings();
|
||||
System.out.println("sync finished!");
|
||||
LOGGER.info("synchronization successful!");
|
||||
}
|
||||
});
|
||||
thread.start();
|
||||
@ -113,14 +119,15 @@ public class CloudController {
|
||||
|
||||
//running uploadFile in a new thread, instead of blocking the main thread
|
||||
new Thread() {
|
||||
public void run() {
|
||||
System.out.println("starting uploadFile in new thread...");
|
||||
@Override
|
||||
public void run() {
|
||||
LOGGER.info("starting uploadFile in new thread ...");
|
||||
|
||||
if(cloudService.equals("GoogleDrive")) {
|
||||
try {
|
||||
googleDriveController.uploadFile(file);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
LOGGER.error("google drive uploadFile failed" ,e);
|
||||
}
|
||||
}
|
||||
if(cloudService.equals("Dropbox")) {
|
||||
@ -133,21 +140,25 @@ public class CloudController {
|
||||
|
||||
public String getFolderID(String cloudService) {
|
||||
String folderID = "";
|
||||
if(cloudService.equals("GoogleDrive")) {
|
||||
folderID = googleDriveController.getFolderID();
|
||||
}
|
||||
if(cloudService.equals("Dropbox")) {
|
||||
|
||||
if (cloudService != null) {
|
||||
if(cloudService.equals("GoogleDrive")) {
|
||||
folderID = googleDriveController.getFolderID();
|
||||
}
|
||||
if(cloudService.equals("Dropbox")) {
|
||||
|
||||
}
|
||||
}
|
||||
return folderID;
|
||||
}
|
||||
|
||||
public void setFolderID(String folderID, String cloudService) {
|
||||
if(cloudService.equals("GoogleDrive")) {
|
||||
googleDriveController.setFolderID(folderID);
|
||||
}
|
||||
if(cloudService.equals("Dropbox")) {
|
||||
|
||||
if (cloudService != null) {
|
||||
if (cloudService.equals("GoogleDrive")) {
|
||||
googleDriveController.setFolderID(folderID);
|
||||
}
|
||||
if (cloudService.equals("Dropbox")) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -21,6 +21,8 @@ import java.nio.channels.Channels;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
import java.util.Optional;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import javafx.application.Application;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.stage.DirectoryChooser;
|
||||
@ -37,8 +39,10 @@ public class Main extends Application {
|
||||
Stage primaryStage;
|
||||
public MainWindowController mainWindowController; //TODO find a better way
|
||||
CloudController cloudController;
|
||||
private String dirWin = System.getProperty("user.home") + "/Documents/cemu_UI"; //Windows: C:/Users/"User"/Documents/HomeFlix
|
||||
private String dirLinux = System.getProperty("user.home") + "/cemu_UI"; //Linux: /home/"User"/HomeFlix
|
||||
AnchorPane pane;
|
||||
private Scene scene;
|
||||
private String dirWin = System.getProperty("user.home") + "/Documents/cemu_UI"; //Windows: C:/Users/"User"/Documents/cemu_UI
|
||||
private String dirLinux = System.getProperty("user.home") + "/cemu_UI"; //Linux: /home/"User"/cemu_UI
|
||||
private String gamesDBdownloadURL = "https://github.com/Seil0/cemu_UI/raw/master/downloadContent/games.db";
|
||||
private File directory;
|
||||
private File configFile;
|
||||
@ -46,7 +50,7 @@ public class Main extends Application {
|
||||
@SuppressWarnings("unused")
|
||||
private File localDB;
|
||||
private File pictureCache;
|
||||
|
||||
private static Logger LOGGER;
|
||||
|
||||
@Override
|
||||
public void start(Stage primaryStage) {
|
||||
@ -58,7 +62,7 @@ public class Main extends Application {
|
||||
private void mainWindow(){
|
||||
try {
|
||||
FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindow.fxml"));
|
||||
AnchorPane pane = loader.load();
|
||||
pane = loader.load();
|
||||
primaryStage.setResizable(false);
|
||||
primaryStage.setTitle("cemu_UI");
|
||||
// primaryStage.getIcons().add(new Image(Main.class.getResourceAsStream("/resources/Homeflix_Icon_64x64.png"))); //adds application icon
|
||||
@ -73,31 +77,44 @@ public class Main extends Application {
|
||||
gamesDBFile = new File(dirLinux + "/games.db");
|
||||
localDB = new File(dirLinux+"/localRoms.db");
|
||||
pictureCache= new File(dirLinux+"/picture_cache");
|
||||
pane.setPrefWidth(904); //this could be a kde plasma specific issue
|
||||
}else{
|
||||
directory = new File(dirWin);
|
||||
directory = new File(dirWin);
|
||||
configFile = new File(dirWin + "/config.xml");
|
||||
gamesDBFile = new File(dirWin + "/games.db");
|
||||
localDB = new File(dirWin+"/localRoms.db");
|
||||
pictureCache= new File(dirWin+"/picture_cache");
|
||||
pane.setPrefWidth(892);
|
||||
}
|
||||
|
||||
//startup checks
|
||||
System.out.println("Directory: " + directory.exists());
|
||||
System.out.println("configfile: " + configFile.exists());
|
||||
if(directory.exists() != true){
|
||||
System.out.println("mkdir all");
|
||||
//check if client_secret.jason is present
|
||||
if (Main.class.getResourceAsStream("/resources/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://github.com/Seil0/cemu_UI/wiki/Documantation");
|
||||
alert.showAndWait();
|
||||
}
|
||||
|
||||
LOGGER.info("Directory: " + directory.exists());
|
||||
LOGGER.info("Configfile: " + configFile.exists());
|
||||
if(!directory.exists()){
|
||||
LOGGER.info("creating cemu_UI directory");
|
||||
directory.mkdir();
|
||||
pictureCache.mkdir();
|
||||
}
|
||||
|
||||
if(configFile.exists() != true){
|
||||
System.out.println("firststart");
|
||||
if(!configFile.exists()){
|
||||
LOGGER.info("firststart, setting default values");
|
||||
firstStart();
|
||||
mainWindowController.setColor("00a8cc");
|
||||
mainWindowController.setxPosHelper(0);
|
||||
mainWindowController.saveSettings();
|
||||
Runtime.getRuntime().exec("java -jar cemu_UI.jar"); //start again (preventing Bugs)
|
||||
System.exit(0); //finishes itself
|
||||
System.exit(0); //finishes itselfdownloading games.db...
|
||||
}
|
||||
|
||||
if(pictureCache.exists() != true){
|
||||
@ -106,13 +123,13 @@ public class Main extends Application {
|
||||
|
||||
if(gamesDBFile.exists() != true){
|
||||
try {
|
||||
System.out.print("downloading games.db... ");
|
||||
LOGGER.info("downloading games.db... ");
|
||||
URL website = new URL(gamesDBdownloadURL);
|
||||
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
|
||||
FileOutputStream fos = new FileOutputStream(gamesDBFile);
|
||||
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
|
||||
fos.close();
|
||||
System.out.println("done!");
|
||||
LOGGER.info("finished downloading games.db");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@ -129,7 +146,7 @@ public class Main extends Application {
|
||||
mainWindowController.initActions();
|
||||
mainWindowController.initUI();
|
||||
|
||||
Scene scene = new Scene(pane); //create new scene, append pane to scene
|
||||
scene = new Scene(pane); //create new scene, append pane to scene
|
||||
scene.getStylesheets().add(Main.class.getResource("MainWindows.css").toExternalForm());
|
||||
primaryStage.setScene(scene); //append scene to stage
|
||||
primaryStage.show(); //show stage
|
||||
@ -171,6 +188,17 @@ public class Main extends Application {
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
//delete old log file and create new
|
||||
if(System.getProperty("os.name").equals("Linux")){
|
||||
System.setProperty("logFilename", System.getProperty("user.home") + "/cemu_UI/app.log");
|
||||
File logFile = new File(System.getProperty("user.home") + "/cemu_UI/app.log");
|
||||
logFile.delete();
|
||||
}else{
|
||||
System.setProperty("logFilename", System.getProperty("user.home") + "/Documents/cemu_UI/app.log");
|
||||
File logFile = new File(System.getProperty("user.home") + "/Documents/cemu_UI/app.log");
|
||||
logFile.delete();
|
||||
}
|
||||
LOGGER = LogManager.getLogger(Main.class.getName());
|
||||
launch(args);
|
||||
}
|
||||
}
|
||||
|
@ -110,7 +110,7 @@
|
||||
<Font name="System Bold" size="14.0" />
|
||||
</font>
|
||||
</JFXButton>
|
||||
<JFXButton fx:id="timePlayedBtn" buttonType="RAISED" maxHeight="32.0" minWidth="100.0" onAction="#timePlayedBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.rightAnchor="516.5" AnchorPane.topAnchor="558.0">
|
||||
<JFXButton fx:id="totalPlaytimeBtn" buttonType="RAISED" maxHeight="32.0" minWidth="100.0" onAction="#totalPlaytimeBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.rightAnchor="516.5" AnchorPane.topAnchor="558.0">
|
||||
</JFXButton>
|
||||
<JFXButton fx:id="lastTimePlayedBtn" buttonType="RAISED" maxHeight="32.0" minWidth="100.0" onAction="#lastTimePlayedBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="516.5" AnchorPane.topAnchor="558.0" />
|
||||
</children>
|
||||
|
@ -40,12 +40,13 @@ import javax.swing.ProgressMonitor;
|
||||
import javax.swing.ProgressMonitorInputStream;
|
||||
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import com.github.junrar.Archive;
|
||||
import com.github.junrar.exception.RarException;
|
||||
import com.github.junrar.impl.FileVolumeManager;
|
||||
import com.github.junrar.rarfile.FileHeader;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import com.jfoenix.controls.JFXButton;
|
||||
import com.jfoenix.controls.JFXColorPicker;
|
||||
import com.jfoenix.controls.JFXDialog;
|
||||
import com.jfoenix.controls.JFXDialogLayout;
|
||||
import com.jfoenix.controls.JFXHamburger;
|
||||
import com.jfoenix.controls.JFXTextField;
|
||||
import com.jfoenix.controls.JFXToggleButton;
|
||||
@ -82,6 +83,7 @@ import javafx.scene.input.MouseButton;
|
||||
import javafx.scene.input.MouseEvent;
|
||||
import javafx.scene.layout.AnchorPane;
|
||||
import javafx.scene.layout.HBox;
|
||||
import javafx.scene.layout.StackPane;
|
||||
import javafx.scene.layout.VBox;
|
||||
import javafx.scene.paint.Color;
|
||||
import javafx.scene.paint.Paint;
|
||||
@ -92,6 +94,8 @@ import javafx.scene.text.TextFlow;
|
||||
import javafx.stage.DirectoryChooser;
|
||||
import javafx.stage.FileChooser;
|
||||
import javafx.util.Duration;
|
||||
import net.lingala.zip4j.core.ZipFile;
|
||||
import net.lingala.zip4j.exception.ZipException;
|
||||
|
||||
public class MainWindowController {
|
||||
|
||||
@ -126,7 +130,7 @@ public class MainWindowController {
|
||||
private JFXButton lastTimePlayedBtn;
|
||||
|
||||
@FXML
|
||||
JFXButton timePlayedBtn;
|
||||
JFXButton totalPlaytimeBtn;
|
||||
|
||||
@FXML
|
||||
private JFXHamburger menuHam;
|
||||
@ -181,19 +185,19 @@ public class MainWindowController {
|
||||
private JFXTreeTableView<CourseTableDataType> courseTreeTable = new JFXTreeTableView<CourseTableDataType>();
|
||||
|
||||
@FXML
|
||||
TreeItem<CourseTableDataType> root = new TreeItem<>(new CourseTableDataType("",0,0,0));
|
||||
TreeItem<CourseTableDataType> root = new TreeItem<>(new CourseTableDataType("","",0,0));
|
||||
|
||||
@FXML
|
||||
private JFXTreeTableColumn<CourseTableDataType, String> titleColumn = new JFXTreeTableColumn<>("title");
|
||||
|
||||
@FXML
|
||||
private JFXTreeTableColumn<CourseTableDataType, String> idColumn = new JFXTreeTableColumn<>("id");
|
||||
|
||||
@FXML
|
||||
private JFXTreeTableColumn<CourseTableDataType, Integer> starsColumn = new JFXTreeTableColumn<>("stars");
|
||||
|
||||
@FXML
|
||||
private JFXTreeTableColumn<CourseTableDataType, Integer> downloadsColumn = new JFXTreeTableColumn<>("downloads");
|
||||
|
||||
@FXML
|
||||
private JFXTreeTableColumn<CourseTableDataType, Integer> idColumn = new JFXTreeTableColumn<>("id");
|
||||
private JFXTreeTableColumn<CourseTableDataType, Integer> timeColumn = new JFXTreeTableColumn<>("time");
|
||||
|
||||
Main main;
|
||||
dbController dbController;
|
||||
@ -209,32 +213,34 @@ public class MainWindowController {
|
||||
private String cemuPath;
|
||||
private String romPath;
|
||||
private String gameExecutePath;
|
||||
private String color;
|
||||
private String dialogBtnStyle;
|
||||
private String selectedGameTitleID;
|
||||
private String selectedGameTitle;
|
||||
private String color;
|
||||
private String version = "0.1.6";
|
||||
private String buildNumber = "027";
|
||||
private String versionName = "Throwback Galaxy";
|
||||
private String id;
|
||||
private String version = "0.1.7";
|
||||
private String buildNumber = "039";
|
||||
private String versionName = "Throwback Galaxy";
|
||||
private int xPos = -200;
|
||||
private int yPos = 17;
|
||||
private int xPosHelper;
|
||||
private int selectedUIDataIndex;
|
||||
private int selected;
|
||||
private int id;
|
||||
private DirectoryChooser directoryChooser = new DirectoryChooser();
|
||||
private File dirWin = new File(System.getProperty("user.home") + "/Documents/cemu_UI");
|
||||
private File dirLinux = new File(System.getProperty("user.home") + "/cemu_UI");
|
||||
private File fileWin = new File(dirWin + "/config.xml");
|
||||
private File fileLinux = new File(dirLinux + "/config.xml");
|
||||
private File configFileWin = new File(dirWin + "/config.xml");
|
||||
private File configFileLinux = new File(dirLinux + "/config.xml");
|
||||
File pictureCacheWin = new File(dirWin+"/picture_cache");
|
||||
File pictureCacheLinux = new File(dirLinux+"/picture_cache");
|
||||
private ObservableList<String> smmIDs = FXCollections.observableArrayList("fe31b7f2"); //TODO add more IDs
|
||||
private ObservableList<String> smmIDs = FXCollections.observableArrayList("fe31b7f2", "44fc5929"); //TODO add more IDs
|
||||
private ObservableList<UIROMDataType> games = FXCollections.observableArrayList();
|
||||
ObservableList<SmmdbApiDataType> courses = FXCollections.observableArrayList();
|
||||
ArrayList<Text> courseText = new ArrayList<Text>();
|
||||
ArrayList<Text> nameText = new ArrayList<Text>();
|
||||
Properties props = new Properties();
|
||||
Properties gameProps = new Properties();
|
||||
private static final Logger LOGGER = LogManager.getLogger(MainWindowController.class.getName());
|
||||
private MenuItem edit = new MenuItem("edit");
|
||||
private MenuItem remove = new MenuItem("remove");
|
||||
private MenuItem update = new MenuItem("update");
|
||||
@ -260,7 +266,6 @@ public class MainWindowController {
|
||||
smmdbApiQuery = new SmmdbApiQuery();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked") //FIXME SuppressWarnings
|
||||
void initUI(){
|
||||
cemuTextField.setText(cemuPath);
|
||||
romTextField.setText(romPath);
|
||||
@ -272,7 +277,7 @@ public class MainWindowController {
|
||||
|
||||
//initialize courseTable
|
||||
titleColumn.setPrefWidth(160);
|
||||
downloadsColumn.setPrefWidth(127);
|
||||
timeColumn.setPrefWidth(127);
|
||||
starsColumn.setPrefWidth(100);
|
||||
|
||||
courseTreeTable.setRoot(root);
|
||||
@ -280,16 +285,22 @@ public class MainWindowController {
|
||||
courseTreeTable.setEditable(false);
|
||||
|
||||
titleColumn.setCellValueFactory(cellData -> cellData.getValue().getValue().title);
|
||||
idColumn.setCellValueFactory(cellData -> cellData.getValue().getValue().id);
|
||||
starsColumn.setCellValueFactory(cellData -> cellData.getValue().getValue().stars.asObject());
|
||||
downloadsColumn.setCellValueFactory(cellData -> cellData.getValue().getValue().downloads.asObject());
|
||||
idColumn.setCellValueFactory(cellData -> cellData.getValue().getValue().id.asObject());
|
||||
timeColumn.setCellValueFactory(cellData -> cellData.getValue().getValue().time.asObject());
|
||||
|
||||
courseTreeTable.getColumns().setAll(titleColumn, downloadsColumn, starsColumn, idColumn);
|
||||
courseTreeTable.getColumns().add(titleColumn);
|
||||
courseTreeTable.getColumns().add(timeColumn);
|
||||
courseTreeTable.getColumns().add(starsColumn);
|
||||
courseTreeTable.getColumns().add(idColumn);
|
||||
courseTreeTable.getColumns().get(3).setVisible(false); //hide idColumn (important)
|
||||
}
|
||||
|
||||
/**
|
||||
* initialize all actions not initialized by a own method
|
||||
*/
|
||||
void initActions() {
|
||||
System.out.println("initializing Actions... ");
|
||||
LOGGER.info("initializing Actions... ");
|
||||
|
||||
HamburgerBackArrowBasicTransition burgerTask = new HamburgerBackArrowBasicTransition(menuHam);
|
||||
menuHam.addEventHandler(MouseEvent.MOUSE_PRESSED, (e)->{
|
||||
@ -339,7 +350,6 @@ public class MainWindowController {
|
||||
});
|
||||
|
||||
remove.setOnAction(new EventHandler<ActionEvent>() {
|
||||
@SuppressWarnings("unlikely-arg-type") //FIXME SuppressWarnings("unlikely-arg-type")
|
||||
@Override
|
||||
public void handle(ActionEvent event) {
|
||||
System.out.println("remove "+selectedGameTitleID);
|
||||
@ -371,7 +381,7 @@ public class MainWindowController {
|
||||
games.remove(selectedUIDataIndex);
|
||||
dbController.removeRom(selectedGameTitleID);
|
||||
//remove all games form gamesAnchorPane (UI)
|
||||
gamesAnchorPane.getChildren().removeAll(games);
|
||||
gamesAnchorPane.getChildren().removeAll(gamesAnchorPane.getChildren());
|
||||
//reset position
|
||||
xPos = -200;
|
||||
yPos = 17;
|
||||
@ -398,7 +408,7 @@ public class MainWindowController {
|
||||
String updatePath;
|
||||
System.out.println("update: "+selectedGameTitleID);
|
||||
if(selectedGameTitleID == null){
|
||||
System.out.println("trying to update null! null is not valid!");
|
||||
LOGGER.error("trying to update null! null is not valid!");
|
||||
Alert alert = new Alert(AlertType.WARNING);
|
||||
alert.setTitle("edit");
|
||||
alert.setHeaderText("cemu_UI");
|
||||
@ -422,21 +432,21 @@ public class MainWindowController {
|
||||
File srcDir = new File(updatePath);
|
||||
File destDir = new File(cemuPath+"\\mlc01\\usr\\title\\"+parts[0]+"\\"+parts[1]);
|
||||
|
||||
System.out.println(updatePath);
|
||||
System.out.println(destDir.toString());
|
||||
LOGGER.info(updatePath);
|
||||
LOGGER.info(destDir.toString());
|
||||
|
||||
if(destDir.exists() != true){
|
||||
destDir.mkdir();
|
||||
}
|
||||
|
||||
try {
|
||||
System.out.println("copying files...");
|
||||
LOGGER.info("copying files...");
|
||||
playBtn.setText("updating...");
|
||||
playBtn.setDisable(true);
|
||||
FileUtils.copyDirectory(srcDir, destDir); //TODO progress indicator
|
||||
playBtn.setText("play");
|
||||
playBtn.setDisable(false);
|
||||
System.out.println("done!");
|
||||
LOGGER.info("copying files done!");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@ -453,7 +463,7 @@ public class MainWindowController {
|
||||
String titleID = selectedGameTitleID;
|
||||
String dlcPath;
|
||||
|
||||
System.out.println("add DLC: "+selectedGameTitleID);
|
||||
LOGGER.info("add DLC: "+selectedGameTitleID);
|
||||
if(selectedGameTitleID == null){
|
||||
System.out.println("trying to add a dlc to null! null is not valid!");
|
||||
Alert alert = new Alert(AlertType.WARNING);
|
||||
@ -479,21 +489,21 @@ public class MainWindowController {
|
||||
File srcDir = new File(dlcPath);
|
||||
File destDir = new File(cemuPath+"\\mlc01\\usr\\title\\"+parts[0]+"\\"+parts[1]+"\\aoc");
|
||||
|
||||
System.out.println(dlcPath);
|
||||
System.out.println(destDir.toString());
|
||||
LOGGER.info(dlcPath);
|
||||
LOGGER.info(destDir.toString());
|
||||
|
||||
if(destDir.exists() != true){
|
||||
destDir.mkdir();
|
||||
}
|
||||
|
||||
try {
|
||||
System.out.println("copying files...");
|
||||
LOGGER.info("copying files...");
|
||||
playBtn.setText("copying files...");
|
||||
playBtn.setDisable(true);
|
||||
FileUtils.copyDirectory(srcDir, destDir); //TODO progress indicator
|
||||
playBtn.setText("play");
|
||||
playBtn.setDisable(false);
|
||||
System.out.println("done!");
|
||||
LOGGER.info("copying files done!");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@ -527,20 +537,18 @@ public class MainWindowController {
|
||||
@Override
|
||||
public void changed(ObservableValue<?> observable, Object oldVal, Object newVal){
|
||||
selected = courseTreeTable.getSelectionModel().getSelectedIndex(); //get selected item
|
||||
id = idColumn.getCellData(selected); //get name of selected item
|
||||
|
||||
//FIXME if a item is selected and you change the sorting,you can't select a new item
|
||||
id = idColumn.getCellData(selected); //get name of selected item
|
||||
|
||||
for (int i = 0; i < courses.size(); i++) {
|
||||
if (courses.get(i).getId() == id) {
|
||||
|
||||
if (courses.get(i).getHasimage() == 1) {
|
||||
try {
|
||||
URL url = new URL("http://smmdb.ddns.net/img/courses/thumbnails/" + id + ".pic");
|
||||
Image image = new Image(url.toURI().toString());
|
||||
smmdbImageView.setImage(image);
|
||||
} catch (MalformedURLException | URISyntaxException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
if (courses.get(i).getId() == id) {
|
||||
try {
|
||||
URL url = new URL("http://smmdb.ddns.net/courseimg/" + id + "_full.jpg?v=3");
|
||||
Image image = new Image(url.toURI().toString());
|
||||
smmdbImageView.setImage(image);
|
||||
} catch (MalformedURLException | URISyntaxException e) {
|
||||
e.printStackTrace();
|
||||
smmdbImageView.setImage(close_black);
|
||||
}
|
||||
addCourseDescription(courses.get(i));
|
||||
@ -562,8 +570,7 @@ public class MainWindowController {
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
System.out.println("initializing Actions done!");
|
||||
LOGGER.info("initializing Actions done!");
|
||||
}
|
||||
|
||||
@FXML
|
||||
@ -572,13 +579,29 @@ public class MainWindowController {
|
||||
}
|
||||
|
||||
@FXML
|
||||
void aboutBtnAction(){
|
||||
Alert alert = new Alert(AlertType.INFORMATION);
|
||||
alert.setTitle("about");
|
||||
alert.setHeaderText("cemu_UI");
|
||||
alert.setContentText("cemu_UI by @Seil0 \nVersion: "+version+" ("+buildNumber+") \""+versionName+"\" \nwww.kellerkinder.xyz");
|
||||
alert.initOwner(main.primaryStage);
|
||||
alert.showAndWait();
|
||||
void aboutBtnAction(){
|
||||
JFXDialogLayout content= new JFXDialogLayout();
|
||||
content.setHeading(new Text("cemu_UI"));
|
||||
content.setBody(new Text("cemu_UI by @Seil0 \nVersion: "+version+" ("+buildNumber+") \""+versionName+"\" \nThis Application is made with free Software\nwww.kellerkinder.xyz"));
|
||||
content.setPrefSize(350, 170);
|
||||
StackPane stackPane = new StackPane();
|
||||
stackPane.autosize();
|
||||
JFXDialog dialog =new JFXDialog(stackPane, content, JFXDialog.DialogTransition.LEFT, true);
|
||||
JFXButton button=new JFXButton("Okay");
|
||||
button.setOnAction(new EventHandler<ActionEvent>(){
|
||||
@Override
|
||||
public void handle(ActionEvent event){
|
||||
dialog.close();
|
||||
}
|
||||
});
|
||||
button.setButtonType(com.jfoenix.controls.JFXButton.ButtonType.RAISED);
|
||||
button.setPrefHeight(32);
|
||||
button.setStyle(dialogBtnStyle);
|
||||
content.setActions(button);
|
||||
main.pane.getChildren().add(stackPane);
|
||||
AnchorPane.setTopAnchor(stackPane, (main.pane.getHeight()-content.getPrefHeight())/2);
|
||||
AnchorPane.setLeftAnchor(stackPane, (main.pane.getWidth()-content.getPrefWidth())/2);
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
@FXML
|
||||
@ -614,21 +637,19 @@ public class MainWindowController {
|
||||
} else {
|
||||
smmdbAnchorPane.setVisible(true);
|
||||
smmdbTrue = true;
|
||||
}
|
||||
|
||||
//start query
|
||||
courses.addAll(smmdbApiQuery.startQuery());
|
||||
|
||||
System.out.println("size: " + courses.size());
|
||||
System.out.println(courses.get(3).getNintendoid());
|
||||
|
||||
//add query response to courseTreeTable
|
||||
for(int i = 0; i < courses.size(); i++){
|
||||
CourseTableDataType helpCourse = new CourseTableDataType(courses.get(i).getTitle(), courses.get(i).getDownloads(),
|
||||
courses.get(i).getStars(), courses.get(i).getId());
|
||||
|
||||
root.getChildren().add(new TreeItem<CourseTableDataType>(helpCourse)); //add data to root-node
|
||||
}
|
||||
//start query
|
||||
courses.removeAll(courses);
|
||||
courses.addAll(smmdbApiQuery.startQuery());
|
||||
|
||||
//add query response to courseTreeTable
|
||||
for(int i = 0; i < courses.size(); i++){
|
||||
CourseTableDataType helpCourse = new CourseTableDataType(courses.get(i).getTitle(), courses.get(i).getId(),
|
||||
courses.get(i).getTime(), courses.get(i).getStars());
|
||||
|
||||
root.getChildren().add(new TreeItem<CourseTableDataType>(helpCourse)); //add data to root-node
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@FXML
|
||||
@ -640,7 +661,7 @@ public class MainWindowController {
|
||||
}
|
||||
|
||||
@FXML
|
||||
void timePlayedBtnAction(ActionEvent event){
|
||||
void totalPlaytimeBtnAction(ActionEvent event){
|
||||
|
||||
}
|
||||
|
||||
@ -653,7 +674,7 @@ public class MainWindowController {
|
||||
void cemuTFBtnAction(ActionEvent event) {
|
||||
File cemuDirectory = directoryChooser.showDialog(main.primaryStage);
|
||||
if(cemuDirectory == null){
|
||||
System.out.println("No Directory selected");
|
||||
LOGGER.info("No Directory selected");
|
||||
}else{
|
||||
setCemuPath(cemuDirectory.getAbsolutePath());
|
||||
saveSettings();
|
||||
@ -672,7 +693,7 @@ public class MainWindowController {
|
||||
void romTFBtnAction(ActionEvent event) {
|
||||
File romDirectory = directoryChooser.showDialog(main.primaryStage);
|
||||
if(romDirectory == null){
|
||||
System.out.println("No Directory selected");
|
||||
LOGGER.info("No Directory selected");
|
||||
}else{
|
||||
setRomPath(romDirectory.getAbsolutePath());
|
||||
saveSettings();
|
||||
@ -689,8 +710,8 @@ public class MainWindowController {
|
||||
|
||||
@FXML
|
||||
void smmdbDownloadBtnAction(ActionEvent event){
|
||||
String downloadUrl = "http://smmdb.ddns.net/courses/" + id;
|
||||
String downloadFileURL = getCemuPath() + "/" + id + ".rar"; //getCemuPath() + "/" + smmID + "/" + id + ".rar"
|
||||
String downloadUrl = "http://smmdb.ddns.net/api/downloadcourse?id=" + id + "&type=zip";
|
||||
String downloadFileURL = getCemuPath() + "/" + id + ".zip"; //getCemuPath() + "/" + smmID + "/" + id + ".rar"
|
||||
String outputFile = getCemuPath() + "/";
|
||||
|
||||
try {
|
||||
@ -703,51 +724,52 @@ public class MainWindowController {
|
||||
pm.setMaximum(conn.getContentLength()); // tell the progress bar the total number of bytes we are going to read.
|
||||
FileUtils.copyInputStreamToFile(pmis, new File(downloadFileURL)); //download file + "/mlc01/emulatorSave"
|
||||
pmis.close();
|
||||
System.out.println("downloaded successfull");
|
||||
LOGGER.info("downloaded successfull");
|
||||
|
||||
File downloadFile = new File(downloadFileURL);
|
||||
Archive a = null;
|
||||
try {
|
||||
a = new Archive(new FileVolumeManager(downloadFile));
|
||||
} catch (RarException | IOException e) {
|
||||
// Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (a != null) {
|
||||
a.getMainHeader().print();
|
||||
FileHeader fh = a.nextFileHeader();
|
||||
|
||||
for (int i = 0; i < smmIDs.size(); i++) {
|
||||
if (new File(outputFile + "mlc01/emulatorSave/" + smmIDs.get(i)).exists()) {
|
||||
File courseDirectory = new File(outputFile + "mlc01/emulatorSave/" + smmIDs.get(0) + "/" + fh.getFileNameString().substring(0, fh.getFileNameString().indexOf('\\')));
|
||||
System.out.println("Path: " + courseDirectory.getAbsolutePath());
|
||||
if (!courseDirectory.exists()) {
|
||||
courseDirectory.mkdir();
|
||||
}
|
||||
while (fh != null) {
|
||||
try {
|
||||
File out = new File(outputFile + "mlc01/emulatorSave/" + smmIDs.get(0) + "/" + fh.getFileNameString().trim());
|
||||
if (!out.getAbsolutePath().equals(courseDirectory.getAbsolutePath())) {
|
||||
System.out.println(out.getAbsolutePath());
|
||||
FileOutputStream os = new FileOutputStream(out);
|
||||
a.extractFile(fh, os);
|
||||
os.close();
|
||||
}
|
||||
|
||||
String source = downloadFileURL;
|
||||
String destination = null;
|
||||
int highestCourseNumber = 0;
|
||||
String courseName = null;
|
||||
|
||||
for (int i = 0; i < smmIDs.size(); i++) {
|
||||
File smmDirectory = new File(outputFile + "mlc01/emulatorSave/" + smmIDs.get(i));
|
||||
|
||||
} catch (RarException | IOException e) {
|
||||
// Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
fh = a.nextFileHeader();
|
||||
if (smmDirectory.exists()) {
|
||||
File[] courses = smmDirectory.listFiles(File::isDirectory);
|
||||
|
||||
//get all existing courses in smm directory, new name is highest number +1
|
||||
for (int j = 0; j < courses.length; j++) {
|
||||
int courseNumber = Integer.parseInt(courses[j].getName().substring(6));
|
||||
if (courseNumber > highestCourseNumber) {
|
||||
highestCourseNumber = courseNumber;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String number = "000" + (highestCourseNumber +1);
|
||||
courseName = "course" + number.substring(number.length() -3, number.length());
|
||||
File courseDirectory = new File(outputFile + "mlc01/emulatorSave/" + smmIDs.get(i) + "/");
|
||||
|
||||
destination = courseDirectory.getPath();
|
||||
}
|
||||
}
|
||||
a.close();
|
||||
|
||||
try {
|
||||
ZipFile zipFile = new ZipFile(source);
|
||||
zipFile.extractAll(destination);
|
||||
|
||||
//rename zipfile
|
||||
File course = new File(destination + "/course000");
|
||||
course.renameTo( new File(destination + "/" + courseName));
|
||||
LOGGER.info("Added new course: " + courseName + ", full path is: " + destination + "/" + courseName);
|
||||
} catch (ZipException e) {
|
||||
LOGGER.error("an error occurred during unziping the file!", e);
|
||||
}
|
||||
|
||||
downloadFile.delete();
|
||||
} catch (IOException e) {
|
||||
System.err.println("something went wrong during downloading the course");
|
||||
e.printStackTrace();
|
||||
LOGGER.error("something went wrong during downloading the course", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -778,24 +800,49 @@ public class MainWindowController {
|
||||
if(cloudSync) {
|
||||
cloudSync = false;
|
||||
} else {
|
||||
Alert cloudWarningAlert = new Alert(AlertType.CONFIRMATION); //new alert with file-chooser
|
||||
cloudWarningAlert.setTitle("cemu_UI");
|
||||
cloudWarningAlert.setHeaderText("activate cloud savegame sync (beta)");
|
||||
cloudWarningAlert.setContentText("You just activate the cloud savegame sync function of cemu_UI which is currently in beta. Are you sure you want to do this?");
|
||||
cloudWarningAlert.initOwner(main.primaryStage);
|
||||
Optional<ButtonType> coverResult = cloudWarningAlert.showAndWait();
|
||||
if (coverResult.get() == ButtonType.OK){
|
||||
cloudSync = true;
|
||||
//TODO rework for other cloud services
|
||||
cloudService = "GoogleDrive";
|
||||
main.cloudController.initializeConnection(getCloudService(), getCemuPath());
|
||||
main.cloudController.sync(getCloudService(), getCemuPath());
|
||||
} else {
|
||||
cloudSyncToggleBtn.setSelected(false);
|
||||
}
|
||||
|
||||
|
||||
JFXDialogLayout content= new JFXDialogLayout();
|
||||
content.setHeading(new Text("activate cloud savegame sync (beta)"));
|
||||
content.setBody(new Text("You just activate the cloud savegame sync function of cemu_UI, \nwhich is currently in beta. Are you sure you want to do this?"));
|
||||
StackPane stackPane = new StackPane();
|
||||
stackPane.autosize();
|
||||
JFXDialog dialog = new JFXDialog(stackPane, content, JFXDialog.DialogTransition.LEFT, true);
|
||||
JFXButton okayBtn = new JFXButton("Okay");
|
||||
okayBtn.setOnAction(new EventHandler<ActionEvent>(){
|
||||
@Override
|
||||
public void handle(ActionEvent event){
|
||||
cloudSync = true;
|
||||
//TODO rework for other cloud services
|
||||
cloudService = "GoogleDrive";
|
||||
main.cloudController.initializeConnection(getCloudService(), getCemuPath());
|
||||
main.cloudController.sync(getCloudService(), getCemuPath());
|
||||
saveSettings();
|
||||
dialog.close();
|
||||
}
|
||||
});
|
||||
JFXButton cancelBtn = new JFXButton("Cancel");
|
||||
cancelBtn.setOnAction(new EventHandler<ActionEvent>(){
|
||||
@Override
|
||||
public void handle(ActionEvent event){
|
||||
cloudSyncToggleBtn.setSelected(false);
|
||||
dialog.close();
|
||||
}
|
||||
});
|
||||
Label placeholder = new Label();
|
||||
placeholder.setPrefSize(15, 10);
|
||||
okayBtn.setButtonType(com.jfoenix.controls.JFXButton.ButtonType.RAISED);
|
||||
cancelBtn.setButtonType(com.jfoenix.controls.JFXButton.ButtonType.RAISED);
|
||||
okayBtn.setPrefHeight(32);
|
||||
cancelBtn.setPrefHeight(32);
|
||||
okayBtn.setStyle(dialogBtnStyle);
|
||||
cancelBtn.setStyle(dialogBtnStyle);
|
||||
content.setActions(cancelBtn, placeholder, okayBtn);
|
||||
content.setPrefSize(419, 140);
|
||||
main.pane.getChildren().add(stackPane);
|
||||
AnchorPane.setTopAnchor(stackPane, (main.pane.getHeight()-content.getPrefHeight())/2);
|
||||
AnchorPane.setLeftAnchor(stackPane, (main.pane.getWidth()-content.getPrefWidth())/2);
|
||||
dialog.show();
|
||||
}
|
||||
saveSettings();
|
||||
}
|
||||
|
||||
@FXML
|
||||
@ -882,7 +929,7 @@ public class MainWindowController {
|
||||
* then add the rom to the local_roms database
|
||||
*/
|
||||
if(exit){
|
||||
System.out.println("No parameter set!");
|
||||
LOGGER.info("No parameter set!");
|
||||
}else{
|
||||
coverName = new File(coverPath).getName();
|
||||
try {
|
||||
@ -898,16 +945,14 @@ public class MainWindowController {
|
||||
ImageIO.write(resizeImagePNG, "png", new File(pictureCache+"\\"+coverName)); //save image to pictureCache
|
||||
coverPath = pictureCache+"\\"+coverName;
|
||||
} catch (IOException e) {
|
||||
System.out.println("Ops something went wrong!");
|
||||
LOGGER.error("Ops something went wrong!", e);
|
||||
}
|
||||
|
||||
try {
|
||||
dbController.addRom(title, coverPath, romPath, titleID, "", "", "", "0");
|
||||
dbController.loadSingleRom(titleID);
|
||||
} catch (SQLException e) {
|
||||
// Auto-generated catch block
|
||||
System.out.println("Oops, something went wrong! Error during adding a game.");
|
||||
e.printStackTrace();
|
||||
LOGGER.error("Oops, something went wrong! Error during adding a game.", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -928,7 +973,7 @@ public class MainWindowController {
|
||||
Image coverImage = new Image(coverFile.toURI().toString());
|
||||
|
||||
generatePosition();
|
||||
|
||||
LOGGER.info("add " + getxPos()); //TODO debug
|
||||
VBox.setLayoutX(getxPos());
|
||||
VBox.setLayoutY(getyPos());
|
||||
VBox.getChildren().addAll(gameTitleLabel,gameBtn);
|
||||
@ -944,7 +989,7 @@ public class MainWindowController {
|
||||
gameBtn.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
|
||||
@Override
|
||||
public void handle(MouseEvent event) {
|
||||
System.out.println("selected: "+title+"; ID: "+titleID);
|
||||
LOGGER.info("selected: "+title+"; ID: "+titleID);
|
||||
|
||||
//getting the selected game index by comparing event.getSource() with games.get(i).getButton()
|
||||
for(int i=0; i<games.size(); i++){
|
||||
@ -965,7 +1010,7 @@ public class MainWindowController {
|
||||
//setting last played
|
||||
if(dbController.getLastPlayed(titleID).equals("") || dbController.getLastPlayed(titleID).equals(null)){
|
||||
lastTimePlayedBtn.setText("Last played, never");
|
||||
timePlayedBtn.setText(dbController.getTimePlayed(titleID)+ " min");
|
||||
totalPlaytimeBtn.setText(dbController.getTotalPlaytime(titleID)+ " min");
|
||||
}else{
|
||||
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
||||
|
||||
@ -980,12 +1025,12 @@ public class MainWindowController {
|
||||
}else{
|
||||
lastTimePlayedBtn.setText("Last played, "+dbController.getLastPlayed(titleID));
|
||||
}
|
||||
if(Integer.parseInt(dbController.getTimePlayed(titleID)) > 60){
|
||||
int hoursPlayed = (int) Math.floor(Integer.parseInt(dbController.getTimePlayed(titleID))/60);
|
||||
int minutesPlayed = Integer.parseInt(dbController.getTimePlayed(titleID))-60*hoursPlayed;
|
||||
timePlayedBtn.setText(hoursPlayed+"h "+minutesPlayed+"min");
|
||||
if(Integer.parseInt(dbController.getTotalPlaytime(titleID)) > 60){
|
||||
int hoursPlayed = (int) Math.floor(Integer.parseInt(dbController.getTotalPlaytime(titleID))/60);
|
||||
int minutesPlayed = Integer.parseInt(dbController.getTotalPlaytime(titleID))-60*hoursPlayed;
|
||||
totalPlaytimeBtn.setText(hoursPlayed+"h "+minutesPlayed+"min");
|
||||
}else{
|
||||
timePlayedBtn.setText(dbController.getTimePlayed(titleID)+ " min");
|
||||
totalPlaytimeBtn.setText(dbController.getTotalPlaytime(titleID)+ " min");
|
||||
}
|
||||
}
|
||||
|
||||
@ -1009,46 +1054,53 @@ public class MainWindowController {
|
||||
}
|
||||
|
||||
private void addCourseDescription(SmmdbApiDataType course) {
|
||||
String coursetype;
|
||||
String leveltype;
|
||||
String courseTheme;
|
||||
String gameStyle;
|
||||
String difficulty;
|
||||
String autoscroll;
|
||||
smmdbTextFlow.getChildren().remove(0, smmdbTextFlow.getChildren().size());
|
||||
nameText.clear();
|
||||
courseText.clear();
|
||||
|
||||
switch (course.getCoursetype()) {
|
||||
switch (course.getCourseTheme()) {
|
||||
case 0:
|
||||
coursetype = "Creation";
|
||||
courseTheme = "Ground";
|
||||
break;
|
||||
case 1:
|
||||
coursetype = "Recreation";
|
||||
courseTheme = "Underground";
|
||||
break;
|
||||
case 2:
|
||||
coursetype = "Wii U Dump";
|
||||
courseTheme = "Castle";
|
||||
break;
|
||||
case 3:
|
||||
courseTheme = "Airship";
|
||||
break;
|
||||
case 4:
|
||||
courseTheme = "Underwater";
|
||||
break;
|
||||
case 5:
|
||||
courseTheme = "Ghost House";
|
||||
break;
|
||||
default:
|
||||
coursetype = "notset";
|
||||
courseTheme = "notset";
|
||||
break;
|
||||
}
|
||||
|
||||
switch (course.getLeveltype()) {
|
||||
switch (course.getGameStyle()) {
|
||||
case 0:
|
||||
leveltype = "NSMBU";
|
||||
gameStyle = "SMB";
|
||||
break;
|
||||
case 1:
|
||||
leveltype = "SMW";
|
||||
gameStyle = "SMB3";
|
||||
break;
|
||||
case 2:
|
||||
leveltype = "SMB3";
|
||||
gameStyle = "SMW";
|
||||
break;
|
||||
case 3:
|
||||
leveltype = "SMB";
|
||||
break;
|
||||
case 4:
|
||||
leveltype = "Mixed";
|
||||
gameStyle = "NSMBU";
|
||||
break;
|
||||
default:
|
||||
leveltype = "notset";
|
||||
gameStyle = "notset";
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1073,23 +1125,45 @@ public class MainWindowController {
|
||||
break;
|
||||
}
|
||||
|
||||
switch (course.getAutoScroll()) {
|
||||
case 0:
|
||||
autoscroll = "disabled";
|
||||
break;
|
||||
case 1:
|
||||
autoscroll = "slow";
|
||||
break;
|
||||
case 2:
|
||||
autoscroll = "medium";
|
||||
break;
|
||||
case 3:
|
||||
autoscroll = "fast";
|
||||
break;
|
||||
default:
|
||||
autoscroll = "notset";
|
||||
break;
|
||||
}
|
||||
|
||||
nameText.add(0, new Text("title" + ": "));
|
||||
nameText.add(1, new Text("owner" + ": "));
|
||||
nameText.add(2, new Text("coursetype" + ": "));
|
||||
nameText.add(3, new Text("leveltype" + ": "));
|
||||
nameText.add(2, new Text("Course-Theme" + ": "));
|
||||
nameText.add(3, new Text("Game-Style" + ": "));
|
||||
nameText.add(4, new Text("difficulty" + ": "));
|
||||
nameText.add(5, new Text("lastmodified" + ": "));
|
||||
nameText.add(6, new Text("uploaded" + ": "));
|
||||
nameText.add(7, new Text("nintendoid" + ": "));
|
||||
nameText.add(5, new Text("Auto-Scroll" + ": "));
|
||||
nameText.add(6, new Text("Time" + ": "));
|
||||
nameText.add(7, new Text("lastmodified" + ": "));
|
||||
nameText.add(8, new Text("uploaded" + ": "));
|
||||
nameText.add(9, new Text("nintendoid" + ": "));
|
||||
|
||||
courseText.add(0, new Text(course.getTitle() + "\n"));
|
||||
courseText.add(1, new Text(Integer.toString(course.getOwner()) + "\n"));
|
||||
courseText.add(2, new Text(coursetype + "\n"));
|
||||
courseText.add(3, new Text(leveltype + "\n"));
|
||||
courseText.add(1, new Text(course.getOwner() + "\n"));
|
||||
courseText.add(2, new Text(courseTheme + "\n"));
|
||||
courseText.add(3, new Text(gameStyle + "\n"));
|
||||
courseText.add(4, new Text(difficulty + "\n"));
|
||||
courseText.add(5, new Text(new java.util.Date((long)course.getLastmodified()*1000) + "\n"));
|
||||
courseText.add(6, new Text(new java.util.Date((long)course.getUploaded()*1000) + "\n"));
|
||||
courseText.add(7, new Text(course.getNintendoid() + "\n"));
|
||||
courseText.add(5, new Text(autoscroll + "\n"));
|
||||
courseText.add(6, new Text(course.getTime() + "\n"));
|
||||
courseText.add(7, new Text(new java.util.Date((long)course.getLastmodified()*1000) + "\n"));
|
||||
courseText.add(8, new Text(new java.util.Date((long)course.getUploaded()*1000) + "\n"));
|
||||
courseText.add(9, new Text(course.getNintendoid() + "\n"));
|
||||
|
||||
for(int i=0; i<nameText.size(); i++){
|
||||
nameText.get(i).setFont(Font.font ("System", FontWeight.BOLD, 14));
|
||||
@ -1099,10 +1173,19 @@ public class MainWindowController {
|
||||
|
||||
}
|
||||
|
||||
//TODO xPosHelper based on window with
|
||||
//TODO Changelistener for resizing
|
||||
/**
|
||||
* xPosHelper based on window width = -24(Windows)/-36(Linux)
|
||||
* calculates how many games can be displayed in one row
|
||||
*/
|
||||
private void generatePosition() {
|
||||
// System.out.println(main.primaryStage.getWidth());
|
||||
if(xPosHelper == 4){
|
||||
int xPosHelperMax;
|
||||
if(System.getProperty("os.name").equals("Linux")){
|
||||
xPosHelperMax = (int) Math.floor((main.pane.getPrefWidth() - 36) / 217);
|
||||
} else {
|
||||
xPosHelperMax = (int) Math.floor((main.pane.getPrefWidth() - 24) / 217);
|
||||
}
|
||||
if(xPosHelper == xPosHelperMax){
|
||||
xPos = 17;
|
||||
yPos = yPos + 345;
|
||||
xPosHelper = 1;
|
||||
@ -1110,6 +1193,10 @@ public class MainWindowController {
|
||||
xPos = xPos + 217;
|
||||
xPosHelper++;
|
||||
}
|
||||
// System.out.println("Breit: " + main.pane.getPrefWidth());
|
||||
// System.out.println("xPosHelper: " + xPosHelper);
|
||||
// System.out.println("yPos: " + yPos);
|
||||
// System.out.println("xPos: " + xPos);
|
||||
}
|
||||
|
||||
private void applyColor() {
|
||||
@ -1125,6 +1212,8 @@ public class MainWindowController {
|
||||
romTextField.setFocusColor(Color.valueOf(getColor()));
|
||||
|
||||
if(icolor.compareTo(ccolor) == -1){
|
||||
dialogBtnStyle = btnStyleWhite;
|
||||
|
||||
aboutBtn.setStyle("-fx-text-fill: WHITE;");
|
||||
settingsBtn.setStyle("-fx-text-fill: WHITE;");
|
||||
addBtn.setStyle("-fx-text-fill: WHITE;");
|
||||
@ -1144,6 +1233,8 @@ public class MainWindowController {
|
||||
|
||||
menuHam.getStyleClass().add("jfx-hamburgerW");
|
||||
}else{
|
||||
dialogBtnStyle = btnStyleBlack;
|
||||
|
||||
aboutBtn.setStyle("-fx-text-fill: BLACK;");
|
||||
settingsBtn.setStyle("-fx-text-fill: BLACK;");
|
||||
addBtn.setStyle("-fx-text-fill: BLACK;");
|
||||
@ -1170,50 +1261,101 @@ public class MainWindowController {
|
||||
}
|
||||
|
||||
void saveSettings(){
|
||||
System.out.print("saving Settings... ");
|
||||
OutputStream outputStream; //new output-stream
|
||||
try {
|
||||
props.setProperty("cemuPath", getCemuPath());
|
||||
props.setProperty("romPath", getRomPath());
|
||||
props.setProperty("color", getColor());
|
||||
props.setProperty("fullscreen", String.valueOf(isFullscreen()));
|
||||
props.setProperty("cloudSync", String.valueOf(cloudSync));
|
||||
LOGGER.info("saving Settings ...");
|
||||
OutputStream outputStream; //new output-stream
|
||||
try {
|
||||
props.setProperty("cemuPath", getCemuPath());
|
||||
props.setProperty("romPath", getRomPath());
|
||||
props.setProperty("color", getColor());
|
||||
props.setProperty("fullscreen", String.valueOf(isFullscreen()));
|
||||
props.setProperty("cloudSync", String.valueOf(cloudSync));
|
||||
if (getCloudService() == null) {
|
||||
props.setProperty("cloudService", "");
|
||||
} else {
|
||||
props.setProperty("cloudService", getCloudService());
|
||||
props.setProperty("folderID", main.cloudController.getFolderID(getCloudService()));
|
||||
if(System.getProperty("os.name").equals("Linux")){
|
||||
outputStream = new FileOutputStream(fileLinux);
|
||||
}else{
|
||||
outputStream = new FileOutputStream(fileWin);
|
||||
}
|
||||
props.storeToXML(outputStream, "cemu_UI settings"); //write new .xml
|
||||
outputStream.close();
|
||||
System.out.println("done!");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
props.setProperty("folderID", main.cloudController.getFolderID(getCloudService()));
|
||||
if(System.getProperty("os.name").equals("Linux")){
|
||||
outputStream = new FileOutputStream(configFileLinux);
|
||||
}else{
|
||||
outputStream = new FileOutputStream(configFileWin);
|
||||
}
|
||||
props.storeToXML(outputStream, "cemu_UI settings"); //write new .xml
|
||||
outputStream.close();
|
||||
LOGGER.info("saving Settings done!");
|
||||
} catch (IOException e) {
|
||||
LOGGER.error("an error occured", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* loading saved settings from the config.xml file
|
||||
* if a value is not present, default is used instead
|
||||
*/
|
||||
void loadSettings(){
|
||||
System.out.print("loading settings... ");
|
||||
LOGGER.info("loading settings ...");
|
||||
InputStream inputStream;
|
||||
try {
|
||||
if(System.getProperty("os.name").equals("Linux")){
|
||||
inputStream = new FileInputStream(fileLinux);
|
||||
inputStream = new FileInputStream(configFileLinux);
|
||||
}else{
|
||||
inputStream = new FileInputStream(fileWin);
|
||||
inputStream = new FileInputStream(configFileWin);
|
||||
}
|
||||
props.loadFromXML(inputStream); //new input-stream from .xml
|
||||
setCemuPath(props.getProperty("cemuPath"));
|
||||
setRomPath(props.getProperty("romPath"));
|
||||
setColor(props.getProperty("color"));
|
||||
setFullscreen(Boolean.parseBoolean(props.getProperty("fullscreen")));
|
||||
setCloudSync(Boolean.parseBoolean(props.getProperty("cloudSync")));
|
||||
setCloudService(props.getProperty("cloudService"));
|
||||
main.cloudController.setFolderID(props.getProperty("folderID"), getCloudService());
|
||||
|
||||
try {
|
||||
setCemuPath(props.getProperty("cemuPath"));
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("cloud not load cemuPath", e);
|
||||
setCemuPath("");
|
||||
}
|
||||
|
||||
try {
|
||||
setRomPath(props.getProperty("romPath"));
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("could not load romPath", e);
|
||||
setRomPath("");
|
||||
}
|
||||
|
||||
try {
|
||||
setColor(props.getProperty("color"));
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("could not load color value, setting default instead", e);
|
||||
setColor("00a8cc");
|
||||
}
|
||||
|
||||
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 {
|
||||
setCloudService(props.getProperty("cloudService"));
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("could not load cloudSync", e);
|
||||
setCloudService("");
|
||||
}
|
||||
|
||||
try {
|
||||
main.cloudController.setFolderID(props.getProperty("folderID"), getCloudService());
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("could not load folderID, disable cloud sync. Please contact an developer", e);
|
||||
setCloudSync(false);
|
||||
}
|
||||
|
||||
inputStream.close();
|
||||
System.out.println("done!");
|
||||
LOGGER.info("loading settings done!");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
LOGGER.error("an error occured", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1252,7 +1394,7 @@ public class MainWindowController {
|
||||
private void playBtnSlideIn(){
|
||||
playBtn.setVisible(true);
|
||||
lastTimePlayedBtn.setVisible(true);
|
||||
timePlayedBtn.setVisible(true);
|
||||
totalPlaytimeBtn.setVisible(true);
|
||||
playTrue = true;
|
||||
|
||||
TranslateTransition playBtnTransition = new TranslateTransition(Duration.millis(300), playBtn);
|
||||
@ -1265,7 +1407,7 @@ public class MainWindowController {
|
||||
lastTimePlayedBtnTransition.setToY(0);
|
||||
lastTimePlayedBtnTransition.play();
|
||||
|
||||
TranslateTransition timePlayedBtnTransition = new TranslateTransition(Duration.millis(300), timePlayedBtn);
|
||||
TranslateTransition timePlayedBtnTransition = new TranslateTransition(Duration.millis(300), totalPlaytimeBtn);
|
||||
timePlayedBtnTransition.setFromY(55);
|
||||
timePlayedBtnTransition.setToY(0);
|
||||
timePlayedBtnTransition.play();
|
||||
@ -1283,7 +1425,7 @@ public class MainWindowController {
|
||||
lastTimePlayedBtnTransition.setToY(56);
|
||||
lastTimePlayedBtnTransition.play();
|
||||
|
||||
TranslateTransition timePlayedBtnTransition = new TranslateTransition(Duration.millis(300), timePlayedBtn);
|
||||
TranslateTransition timePlayedBtnTransition = new TranslateTransition(Duration.millis(300), totalPlaytimeBtn);
|
||||
timePlayedBtnTransition.setFromY(0);
|
||||
timePlayedBtnTransition.setToY(56);
|
||||
timePlayedBtnTransition.play();
|
||||
@ -1297,6 +1439,9 @@ public class MainWindowController {
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
/**
|
||||
* @return the main color in hexadecimal format
|
||||
*/
|
||||
private String hexToRgb() {
|
||||
System.out.println(getColor());
|
||||
int hex = Integer.parseInt(getColor().substring(0, 5), 16);
|
||||
@ -1308,6 +1453,14 @@ public class MainWindowController {
|
||||
return r + ", " + g + ", " + b;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param originalImage original image which size is changed
|
||||
* @param type type of the original image (PNG,JPEG,...)
|
||||
* @param imgWidth wanted width
|
||||
* @param imgHeigth wanted height
|
||||
* @return the rezised image
|
||||
*/
|
||||
private static BufferedImage resizeImage(BufferedImage originalImage, int type, int imgWidth, int imgHeigth) {
|
||||
BufferedImage resizedImage = new BufferedImage(imgWidth, imgHeigth, type);
|
||||
Graphics2D g = resizedImage.createGraphics();
|
||||
|
@ -17,7 +17,7 @@
|
||||
*/
|
||||
|
||||
.tree-table-view {
|
||||
-fx-tree-table-color: rgba(0, 168, 204, 0.2);
|
||||
-fx-tree-table-color: rgba(0, 168, 204, 0.2);
|
||||
-fx-tree-table-rippler-color: rgba(0, 168, 204, 0.4);
|
||||
}
|
||||
|
||||
@ -32,7 +32,7 @@
|
||||
}
|
||||
|
||||
.tree-table-view .jfx-rippler {
|
||||
-jfx-rippler-fill: -fx-tree-table-rippler-color;
|
||||
-jfx-rippler-fill: -fx-tree-table-rippler-color;
|
||||
}
|
||||
|
||||
.tree-table-view .column-header,
|
||||
|
@ -9,24 +9,31 @@ import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import com.eclipsesource.json.Json;
|
||||
import com.eclipsesource.json.JsonArray;
|
||||
import com.eclipsesource.json.JsonObject;
|
||||
import com.eclipsesource.json.JsonValue;
|
||||
|
||||
import datatypes.SmmdbApiDataType;
|
||||
|
||||
public class SmmdbApiQuery {
|
||||
|
||||
private String URL = "http://smmdb.ddns.net/api/getcourses?";
|
||||
//FIXME limit=70 as workaround for to long response, courseDataGz is to long
|
||||
private String URL = "http://smmdb.ddns.net/api/getcourses?format=json&limit=70";
|
||||
private static final Logger LOGGER = LogManager.getLogger(SmmdbApiQuery.class.getName());
|
||||
|
||||
public SmmdbApiQuery() {
|
||||
//Auto-generated constructor stub
|
||||
}
|
||||
|
||||
//start api query
|
||||
/**
|
||||
* start smmdb api query
|
||||
* @return a ArryList with all courses found at smmdb
|
||||
*/
|
||||
public ArrayList<SmmdbApiDataType> startQuery() {
|
||||
ArrayList<Integer> courseIDs = new ArrayList<>();
|
||||
ArrayList<SmmdbApiDataType> course = new ArrayList<>();
|
||||
String output = "";
|
||||
|
||||
@ -36,98 +43,95 @@ public class SmmdbApiQuery {
|
||||
BufferedReader ina = new BufferedReader(new InputStreamReader(apiUrl.openStream()));
|
||||
output = ina.readLine();
|
||||
ina.close();
|
||||
System.out.println(output);
|
||||
LOGGER.info("response from " + URL + " was valid");
|
||||
} catch (IOException e) {
|
||||
System.out.println("error while making api request or reading response");
|
||||
e.printStackTrace();
|
||||
LOGGER.error("error while making api request or reading response");
|
||||
LOGGER.error("response from " + URL + " was: " + output, e);
|
||||
}
|
||||
|
||||
JsonObject mainObject = Json.parse(output).asObject().get("courses").asObject();
|
||||
JsonArray objectAssets = Json.parse(output).asObject().get("order").asArray();
|
||||
String apiOutput = "{ \"courses\": " + output + "}";
|
||||
JsonArray items = Json.parse(apiOutput).asObject().get("courses").asArray();
|
||||
|
||||
for (JsonValue asset : objectAssets) {
|
||||
courseIDs.add(asset.asInt());
|
||||
}
|
||||
|
||||
//if value is 9 or "notset" the api returned NULL as value
|
||||
for (int i = 0; i < courseIDs.size(); i++) {
|
||||
int id, owner, coursetype, leveltype, difficulty, lastmodified, uploaded, downloads, stars, hasimage, ispackage, updatereq;
|
||||
String nintendoid, title;
|
||||
JsonObject singleObject = mainObject.get(courseIDs.get(i).toString()).asObject();
|
||||
for (JsonValue item : items) {
|
||||
int courseTheme, gameStyle, difficulty, lastmodified, uploaded, autoScroll, stars ,time;
|
||||
String owner, id, nintendoid, title;
|
||||
|
||||
try {
|
||||
id = singleObject.getInt("id", 0);
|
||||
courseTheme = item.asObject().getInt("courseTheme", 9);
|
||||
} catch (Exception e) {
|
||||
id = 9;
|
||||
courseTheme = 9;
|
||||
}
|
||||
|
||||
try {
|
||||
owner = singleObject.getInt("owner", 0);
|
||||
gameStyle = item.asObject().getInt("gameStyle", 9);
|
||||
} catch (Exception e) {
|
||||
owner = 9;
|
||||
gameStyle = 9;
|
||||
}
|
||||
|
||||
try {
|
||||
coursetype = singleObject.getInt("coursetype", 0);
|
||||
} catch (Exception e) {
|
||||
coursetype = 9;
|
||||
}
|
||||
try {
|
||||
leveltype = singleObject.getInt("leveltype", 0);
|
||||
} catch (Exception e) {
|
||||
leveltype = 9;
|
||||
}
|
||||
try {
|
||||
difficulty = singleObject.getInt("difficulty", 0);
|
||||
difficulty = item.asObject().getInt("difficulty", 9);
|
||||
} catch (Exception e) {
|
||||
difficulty = 9;
|
||||
}
|
||||
|
||||
try {
|
||||
lastmodified = singleObject.getInt("lastmodified", 0);
|
||||
lastmodified = item.asObject().getInt("lastmodified", 9);
|
||||
} catch (Exception e) {
|
||||
lastmodified = 9;
|
||||
}
|
||||
|
||||
try {
|
||||
uploaded = singleObject.getInt("uploaded", 0);
|
||||
uploaded = item.asObject().getInt("uploaded", 9);
|
||||
} catch (Exception e) {
|
||||
uploaded = 9;
|
||||
}
|
||||
|
||||
try {
|
||||
downloads = singleObject.getInt("downloads", 0);
|
||||
autoScroll = item.asObject().getInt("autoScroll", 9);
|
||||
} catch (Exception e) {
|
||||
downloads = 9;
|
||||
autoScroll = 9;
|
||||
}
|
||||
|
||||
try {
|
||||
stars = singleObject.getInt("stars", 0);
|
||||
stars = item.asObject().getInt("stars", 9);
|
||||
} catch (Exception e) {
|
||||
stars = 9;
|
||||
}
|
||||
|
||||
try {
|
||||
hasimage = singleObject.getInt("hasimage", 0);
|
||||
time = item.asObject().getInt("time", 9);
|
||||
} catch (Exception e) {
|
||||
hasimage = 9;
|
||||
time = 9;
|
||||
}
|
||||
|
||||
try {
|
||||
ispackage = singleObject.getInt("ispackage", 0);
|
||||
owner = item.asObject().getString("owner", "");
|
||||
} catch (Exception e) {
|
||||
ispackage = 9;
|
||||
owner = "notset";
|
||||
}
|
||||
|
||||
try {
|
||||
updatereq = singleObject.getInt("updatereq", 0);
|
||||
id = item.asObject().getString("id", "");
|
||||
} catch (Exception e) {
|
||||
updatereq = 9;
|
||||
id = "notset";
|
||||
}
|
||||
|
||||
try {
|
||||
nintendoid = singleObject.getString("nintendoid", "");
|
||||
nintendoid = item.asObject().getString("nintendoid", "");
|
||||
} catch (Exception e) {
|
||||
nintendoid = "notset";
|
||||
}
|
||||
|
||||
try {
|
||||
title = singleObject.getString("title", "");;
|
||||
title = item.asObject().getString("title", "");;
|
||||
} catch (Exception e) {
|
||||
title = "notset";
|
||||
}
|
||||
|
||||
course.add(new SmmdbApiDataType(id, owner, coursetype, leveltype, difficulty, lastmodified, uploaded, downloads,
|
||||
stars, hasimage, ispackage, updatereq, nintendoid, title));
|
||||
}
|
||||
course.add(new SmmdbApiDataType(courseTheme, gameStyle, difficulty, lastmodified, uploaded, autoScroll,
|
||||
stars, time, owner, id, nintendoid, title));
|
||||
}
|
||||
|
||||
return course;
|
||||
}
|
||||
|
@ -32,6 +32,8 @@ import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.w3c.dom.Document;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
@ -47,15 +49,16 @@ public class dbController {
|
||||
private String DB_PATH_games;
|
||||
private Connection connection = null;
|
||||
private Connection connectionGames = null;
|
||||
private static final Logger LOGGER = LogManager.getLogger(dbController.class.getName());
|
||||
|
||||
public void main(){
|
||||
System.out.println("<==========starting loading sql==========>");
|
||||
LOGGER.info("<==========starting loading sql==========>");
|
||||
loadRomDatabase();
|
||||
loadGamesDatabase();
|
||||
createRomDatabase();
|
||||
loadAllRoms();
|
||||
checkRemoveEntry();
|
||||
System.out.println("<==========finished loading sql==========>");
|
||||
LOGGER.info("<==========finished loading sql==========>");
|
||||
}
|
||||
|
||||
private void loadRomDatabase(){
|
||||
@ -70,9 +73,9 @@ public class dbController {
|
||||
connection.setAutoCommit(false); //AutoCommit to false -> manual commit is active
|
||||
} catch (SQLException e) {
|
||||
// if the error message is "out of memory", it probably means no database file is found
|
||||
System.err.println(e.getMessage());
|
||||
LOGGER.error("error while loading the ROM database", e);
|
||||
}
|
||||
System.out.println("rom database loaded successfull");
|
||||
LOGGER.info("ROM database loaded successfull");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -91,9 +94,9 @@ public class dbController {
|
||||
connectionGames.setAutoCommit(false); //AutoCommit to false -> manual commit is active
|
||||
} catch (SQLException e) {
|
||||
// if the error message is "out of memory", it probably means no database file is found
|
||||
System.err.println(e.getMessage());
|
||||
LOGGER.error("error while loading the games database", e);
|
||||
}
|
||||
System.out.println("games database loaded successfull");
|
||||
LOGGER.info("games database loaded successfull");
|
||||
}
|
||||
|
||||
//creating database, if database has 0 entries search for all .rpx files in the roms directory and add them
|
||||
@ -103,8 +106,8 @@ public class dbController {
|
||||
stmt.executeUpdate("create table if not exists local_roms (title, coverPath, romPath, titleID, productCode, region, lastPlayed, timePlayed)");
|
||||
stmt.close();
|
||||
connection.commit();
|
||||
} catch (SQLException e1) {
|
||||
e1.printStackTrace();
|
||||
} catch (SQLException e) {
|
||||
LOGGER.error("error while creating ROM database", e);
|
||||
}
|
||||
|
||||
try {
|
||||
@ -115,9 +118,8 @@ public class dbController {
|
||||
}
|
||||
stmt.close();
|
||||
rs.close();
|
||||
}catch (SQLException ea){
|
||||
System.err.println("Ups! an error occured!");
|
||||
ea.printStackTrace();
|
||||
}catch (SQLException e){
|
||||
LOGGER.error("error while loading ROMs from ROM database, local_roms table", e);
|
||||
}
|
||||
if(entries.size() == 0){
|
||||
loadRomDirectory(mainWindowController.getRomPath());
|
||||
@ -129,7 +131,7 @@ public class dbController {
|
||||
stmt.executeUpdate("insert into local_roms values ('"+title+"','"+coverPath+"','"+romPath+"','"+titleID+"','"+productCode+"','"+region+"','"+lastPlayed+"','"+timePlayed+"')");
|
||||
connection.commit();
|
||||
stmt.close();
|
||||
System.out.println("added \""+title+"\" to databsae");
|
||||
LOGGER.info("added \""+title+"\" to ROM database");
|
||||
}
|
||||
|
||||
void removeRom(String titleID) throws SQLException{
|
||||
@ -137,12 +139,12 @@ public class dbController {
|
||||
stmt.executeUpdate("delete from local_roms where titleID = '"+titleID+"'");
|
||||
connection.commit();
|
||||
stmt.close();
|
||||
System.out.println("removed \""+titleID+"\" from databsae");
|
||||
LOGGER.info("removed \""+titleID+"\" from ROM database");
|
||||
}
|
||||
|
||||
//load all rom's on startup to the UI
|
||||
//load all ROMs on startup to the mainWindowController
|
||||
void loadAllRoms(){
|
||||
System.out.println("loading all rom's on startup to mwc ...");
|
||||
LOGGER.info("loading all rom's on startup into the mainWindowController ...");
|
||||
try {
|
||||
Statement stmt = connection.createStatement();
|
||||
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms");
|
||||
@ -152,13 +154,13 @@ public class dbController {
|
||||
stmt.close();
|
||||
rs.close();
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
LOGGER.error("error while loading all ROMs into the mainWindowController", e);
|
||||
}
|
||||
}
|
||||
|
||||
//load one single rom after manual adding one
|
||||
//load one single ROM after manual adding into the mainWindowController
|
||||
void loadSingleRom(String titleID){
|
||||
System.out.println("loading a single rom (ID: "+titleID+") to mwc ...");
|
||||
LOGGER.info("loading a single ROM (ID: "+titleID+") into the mainWindowController ...");
|
||||
try {
|
||||
Statement stmt = connection.createStatement();
|
||||
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms where titleID = '"+titleID+"'");
|
||||
@ -168,7 +170,7 @@ public class dbController {
|
||||
stmt.close();
|
||||
rs.close();
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
LOGGER.error("error while loading a single ROM into the mainWindowController", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -188,7 +190,7 @@ public class dbController {
|
||||
|
||||
try {
|
||||
Statement stmt = connectionGames.createStatement();
|
||||
System.out.println("Getting all .rpx files in " + dir.getCanonicalPath()+" including those in subdirectories \n");
|
||||
LOGGER.info("Getting all .rpx files in " + dir.getCanonicalPath()+" including those in subdirectories");
|
||||
List<File> files = (List<File>) FileUtils.listFiles(dir, extensions, true);
|
||||
for (File file : files) {
|
||||
if(System.getProperty("os.name").equals("Linux")){
|
||||
@ -201,16 +203,13 @@ public class dbController {
|
||||
Document document = documentBuilder.parse(appFile);
|
||||
String title_ID = document.getElementsByTagName("title_id").item(0).getTextContent();
|
||||
title_ID = title_ID.substring(0, 8) + "-" + title_ID.substring(8, title_ID.length());
|
||||
System.out.println("Name: "+file.getName()+"; Title ID: "+title_ID);
|
||||
LOGGER.info("Name: "+file.getName()+"; Title ID: "+title_ID);
|
||||
ResultSet rs = stmt.executeQuery("SELECT * FROM games WHERE TitleID = '"+title_ID+"';");
|
||||
while (rs.next()) {
|
||||
System.out.print(rs.getString(2));
|
||||
if (checkEntry(rs.getString(2))) {
|
||||
System.out.println(": game already in database");
|
||||
LOGGER.info(rs.getString(2) + ": game already in database");
|
||||
}else{
|
||||
System.out.println(": add game");
|
||||
System.out.println("adding cover to cache ...");
|
||||
|
||||
LOGGER.info("adding cover to cache ...");
|
||||
BufferedImage originalImage = ImageIO.read(new URL(rs.getString(6)));//change path to where file is located
|
||||
int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
|
||||
BufferedImage resizeImagePNG = resizeImage(originalImage, type, 400, 600);
|
||||
@ -221,15 +220,14 @@ public class dbController {
|
||||
ImageIO.write(resizeImagePNG, "png", new File(pictureCache+"\\"+rs.getString(3)+".png")); //change path where you want it saved
|
||||
coverPath = pictureCache+"\\"+rs.getString(3)+".png";
|
||||
}
|
||||
|
||||
|
||||
LOGGER.info(rs.getString(2) + ": adding ROM");
|
||||
addRom(rs.getString(2), coverPath, file.getCanonicalPath(), rs.getString(1), rs.getString(3), rs.getString(5),"","0");
|
||||
}
|
||||
}
|
||||
System.out.println("");
|
||||
}
|
||||
} catch (IOException | SQLException | ParserConfigurationException | SAXException e) {
|
||||
System.out.println("Ups something went wrong!");
|
||||
e.printStackTrace();
|
||||
LOGGER.error("error while loading ROMs from directory", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -244,8 +242,11 @@ public class dbController {
|
||||
}
|
||||
|
||||
private void checkRemoveEntry() {
|
||||
// TODO needs to be implemented!
|
||||
System.out.println("check if entry removed not done yet!");
|
||||
/**
|
||||
* TODO needs to be implemented!
|
||||
* don't show ROM on the UI, but keep all parameter in case it's showing up again ask if old data should be used
|
||||
*/
|
||||
//LOGGER.info("check if entry removed not done yet!");
|
||||
}
|
||||
|
||||
private static BufferedImage resizeImage(BufferedImage originalImage, int type, int IMG_WIDTH, int IMG_HEIGHT) {
|
||||
@ -264,7 +265,7 @@ public class dbController {
|
||||
connection.commit();
|
||||
stmt.close();
|
||||
}catch(SQLException e){
|
||||
e.printStackTrace();
|
||||
LOGGER.error("failed to set the last played", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -277,23 +278,24 @@ public class dbController {
|
||||
stmt.close();
|
||||
rs.close();
|
||||
}catch(SQLException e){
|
||||
e.printStackTrace();
|
||||
LOGGER.error("failed to get the last played", e);
|
||||
}
|
||||
return lastPlayed;
|
||||
}
|
||||
|
||||
void setTimePlayed(String timePlayed, String titleID){
|
||||
void setTotalPlaytime(String timePlayed, String titleID){
|
||||
try{
|
||||
Statement stmt = connection.createStatement();
|
||||
stmt.executeUpdate("UPDATE local_roms SET timePlayed='"+timePlayed+"' WHERE titleID = '"+titleID+"';");
|
||||
connection.commit();
|
||||
stmt.close();
|
||||
}catch(SQLException e){
|
||||
LOGGER.error("failed to set total play time", e);
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
String getTimePlayed(String titleID){
|
||||
String getTotalPlaytime(String titleID){
|
||||
String timePlayed = null;
|
||||
try{
|
||||
Statement stmt = connection.createStatement();
|
||||
@ -302,7 +304,7 @@ public class dbController {
|
||||
stmt.close();
|
||||
rs.close();
|
||||
}catch(SQLException e){
|
||||
e.printStackTrace();
|
||||
LOGGER.error("failed to get total play time", e);
|
||||
}
|
||||
return timePlayed;
|
||||
}
|
||||
|
@ -16,18 +16,23 @@ package application;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import javafx.application.Platform;
|
||||
|
||||
public class playGame extends Thread{
|
||||
|
||||
MainWindowController mainWindowController;
|
||||
dbController dbController;
|
||||
private static final Logger LOGGER = LogManager.getLogger(playGame.class.getName());
|
||||
|
||||
public playGame(MainWindowController m, dbController db){
|
||||
mainWindowController = m;
|
||||
dbController = db;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(){
|
||||
String selectedGameTitleID = mainWindowController.getSelectedGameTitleID();
|
||||
String executeComand;
|
||||
@ -55,22 +60,22 @@ public class playGame extends Thread{
|
||||
executeComand = mainWindowController.getCemuPath()+"\\Cemu.exe -g \""+mainWindowController.getGameExecutePath()+"\"";
|
||||
}
|
||||
}
|
||||
System.out.println(executeComand);
|
||||
LOGGER.info(executeComand);
|
||||
|
||||
p = Runtime.getRuntime().exec(executeComand);
|
||||
p.waitFor();
|
||||
endTime = System.currentTimeMillis();
|
||||
timePlayedNow = (int) Math.floor(((endTime - startTime)/1000/60));
|
||||
timePlayed = Integer.parseInt(dbController.getTimePlayed(selectedGameTitleID))+timePlayedNow;
|
||||
timePlayed = Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID))+timePlayedNow;
|
||||
|
||||
dbController.setTimePlayed(Integer.toString(timePlayed), selectedGameTitleID);
|
||||
dbController.setTotalPlaytime(Integer.toString(timePlayed), selectedGameTitleID);
|
||||
Platform.runLater(() -> {
|
||||
if(Integer.parseInt(dbController.getTimePlayed(selectedGameTitleID)) > 60){
|
||||
int hoursPlayed = (int) Math.floor(Integer.parseInt(dbController.getTimePlayed(selectedGameTitleID))/60);
|
||||
int minutesPlayed = Integer.parseInt(dbController.getTimePlayed(selectedGameTitleID))-60*hoursPlayed;
|
||||
mainWindowController.timePlayedBtn.setText(hoursPlayed+"h "+minutesPlayed+"min");
|
||||
if(Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID)) > 60){
|
||||
int hoursPlayed = (int) Math.floor(Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID))/60);
|
||||
int minutesPlayed = Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID))-60*hoursPlayed;
|
||||
mainWindowController.totalPlaytimeBtn.setText(hoursPlayed+"h "+minutesPlayed+"min");
|
||||
}else{
|
||||
mainWindowController.timePlayedBtn.setText(dbController.getTimePlayed(selectedGameTitleID)+ " min");
|
||||
mainWindowController.totalPlaytimeBtn.setText(dbController.getTotalPlaytime(selectedGameTitleID)+ " min");
|
||||
}
|
||||
mainWindowController.main.primaryStage.setIconified(false);
|
||||
});
|
||||
|
@ -11,6 +11,8 @@ import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import com.google.api.client.auth.oauth2.Credential;
|
||||
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
|
||||
@ -39,6 +41,7 @@ public class GoogleDriveController {
|
||||
private ArrayList<File> cloudSavegames = new ArrayList<>();
|
||||
private ArrayList<String> localSavegamesName = new ArrayList<>();
|
||||
private ArrayList<String> cloudSavegamesName = new ArrayList<>();
|
||||
private static final Logger LOGGER = LogManager.getLogger(GoogleDriveController.class.getName());
|
||||
|
||||
private final String APPLICATION_NAME ="cemu_Ui Drive API Controller";
|
||||
|
||||
@ -65,7 +68,7 @@ public class GoogleDriveController {
|
||||
DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
|
||||
folderID = "";
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
LOGGER.error("error", t);
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
@ -87,7 +90,7 @@ public class GoogleDriveController {
|
||||
.setAccessType("offline")
|
||||
.build();
|
||||
Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
|
||||
System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
|
||||
LOGGER.info("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
|
||||
return credential;
|
||||
}
|
||||
|
||||
@ -129,19 +132,19 @@ public class GoogleDriveController {
|
||||
FileInputStream fis = new FileInputStream(localSavegames.get(localSavegamesNumber));
|
||||
|
||||
if (cloudSavegames.get(i).getMd5Checksum().equals(org.apache.commons.codec.digest.DigestUtils.md5Hex(fis))) {
|
||||
System.out.println("both files are the same, nothing to do");
|
||||
LOGGER.info("both files are the same, nothing to do");
|
||||
} else {
|
||||
if (localModified >= cloudModified) {
|
||||
System.out.print("local is newer, ");
|
||||
LOGGER.info("local is newer");
|
||||
updateFile(cloudSavegames.get(i), localSavegames.get(localSavegamesNumber));
|
||||
} else {
|
||||
System.out.print("cloud is newer, ");
|
||||
LOGGER.info("cloud is newer");
|
||||
downloadFile(cloudSavegames.get(i));
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
System.out.print("file doesn't exist locally, ");
|
||||
LOGGER.info("file doesn't exist locally");
|
||||
downloadFile(cloudSavegames.get(i));
|
||||
}
|
||||
}
|
||||
@ -149,7 +152,7 @@ public class GoogleDriveController {
|
||||
// upload file to cloud which don't exist in the cloud
|
||||
for (int j = 0; j < localSavegames.size(); j++) {
|
||||
if (!cloudSavegamesName.contains(localSavegamesName.get(j))) {
|
||||
System.out.print("file doesn't exist in the cloud, ");
|
||||
LOGGER.info("file doesn't exist in the cloud");
|
||||
uploadFile(localSavegames.get(j));
|
||||
}
|
||||
}
|
||||
@ -157,13 +160,13 @@ public class GoogleDriveController {
|
||||
|
||||
//create a folder in google drive
|
||||
public void creatFolder() throws IOException {
|
||||
System.out.println("creating new folder");
|
||||
LOGGER.info("creating new folder");
|
||||
File fileMetadata = new File();
|
||||
fileMetadata.setName("cemu_savegames");
|
||||
fileMetadata.setMimeType("application/vnd.google-apps.folder");
|
||||
|
||||
File file = service.files().create(fileMetadata).setFields("id").execute();
|
||||
System.out.println("Folder ID: " + file.getId());
|
||||
LOGGER.info("Folder ID: " + file.getId());
|
||||
folderID = file.getId();
|
||||
}
|
||||
|
||||
@ -189,7 +192,7 @@ public class GoogleDriveController {
|
||||
String[] extensions = new String[] { "dat","sav","bin" };
|
||||
localSavegames.removeAll(localSavegames);
|
||||
localSavegamesName.removeAll(localSavegamesName);
|
||||
System.out.println("Getting all dat,sav,bin files in " + dir.getCanonicalPath()+" including those in subdirectories");
|
||||
LOGGER.info("Getting all dat,sav,bin files in " + dir.getCanonicalPath()+" including those in subdirectories");
|
||||
List<java.io.File> files = (List<java.io.File>) FileUtils.listFiles(dir, extensions, true);
|
||||
for (java.io.File file : files) {
|
||||
localSavegamesName.add(file.getParentFile().getName()+"_"+file.getName());
|
||||
@ -199,7 +202,7 @@ public class GoogleDriveController {
|
||||
|
||||
//reading all cloud savegames
|
||||
private void getCloudSavegames() throws IOException {
|
||||
System.out.println("getting all cloud savegames");
|
||||
LOGGER.info("getting all cloud savegames");
|
||||
cloudSavegames.removeAll(cloudSavegames);
|
||||
cloudSavegamesName.removeAll(cloudSavegamesName);
|
||||
Files.List request = service.files().list().setQ("'"+folderID+"' in parents").setFields("nextPageToken, files(id, name, size, modifiedTime, createdTime, md5Checksum)");
|
||||
@ -216,46 +219,45 @@ public class GoogleDriveController {
|
||||
FileList files = request.execute();
|
||||
|
||||
try {
|
||||
System.out.println("FolderID: " + files.getFiles().get(0).getId());
|
||||
LOGGER.info("FolderID: " + files.getFiles().get(0).getId());
|
||||
setFolderID(files.getFiles().get(0).getId());
|
||||
} catch (Exception e) {
|
||||
System.out.println("Oops, something went wrong! It seems that you have more than one folder called 'cemu_savegames'!");
|
||||
e.printStackTrace();
|
||||
LOGGER.error("Oops, something went wrong! It seems that you have more than one folder called 'cemu_savegames'!", e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//upload a file to the cloud from the local savegames folder
|
||||
public void uploadFile(java.io.File uploadFile) throws IOException{
|
||||
System.out.println("uploading " + uploadFile.getName() + "...");
|
||||
LOGGER.info("uploading " + uploadFile.getName() + " ...");
|
||||
File fileMetadata = new File();
|
||||
fileMetadata.setName(uploadFile.getParentFile().getName()+"_"+uploadFile.getName());
|
||||
fileMetadata.setParents(Collections.singletonList(folderID));
|
||||
fileMetadata.setModifiedTime(new DateTime(uploadFile.lastModified()));
|
||||
FileContent mediaContent = new FileContent("", uploadFile);
|
||||
File file = service.files().create(fileMetadata, mediaContent).setFields("id, parents").execute();
|
||||
System.out.println("upload successfull, File ID: " + file.getId());
|
||||
LOGGER.info("upload successfull, File ID: " + file.getId());
|
||||
}
|
||||
|
||||
//download a file from the cloud to the local savegames folder
|
||||
private void downloadFile(File downloadFile) throws IOException{
|
||||
System.out.print("downloading "+downloadFile.getName()+"... ");
|
||||
private void downloadFile(File downloadFile) throws IOException{
|
||||
LOGGER.info("downloading "+downloadFile.getName()+" ...");
|
||||
java.io.File directory = new java.io.File(cemuDirectory+"/mlc01/emulatorSave/"+ downloadFile.getName().substring(0,8));
|
||||
String file = downloadFile.getName().substring(9,downloadFile.getName().length());
|
||||
if(!directory.exists()) {
|
||||
System.out.print("dir dosent exist... ");
|
||||
LOGGER.info("dir dosent exist");
|
||||
directory.mkdir();
|
||||
}
|
||||
|
||||
OutputStream outputStream = new FileOutputStream(directory +"/"+ file);
|
||||
service.files().get(downloadFile.getId()).executeMediaAndDownloadTo(outputStream);
|
||||
outputStream.close();
|
||||
System.out.println("done");
|
||||
LOGGER.info("download successfull, File ID: " + file); //TODO add FileID
|
||||
}
|
||||
|
||||
//update a file in the cloud, by deleting the old one and uploading an new with the same id
|
||||
private void updateFile(File oldFile, java.io.File newFile) throws IOException {
|
||||
System.out.println("updating " +oldFile.getName()+"... ");
|
||||
LOGGER.info("updating " +oldFile.getName()+" ...");
|
||||
service.files().delete(oldFile.getId()).execute(); //deleting old file
|
||||
|
||||
//uploading new file
|
||||
@ -266,21 +268,19 @@ public class GoogleDriveController {
|
||||
|
||||
FileContent mediaContent = new FileContent("", newFile);
|
||||
File file = service.files().create(fileMetadata, mediaContent).setFields("id, parents").execute();
|
||||
System.out.println("File ID: " + file.getId());
|
||||
LOGGER.info("update successfull, File ID: " + file.getId());
|
||||
}
|
||||
|
||||
public void uploadAllFiles() {
|
||||
try {
|
||||
getLocalSavegames();
|
||||
System.out.println("uploading " + localSavegames.size() + " files...");
|
||||
LOGGER.info("uploading " + localSavegames.size() + " files ...");
|
||||
for (int i = 0; i < localSavegames.size(); i++) {
|
||||
uploadFile(localSavegames.get(i));
|
||||
}
|
||||
System.out.println("finished uploading all files!");
|
||||
LOGGER.info("finished uploading all files");
|
||||
} catch (IOException e) {
|
||||
//Auto-generated catch block
|
||||
System.out.println("Oops, there went something wrong! Error during uploading all files.");
|
||||
e.printStackTrace();
|
||||
LOGGER.error("error while uploading all files", e);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -13,14 +13,14 @@ import javafx.beans.property.StringProperty;
|
||||
public class CourseTableDataType extends RecursiveTreeObject<CourseTableDataType> {
|
||||
|
||||
public final StringProperty title;
|
||||
public final IntegerProperty downloads;
|
||||
public final StringProperty id;
|
||||
public final IntegerProperty time;
|
||||
public final IntegerProperty stars;
|
||||
public final IntegerProperty id;
|
||||
|
||||
public CourseTableDataType(String title, int downloads, int stars, int id) {
|
||||
public CourseTableDataType(String title, String id, int time, int stars) {
|
||||
this.title = new SimpleStringProperty(title);
|
||||
this.downloads = new SimpleIntegerProperty(downloads);
|
||||
this.id = new SimpleStringProperty(id);
|
||||
this.time = new SimpleIntegerProperty(time);
|
||||
this.stars = new SimpleIntegerProperty(stars);
|
||||
this.id = new SimpleIntegerProperty(id);
|
||||
}
|
||||
}
|
||||
|
@ -10,58 +10,43 @@ import javafx.beans.property.StringProperty;
|
||||
|
||||
public class SmmdbApiDataType {
|
||||
|
||||
private final IntegerProperty id = new SimpleIntegerProperty();
|
||||
private final IntegerProperty owner = new SimpleIntegerProperty();
|
||||
private final IntegerProperty coursetype = new SimpleIntegerProperty();
|
||||
private final IntegerProperty leveltype = new SimpleIntegerProperty();
|
||||
private final IntegerProperty courseTheme = new SimpleIntegerProperty();
|
||||
private final IntegerProperty gameStyle = new SimpleIntegerProperty();
|
||||
private final IntegerProperty difficulty = new SimpleIntegerProperty();
|
||||
private final IntegerProperty lastmodified = new SimpleIntegerProperty();
|
||||
private final IntegerProperty uploaded = new SimpleIntegerProperty();
|
||||
private final IntegerProperty downloads = new SimpleIntegerProperty();
|
||||
private final IntegerProperty autoScroll = new SimpleIntegerProperty();
|
||||
private final IntegerProperty stars = new SimpleIntegerProperty();
|
||||
private final IntegerProperty hasimage = new SimpleIntegerProperty();
|
||||
private final IntegerProperty ispackage = new SimpleIntegerProperty();
|
||||
private final IntegerProperty updatereq = new SimpleIntegerProperty();
|
||||
private final IntegerProperty time = new SimpleIntegerProperty();
|
||||
private final StringProperty owner = new SimpleStringProperty();
|
||||
private final StringProperty id = new SimpleStringProperty();
|
||||
private final StringProperty nintendoid = new SimpleStringProperty();
|
||||
private final StringProperty title = new SimpleStringProperty();
|
||||
|
||||
public SmmdbApiDataType(final int id, final int owner, final int coursetype, final int leveltype, final int difficulty,
|
||||
final int lastmodified, final int uploaded, final int downloads, final int stars, final int hasimage,
|
||||
final int ispackage, final int updatereq, final String nintendoid, final String title) {
|
||||
public SmmdbApiDataType(final int courseTheme, final int gameStyle, final int difficulty, final int lastmodified,
|
||||
final int uploaded, final int autoScroll, final int stars, final int time,
|
||||
final String owner, final String id, final String nintendoid, final String title) {
|
||||
this.id.set(id);
|
||||
this.owner.set(owner);
|
||||
this.coursetype.set(coursetype);
|
||||
this.leveltype.set(leveltype);
|
||||
this.courseTheme.set(courseTheme);
|
||||
this.gameStyle.set(gameStyle);
|
||||
this.difficulty.set(difficulty);
|
||||
this.lastmodified.set(lastmodified);
|
||||
this.uploaded.set(uploaded);
|
||||
this.downloads.set(downloads);
|
||||
this.autoScroll.set(autoScroll);
|
||||
this.stars.set(stars);
|
||||
this.hasimage.set(hasimage);
|
||||
this.ispackage.set(ispackage);
|
||||
this.updatereq.set(updatereq);
|
||||
this.time.set(time);
|
||||
this.nintendoid.set(nintendoid);
|
||||
this.title.set(title);
|
||||
}
|
||||
|
||||
public IntegerProperty idProperty(){
|
||||
return id;
|
||||
public IntegerProperty courseThemeProperty(){
|
||||
return courseTheme;
|
||||
}
|
||||
|
||||
public IntegerProperty ownerProperty(){
|
||||
return owner;
|
||||
}
|
||||
|
||||
public IntegerProperty coursetypeProperty(){
|
||||
return coursetype;
|
||||
}
|
||||
|
||||
public StringProperty nintendoidProperty(){
|
||||
return nintendoid;
|
||||
}
|
||||
|
||||
public IntegerProperty leveltypeProperty(){
|
||||
return leveltype;
|
||||
public IntegerProperty gameStyleProperty(){
|
||||
return gameStyle;
|
||||
}
|
||||
|
||||
public IntegerProperty difficultyProperty(){
|
||||
@ -76,44 +61,40 @@ public class SmmdbApiDataType {
|
||||
return uploaded;
|
||||
}
|
||||
|
||||
public IntegerProperty downloadsProperty(){
|
||||
return downloads;
|
||||
public IntegerProperty autoScrollProperty(){
|
||||
return autoScroll;
|
||||
}
|
||||
|
||||
public IntegerProperty starsProperty(){
|
||||
return stars;
|
||||
}
|
||||
|
||||
public IntegerProperty hasimageProperty(){
|
||||
return hasimage;
|
||||
public IntegerProperty timeProperty(){
|
||||
return time;
|
||||
}
|
||||
|
||||
public IntegerProperty ispackageProperty(){
|
||||
return ispackage;
|
||||
public StringProperty ownerProperty(){
|
||||
return owner;
|
||||
}
|
||||
|
||||
public IntegerProperty updatereqProperty(){
|
||||
return updatereq;
|
||||
public StringProperty idProperty(){
|
||||
return id;
|
||||
}
|
||||
|
||||
public StringProperty nintendoidProperty(){
|
||||
return nintendoid;
|
||||
}
|
||||
|
||||
public StringProperty titleProperty(){
|
||||
return title;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return idProperty().get();
|
||||
public int getCourseTheme() {
|
||||
return courseThemeProperty().get();
|
||||
}
|
||||
|
||||
public int getOwner() {
|
||||
return ownerProperty().get();
|
||||
}
|
||||
|
||||
public int getCoursetype() {
|
||||
return coursetypeProperty().get();
|
||||
}
|
||||
|
||||
public int getLeveltype() {
|
||||
return leveltypeProperty().get();
|
||||
public int getGameStyle() {
|
||||
return gameStyleProperty().get();
|
||||
}
|
||||
|
||||
public int getDifficulty() {
|
||||
@ -128,24 +109,24 @@ public class SmmdbApiDataType {
|
||||
return uploadedProperty().get();
|
||||
}
|
||||
|
||||
public int getDownloads() {
|
||||
return downloadsProperty().get();
|
||||
public int getAutoScroll() {
|
||||
return autoScrollProperty().get();
|
||||
}
|
||||
|
||||
public int getStars() {
|
||||
return starsProperty().get();
|
||||
}
|
||||
|
||||
public int getHasimage() {
|
||||
return hasimageProperty().get();
|
||||
public int getTime() {
|
||||
return timeProperty().get();
|
||||
}
|
||||
|
||||
public int getIspackage() {
|
||||
return ispackageProperty().get();
|
||||
public String getOwner() {
|
||||
return ownerProperty().get();
|
||||
}
|
||||
|
||||
public int getUpdatereq() {
|
||||
return updatereqProperty().get();
|
||||
public String getId() {
|
||||
return idProperty().get();
|
||||
}
|
||||
|
||||
public String getNintendoid() {
|
||||
@ -156,20 +137,12 @@ public class SmmdbApiDataType {
|
||||
return titleProperty().get();
|
||||
}
|
||||
|
||||
public final void setId(int id) {
|
||||
idProperty().set(id);
|
||||
public final void setCourseTheme(int courseTheme) {
|
||||
courseThemeProperty().set(courseTheme);
|
||||
}
|
||||
|
||||
public final void setOwner(int owner) {
|
||||
ownerProperty().set(owner);
|
||||
}
|
||||
|
||||
public final void setCoursetype(int coursetype) {
|
||||
coursetypeProperty().set(coursetype);
|
||||
}
|
||||
|
||||
public final void setLeveltype(int leveltype) {
|
||||
leveltypeProperty().set(leveltype);
|
||||
public final void setGameStyle(int gameStyle) {
|
||||
gameStyleProperty().set(gameStyle);
|
||||
}
|
||||
|
||||
public final void setDifficulty(int difficulty) {
|
||||
@ -184,26 +157,26 @@ public class SmmdbApiDataType {
|
||||
uploadedProperty().set(uploaded);
|
||||
}
|
||||
|
||||
public final void setDownloads(int downloads) {
|
||||
downloadsProperty().set(downloads);
|
||||
public final void setAutoScroll(int autoScroll) {
|
||||
autoScrollProperty().set(autoScroll);
|
||||
}
|
||||
|
||||
public final void setStars(int stars) {
|
||||
starsProperty().set(stars);
|
||||
}
|
||||
|
||||
public final void setHasimage(int hasimage) {
|
||||
hasimageProperty().set(hasimage);
|
||||
|
||||
public final void setTime(int time) {
|
||||
timeProperty().set(time);
|
||||
}
|
||||
|
||||
public final void setIspackage(int ispackage) {
|
||||
ispackageProperty().set(ispackage);
|
||||
public final void setOwner(String owner) {
|
||||
ownerProperty().set(owner);
|
||||
}
|
||||
|
||||
public final void setUpdatereq(int updatereq) {
|
||||
updatereqProperty().set(updatereq);
|
||||
public final void setId(String id) {
|
||||
idProperty().set(id);
|
||||
}
|
||||
|
||||
|
||||
public final void setNintendoid(String nintendoid) {
|
||||
nintendoidProperty().set(nintendoid);
|
||||
}
|
||||
|
BIN
src/libraries/flow-8.0.1.jar
Normal file
BIN
src/libraries/flow-8.0.1.jar
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
src/libraries/log4j-api-2.8.2.jar
Normal file
BIN
src/libraries/log4j-api-2.8.2.jar
Normal file
Binary file not shown.
BIN
src/libraries/log4j-core-2.8.2.jar
Normal file
BIN
src/libraries/log4j-core-2.8.2.jar
Normal file
Binary file not shown.
Binary file not shown.
BIN
src/libraries/sqlite-jdbc-3.20.0.jar
Normal file
BIN
src/libraries/sqlite-jdbc-3.20.0.jar
Normal file
Binary file not shown.
BIN
src/libraries/zip4j-1.3.2.jar
Normal file
BIN
src/libraries/zip4j-1.3.2.jar
Normal file
Binary file not shown.
20
src/log4j2.xml
Normal file
20
src/log4j2.xml
Normal file
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Configuration status="INFO">
|
||||
<Appenders>
|
||||
|
||||
<Console name="console" target="SYSTEM_OUT">
|
||||
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] %c{1} - %msg%n" />
|
||||
</Console>
|
||||
|
||||
<File name="file" fileName="${sys:logFilename}" immediateFlush="true">
|
||||
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] %c{1} - %msg%n" />
|
||||
</File>
|
||||
|
||||
</Appenders>
|
||||
<Loggers>
|
||||
<Root level="debug" additivity="false">
|
||||
<AppenderRef ref="console" />
|
||||
<AppenderRef ref="file"/>
|
||||
</Root>
|
||||
</Loggers>
|
||||
</Configuration>
|
Reference in New Issue
Block a user