16 Commits
0.1.6 ... 0.1.7

Author SHA1 Message Date
959963f9bc more logger work and lib updates
* jfoenix 1.7.0 -> 1.8.0
* sqlite 3.19.1 -> 3.20.0
* replaced all remaining syso/syse with logger output
* fixed a bug in smmdb api integration by only requesting the first 70 courses (this is a temporary workaround)
* code clean up
* typo fixes
2017-09-12 15:04:21 +02:00
85fc66e8d6 logging to file
* the logger output is now written into a file in the cemu_UI directory called app.log
2017-09-02 17:38:40 +02:00
6c1663f386 reworked loadSettings
* loadSettings() should be 100% bulletproof
* replaced a few more syso with logger
2017-08-30 11:29:58 +02:00
71cf0316ec replace syso with logger
* replacing all debug/info syso and all syse with log4j 2 logger
2017-08-27 20:44:08 +02:00
dec767f553 Merge remote-tracking branch 'origin/master' 2017-08-27 18:23:36 +02:00
a24783f18c code clean up
* smmdb api query is not started anymore when closing the smmdb window
* general code clean up
2017-08-27 18:23:09 +02:00
9f0956a674 code clean up
* smmdb api query is not started anymore on closing the smmdb window
* general code clean up
2017-08-27 18:22:05 +02:00
dbd52cbe9c smmdb api integration rework
* fixed wrong placment of the downloaded courses
2017-08-27 17:25:41 +02:00
4c8a0a51e9 smmdb api integration rework part 2/2
* fixed all remaining parameters
* course is downloaded as .zip now
* junrar is replaced by zip4j
2017-08-26 00:13:09 +02:00
7a2112a759 smmd rework part 1
due to changes on the smmdb api i have to rework the smmdb integration
2017-08-25 14:57:15 +02:00
9930a4cb15 added a smmID
* added 44fc5929 to smmIDs
2017-08-24 22:04:06 +02:00
d36b869e80 updated build number 2017-08-11 20:04:36 +02:00
43a7e22254 fixed loading error
* fixed an issue with loading sttings when no cloudService is set
2017-08-11 20:01:43 +02:00
07d33df63a updated libraries
* jfoenix 1.4.0 -> 1.7.0
* sqlite-jdbc 3.18.0 -> 3.19.3
* flow 8.0.1
2017-08-01 20:20:37 +02:00
e394b1a573 Material styled dialogs
* added material styled dialogs
2017-08-01 20:11:17 +02:00
a30def1fd0 Update README.md 2017-07-26 18:08:26 +02:00
58 changed files with 686 additions and 465 deletions

View File

@ -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>

View File

@ -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 ![#f03c15](https://placehold.it/15/fbca04/000000?text=+)`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
![Screenshot](/downloadContent/cemu_UI4.png)

2
bin/.gitignore vendored
View File

@ -1 +1,3 @@
/application/
/resources/
/cloudControllerInstances/

Binary file not shown.

View File

@ -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.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -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,

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.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

20
bin/log4j2.xml Normal file
View 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>

View File

@ -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")) {
}
}
}
}

View File

@ -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);
}
}

View File

@ -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>

View File

@ -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();

View File

@ -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,

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
});

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}

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.

20
src/log4j2.xml Normal file
View 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>