Compare commits
101 Commits
Author | SHA1 | Date | |
---|---|---|---|
b610dc337b | |||
f195addea8 | |||
41a0becd4f | |||
9b7a85cabe | |||
cc4e73c45d | |||
c6a40f8937 | |||
e13c84382f | |||
ea34f10c09 | |||
4e4d32dc97 | |||
5758b23bff | |||
1e7cea86ad | |||
433767f81c | |||
f9f63c0f3c | |||
fcaffecabf | |||
7813778502 | |||
662188813b | |||
b915cf7ad9 | |||
b4fc36621a | |||
061f58105a | |||
3a6a7b7cce | |||
f7675cf277 | |||
4932731987 | |||
2e3395caea | |||
e9d033f121 | |||
54078eb99f | |||
79cb1c2476 | |||
b88c530ac2 | |||
88e31468d4 | |||
84b5eaedcd | |||
f331fb57a4 | |||
a9f675ee5e | |||
fe4fcb45d7 | |||
52c2912ba2 | |||
46455e9e9d | |||
1e2d4088e9 | |||
d3acf387d9 | |||
de2c8d76ea | |||
9be124a5f3 | |||
a020992cc2 | |||
8c5d511dfb | |||
c73d02c433 | |||
34bed89b40 | |||
ce52628554 | |||
fc0be39455 | |||
595bfbe07d | |||
599669f0f2 | |||
42b8434a58 | |||
9b443dfeae | |||
c70786cdf4 | |||
a3a7d415c7 | |||
9ccb7e6b42 | |||
1aab6fdeb5 | |||
45c36aa09c | |||
99574ce6ef | |||
3289bb4aed | |||
a1bab241b6 | |||
02d7cb6a3e | |||
e92a43a37e | |||
75d8e6b525 | |||
548629eeaf | |||
37d55abe9a | |||
68d3445afe | |||
4851f0c3a4 | |||
c4a0a5d5f9 | |||
95df2b9359 | |||
e4bf16e7a1 | |||
0cfbd2b125 | |||
2e200e5a88 | |||
b9b7b143e5 | |||
46c57ef330 | |||
e0a73a1fbe | |||
0f7d262bcb | |||
b975a6300c | |||
c6737fc387 | |||
f5e16d2f58 | |||
73bb433d03 | |||
5f756f613f | |||
fe6ddedab9 | |||
922b1443e1 | |||
ba9fd1bb32 | |||
15196718c5 | |||
890830b84e | |||
2b17d34841 | |||
0a208f5a6b | |||
88a83e5f0d | |||
1268ab9cf8 | |||
6a2c5d050f | |||
b8f4f89ec6 | |||
dafd0b84df | |||
06429eaf87 | |||
9e3b553851 | |||
61e02f6ac1 | |||
40c6084412 | |||
6cc9790c5a | |||
3bcbf902d5 | |||
3f85fdf07b | |||
40dd2c48d3 | |||
1a4027e687 | |||
b76126add1 | |||
9c4934966c | |||
74440e3d7e |
56
.classpath
56
.classpath
@ -1,29 +1,33 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<classpath>
|
<classpath>
|
||||||
<classpathentry kind="src" path="src"/>
|
<classpathentry kind="src" output="target/classes" path="src/main/java">
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
|
<attributes>
|
||||||
<classpathentry kind="con" path="org.eclipse.fx.ide.jdt.core.JAVAFX_CONTAINER"/>
|
<attribute name="optional" value="true"/>
|
||||||
<classpathentry kind="lib" path="src/libraries/minimal-json-0.9.4.jar"/>
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
<classpathentry kind="lib" path="src/libraries/commons-vfs2-2.1.1744488.2.jar"/>
|
</attributes>
|
||||||
<classpathentry kind="lib" path="src/libraries/flow-8.0.1.jar"/>
|
</classpathentry>
|
||||||
<classpathentry kind="lib" path="src/libraries/zip4j-1.3.2.jar"/>
|
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
|
||||||
<classpathentry kind="lib" path="src/libraries/log4j-api-2.8.2.jar"/>
|
<attributes>
|
||||||
<classpathentry kind="lib" path="src/libraries/log4j-core-2.8.2.jar"/>
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
<classpathentry kind="lib" path="src/libraries/sqlite-jdbc-3.20.0.jar"/>
|
</attributes>
|
||||||
<classpathentry kind="lib" path="src/libraries/jfoenix-1.9.1.jar"/>
|
</classpathentry>
|
||||||
<classpathentry kind="lib" path="src/libraries/commons-codec-1.11.jar"/>
|
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
|
||||||
<classpathentry kind="lib" path="src/libraries/commons-io-2.6.jar"/>
|
<attributes>
|
||||||
<classpathentry kind="lib" path="src/libraries/google_api_libraries/google-api-client-1.23.0.jar"/>
|
<attribute name="optional" value="true"/>
|
||||||
<classpathentry kind="lib" path="src/libraries/google_api_libraries/google-api-services-drive-v3-rev87-1.23.0.jar"/>
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
<classpathentry kind="lib" path="src/libraries/google_api_libraries/google-http-client-1.23.0.jar"/>
|
</attributes>
|
||||||
<classpathentry kind="lib" path="src/libraries/google_api_libraries/google-http-client-jackson2-1.23.0.jar"/>
|
</classpathentry>
|
||||||
<classpathentry kind="lib" path="src/libraries/google_api_libraries/google-oauth-client-1.23.0.jar"/>
|
<classpathentry kind="src" path="src/test/main"/>
|
||||||
<classpathentry kind="lib" path="src/libraries/google_api_libraries/google-oauth-client-java6-1.23.0.jar"/>
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-9">
|
||||||
<classpathentry kind="lib" path="src/libraries/google_api_libraries/google-oauth-client-jetty-1.23.0.jar"/>
|
<attributes>
|
||||||
<classpathentry kind="lib" path="src/libraries/google_api_libraries/jackson-core-2.9.2.jar"/>
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
<classpathentry kind="lib" path="src/libraries/google_api_libraries/javax.servlet-api-4.0.0.jar"/>
|
</attributes>
|
||||||
<classpathentry kind="lib" path="src/libraries/google_api_libraries/jetty-6.1.26.jar"/>
|
</classpathentry>
|
||||||
<classpathentry kind="lib" path="src/libraries/google_api_libraries/jetty-util-6.1.26.jar"/>
|
<classpathentry exported="true" kind="con" path="org.eclipse.fx.ide.jdt.core.JAVAFX_CONTAINER"/>
|
||||||
<classpathentry kind="lib" path="src/libraries/commons-logging-1.1.1.jar"/>
|
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
|
||||||
<classpathentry kind="output" path="bin"/>
|
<attributes>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="output" path="target/classes"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -48,4 +48,5 @@ Temporary Items
|
|||||||
config.xml
|
config.xml
|
||||||
client_secret.json
|
client_secret.json
|
||||||
.directory
|
.directory
|
||||||
|
target/
|
||||||
|
cemu_UI.jar
|
||||||
|
6
.project
6
.project
@ -15,8 +15,14 @@
|
|||||||
<arguments>
|
<arguments>
|
||||||
</arguments>
|
</arguments>
|
||||||
</buildCommand>
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.m2e.core.maven2Builder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
</buildSpec>
|
</buildSpec>
|
||||||
<natures>
|
<natures>
|
||||||
|
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
||||||
<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
|
<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
</natures>
|
</natures>
|
||||||
|
5
.settings/org.eclipse.core.resources.prefs
Normal file
5
.settings/org.eclipse.core.resources.prefs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
eclipse.preferences.version=1
|
||||||
|
encoding//src/main/java=UTF-8
|
||||||
|
encoding//src/main/resources=UTF-8
|
||||||
|
encoding//src/test/java=UTF-8
|
||||||
|
encoding/<project>=UTF-8
|
@ -1,12 +1,13 @@
|
|||||||
eclipse.preferences.version=1
|
eclipse.preferences.version=1
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
|
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=9
|
||||||
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
||||||
org.eclipse.jdt.core.compiler.compliance=1.8
|
org.eclipse.jdt.core.compiler.compliance=9
|
||||||
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
||||||
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
||||||
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
||||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
org.eclipse.jdt.core.compiler.source=1.8
|
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
||||||
|
org.eclipse.jdt.core.compiler.source=9
|
||||||
|
4
.settings/org.eclipse.m2e.core.prefs
Normal file
4
.settings/org.eclipse.m2e.core.prefs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
activeProfiles=
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
resolveWorkspaceProjects=true
|
||||||
|
version=1
|
4
.travis.yml
Normal file
4
.travis.yml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
language: java
|
||||||
|
jdk:
|
||||||
|
- oraclejdk9
|
||||||
|
- oraclejdk10
|
33
CONTRIBUTING.md
Normal file
33
CONTRIBUTING.md
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# Contributing to cemu_UI
|
||||||
|
The following is a set of guidelines for contributing to cemu_UI.
|
||||||
|
|
||||||
|
## Translating
|
||||||
|
If you don't want to contibute any code you can support this project by translating it! The translation files are stored in "src/main/resources/locals".
|
||||||
|
|
||||||
|
# Contributing code
|
||||||
|
If you want to contibute code please read the java code styleguide.
|
||||||
|
|
||||||
|
## Java code sytleguide
|
||||||
|
If your willing to contribute to cemu_UI please us the following example as guide and rules to design your code.
|
||||||
|
* Use names for methods and variables that clarify their purpose. (This will help a lot to understand the code)
|
||||||
|
* Use as many spaces as necessary to make the code clear, but as little as possible.
|
||||||
|
* Sort all variables according to their type.
|
||||||
|
* For all (debugging) console outputs, use the log4j based logger. (syso/syse is okay for testing)
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Use this as a sample Class:
|
||||||
|
public ClassName () {
|
||||||
|
|
||||||
|
void MethodName () {
|
||||||
|
double gameID; // Title-ID used on the Wii U
|
||||||
|
|
||||||
|
if (gameID == null) {
|
||||||
|
// Do something
|
||||||
|
}
|
||||||
|
|
||||||
|
// more code ...
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
17
LICENSE
17
LICENSE
@ -1,13 +1,4 @@
|
|||||||
"THE CHOCOLATE-WARE LICENSE" (Revision 1):
|
GNU GENERAL PUBLIC LICENSE
|
||||||
<@Seil0> wrote this file. As long as you retain
|
|
||||||
this notice this software is licensed under the
|
|
||||||
GNU GENERAL PUBLIC LICENSE Version 3 ,with the following additions:
|
|
||||||
* If we meet some day, and you think this stuff is worth it,
|
|
||||||
you can buy me a chocolate in return. - @Seil0
|
|
||||||
(license based in Beer-ware, see https://fedoraproject.org/wiki/Licensing/Beerware )
|
|
||||||
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
@ -640,8 +631,8 @@ to attach them to the start of each source file to most effectively
|
|||||||
state the exclusion of warranty; and each file should have at least
|
state the exclusion of warranty; and each file should have at least
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
{one line to give the program's name and a brief idea of what it does.}
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
Copyright (C) {year} {name of author}
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -661,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
|
|||||||
If the program does terminal interaction, make it output a short
|
If the program does terminal interaction, make it output a short
|
||||||
notice like this when it starts in an interactive mode:
|
notice like this when it starts in an interactive mode:
|
||||||
|
|
||||||
{project} Copyright (C) {year} {fullname}
|
<program> Copyright (C) <year> <name of author>
|
||||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
This is free software, and you are welcome to redistribute it
|
This is free software, and you are welcome to redistribute it
|
||||||
under certain conditions; type `show c' for details.
|
under certain conditions; type `show c' for details.
|
||||||
|
28
README.md
28
README.md
@ -1,41 +1,39 @@
|
|||||||
# cemu_UI
|
# cemu_UI
|
||||||
|
|
||||||

|

|
||||||
|
[](https://travis-ci.org/Seil0/cemu_UI)
|
||||||
[](https://github.com/Seil0/cemu_UI/releases)
|
[](https://github.com/Seil0/cemu_UI/releases)
|
||||||
|
[](http://hits.dwyl.io/Seil0/cemu_UI)
|
||||||
[](https://www.gnu.org/licenses/gpl-3.0)
|
[](https://www.gnu.org/licenses/gpl-3.0)
|
||||||
|
|
||||||
cemu_UI is a simple, material design graphical frontend for [cemu](http://cemu.info/), a Wii U emulator. Downloads can be found [here](https://github.com/Seil0/cemu_UI/releases).
|
cemu_UI is a simple, material design graphical frontend for [cemu](http://cemu.info/), a Wii U emulator. Downloads can be found [here](https://git.mosad.xyz/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 and 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!**
|
Simply download the cemu_UI.jar from [Releases](https://git.mosad.xyz/Seil0/cemu_UI/releases), make sure you have the latest version of java 8 oracle jre/jdk installed and 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!
|
If you want to use the cloud sync function read the [wiki](https://git.mosad.xyz/Seil0/cemu_UI/wiki#cloud-savegame-syncronisation) carefully!
|
||||||
|
|
||||||
|
### [FAQ](https://git.mosad.xyz/Seil0/cemu_UI/wiki#faq)
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
* launch Games
|
* launch Games
|
||||||
* Time played in total
|
* Time played in total
|
||||||
* last time played
|
* last time played
|
||||||
* easyer way to add updates & DLCs (only adding not downloading!)
|
* add updates and dlcs easier (only adding not downloading!)
|
||||||
* automatic rom detection (only .rpx files with a app.xml)
|
* automatic rom detection (only .rpx files with a app.xml)
|
||||||
* customisable UI
|
* customisable UI
|
||||||
* [sync savegames via google drive](https://github.com/Seil0/cemu_UI/wiki)
|
* [sync savegames via google drive](https://git.mosad.xyz/Seil0/cemu_UI/wiki)
|
||||||
* [smmdb api](https://github.com/Tarnadas/smmdb) integration
|
* [smmdb api](https://github.com/Tarnadas/smmdb) integration
|
||||||
|
|
||||||
## [planed Features](https://github.com/Seil0/cemu_UI/projects/1) (no ETA)
|
## [planed Features](https://git.mosad.xyz/Seil0/cemu_UI/milestones)
|
||||||
|
|
||||||
* Controller support
|
* Controller support
|
||||||
* more UI improvements
|
|
||||||
* support more rom file formats in automatic detection
|
|
||||||
|
|
||||||
### If you have another idea, make a "new issue" with the `idea` lable
|
### If you have another idea, make a new issue!
|
||||||
|
|
||||||
## [FAQ](https://github.com/Seil0/cemu_UI/wiki#faq)
|
### [building from source](https://git.mosad.xyz/Seil0/cemu_UI/wiki/Documantation)
|
||||||
|
|
||||||
### [building from source](https://github.com/Seil0/cemu_UI/wiki/Documantation)
|
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
3
bin/.gitignore
vendored
3
bin/.gitignore
vendored
@ -1,3 +0,0 @@
|
|||||||
/application/
|
|
||||||
/cloudControllerInstances/
|
|
||||||
/datatypes/
|
|
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.
@ -1,124 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<?import com.jfoenix.controls.JFXButton?>
|
|
||||||
<?import com.jfoenix.controls.JFXColorPicker?>
|
|
||||||
<?import com.jfoenix.controls.JFXHamburger?>
|
|
||||||
<?import com.jfoenix.controls.JFXTextField?>
|
|
||||||
<?import com.jfoenix.controls.JFXToggleButton?>
|
|
||||||
<?import com.jfoenix.controls.JFXTreeTableView?>
|
|
||||||
<?import javafx.geometry.Insets?>
|
|
||||||
<?import javafx.scene.control.Label?>
|
|
||||||
<?import javafx.scene.control.ScrollPane?>
|
|
||||||
<?import javafx.scene.image.ImageView?>
|
|
||||||
<?import javafx.scene.layout.AnchorPane?>
|
|
||||||
<?import javafx.scene.layout.HBox?>
|
|
||||||
<?import javafx.scene.layout.VBox?>
|
|
||||||
<?import javafx.scene.text.Font?>
|
|
||||||
<?import javafx.scene.text.TextFlow?>
|
|
||||||
|
|
||||||
<AnchorPane fx:id="mainAnchorPane" prefHeight="600.0" prefWidth="904.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MainWindowController">
|
|
||||||
<children>
|
|
||||||
<ScrollPane fx:id="mainScrollPane" fitToWidth="true" layoutY="38.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="38.0">
|
|
||||||
<content>
|
|
||||||
<AnchorPane fx:id="gamesAnchorPane">
|
|
||||||
<padding>
|
|
||||||
<Insets bottom="17.0" />
|
|
||||||
</padding></AnchorPane>
|
|
||||||
</content>
|
|
||||||
</ScrollPane>
|
|
||||||
<HBox fx:id="topHBox" prefHeight="38.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
|
||||||
<children>
|
|
||||||
<JFXHamburger fx:id="menuHam" prefHeight="38.0" prefWidth="38.0" stylesheets="@MainWindows.css" />
|
|
||||||
</children>
|
|
||||||
</HBox>
|
|
||||||
<VBox fx:id="sideMenuVBox" layoutY="32.0" prefHeight="568.0" prefWidth="175.0" visible="false" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.topAnchor="38.0">
|
|
||||||
<children>
|
|
||||||
<JFXButton fx:id="aboutBtn" alignment="TOP_LEFT" maxHeight="38.0" maxWidth="190.0" onAction="#aboutBtnAction" prefHeight="38.0" prefWidth="190.0" text="About" textAlignment="LEFT">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</JFXButton>
|
|
||||||
<JFXButton fx:id="settingsBtn" alignment="TOP_LEFT" maxHeight="38.0" maxWidth="213.0" onAction="#settingsBtnAction" prefHeight="38.0" prefWidth="213.0" text="Settings" textAlignment="LEFT">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</JFXButton>
|
|
||||||
<JFXButton fx:id="addBtn" alignment="TOP_LEFT" maxHeight="38.0" maxWidth="193.0" onAction="#addBtnAction" prefHeight="38.0" prefWidth="193.0" text="Add new Game" textAlignment="LEFT">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</JFXButton>
|
|
||||||
<JFXButton fx:id="reloadRomsBtn" alignment="TOP_LEFT" maxHeight="38.0" maxWidth="199.0" onAction="#reloadRomsBtnAction" prefHeight="38.0" prefWidth="199.0" text="reload roms" textAlignment="LEFT">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</JFXButton>
|
|
||||||
<JFXButton fx:id="smmdbBtn" alignment="TOP_LEFT" onAction="#smmdbBtnAction" prefHeight="38.0" prefWidth="216.0" text="smmdb">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</JFXButton>
|
|
||||||
</children>
|
|
||||||
</VBox>
|
|
||||||
<ScrollPane fx:id="settingsScrollPane" style="-fx-background: white;" visible="false" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="175.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="38.0">
|
|
||||||
<content>
|
|
||||||
<!-- space between settings sections 35px, between sections elements (label + element) 20px, between label and element 3px(or more) -->
|
|
||||||
<AnchorPane fx:id="settingsAnchorPane" prefHeight="562.0" prefWidth="511.0" style="-fx-background-color: white;">
|
|
||||||
<children>
|
|
||||||
<Label fx:id="cemuDirectoryLbl" layoutX="10.0" layoutY="39.0" text="Cemu Directory" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="39.0" />
|
|
||||||
<JFXTextField fx:id="cemuTextField" layoutX="10.0" layoutY="59.0" maxWidth="305.0" minWidth="305.0" onAction="#cemuTextFieldAction" prefHeight="32.0" prefWidth="305.0" promptText="cemu directory" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="59.0" />
|
|
||||||
<JFXTextField fx:id="romTextField" layoutX="10.0" layoutY="131.0" maxWidth="305.0" minWidth="305.0" onAction="#romTextFieldAction" prefHeight="32.0" prefWidth="305.0" promptText="rom directory" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="131.0" />
|
|
||||||
<JFXButton fx:id="romTFBtn" layoutX="329.0" layoutY="131.0" onAction="#romTFBtnAction" prefHeight="32.0" text="choose directory" AnchorPane.leftAnchor="329.0" AnchorPane.topAnchor="131.0" />
|
|
||||||
<JFXButton fx:id="cemuTFBtn" layoutX="329.0" layoutY="59.0" onAction="#cemuTFBtnAction" prefHeight="32.0" text="choose directory" AnchorPane.leftAnchor="329.0" AnchorPane.topAnchor="59.0" />
|
|
||||||
<JFXColorPicker fx:id="colorPicker" layoutX="12.0" layoutY="207.0" onAction="#colorPickerAction" AnchorPane.leftAnchor="12.0" AnchorPane.topAnchor="207.0" />
|
|
||||||
<JFXToggleButton fx:id="fullscreenToggleBtn" layoutX="16.0" layoutY="488.0" onAction="#fullscreenToggleBtnAction" text="start game in fullscreen" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="488.0" />
|
|
||||||
<Label fx:id="romDirectoryLbl" layoutX="10.0" layoutY="111.0" text="Rom Directory" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="111.0" />
|
|
||||||
<Label fx:id="mainColorLbl" layoutX="10.0" layoutY="183.0" text="main Color" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="183.0" />
|
|
||||||
<Label fx:id="cemuSettingsLbl" layoutX="16.0" layoutY="450.0" text="Cemu Settings" AnchorPane.leftAnchor="16.0" AnchorPane.topAnchor="465.0">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</Label>
|
|
||||||
<Label fx:id="cemu_UISettingsLbl" layoutX="22.0" layoutY="14.0" text="cemu_UI Settings" AnchorPane.leftAnchor="18.0" AnchorPane.topAnchor="14.0">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</Label>
|
|
||||||
<JFXToggleButton fx:id="cloudSyncToggleBtn" layoutX="10.0" layoutY="247.0" onAction="#cloudSyncToggleBtnAction" text="cloud savegames (Google Drive)" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="247.0" />
|
|
||||||
<Label fx:id="updateLbl" layoutX="10.0" layoutY="315.0" text="Updates" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="315.0" />
|
|
||||||
<JFXButton fx:id="updateBtn" layoutX="14.0" layoutY="335.0" onAction="#updateBtnAction" prefHeight="32.0" prefWidth="111.0" text="check now!" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="335.0" />
|
|
||||||
<JFXToggleButton fx:id="autoUpdateToggleBtn" layoutX="10.0" layoutY="372.0" onAction="#autoUpdateToggleBtnAction" text="check for updates on startup" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="372.0" />
|
|
||||||
</children>
|
|
||||||
</AnchorPane>
|
|
||||||
</content>
|
|
||||||
</ScrollPane>
|
|
||||||
<AnchorPane fx:id="smmdbAnchorPane" style="-fx-background-color: white;" visible="false" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="175.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="38.0">
|
|
||||||
<children>
|
|
||||||
<JFXTreeTableView fx:id="courseTreeTable" layoutX="14.0" layoutY="14.0" prefHeight="537.0" prefWidth="405.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="14.0" />
|
|
||||||
<ImageView fx:id="smmdbImageView" fitHeight="150.0" fitWidth="267.0" layoutX="436.0" layoutY="14.0" pickOnBounds="true" preserveRatio="true" AnchorPane.leftAnchor="436.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0" />
|
|
||||||
<ScrollPane fx:id="smmdbScrollPane" layoutX="436.0" layoutY="181.0" prefHeight="290.0" prefWidth="267.0" AnchorPane.bottomAnchor="91.0" AnchorPane.leftAnchor="436.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="181.0">
|
|
||||||
<content>
|
|
||||||
<TextFlow fx:id="smmdbTextFlow" maxWidth="265.0" prefWidth="265.0" />
|
|
||||||
</content>
|
|
||||||
</ScrollPane>
|
|
||||||
<JFXButton fx:id="smmdbDownloadBtn" buttonType="RAISED" layoutX="436.0" layoutY="479.0" onAction="#smmdbDownloadBtnAction" prefHeight="38.0" prefWidth="267.0" text="download" AnchorPane.bottomAnchor="45.0" AnchorPane.leftAnchor="436.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="479.0">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</JFXButton>
|
|
||||||
<Label fx:id="helpLabel" layoutX="436.0" layoutY="538.0" prefHeight="17.0" prefWidth="267.0" text="please help me improving this! click me!">
|
|
||||||
<font>
|
|
||||||
<Font size="14.0" />
|
|
||||||
</font>
|
|
||||||
</Label>
|
|
||||||
</children></AnchorPane>
|
|
||||||
<JFXButton fx:id="playBtn" buttonType="RAISED" layoutX="396.0" maxHeight="28.0" minWidth="100.0" onAction="#playBtnAction" ripplerFill="#00aacc" text="play" textAlignment="CENTER" visible="false" AnchorPane.bottomAnchor="12.0">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</JFXButton>
|
|
||||||
<JFXButton fx:id="totalPlaytimeBtn" buttonType="RAISED" layoutX="275.5" maxHeight="32.0" minWidth="100.0" onAction="#totalPlaytimeBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" text="0 h 0 min" visible="false" AnchorPane.bottomAnchor="10.0">
|
|
||||||
</JFXButton>
|
|
||||||
<JFXButton fx:id="lastTimePlayedBtn" buttonType="RAISED" layoutX="516.5" maxHeight="32.0" minWidth="100.0" onAction="#lastTimePlayedBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" text="Last played, never" visible="false" AnchorPane.bottomAnchor="10.0" />
|
|
||||||
</children>
|
|
||||||
</AnchorPane>
|
|
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.
Binary file not shown.
Binary file not shown.
@ -1,86 +0,0 @@
|
|||||||
/*
|
|
||||||
* HAMBURGER CSS
|
|
||||||
*/
|
|
||||||
|
|
||||||
.jfx-hamburgerW StackPane {
|
|
||||||
-fx-background-color: white;
|
|
||||||
-fx-background-radius: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.jfx-hamburgerB StackPane {
|
|
||||||
-fx-background-color: black;
|
|
||||||
-fx-background-radius: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TREE TABLE CSS
|
|
||||||
*/
|
|
||||||
|
|
||||||
.tree-table-view {
|
|
||||||
-fx-tree-table-color: rgba(0, 168, 204, 0.2);
|
|
||||||
-fx-tree-table-rippler-color: rgba(0, 168, 204, 0.4);
|
|
||||||
}
|
|
||||||
|
|
||||||
.tree-table-view:focused .tree-table-row-cell:selected {
|
|
||||||
-fx-background-color: -fx-tree-table-color;
|
|
||||||
-fx-table-cell-border-color: -fx-tree-table-color;
|
|
||||||
-fx-text-fill: BLACK;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tree-table-view:focused .tree-table-row-cell:selected .tree-table-cell {
|
|
||||||
-fx-text-fill: BLACK;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tree-table-view .jfx-rippler {
|
|
||||||
-jfx-rippler-fill: -fx-tree-table-rippler-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tree-table-view .column-header,
|
|
||||||
.tree-table-view .column-header-background,
|
|
||||||
.tree-table-view .column-header-background .filler {
|
|
||||||
-fx-background-color: TRANSPARENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tree-table-view .column-header {
|
|
||||||
-fx-border-width: 0 1 0 1;
|
|
||||||
-fx-border-color: #F3F3F3;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tree-table-view .column-header .label {
|
|
||||||
-fx-text-fill: #949494;
|
|
||||||
-fx-padding: 16 0 16 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tree-table-view .column-header .arrow, .tree-table-view .column-header .sort-order-dot {
|
|
||||||
-fx-background-color: #949494;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tree-table-view .column-header:last-visible {
|
|
||||||
-fx-border-width: 0 2 0 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tree-table-view .column-header-background {
|
|
||||||
-fx-border-width: 0 0.0 1 0;
|
|
||||||
-fx-border-color: #F3F3F3;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tree-table-view .tree-table-cell {
|
|
||||||
-fx-border-width: 0 0 0 0;
|
|
||||||
-fx-padding: 16 0 16 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tree-table-view .column-overlay {
|
|
||||||
-fx-background-color: -fx-tree-table-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tree-table-view .column-resize-line, .tree-table-view .column-drag-header {
|
|
||||||
-fx-background-color: -fx-tree-table-rippler-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tree-table-view:focused {
|
|
||||||
-fx-background-color: -fx-tree-table-color, -fx-box-border, -fx-control-inner-background;
|
|
||||||
-fx-background-insets: -1.4, 0, 1;
|
|
||||||
-fx-background-radius: 1.4, 0, 0;
|
|
||||||
/*....*/
|
|
||||||
-fx-padding: 1; /* 0.083333em; */
|
|
||||||
}
|
|
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.
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.
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.
@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="ASCII"?>
|
|
||||||
<anttasks:AntTask xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:anttasks="http://org.eclipse.fx.ide.jdt/1.0" buildDirectory="${project}/build">
|
|
||||||
<deploy>
|
|
||||||
<application name="cemu_UI"/>
|
|
||||||
<info/>
|
|
||||||
</deploy>
|
|
||||||
<signjar/>
|
|
||||||
</anttasks:AntTask>
|
|
220
pom.xml
Normal file
220
pom.xml
Normal file
@ -0,0 +1,220 @@
|
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>com</groupId>
|
||||||
|
<artifactId>cemu_UI</artifactId>
|
||||||
|
<version>0.3.0-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<name>cemu_UI</name>
|
||||||
|
<description>cemu_UI is a simple, material design graphical frontend for cemu, a Wii U emulator</description>
|
||||||
|
<url>http://www.kellerkinder.xyz</url>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.12</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.jfoenix</groupId>
|
||||||
|
<artifactId>jfoenix</artifactId>
|
||||||
|
<version>9.0.4</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.eclipsesource.minimal-json</groupId>
|
||||||
|
<artifactId>minimal-json</artifactId>
|
||||||
|
<version>0.9.5</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.xerial</groupId>
|
||||||
|
<artifactId>sqlite-jdbc</artifactId>
|
||||||
|
<version>3.23.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-api</artifactId>
|
||||||
|
<version>2.11.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-core</artifactId>
|
||||||
|
<version>2.11.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-io</groupId>
|
||||||
|
<artifactId>commons-io</artifactId>
|
||||||
|
<version>2.6</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-vfs2 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-vfs2</artifactId>
|
||||||
|
<version>2.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-codec</groupId>
|
||||||
|
<artifactId>commons-codec</artifactId>
|
||||||
|
<version>1.11</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/io.datafx/flow -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.datafx</groupId>
|
||||||
|
<artifactId>flow</artifactId>
|
||||||
|
<version>8.0.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/net.lingala.zip4j/zip4j -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.lingala.zip4j</groupId>
|
||||||
|
<artifactId>zip4j</artifactId>
|
||||||
|
<version>1.3.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Google Drive-API libraries-->
|
||||||
|
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-logging</groupId>
|
||||||
|
<artifactId>commons-logging</artifactId>
|
||||||
|
<version>1.1.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/com.google.api-client/google-api-client -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.api-client</groupId>
|
||||||
|
<artifactId>google-api-client</artifactId>
|
||||||
|
<version>1.23.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/com.google.apis/google-api-services-drive -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.apis</groupId>
|
||||||
|
<artifactId>google-api-services-drive</artifactId>
|
||||||
|
<version>v3-rev120-1.23.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/com.google.http-client/google-http-client -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.http-client</groupId>
|
||||||
|
<artifactId>google-http-client</artifactId>
|
||||||
|
<version>1.23.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/com.google.http-client/google-http-client-jackson2 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.http-client</groupId>
|
||||||
|
<artifactId>google-http-client-jackson2</artifactId>
|
||||||
|
<version>1.23.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.oauth-client</groupId>
|
||||||
|
<artifactId>google-oauth-client</artifactId>
|
||||||
|
<version>1.23.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client-java6 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.oauth-client</groupId>
|
||||||
|
<artifactId>google-oauth-client-java6</artifactId>
|
||||||
|
<version>1.23.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client-jetty -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.oauth-client</groupId>
|
||||||
|
<artifactId>google-oauth-client-jetty</artifactId>
|
||||||
|
<version>1.23.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-core</artifactId>
|
||||||
|
<version>2.9.5</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.servlet</groupId>
|
||||||
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
|
<version>4.0.0</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.mortbay.jetty/jetty -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mortbay.jetty</groupId>
|
||||||
|
<artifactId>jetty</artifactId>
|
||||||
|
<version>6.1.26</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.mortbay.jetty/jetty-util -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mortbay.jetty</groupId>
|
||||||
|
<artifactId>jetty-util</artifactId>
|
||||||
|
<version>6.1.26</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.7.0</version>
|
||||||
|
<configuration>
|
||||||
|
<source>9</source>
|
||||||
|
<target>9</target>
|
||||||
|
<showWarnings>true</showWarnings>
|
||||||
|
<showDeprecation>true</showDeprecation>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
|
<version>3.1.1</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>shade</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<finalName>cemu_UI</finalName>
|
||||||
|
<shadedArtifactAttached>true</shadedArtifactAttached>
|
||||||
|
<transformers>
|
||||||
|
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
|
||||||
|
<mainClass>com.cemu_UI.application.Main</mainClass>
|
||||||
|
</transformer>
|
||||||
|
</transformers>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
@ -1,178 +0,0 @@
|
|||||||
/**
|
|
||||||
* cemu_UI
|
|
||||||
*
|
|
||||||
* Copyright 2017 <@Seil0>
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
||||||
* MA 02110-1301, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package 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;
|
|
||||||
|
|
||||||
public class CloudController {
|
|
||||||
|
|
||||||
public CloudController(Main ma) {
|
|
||||||
main = ma;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Main main;
|
|
||||||
private GoogleDriveController googleDriveController = new GoogleDriveController();
|
|
||||||
private static final Logger LOGGER = LogManager.getLogger(CloudController.class.getName());
|
|
||||||
|
|
||||||
boolean initializeConnection(String cloudService, String cemuDirectory) {
|
|
||||||
boolean success = false;
|
|
||||||
LOGGER.info("sartting cloud initialisation ...");
|
|
||||||
|
|
||||||
if(cloudService.equals("GoogleDrive")) {
|
|
||||||
LOGGER.info("selected service is Google Drive");
|
|
||||||
try {
|
|
||||||
googleDriveController.main(cemuDirectory);
|
|
||||||
} catch (IOException e) {
|
|
||||||
LOGGER.error("error while initialize connection", e);
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
success = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(cloudService.equals("Dropbox")) {
|
|
||||||
LOGGER.info("selected service is Dropbox");
|
|
||||||
}
|
|
||||||
LOGGER.info("cloud initialisation done!");
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
void stratupCheck(String cloudService, String cemuDirectory) {
|
|
||||||
if(cloudService.equals("GoogleDrive")) {
|
|
||||||
LOGGER.info("starting startup check google drive ...");
|
|
||||||
try {
|
|
||||||
if (!googleDriveController.checkFolder()) {
|
|
||||||
googleDriveController.creatFolder();
|
|
||||||
main.mainWindowController.saveSettings();
|
|
||||||
|
|
||||||
Thread thread = new Thread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
Platform.runLater(() -> {
|
|
||||||
main.mainWindowController.getPlayBtn().setText("syncing...");
|
|
||||||
});
|
|
||||||
googleDriveController.uploadAllFiles();
|
|
||||||
Platform.runLater(() -> {
|
|
||||||
main.mainWindowController.getPlayBtn().setText("play");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
thread.start();
|
|
||||||
} else {
|
|
||||||
sync(cloudService, cemuDirectory);
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
LOGGER.error("google drive startup check failed", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(cloudService.equals("Dropbox")) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void sync(String cloudService, String cemuDirectory) {
|
|
||||||
|
|
||||||
//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...");
|
|
||||||
});
|
|
||||||
LOGGER.info("starting synchronization in new thread ...");
|
|
||||||
|
|
||||||
if(cloudService.equals("GoogleDrive")) {
|
|
||||||
try {
|
|
||||||
googleDriveController.sync(cemuDirectory);
|
|
||||||
} catch (IOException e) {
|
|
||||||
LOGGER.error("google drive synchronization failed", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(cloudService.equals("Dropbox")) {
|
|
||||||
|
|
||||||
}
|
|
||||||
Platform.runLater(() -> {
|
|
||||||
main.mainWindowController.getPlayBtn().setText("play");
|
|
||||||
});
|
|
||||||
main.mainWindowController.saveSettings();
|
|
||||||
LOGGER.info("synchronization successful!");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
thread.start();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void uploadFile(String cloudService, File file) {
|
|
||||||
|
|
||||||
//running uploadFile in a new thread, instead of blocking the main thread
|
|
||||||
new Thread() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
LOGGER.info("starting uploadFile in new thread ...");
|
|
||||||
|
|
||||||
if(cloudService.equals("GoogleDrive")) {
|
|
||||||
try {
|
|
||||||
googleDriveController.uploadFile(file);
|
|
||||||
} catch (IOException e) {
|
|
||||||
LOGGER.error("google drive uploadFile failed" ,e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(cloudService.equals("Dropbox")) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.start();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFolderID(String cloudService) {
|
|
||||||
String folderID = "";
|
|
||||||
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 != null) {
|
|
||||||
if (cloudService.equals("GoogleDrive")) {
|
|
||||||
googleDriveController.setFolderID(folderID);
|
|
||||||
}
|
|
||||||
if (cloudService.equals("Dropbox")) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,124 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<?import com.jfoenix.controls.JFXButton?>
|
|
||||||
<?import com.jfoenix.controls.JFXColorPicker?>
|
|
||||||
<?import com.jfoenix.controls.JFXHamburger?>
|
|
||||||
<?import com.jfoenix.controls.JFXTextField?>
|
|
||||||
<?import com.jfoenix.controls.JFXToggleButton?>
|
|
||||||
<?import com.jfoenix.controls.JFXTreeTableView?>
|
|
||||||
<?import javafx.geometry.Insets?>
|
|
||||||
<?import javafx.scene.control.Label?>
|
|
||||||
<?import javafx.scene.control.ScrollPane?>
|
|
||||||
<?import javafx.scene.image.ImageView?>
|
|
||||||
<?import javafx.scene.layout.AnchorPane?>
|
|
||||||
<?import javafx.scene.layout.HBox?>
|
|
||||||
<?import javafx.scene.layout.VBox?>
|
|
||||||
<?import javafx.scene.text.Font?>
|
|
||||||
<?import javafx.scene.text.TextFlow?>
|
|
||||||
|
|
||||||
<AnchorPane fx:id="mainAnchorPane" prefHeight="600.0" prefWidth="904.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MainWindowController">
|
|
||||||
<children>
|
|
||||||
<ScrollPane fx:id="mainScrollPane" fitToWidth="true" layoutY="38.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="38.0">
|
|
||||||
<content>
|
|
||||||
<AnchorPane fx:id="gamesAnchorPane">
|
|
||||||
<padding>
|
|
||||||
<Insets bottom="17.0" />
|
|
||||||
</padding></AnchorPane>
|
|
||||||
</content>
|
|
||||||
</ScrollPane>
|
|
||||||
<HBox fx:id="topHBox" prefHeight="38.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
|
||||||
<children>
|
|
||||||
<JFXHamburger fx:id="menuHam" prefHeight="38.0" prefWidth="38.0" stylesheets="@MainWindows.css" />
|
|
||||||
</children>
|
|
||||||
</HBox>
|
|
||||||
<VBox fx:id="sideMenuVBox" layoutY="32.0" prefHeight="568.0" prefWidth="175.0" visible="false" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.topAnchor="38.0">
|
|
||||||
<children>
|
|
||||||
<JFXButton fx:id="aboutBtn" alignment="TOP_LEFT" maxHeight="38.0" maxWidth="190.0" onAction="#aboutBtnAction" prefHeight="38.0" prefWidth="190.0" text="About" textAlignment="LEFT">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</JFXButton>
|
|
||||||
<JFXButton fx:id="settingsBtn" alignment="TOP_LEFT" maxHeight="38.0" maxWidth="213.0" onAction="#settingsBtnAction" prefHeight="38.0" prefWidth="213.0" text="Settings" textAlignment="LEFT">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</JFXButton>
|
|
||||||
<JFXButton fx:id="addBtn" alignment="TOP_LEFT" maxHeight="38.0" maxWidth="193.0" onAction="#addBtnAction" prefHeight="38.0" prefWidth="193.0" text="Add new Game" textAlignment="LEFT">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</JFXButton>
|
|
||||||
<JFXButton fx:id="reloadRomsBtn" alignment="TOP_LEFT" maxHeight="38.0" maxWidth="199.0" onAction="#reloadRomsBtnAction" prefHeight="38.0" prefWidth="199.0" text="reload roms" textAlignment="LEFT">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</JFXButton>
|
|
||||||
<JFXButton fx:id="smmdbBtn" alignment="TOP_LEFT" onAction="#smmdbBtnAction" prefHeight="38.0" prefWidth="216.0" text="smmdb">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</JFXButton>
|
|
||||||
</children>
|
|
||||||
</VBox>
|
|
||||||
<ScrollPane fx:id="settingsScrollPane" style="-fx-background: white;" visible="false" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="175.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="38.0">
|
|
||||||
<content>
|
|
||||||
<!-- space between settings sections 35px, between sections elements (label + element) 20px, between label and element 3px(or more) -->
|
|
||||||
<AnchorPane fx:id="settingsAnchorPane" prefHeight="562.0" prefWidth="511.0" style="-fx-background-color: white;">
|
|
||||||
<children>
|
|
||||||
<Label fx:id="cemuDirectoryLbl" layoutX="10.0" layoutY="39.0" text="Cemu Directory" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="39.0" />
|
|
||||||
<JFXTextField fx:id="cemuTextField" layoutX="10.0" layoutY="59.0" maxWidth="305.0" minWidth="305.0" onAction="#cemuTextFieldAction" prefHeight="32.0" prefWidth="305.0" promptText="cemu directory" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="59.0" />
|
|
||||||
<JFXTextField fx:id="romTextField" layoutX="10.0" layoutY="131.0" maxWidth="305.0" minWidth="305.0" onAction="#romTextFieldAction" prefHeight="32.0" prefWidth="305.0" promptText="rom directory" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="131.0" />
|
|
||||||
<JFXButton fx:id="romTFBtn" layoutX="329.0" layoutY="131.0" onAction="#romTFBtnAction" prefHeight="32.0" text="choose directory" AnchorPane.leftAnchor="329.0" AnchorPane.topAnchor="131.0" />
|
|
||||||
<JFXButton fx:id="cemuTFBtn" layoutX="329.0" layoutY="59.0" onAction="#cemuTFBtnAction" prefHeight="32.0" text="choose directory" AnchorPane.leftAnchor="329.0" AnchorPane.topAnchor="59.0" />
|
|
||||||
<JFXColorPicker fx:id="colorPicker" layoutX="12.0" layoutY="207.0" onAction="#colorPickerAction" AnchorPane.leftAnchor="12.0" AnchorPane.topAnchor="207.0" />
|
|
||||||
<JFXToggleButton fx:id="fullscreenToggleBtn" layoutX="16.0" layoutY="488.0" onAction="#fullscreenToggleBtnAction" text="start game in fullscreen" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="488.0" />
|
|
||||||
<Label fx:id="romDirectoryLbl" layoutX="10.0" layoutY="111.0" text="Rom Directory" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="111.0" />
|
|
||||||
<Label fx:id="mainColorLbl" layoutX="10.0" layoutY="183.0" text="main Color" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="183.0" />
|
|
||||||
<Label fx:id="cemuSettingsLbl" layoutX="16.0" layoutY="450.0" text="Cemu Settings" AnchorPane.leftAnchor="16.0" AnchorPane.topAnchor="465.0">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</Label>
|
|
||||||
<Label fx:id="cemu_UISettingsLbl" layoutX="22.0" layoutY="14.0" text="cemu_UI Settings" AnchorPane.leftAnchor="18.0" AnchorPane.topAnchor="14.0">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</Label>
|
|
||||||
<JFXToggleButton fx:id="cloudSyncToggleBtn" layoutX="10.0" layoutY="247.0" onAction="#cloudSyncToggleBtnAction" text="cloud savegames (Google Drive)" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="247.0" />
|
|
||||||
<Label fx:id="updateLbl" layoutX="10.0" layoutY="315.0" text="Updates" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="315.0" />
|
|
||||||
<JFXButton fx:id="updateBtn" layoutX="14.0" layoutY="335.0" onAction="#updateBtnAction" prefHeight="32.0" prefWidth="111.0" text="check now!" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="335.0" />
|
|
||||||
<JFXToggleButton fx:id="autoUpdateToggleBtn" layoutX="10.0" layoutY="372.0" onAction="#autoUpdateToggleBtnAction" text="check for updates on startup" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="372.0" />
|
|
||||||
</children>
|
|
||||||
</AnchorPane>
|
|
||||||
</content>
|
|
||||||
</ScrollPane>
|
|
||||||
<AnchorPane fx:id="smmdbAnchorPane" style="-fx-background-color: white;" visible="false" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="175.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="38.0">
|
|
||||||
<children>
|
|
||||||
<JFXTreeTableView fx:id="courseTreeTable" layoutX="14.0" layoutY="14.0" prefHeight="537.0" prefWidth="405.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="14.0" />
|
|
||||||
<ImageView fx:id="smmdbImageView" fitHeight="150.0" fitWidth="267.0" layoutX="436.0" layoutY="14.0" pickOnBounds="true" preserveRatio="true" AnchorPane.leftAnchor="436.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0" />
|
|
||||||
<ScrollPane fx:id="smmdbScrollPane" layoutX="436.0" layoutY="181.0" prefHeight="290.0" prefWidth="267.0" AnchorPane.bottomAnchor="91.0" AnchorPane.leftAnchor="436.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="181.0">
|
|
||||||
<content>
|
|
||||||
<TextFlow fx:id="smmdbTextFlow" maxWidth="265.0" prefWidth="265.0" />
|
|
||||||
</content>
|
|
||||||
</ScrollPane>
|
|
||||||
<JFXButton fx:id="smmdbDownloadBtn" buttonType="RAISED" layoutX="436.0" layoutY="479.0" onAction="#smmdbDownloadBtnAction" prefHeight="38.0" prefWidth="267.0" text="download" AnchorPane.bottomAnchor="45.0" AnchorPane.leftAnchor="436.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="479.0">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</JFXButton>
|
|
||||||
<Label fx:id="helpLabel" layoutX="436.0" layoutY="538.0" prefHeight="17.0" prefWidth="267.0" text="please help me improving this! click me!">
|
|
||||||
<font>
|
|
||||||
<Font size="14.0" />
|
|
||||||
</font>
|
|
||||||
</Label>
|
|
||||||
</children></AnchorPane>
|
|
||||||
<JFXButton fx:id="playBtn" buttonType="RAISED" layoutX="396.0" maxHeight="28.0" minWidth="100.0" onAction="#playBtnAction" ripplerFill="#00aacc" text="play" textAlignment="CENTER" visible="false" AnchorPane.bottomAnchor="12.0">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</JFXButton>
|
|
||||||
<JFXButton fx:id="totalPlaytimeBtn" buttonType="RAISED" layoutX="275.5" maxHeight="32.0" minWidth="100.0" onAction="#totalPlaytimeBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" text="0 h 0 min" visible="false" AnchorPane.bottomAnchor="10.0">
|
|
||||||
</JFXButton>
|
|
||||||
<JFXButton fx:id="lastTimePlayedBtn" buttonType="RAISED" layoutX="516.5" maxHeight="32.0" minWidth="100.0" onAction="#lastTimePlayedBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" text="Last played, never" visible="false" AnchorPane.bottomAnchor="10.0" />
|
|
||||||
</children>
|
|
||||||
</AnchorPane>
|
|
File diff suppressed because it is too large
Load Diff
@ -1,101 +0,0 @@
|
|||||||
/**
|
|
||||||
* cemu_UI
|
|
||||||
*
|
|
||||||
* Copyright 2017 <@Seil0>
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
||||||
* MA 02110-1301, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package 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;
|
|
||||||
long startTime;
|
|
||||||
long endTime;
|
|
||||||
int timePlayedNow;
|
|
||||||
int timePlayed;
|
|
||||||
Process p;
|
|
||||||
|
|
||||||
Platform.runLater(() -> {
|
|
||||||
mainWindowController.main.primaryStage.setIconified(true);
|
|
||||||
});
|
|
||||||
startTime = System.currentTimeMillis();
|
|
||||||
try{
|
|
||||||
if(mainWindowController.isFullscreen()){
|
|
||||||
if(System.getProperty("os.name").equals("Linux")){
|
|
||||||
executeComand = "wine "+mainWindowController.getCemuPath()+"/Cemu.exe -f -g \""+mainWindowController.getGameExecutePath()+"\"";
|
|
||||||
} else {
|
|
||||||
executeComand = mainWindowController.getCemuPath()+"\\Cemu.exe -f -g \""+mainWindowController.getGameExecutePath()+"\"";
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
if(System.getProperty("os.name").equals("Linux")){
|
|
||||||
executeComand = "wine "+mainWindowController.getCemuPath()+"/Cemu.exe -g \""+mainWindowController.getGameExecutePath()+"\"";
|
|
||||||
} else {
|
|
||||||
executeComand = mainWindowController.getCemuPath()+"\\Cemu.exe -g \""+mainWindowController.getGameExecutePath()+"\"";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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.getTotalPlaytime(selectedGameTitleID))+timePlayedNow;
|
|
||||||
|
|
||||||
dbController.setTotalPlaytime(Integer.toString(timePlayed), selectedGameTitleID);
|
|
||||||
Platform.runLater(() -> {
|
|
||||||
if(Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID)) > 60){
|
|
||||||
int hoursPlayed = (int) Math.floor(Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID))/60);
|
|
||||||
int minutesPlayed = Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID))-60*hoursPlayed;
|
|
||||||
mainWindowController.totalPlaytimeBtn.setText(hoursPlayed+"h "+minutesPlayed+"min");
|
|
||||||
}else{
|
|
||||||
mainWindowController.totalPlaytimeBtn.setText(dbController.getTotalPlaytime(selectedGameTitleID)+ " min");
|
|
||||||
}
|
|
||||||
mainWindowController.main.primaryStage.setIconified(false);
|
|
||||||
});
|
|
||||||
|
|
||||||
// System.out.println(mainWindowController.getCemuPath()+"/mlc01/emulatorSave/"+);
|
|
||||||
//sync savegame with cloud service
|
|
||||||
if(mainWindowController.isCloudSync()) {
|
|
||||||
mainWindowController.main.cloudController.sync(mainWindowController.getCloudService(), mainWindowController.getCemuPath());
|
|
||||||
}
|
|
||||||
|
|
||||||
}catch (IOException | InterruptedException e){
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
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.
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.
@ -1,20 +0,0 @@
|
|||||||
<?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>
|
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* cemu_UI
|
* cemu_UI
|
||||||
*
|
*
|
||||||
* Copyright 2017 <@Seil0>
|
* Copyright 2017-2018 <@Seil0>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -18,8 +18,7 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
* MA 02110-1301, USA.
|
* MA 02110-1301, USA.
|
||||||
*/
|
*/
|
||||||
|
package com.cemu_UI.application;
|
||||||
package application;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
@ -33,6 +32,9 @@ import java.util.TimerTask;
|
|||||||
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
import com.cemu_UI.controller.CloudController;
|
||||||
|
|
||||||
import javafx.application.Application;
|
import javafx.application.Application;
|
||||||
import javafx.beans.value.ChangeListener;
|
import javafx.beans.value.ChangeListener;
|
||||||
import javafx.beans.value.ObservableValue;
|
import javafx.beans.value.ObservableValue;
|
||||||
@ -45,62 +47,70 @@ import javafx.scene.control.ButtonType;
|
|||||||
import javafx.scene.control.Alert.AlertType;
|
import javafx.scene.control.Alert.AlertType;
|
||||||
import javafx.scene.layout.AnchorPane;
|
import javafx.scene.layout.AnchorPane;
|
||||||
|
|
||||||
|
|
||||||
public class Main extends Application {
|
public class Main extends Application {
|
||||||
|
|
||||||
Stage primaryStage;
|
private Stage primaryStage;
|
||||||
public MainWindowController mainWindowController; //TODO find a better way
|
private MainWindowController mainWindowController;
|
||||||
CloudController cloudController;
|
private CloudController cloudController;
|
||||||
AnchorPane pane;
|
private AnchorPane pane;
|
||||||
private Scene scene;
|
private Scene scene;
|
||||||
private String dirWin = System.getProperty("user.home") + "/Documents/cemu_UI"; //Windows: C:/Users/"User"/Documents/cemu_UI
|
private static String userHome = System.getProperty("user.home");
|
||||||
private String dirLinux = System.getProperty("user.home") + "/cemu_UI"; //Linux: /home/"User"/cemu_UI
|
private static String userName = System.getProperty("user.name");
|
||||||
|
private static String osName = System.getProperty("os.name");
|
||||||
|
private static String osArch = System.getProperty("os.arch");
|
||||||
|
private static String osVers = System.getProperty("os.version");
|
||||||
|
private static String javaVers = System.getProperty("java.version");
|
||||||
|
private static String javaVend= System.getProperty("java.vendor");
|
||||||
private String gamesDBdownloadURL = "https://github.com/Seil0/cemu_UI/raw/master/downloadContent/games.db";
|
private String gamesDBdownloadURL = "https://github.com/Seil0/cemu_UI/raw/master/downloadContent/games.db";
|
||||||
private File directory;
|
private static String dirCemuUI;
|
||||||
private File configFile;
|
private static File directory;
|
||||||
private File gamesDBFile;
|
private static File configFile;
|
||||||
@SuppressWarnings("unused")
|
private static File gamesDBFile;
|
||||||
private File localDB;
|
private static File reference_gamesFile;
|
||||||
private File pictureCache;
|
private static File pictureCache;
|
||||||
private static Logger LOGGER;
|
private static Logger LOGGER;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start(Stage primaryStage) {
|
public void start(Stage primaryStage) {
|
||||||
this.primaryStage = primaryStage;
|
try {
|
||||||
cloudController = new CloudController(this);
|
LOGGER.info("OS: " + osName + " " + osVers + " " + osArch);
|
||||||
mainWindow();
|
LOGGER.info("Java: " + javaVend + " " + javaVers);
|
||||||
initActions();
|
LOGGER.info("User: " + userName + " " + userHome);
|
||||||
|
|
||||||
|
this.primaryStage = primaryStage;
|
||||||
|
mainWindowController = new MainWindowController(this);
|
||||||
|
|
||||||
|
mainWindow();
|
||||||
|
initActions();
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.error("ooooops",e);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void mainWindow(){
|
private void mainWindow(){
|
||||||
try {
|
try {
|
||||||
FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindow.fxml"));
|
FXMLLoader loader = new FXMLLoader();
|
||||||
pane = loader.load();
|
loader.setLocation(ClassLoader.getSystemResource("fxml/MainWindow.fxml"));
|
||||||
// primaryStage.setResizable(false);
|
loader.setController(mainWindowController);
|
||||||
|
pane = (AnchorPane) loader.load();
|
||||||
|
primaryStage.setMinWidth(265.00);
|
||||||
|
primaryStage.setMinHeight(425.00);
|
||||||
primaryStage.setTitle("cemu_UI");
|
primaryStage.setTitle("cemu_UI");
|
||||||
// primaryStage.getIcons().add(new Image(Main.class.getResourceAsStream("/resources/Homeflix_Icon_64x64.png"))); //adds application icon
|
// primaryStage.getIcons().add(new Image(Main.class.getResourceAsStream(""))); //adds application icon
|
||||||
|
primaryStage.setOnCloseRequest(event -> System.exit(1));
|
||||||
|
|
||||||
mainWindowController = loader.getController(); //Link of FXMLController and controller class
|
// generate window
|
||||||
mainWindowController.setMain(this); //call setMain
|
scene = new Scene(pane); // create new scene, append pane to scene
|
||||||
|
scene.getStylesheets().add(Main.class.getResource("/css/MainWindows.css").toExternalForm());
|
||||||
|
primaryStage.setScene(scene); // append scene to stage
|
||||||
|
primaryStage.show(); // show stage
|
||||||
|
|
||||||
//get os and the right paths
|
cloudController = new CloudController(mainWindowController); // call cloudController constructor
|
||||||
if (System.getProperty("os.name").equals("Linux")) {
|
|
||||||
directory = new File(dirLinux);
|
|
||||||
configFile = new File(dirLinux + "/config.xml");
|
|
||||||
gamesDBFile = new File(dirLinux + "/games.db");
|
|
||||||
localDB = new File(dirLinux+"/localRoms.db");
|
|
||||||
pictureCache= new File(dirLinux+"/picture_cache");
|
|
||||||
} else {
|
|
||||||
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");
|
|
||||||
}
|
|
||||||
|
|
||||||
//startup checks
|
// startup checks
|
||||||
//check if client_secret.jason is present
|
// check if client_secret.json is present
|
||||||
if (Main.class.getResourceAsStream("/resources/client_secret.json") == null) {
|
if (Main.class.getResourceAsStream("/client_secret.json") == null) {
|
||||||
LOGGER.error("client_secret is missing!!!!!");
|
LOGGER.error("client_secret is missing!!!!!");
|
||||||
|
|
||||||
Alert alert = new Alert(AlertType.ERROR);
|
Alert alert = new Alert(AlertType.ERROR);
|
||||||
@ -110,8 +120,6 @@ public class Main extends Application {
|
|||||||
alert.showAndWait();
|
alert.showAndWait();
|
||||||
}
|
}
|
||||||
|
|
||||||
LOGGER.info("Directory: " + directory.exists());
|
|
||||||
LOGGER.info("Configfile: " + configFile.exists());
|
|
||||||
if (!directory.exists()) {
|
if (!directory.exists()) {
|
||||||
LOGGER.info("creating cemu_UI directory");
|
LOGGER.info("creating cemu_UI directory");
|
||||||
directory.mkdir();
|
directory.mkdir();
|
||||||
@ -122,22 +130,27 @@ public class Main extends Application {
|
|||||||
LOGGER.info("firststart, setting default values");
|
LOGGER.info("firststart, setting default values");
|
||||||
firstStart();
|
firstStart();
|
||||||
mainWindowController.setColor("00a8cc");
|
mainWindowController.setColor("00a8cc");
|
||||||
|
mainWindowController.setAutoUpdate(false);
|
||||||
|
mainWindowController.setLanguage("en_US");
|
||||||
|
mainWindowController.setLastLocalSync(0);
|
||||||
mainWindowController.setxPosHelper(0);
|
mainWindowController.setxPosHelper(0);
|
||||||
mainWindowController.saveSettings();
|
mainWindowController.saveSettings();
|
||||||
Runtime.getRuntime().exec("java -jar cemu_UI.jar"); //start again (preventing Bugs)
|
|
||||||
System.exit(0); //finishes itself
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pictureCache.exists() != true) {
|
if (!pictureCache.exists()) {
|
||||||
pictureCache.mkdir();
|
pictureCache.mkdir();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gamesDBFile.exists() != true) {
|
|
||||||
|
if (!reference_gamesFile.exists()) {
|
||||||
|
if (gamesDBFile.exists()) {
|
||||||
|
gamesDBFile.delete();
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
LOGGER.info("downloading games.db... ");
|
LOGGER.info("downloading ReferenceGameList.db... ");
|
||||||
URL website = new URL(gamesDBdownloadURL);
|
URL website = new URL(gamesDBdownloadURL);
|
||||||
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
|
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
|
||||||
FileOutputStream fos = new FileOutputStream(gamesDBFile);
|
FileOutputStream fos = new FileOutputStream(reference_gamesFile);
|
||||||
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
|
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
|
||||||
fos.close();
|
fos.close();
|
||||||
LOGGER.info("finished downloading games.db");
|
LOGGER.info("finished downloading games.db");
|
||||||
@ -146,28 +159,45 @@ public class Main extends Application {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//loading settings and initialize UI, dbController.main() loads all databases
|
// init here as it loads the games to the mwc and the gui, therefore the window must exist
|
||||||
mainWindowController.loadSettings();
|
mainWindowController.init();
|
||||||
mainWindowController.initActions();
|
mainWindowController.getDbController().init();
|
||||||
mainWindowController.initUI();
|
|
||||||
mainWindowController.dbController.main();
|
// if cloud sync is activated start sync
|
||||||
if(mainWindowController.isCloudSync()) {
|
if(mainWindowController.isCloudSync()) {
|
||||||
cloudController.initializeConnection(mainWindowController.getCloudService(), mainWindowController.getCemuPath());
|
cloudController.initializeConnection(mainWindowController.getCloudService(), mainWindowController.getCemuPath());
|
||||||
cloudController.stratupCheck(mainWindowController.getCloudService(), mainWindowController.getCemuPath());
|
cloudController.sync(mainWindowController.getCloudService(), mainWindowController.getCemuPath(), directory.getPath());
|
||||||
}
|
}
|
||||||
mainWindowController.addUIData();
|
|
||||||
|
|
||||||
scene = new Scene(pane); //create new scene, append pane to scene
|
} catch (IOException e) {
|
||||||
scene.getStylesheets().add(Main.class.getResource("MainWindows.css").toExternalForm());
|
e.printStackTrace();
|
||||||
primaryStage.setScene(scene); //append scene to stage
|
}
|
||||||
primaryStage.show(); //show stage
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void firstStart(){
|
public static void main(String[] args) {
|
||||||
Alert alert = new Alert(AlertType.CONFIRMATION); //new alert with file-chooser
|
|
||||||
|
if (osName.contains("Windows")) {
|
||||||
|
dirCemuUI = userHome + "/Documents/cemu_UI";
|
||||||
|
} else {
|
||||||
|
dirCemuUI = userHome + "/cemu_UI";
|
||||||
|
}
|
||||||
|
|
||||||
|
directory = new File(dirCemuUI);
|
||||||
|
configFile = new File(dirCemuUI + "/config.xml");
|
||||||
|
gamesDBFile = new File(dirCemuUI + "/games.db");
|
||||||
|
reference_gamesFile = new File(dirCemuUI + "/reference_games.db");
|
||||||
|
pictureCache= new File(dirCemuUI+"/picture_cache");
|
||||||
|
|
||||||
|
// delete old log file and create new
|
||||||
|
System.setProperty("logFilename", dirCemuUI + "/app.log");
|
||||||
|
File logFile = new File(dirCemuUI + "/app.log");
|
||||||
|
logFile.delete();
|
||||||
|
LOGGER = LogManager.getLogger(Main.class.getName());
|
||||||
|
launch(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void firstStart() {
|
||||||
|
Alert alert = new Alert(AlertType.CONFIRMATION); // new alert with file-chooser
|
||||||
alert.setTitle("cemu_UI");
|
alert.setTitle("cemu_UI");
|
||||||
alert.setHeaderText("cemu installation");
|
alert.setHeaderText("cemu installation");
|
||||||
alert.setContentText("please select your cemu installation");
|
alert.setContentText("please select your cemu installation");
|
||||||
@ -182,7 +212,7 @@ public class Main extends Application {
|
|||||||
mainWindowController.setCemuPath(null);
|
mainWindowController.setCemuPath(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
Alert alert2 = new Alert(AlertType.CONFIRMATION); //new alert with file-chooser
|
Alert alert2 = new Alert(AlertType.CONFIRMATION); // new alert with file-chooser
|
||||||
alert2.setTitle("cemu_UI");
|
alert2.setTitle("cemu_UI");
|
||||||
alert2.setHeaderText("rom directory");
|
alert2.setHeaderText("rom directory");
|
||||||
alert2.setContentText("please select your rom directory");
|
alert2.setContentText("please select your rom directory");
|
||||||
@ -190,11 +220,10 @@ public class Main extends Application {
|
|||||||
Optional<ButtonType> result2 = alert2.showAndWait();
|
Optional<ButtonType> result2 = alert2.showAndWait();
|
||||||
if (result2.get() == ButtonType.OK) {
|
if (result2.get() == ButtonType.OK) {
|
||||||
DirectoryChooser directoryChooser = new DirectoryChooser();
|
DirectoryChooser directoryChooser = new DirectoryChooser();
|
||||||
File selectedDirectory = directoryChooser.showDialog(primaryStage);
|
File selectedDirectory = directoryChooser.showDialog(primaryStage);
|
||||||
mainWindowController.setRomPath(selectedDirectory.getAbsolutePath());
|
mainWindowController.setRomDirectoryPath(selectedDirectory.getAbsolutePath());
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
mainWindowController.setRomPath(null);
|
mainWindowController.setRomDirectoryPath(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,21 +231,19 @@ public class Main extends Application {
|
|||||||
final ChangeListener<Number> widthListener = new ChangeListener<Number>() {
|
final ChangeListener<Number> widthListener = new ChangeListener<Number>() {
|
||||||
|
|
||||||
final Timer timer = new Timer();
|
final Timer timer = new Timer();
|
||||||
TimerTask saveTask = null; //task to execute save operation
|
TimerTask saveTask = null; // task to execute save operation
|
||||||
final long delayTime = 500; //delay until the window size is saved, if the window is resized earlier it will be killed, default is 500ms
|
final long delayTime = 500; // delay until the window size is saved, if the window is resized earlier it will be killed, default is 500ms
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void changed(ObservableValue<? extends Number> observable, Number oldValue, final Number newValue) {
|
public void changed(ObservableValue<? extends Number> observable, Number oldValue, final Number newValue) {
|
||||||
int xPosHelperMax = (int) Math.floor((mainWindowController.getMainAnchorPane().getWidth() - 36) / 217);
|
int xPosHelperMax = (int) Math.floor((mainWindowController.getMainAnchorPane().getWidth() - 36) / 217);
|
||||||
|
|
||||||
mainWindowController.refreshplayBtnPosition();
|
// call only if there is enough space for a new row
|
||||||
|
|
||||||
//call only if there is enough space for a new row
|
|
||||||
if (mainWindowController.getOldXPosHelper() != xPosHelperMax) {
|
if (mainWindowController.getOldXPosHelper() != xPosHelperMax) {
|
||||||
mainWindowController.refreshUIData();
|
mainWindowController.refreshUIData();
|
||||||
}
|
}
|
||||||
|
|
||||||
//if saveTask is already running kill it
|
// if saveTask is already running kill it
|
||||||
if (saveTask != null) saveTask.cancel();
|
if (saveTask != null) saveTask.cancel();
|
||||||
|
|
||||||
saveTask = new TimerTask() {
|
saveTask = new TimerTask() {
|
||||||
@ -232,8 +259,8 @@ public class Main extends Application {
|
|||||||
final ChangeListener<Number> heightListener = new ChangeListener<Number>() {
|
final ChangeListener<Number> heightListener = new ChangeListener<Number>() {
|
||||||
|
|
||||||
final Timer timer = new Timer();
|
final Timer timer = new Timer();
|
||||||
TimerTask saveTask = null; //task to execute save operation
|
TimerTask saveTask = null; // task to execute save operation
|
||||||
final long delayTime = 500; //delay until the window size is saved, if the window is resized earlier it will be killed, default is 500ms
|
final long delayTime = 500; // delay until the window size is saved, if the window is resized earlier it will be killed, default is 500ms
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void changed(ObservableValue<? extends Number> observable, Number oldValue, final Number newValue) {
|
public void changed(ObservableValue<? extends Number> observable, Number oldValue, final Number newValue) {
|
||||||
@ -267,29 +294,53 @@ public class Main extends Application {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//add listener to primaryStage
|
// add listener to primaryStage
|
||||||
primaryStage.widthProperty().addListener(widthListener);
|
primaryStage.widthProperty().addListener(widthListener);
|
||||||
primaryStage.heightProperty().addListener(heightListener);
|
primaryStage.heightProperty().addListener(heightListener);
|
||||||
primaryStage.maximizedProperty().addListener(maximizeListener);
|
primaryStage.maximizedProperty().addListener(maximizeListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public Stage getPrimaryStage() {
|
||||||
//delete old log file and create new
|
return primaryStage;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public void setPrimaryStage(Stage primaryStage) {
|
||||||
public void stop() {
|
this.primaryStage = primaryStage;
|
||||||
System.exit(0);
|
}
|
||||||
|
|
||||||
|
public CloudController getCloudController() {
|
||||||
|
return cloudController;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCloudController(CloudController cloudController) {
|
||||||
|
this.cloudController = cloudController;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AnchorPane getPane() {
|
||||||
|
return pane;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPane(AnchorPane pane) {
|
||||||
|
this.pane = pane;
|
||||||
|
}
|
||||||
|
|
||||||
|
public File getDirectory() {
|
||||||
|
return directory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public File getConfigFile() {
|
||||||
|
return configFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public File getGamesDBFile() {
|
||||||
|
return gamesDBFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public File getReference_gamesFile() {
|
||||||
|
return reference_gamesFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public File getPictureCache() {
|
||||||
|
return pictureCache;
|
||||||
}
|
}
|
||||||
}
|
}
|
1987
src/main/java/com/cemu_UI/application/MainWindowController.java
Normal file
1987
src/main/java/com/cemu_UI/application/MainWindowController.java
Normal file
File diff suppressed because it is too large
Load Diff
103
src/main/java/com/cemu_UI/application/playGame.java
Normal file
103
src/main/java/com/cemu_UI/application/playGame.java
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
/**
|
||||||
|
* cemu_UI
|
||||||
|
*
|
||||||
|
* Copyright 2017-2018 <@Seil0>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
package com.cemu_UI.application;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.time.Instant;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
import com.cemu_UI.controller.DBController;
|
||||||
|
|
||||||
|
import javafx.application.Platform;
|
||||||
|
|
||||||
|
public class playGame extends Thread{
|
||||||
|
|
||||||
|
private MainWindowController mainWindowController;
|
||||||
|
private DBController dbController;
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger(playGame.class.getName());
|
||||||
|
|
||||||
|
public playGame(MainWindowController m, com.cemu_UI.controller.DBController db) {
|
||||||
|
mainWindowController = m;
|
||||||
|
dbController = db;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
String selectedGameTitleID = mainWindowController.getSelectedGameTitleID();
|
||||||
|
String cemuBin = mainWindowController.getCemuPath() + "/Cemu.exe";
|
||||||
|
String gameExec = "\"" + mainWindowController.getGameExecutePath() + "\"";
|
||||||
|
long startTime;
|
||||||
|
long endTime;
|
||||||
|
int timePlayedNow;
|
||||||
|
int timePlayed;
|
||||||
|
Process p;
|
||||||
|
|
||||||
|
Platform.runLater(() -> {
|
||||||
|
mainWindowController.getMain().getPrimaryStage().setIconified(true); // minimize cemu_UI
|
||||||
|
});
|
||||||
|
startTime = System.currentTimeMillis();
|
||||||
|
try {
|
||||||
|
if (System.getProperty("os.name").equals("Linux")) {
|
||||||
|
if(mainWindowController.isFullscreen()){
|
||||||
|
p = new ProcessBuilder("wine", cemuBin, "-f", "-g", gameExec).start();
|
||||||
|
} else {
|
||||||
|
p = new ProcessBuilder("wine", cemuBin, "-g", gameExec).start();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(mainWindowController.isFullscreen()){
|
||||||
|
p = new ProcessBuilder(cemuBin, "-f", "-g", gameExec).start();
|
||||||
|
} else {
|
||||||
|
p = new ProcessBuilder(cemuBin, "-g", gameExec).start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p.waitFor(); // wait until cemu is closed so we can calculate the played time
|
||||||
|
endTime = System.currentTimeMillis();
|
||||||
|
timePlayedNow = (int) Math.floor(((endTime - startTime)/1000/60));
|
||||||
|
timePlayed = Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID))+timePlayedNow;
|
||||||
|
|
||||||
|
dbController.setTotalPlaytime(Integer.toString(timePlayed), selectedGameTitleID);
|
||||||
|
Platform.runLater(() -> {
|
||||||
|
if (Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID)) > 60) {
|
||||||
|
int hoursPlayed = (int) Math.floor(Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID)) / 60);
|
||||||
|
int minutesPlayed = Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID)) - 60 * hoursPlayed;
|
||||||
|
mainWindowController.totalPlaytimeBtn.setText(hoursPlayed + "h " + minutesPlayed + "min");
|
||||||
|
} else {
|
||||||
|
mainWindowController.totalPlaytimeBtn.setText(dbController.getTotalPlaytime(selectedGameTitleID) + " min");
|
||||||
|
}
|
||||||
|
mainWindowController.getMain().getPrimaryStage().setIconified(false); // maximize cemu_UI
|
||||||
|
});
|
||||||
|
|
||||||
|
//sync savegame with cloud service
|
||||||
|
if (mainWindowController.isCloudSync()) {
|
||||||
|
mainWindowController.setLastLocalSync(Instant.now().getEpochSecond());
|
||||||
|
mainWindowController.getMain().getCloudController().sync(mainWindowController.getCloudService(),
|
||||||
|
mainWindowController.getCemuPath(), mainWindowController.getMain().getDirectory().getPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (IOException | InterruptedException e) {
|
||||||
|
LOGGER.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
226
src/main/java/com/cemu_UI/controller/CloudController.java
Normal file
226
src/main/java/com/cemu_UI/controller/CloudController.java
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
/**
|
||||||
|
* cemu_UI
|
||||||
|
*
|
||||||
|
* Copyright 2017-2018 <@Seil0>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
package com.cemu_UI.controller;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
import com.cemu_UI.application.MainWindowController;
|
||||||
|
import com.cemu_UI.vendorCloudController.GoogleDriveController;
|
||||||
|
|
||||||
|
import javafx.application.Platform;
|
||||||
|
import net.lingala.zip4j.core.ZipFile;
|
||||||
|
import net.lingala.zip4j.exception.ZipException;
|
||||||
|
|
||||||
|
public class CloudController {
|
||||||
|
|
||||||
|
public CloudController(MainWindowController mwc) {
|
||||||
|
this.mwc = mwc;
|
||||||
|
}
|
||||||
|
|
||||||
|
private MainWindowController mwc;
|
||||||
|
private GoogleDriveController googleDriveController = new GoogleDriveController();
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger(CloudController.class.getName());
|
||||||
|
|
||||||
|
public boolean initializeConnection(String cloudService, String cemuDirectory) {
|
||||||
|
boolean success = false;
|
||||||
|
LOGGER.info("sartting cloud initialisation ...");
|
||||||
|
|
||||||
|
if(cloudService.equals("GoogleDrive")) {
|
||||||
|
LOGGER.info("selected service is Google Drive");
|
||||||
|
try {
|
||||||
|
googleDriveController.main(cemuDirectory);
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOGGER.error("error while initialize connection", e);
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
success = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cloudService.equals("Dropbox")) {
|
||||||
|
LOGGER.info("selected service is Dropbox");
|
||||||
|
}
|
||||||
|
LOGGER.info("cloud initialisation done!");
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* to trigger a new sync set the mwc LastLocalSync to the actual time and call the sync method
|
||||||
|
* @param cloudService
|
||||||
|
* @param cemuDirectory
|
||||||
|
* @param cemu_UIDirectory
|
||||||
|
*/
|
||||||
|
public void sync(String cloudService, String cemuDirectory, String cemu_UIDirectory) {
|
||||||
|
|
||||||
|
// running sync in a new thread, instead of blocking the main thread
|
||||||
|
Thread thread = new Thread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
Platform.runLater(() -> {
|
||||||
|
mwc.getPlayBtn().setDisable(true);
|
||||||
|
mwc.getPlayBtn().setText("syncing...");
|
||||||
|
});
|
||||||
|
LOGGER.info("starting synchronization in new thread ...");
|
||||||
|
|
||||||
|
// zip the saves folder
|
||||||
|
File zipFile = zipSavegames(cemu_UIDirectory, cemuDirectory);
|
||||||
|
|
||||||
|
// upload the zip
|
||||||
|
switch (cloudService) {
|
||||||
|
|
||||||
|
// use GoogleDriveController
|
||||||
|
case "GoogleDrive":
|
||||||
|
LOGGER.info("using GoogleDriveController");
|
||||||
|
long lastCloudSync = googleDriveController.getLastCloudSync();
|
||||||
|
|
||||||
|
if (!googleDriveController.checkFolder()) {
|
||||||
|
LOGGER.info("cloud sync folder dosen't exist, creating one!");
|
||||||
|
googleDriveController.creatFolder();
|
||||||
|
googleDriveController.uploadZipFile(zipFile);
|
||||||
|
} else if (mwc.getLastLocalSync() > lastCloudSync) {
|
||||||
|
LOGGER.info("local is new, going to upload zip");
|
||||||
|
googleDriveController.uploadZipFile(zipFile);
|
||||||
|
} else if(mwc.getLastLocalSync() < lastCloudSync) {
|
||||||
|
LOGGER.info("cloud is new, going to download zip");
|
||||||
|
unzipSavegames(cemuDirectory, googleDriveController.downloadZipFile(cemu_UIDirectory));
|
||||||
|
mwc.setLastLocalSync(lastCloudSync);
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
LOGGER.info("nothing to do");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
mwc.setLastLocalSync(Long.parseLong(zipFile.getName().substring(0, zipFile.getName().length()-4))); // set time of last sucessfull sync
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
case "Dropbox":
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
default:
|
||||||
|
LOGGER.warn("no cloud vendor found!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
zipFile.delete(); // delete zipfile in cem_UI directory
|
||||||
|
|
||||||
|
Platform.runLater(() -> {
|
||||||
|
mwc.getPlayBtn().setText("play");
|
||||||
|
mwc.getPlayBtn().setDisable(false);
|
||||||
|
mwc.saveSettings();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
LOGGER.info("synchronization successful!");
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.error("There was an error during syncronisation! Please open a new issue on the cemu_UI github page:", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
thread.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private File zipSavegames(String cemu_UIDirectory, String cemuDirectory) throws Exception {
|
||||||
|
long unixTimestamp = Instant.now().getEpochSecond();
|
||||||
|
FileOutputStream fos = new FileOutputStream(cemu_UIDirectory + "/" + unixTimestamp + ".zip");
|
||||||
|
ZipOutputStream zos = new ZipOutputStream(fos);
|
||||||
|
addDirToZipArchive(zos, new File(cemuDirectory + "/mlc01/usr/save"), null);
|
||||||
|
zos.flush();
|
||||||
|
fos.flush();
|
||||||
|
zos.close();
|
||||||
|
fos.close();
|
||||||
|
return new File(cemu_UIDirectory + "/" + unixTimestamp + ".zip");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void addDirToZipArchive(ZipOutputStream zos, File fileToZip, String parrentDirectoryName) throws Exception {
|
||||||
|
if (fileToZip == null || !fileToZip.exists()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String zipEntryName = fileToZip.getName();
|
||||||
|
if (parrentDirectoryName!=null && !parrentDirectoryName.isEmpty()) {
|
||||||
|
zipEntryName = parrentDirectoryName + "/" + fileToZip.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fileToZip.isDirectory()) {
|
||||||
|
for (File file : fileToZip.listFiles()) {
|
||||||
|
addDirToZipArchive(zos, file, zipEntryName);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
FileInputStream fis = new FileInputStream(fileToZip);
|
||||||
|
zos.putNextEntry(new ZipEntry(zipEntryName));
|
||||||
|
int length;
|
||||||
|
while ((length = fis.read(buffer)) > 0) {
|
||||||
|
zos.write(buffer, 0, length);
|
||||||
|
}
|
||||||
|
zos.closeEntry();
|
||||||
|
fis.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void unzipSavegames(String cemuDirectory, File outputFile) {
|
||||||
|
try {
|
||||||
|
ZipFile zipFile = new ZipFile(outputFile);
|
||||||
|
zipFile.extractAll(cemuDirectory + "/mlc01/usr");
|
||||||
|
outputFile.delete();
|
||||||
|
LOGGER.info("unzip successfull");
|
||||||
|
} catch (ZipException e) {
|
||||||
|
LOGGER.error("an error occurred during unziping the file!", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFolderID(String cloudService) {
|
||||||
|
String folderID = "";
|
||||||
|
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 != null) {
|
||||||
|
if (cloudService.equals("GoogleDrive")) {
|
||||||
|
googleDriveController.setFolderID(folderID);
|
||||||
|
}
|
||||||
|
if (cloudService.equals("Dropbox")) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* cemu_UI
|
* cemu_UI
|
||||||
*
|
*
|
||||||
* Copyright 2017 <@Seil0>
|
* Copyright 2017-2018 <@Seil0>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -18,8 +18,7 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
* MA 02110-1301, USA.
|
* MA 02110-1301, USA.
|
||||||
*/
|
*/
|
||||||
|
package com.cemu_UI.controller;
|
||||||
package application;
|
|
||||||
|
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
@ -45,69 +44,83 @@ import org.apache.logging.log4j.Logger;
|
|||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
public class dbController {
|
import com.cemu_UI.application.Main;
|
||||||
|
import com.cemu_UI.application.MainWindowController;
|
||||||
|
|
||||||
public dbController(MainWindowController m) {
|
public class DBController {
|
||||||
mainWindowController = m;
|
|
||||||
|
public DBController(Main main, MainWindowController mainWindowController) {
|
||||||
|
this.main = main;
|
||||||
|
this.mainWindowController = mainWindowController;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Main main;
|
||||||
private MainWindowController mainWindowController;
|
private MainWindowController mainWindowController;
|
||||||
private ArrayList<String> entries = new ArrayList<>();
|
private ArrayList<String> entries = new ArrayList<>();
|
||||||
private String DB_PATH;
|
private String DB_PATH_localRoms;
|
||||||
private String DB_PATH_games;
|
private String DB_PATH_games;
|
||||||
private Connection connection = null;
|
private Connection connection = null;
|
||||||
private Connection connectionGames = null;
|
private Connection connectionGames = null;
|
||||||
private static final Logger LOGGER = LogManager.getLogger(dbController.class.getName());
|
private static final Logger LOGGER = LogManager.getLogger(DBController.class.getName());
|
||||||
|
|
||||||
public void main(){
|
/**
|
||||||
LOGGER.info("<==========starting loading sql==========>");
|
* initialize the sqlite database controller
|
||||||
|
* load ROM and games database
|
||||||
|
* load all games
|
||||||
|
*/
|
||||||
|
public void init() {
|
||||||
|
LOGGER.info("<========== starting loading sql ==========>");
|
||||||
loadRomDatabase();
|
loadRomDatabase();
|
||||||
loadGamesDatabase();
|
loadGamesDatabase();
|
||||||
createRomDatabase();
|
createRomDatabase();
|
||||||
loadAllRoms();
|
LOGGER.info("<========== finished loading sql ==========>");
|
||||||
checkRemoveEntry();
|
|
||||||
LOGGER.info("<==========finished loading sql==========>");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadRomDatabase(){
|
/**
|
||||||
|
* set the path to the localRoms.db file and initialize the connection
|
||||||
|
*
|
||||||
|
* TODO this should be called LocalGames
|
||||||
|
*/
|
||||||
|
private void loadRomDatabase() {
|
||||||
if (System.getProperty("os.name").equals("Linux")) {
|
if (System.getProperty("os.name").equals("Linux")) {
|
||||||
DB_PATH = System.getProperty("user.home") + "/cemu_UI/localRoms.db";
|
DB_PATH_localRoms = System.getProperty("user.home") + "/cemu_UI/localRoms.db";
|
||||||
}else{
|
} else {
|
||||||
DB_PATH = System.getProperty("user.home") + "\\Documents\\cemu_UI" + "\\" + "localRoms.db";
|
DB_PATH_localRoms = System.getProperty("user.home") + "\\Documents\\cemu_UI" + "\\" + "localRoms.db";
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
// create a database connection
|
// create a database connection
|
||||||
connection = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH);
|
connection = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH_localRoms);
|
||||||
connection.setAutoCommit(false); //AutoCommit to false -> manual commit is active
|
connection.setAutoCommit(false); // AutoCommit to false -> manual commit is active
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
// if the error message is "out of memory", it probably means no database file is found
|
// if the error message is "out of memory", probably no database file is found
|
||||||
LOGGER.error("error while loading the ROM database", e);
|
LOGGER.error("error while loading the ROM database", e);
|
||||||
}
|
}
|
||||||
LOGGER.info("ROM database loaded successfull");
|
LOGGER.info("ROM database loaded successfull");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* this method is used to load the games database with additional informations about a game
|
* set the path to the localRoms.db file and initialize the connection
|
||||||
* it is used if a new game is added (automatic or manual)
|
* games.db contains a reverence list to for the automatic detection mode
|
||||||
*/
|
*/
|
||||||
private void loadGamesDatabase(){
|
private void loadGamesDatabase() {
|
||||||
if (System.getProperty("os.name").equals("Linux")) {
|
DB_PATH_games = main.getReference_gamesFile().getAbsolutePath();
|
||||||
DB_PATH_games = System.getProperty("user.home") + "/cemu_UI/games.db";
|
|
||||||
}else{
|
|
||||||
DB_PATH_games = System.getProperty("user.home") + "\\Documents\\cemu_UI" + "\\" + "games.db";
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
// create a database connection
|
// create a database connection
|
||||||
connectionGames = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH_games);
|
connectionGames = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH_games);
|
||||||
connectionGames.setAutoCommit(false); //AutoCommit to false -> manual commit is active
|
connectionGames.setAutoCommit(false); // AutoCommit to false -> manual commit is active
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
// if the error message is "out of memory", it probably means no database file is found
|
|
||||||
LOGGER.error("error while loading the games database", e);
|
LOGGER.error("error while loading the games database", e);
|
||||||
}
|
}
|
||||||
LOGGER.info("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
|
|
||||||
|
/**
|
||||||
|
* creating the local_roms table in localRoms.db
|
||||||
|
* if the table has no entries, call loadRomDirectory
|
||||||
|
*
|
||||||
|
* TODO the local_roms table should be called local_games
|
||||||
|
*/
|
||||||
void createRomDatabase() {
|
void createRomDatabase() {
|
||||||
try {
|
try {
|
||||||
Statement stmt = connection.createStatement();
|
Statement stmt = connection.createStatement();
|
||||||
@ -126,23 +139,29 @@ public class dbController {
|
|||||||
}
|
}
|
||||||
stmt.close();
|
stmt.close();
|
||||||
rs.close();
|
rs.close();
|
||||||
}catch (SQLException e){
|
} catch (SQLException e) {
|
||||||
LOGGER.error("error while loading ROMs from ROM database, local_roms table", e);
|
LOGGER.error("error while loading ROMs from ROM database, local_roms table", e);
|
||||||
}
|
}
|
||||||
if(entries.size() == 0){
|
if (entries.size() == 0) {
|
||||||
loadRomDirectory(mainWindowController.getRomPath());
|
mainWindowController.reloadRoms();
|
||||||
|
} else {
|
||||||
|
loadAllGames();
|
||||||
|
mainWindowController.refreshUIData();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void addRom(String title, String coverPath, String romPath, String titleID, String productCode, String region, String lastPlayed, String timePlayed) throws SQLException{
|
// add a game to the database
|
||||||
|
public void addGame(String title, String coverPath, String romPath, String titleID, String productCode, String region, String lastPlayed, String timePlayed) throws SQLException{
|
||||||
Statement stmt = connection.createStatement();
|
Statement stmt = connection.createStatement();
|
||||||
stmt.executeUpdate("insert into local_roms values ('"+title+"','"+coverPath+"','"+romPath+"','"+titleID+"','"+productCode+"','"+region+"','"+lastPlayed+"','"+timePlayed+"')");
|
stmt.executeUpdate("insert into local_roms values ('"+title+"','"+coverPath+"','"+romPath+"','"+titleID+"',"
|
||||||
|
+ "'"+productCode+"','"+region+"','"+lastPlayed+"','"+timePlayed+"')");
|
||||||
connection.commit();
|
connection.commit();
|
||||||
stmt.close();
|
stmt.close();
|
||||||
LOGGER.info("added \""+title+"\" to ROM database");
|
LOGGER.info("added \""+title+"\" to ROM database");
|
||||||
}
|
}
|
||||||
|
|
||||||
void removeRom(String titleID) throws SQLException{
|
// remove a game from the database
|
||||||
|
public void removeGame(String titleID) throws SQLException{
|
||||||
Statement stmt = connection.createStatement();
|
Statement stmt = connection.createStatement();
|
||||||
stmt.executeUpdate("delete from local_roms where titleID = '"+titleID+"'");
|
stmt.executeUpdate("delete from local_roms where titleID = '"+titleID+"'");
|
||||||
connection.commit();
|
connection.commit();
|
||||||
@ -150,9 +169,9 @@ public class dbController {
|
|||||||
LOGGER.info("removed \""+titleID+"\" from ROM database");
|
LOGGER.info("removed \""+titleID+"\" from ROM database");
|
||||||
}
|
}
|
||||||
|
|
||||||
//load all ROMs on startup to the mainWindowController
|
//load all ROMs to the mainWindowController
|
||||||
void loadAllRoms(){
|
public void loadAllGames(){
|
||||||
LOGGER.info("loading all rom's on startup into the mainWindowController ...");
|
LOGGER.info("loading all games on startup into the mainWindowController ...");
|
||||||
try {
|
try {
|
||||||
Statement stmt = connection.createStatement();
|
Statement stmt = connection.createStatement();
|
||||||
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms");
|
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms");
|
||||||
@ -162,13 +181,13 @@ public class dbController {
|
|||||||
stmt.close();
|
stmt.close();
|
||||||
rs.close();
|
rs.close();
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
LOGGER.error("error while loading all ROMs into the mainWindowController", e);
|
LOGGER.error("error while loading all games into the mainWindowController", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//load one single ROM after manual adding into the mainWindowController
|
//load a single ROM to the mainWindowController
|
||||||
void loadSingleRom(String titleID){
|
public void loadSingleGame(String titleID){
|
||||||
LOGGER.info("loading a single ROM (ID: "+titleID+") into the mainWindowController ...");
|
LOGGER.info("loading a single game (ID: "+titleID+") into the mainWindowController ...");
|
||||||
try {
|
try {
|
||||||
Statement stmt = connection.createStatement();
|
Statement stmt = connection.createStatement();
|
||||||
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms where titleID = '"+titleID+"'");
|
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms where titleID = '"+titleID+"'");
|
||||||
@ -178,68 +197,67 @@ public class dbController {
|
|||||||
stmt.close();
|
stmt.close();
|
||||||
rs.close();
|
rs.close();
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
LOGGER.error("error while loading a single ROM into the mainWindowController", e);
|
LOGGER.error("error while loading a single game into the mainWindowController", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//get all files with .rpx TODO add other formats
|
/**
|
||||||
void loadRomDirectory(String directory){
|
* get all .rpx files from a given directory and add them to the games database if they don't exist there
|
||||||
|
* @param directory where to search for the .rpx files
|
||||||
|
*/
|
||||||
|
public void loadRomDirectory(String directory){
|
||||||
File dir = new File(directory);
|
File dir = new File(directory);
|
||||||
File appFile;
|
File appFile;
|
||||||
String[] extensions = new String[] { "rpx", "jsp" };
|
String[] extensions = new String[] { "rpx", "jsp" };
|
||||||
File pictureCache;
|
File pictureCache = main.getPictureCache();
|
||||||
String coverPath;
|
String coverPath;
|
||||||
|
|
||||||
if(System.getProperty("os.name").equals("Linux")){
|
|
||||||
pictureCache = mainWindowController.pictureCacheLinux;
|
|
||||||
}else{
|
|
||||||
pictureCache = mainWindowController.pictureCacheWin;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Statement stmt = connectionGames.createStatement();
|
Statement stmt = connectionGames.createStatement();
|
||||||
LOGGER.info("Getting all .rpx files in " + dir.getCanonicalPath()+" including those in subdirectories");
|
|
||||||
List<File> files = (List<File>) FileUtils.listFiles(dir, extensions, true);
|
List<File> files = (List<File>) FileUtils.listFiles(dir, extensions, true);
|
||||||
|
LOGGER.info("<============================== start loading ROM Directory ==============================>");
|
||||||
|
LOGGER.info("Getting all .rpx files in " + dir.getCanonicalPath()+" including those in subdirectories");
|
||||||
|
// for all files in dir get the app.xml
|
||||||
for (File file : files) {
|
for (File file : files) {
|
||||||
if(System.getProperty("os.name").equals("Linux")){
|
appFile = new File(file.getParent() + "/app.xml");
|
||||||
appFile = new File(file.getParent()+"/app.xml");
|
|
||||||
} else {
|
|
||||||
appFile = new File(file.getParent()+"\\app.xml");
|
|
||||||
}
|
|
||||||
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
|
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
|
||||||
Document document = documentBuilder.parse(appFile);
|
Document document = documentBuilder.parse(appFile);
|
||||||
String title_ID = document.getElementsByTagName("title_id").item(0).getTextContent();
|
String title_ID = document.getElementsByTagName("title_id").item(0).getTextContent(); // get titile_ID from app.xml
|
||||||
title_ID = title_ID.substring(0, 8) + "-" + title_ID.substring(8, title_ID.length());
|
title_ID = title_ID.substring(0, 8) + "-" + title_ID.substring(8, title_ID.length());
|
||||||
LOGGER.info("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+"';");
|
ResultSet rs = stmt.executeQuery("SELECT * FROM games WHERE TitleID = '" + title_ID + "';");
|
||||||
while (rs.next()) {
|
|
||||||
if (checkEntry(rs.getString(2))) {
|
|
||||||
LOGGER.info(rs.getString(2) + ": game already in database");
|
|
||||||
}else{
|
|
||||||
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);
|
|
||||||
if(System.getProperty("os.name").equals("Linux")) {
|
|
||||||
ImageIO.write(resizeImagePNG, "png", new File(pictureCache+"/"+rs.getString(3)+".png")); //change path where you want it saved
|
|
||||||
coverPath = pictureCache+"/"+rs.getString(3)+".png";
|
|
||||||
} else {
|
|
||||||
ImageIO.write(resizeImagePNG, "png", new File(pictureCache+"\\"+rs.getString(3)+".png")); //change path where you want it saved
|
|
||||||
coverPath = pictureCache+"\\"+rs.getString(3)+".png";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// for all elements in the games table check if it's already present, else add it
|
||||||
|
while (rs.next()) {
|
||||||
|
if (checkAddEntry(rs.getString(2))) {
|
||||||
|
LOGGER.info(rs.getString(2) + ": game already in database");
|
||||||
|
} else {
|
||||||
|
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);
|
||||||
|
|
||||||
|
ImageIO.write(resizeImagePNG, "png", new File(pictureCache + "/" + rs.getString(3) + ".png"));
|
||||||
|
coverPath = pictureCache + "/" + rs.getString(3) + ".png";
|
||||||
LOGGER.info(rs.getString(2) + ": adding ROM");
|
LOGGER.info(rs.getString(2) + ": adding ROM");
|
||||||
addRom(rs.getString(2), coverPath, file.getCanonicalPath(), rs.getString(1), rs.getString(3), rs.getString(5),"","0");
|
addGame(rs.getString(2), coverPath, file.getCanonicalPath(), rs.getString(1), rs.getString(3),
|
||||||
|
rs.getString(5), "", "0");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
LOGGER.info("<============================= finished loading ROM Directory ============================>");
|
||||||
} catch (IOException | SQLException | ParserConfigurationException | SAXException e) {
|
} catch (IOException | SQLException | ParserConfigurationException | SAXException e) {
|
||||||
LOGGER.error("error while loading ROMs from directory", e);
|
LOGGER.error("error while loading ROMs from directory", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean checkEntry(String title) throws SQLException{
|
/**
|
||||||
|
* check if there is a game with the given name already in the database
|
||||||
|
* @param title game title
|
||||||
|
* @return true if the game exists, false if not
|
||||||
|
* @throws SQLException
|
||||||
|
*/
|
||||||
|
private boolean checkAddEntry(String title) throws SQLException{
|
||||||
Statement stmt = connection.createStatement();
|
Statement stmt = connection.createStatement();
|
||||||
boolean check = false;
|
boolean check = false;
|
||||||
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms WHERE title = '"+title+"';");
|
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms WHERE title = '"+title+"';");
|
||||||
@ -249,6 +267,7 @@ public class dbController {
|
|||||||
return check;
|
return check;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
private void checkRemoveEntry() {
|
private void checkRemoveEntry() {
|
||||||
/**
|
/**
|
||||||
* TODO needs to be implemented!
|
* TODO needs to be implemented!
|
||||||
@ -266,7 +285,45 @@ public class dbController {
|
|||||||
return resizedImage;
|
return resizedImage;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setLastPlayed(String titleID){
|
/**
|
||||||
|
* getting info for a game with titleID
|
||||||
|
* @param titleID Title-ID of the Game
|
||||||
|
* @return title, coverPath, romPath, titleID (in this order)
|
||||||
|
*/
|
||||||
|
public String[] getGameInfo(String titleID){
|
||||||
|
String[] gameInfo = new String[4];
|
||||||
|
LOGGER.info("getting game info for titleID: "+titleID+" ...");
|
||||||
|
try {
|
||||||
|
Statement stmt = connection.createStatement();
|
||||||
|
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms where titleID = '"+titleID+"'");
|
||||||
|
while (rs.next()) {
|
||||||
|
gameInfo[0] = rs.getString(1);// title
|
||||||
|
gameInfo[1] = rs.getString(2);// coverPath
|
||||||
|
gameInfo[2] = rs.getString(3);// romPath
|
||||||
|
gameInfo[3] = rs.getString(4);// titleID
|
||||||
|
}
|
||||||
|
stmt.close();
|
||||||
|
rs.close();
|
||||||
|
}catch (Exception e){
|
||||||
|
LOGGER.error("error while getting game info", e);
|
||||||
|
}
|
||||||
|
return gameInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGameInfo(String title, String coverPath, String romPath, String titleID){
|
||||||
|
LOGGER.info("setting game info for titleID: "+titleID+" ...");
|
||||||
|
try {
|
||||||
|
Statement stmt = connection.createStatement();
|
||||||
|
stmt.executeUpdate("UPDATE local_roms SET title = '" + title + "', coverPath = '" + coverPath + "',"
|
||||||
|
+ " romPath = '" + romPath + "' WHERE titleID = '"+titleID+"';");
|
||||||
|
connection.commit();
|
||||||
|
stmt.close();
|
||||||
|
}catch (Exception e){
|
||||||
|
LOGGER.error("error while setting game info", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastPlayed(String titleID){
|
||||||
try{
|
try{
|
||||||
Statement stmt = connection.createStatement();
|
Statement stmt = connection.createStatement();
|
||||||
stmt.executeUpdate("UPDATE local_roms SET lastPlayed=date('now') WHERE titleID = '"+titleID+"';");
|
stmt.executeUpdate("UPDATE local_roms SET lastPlayed=date('now') WHERE titleID = '"+titleID+"';");
|
||||||
@ -277,7 +334,7 @@ public class dbController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String getLastPlayed(String titleID){
|
public String getLastPlayed(String titleID){
|
||||||
String lastPlayed = null;
|
String lastPlayed = null;
|
||||||
try{
|
try{
|
||||||
Statement stmt = connection.createStatement();
|
Statement stmt = connection.createStatement();
|
||||||
@ -291,7 +348,7 @@ public class dbController {
|
|||||||
return lastPlayed;
|
return lastPlayed;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setTotalPlaytime(String timePlayed, String titleID){
|
public void setTotalPlaytime(String timePlayed, String titleID){
|
||||||
try{
|
try{
|
||||||
Statement stmt = connection.createStatement();
|
Statement stmt = connection.createStatement();
|
||||||
stmt.executeUpdate("UPDATE local_roms SET timePlayed='"+timePlayed+"' WHERE titleID = '"+titleID+"';");
|
stmt.executeUpdate("UPDATE local_roms SET timePlayed='"+timePlayed+"' WHERE titleID = '"+titleID+"';");
|
||||||
@ -303,7 +360,7 @@ public class dbController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String getTotalPlaytime(String titleID){
|
public String getTotalPlaytime(String titleID){
|
||||||
String timePlayed = null;
|
String timePlayed = null;
|
||||||
try{
|
try{
|
||||||
Statement stmt = connection.createStatement();
|
Statement stmt = connection.createStatement();
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* cemu_UI
|
* cemu_UI
|
||||||
*
|
*
|
||||||
* Copyright 2017 <@Seil0>
|
* Copyright 2017-2018 <@Seil0>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -18,8 +18,7 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
* MA 02110-1301, USA.
|
* MA 02110-1301, USA.
|
||||||
*/
|
*/
|
||||||
|
package com.cemu_UI.controller;
|
||||||
package application;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -30,18 +29,17 @@ import java.util.ArrayList;
|
|||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
import com.cemu_UI.datatypes.SmmdbApiDataType;
|
||||||
import com.eclipsesource.json.Json;
|
import com.eclipsesource.json.Json;
|
||||||
import com.eclipsesource.json.JsonArray;
|
import com.eclipsesource.json.JsonArray;
|
||||||
import com.eclipsesource.json.JsonValue;
|
import com.eclipsesource.json.JsonValue;
|
||||||
|
|
||||||
import datatypes.SmmdbApiDataType;
|
public class SmmdbAPIController {
|
||||||
|
|
||||||
public class SmmdbApiQuery {
|
private String URL = "https://smmdb.ddns.net/api/getcourses?format=json";
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger(SmmdbAPIController.class.getName());
|
||||||
|
|
||||||
private String URL = "http://smmdb.ddns.net/api/getcourses?format=json";
|
public SmmdbAPIController() {
|
||||||
private static final Logger LOGGER = LogManager.getLogger(SmmdbApiQuery.class.getName());
|
|
||||||
|
|
||||||
public SmmdbApiQuery() {
|
|
||||||
//Auto-generated constructor stub
|
//Auto-generated constructor stub
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,6 +62,7 @@ public class SmmdbApiQuery {
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOGGER.error("error while making api request or reading response");
|
LOGGER.error("error while making api request or reading response");
|
||||||
LOGGER.error("response from " + URL + " was: " + output, e);
|
LOGGER.error("response from " + URL + " was: " + output, e);
|
||||||
|
return course;
|
||||||
}
|
}
|
||||||
|
|
||||||
String apiOutput = "{ \"courses\": " + output + "}";
|
String apiOutput = "{ \"courses\": " + output + "}";
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user