Compare commits
188 Commits
Author | SHA1 | Date | |
---|---|---|---|
5728ea4f4d | |||
13dd0a0150 | |||
f584eef9b7 | |||
a6b1ce7f72 | |||
0fecb8bb16 | |||
2689b03c16 | |||
bc36630ef2 | |||
07ded89069 | |||
a4c8eb2efe | |||
7d376535ae | |||
3f69169a6a | |||
922c5197da | |||
0599945036 | |||
df33c21826 | |||
e59b14074e | |||
648d101c8e | |||
4222101b68 | |||
db8fcd4bdc | |||
7434d0be25 | |||
360badb841 | |||
38421599a3 | |||
3f6eeece7d | |||
36fd86d15c | |||
87eaec31ee | |||
a2f35de1c7 | |||
b879e22fcf | |||
960bec5283 | |||
ffb7bc971c | |||
50088e0130 | |||
a3fc8ba463 | |||
ada6bec325 | |||
bbfc9521a0 | |||
2ac66978ba | |||
ed99e45115 | |||
dcd928096a | |||
1df6a91f41 | |||
|
d46eace9d5 | ||
|
9e58a30390 | ||
|
010f109597 | ||
|
d082482844 | ||
fb1fd442f7 | |||
|
9839c303da | ||
b610dc337b | |||
|
f195addea8 | ||
|
e371859987 | ||
|
8b62a732cd | ||
|
41a0becd4f | ||
|
9b7a85cabe | ||
|
cc4e73c45d | ||
|
c6a40f8937 | ||
|
e13c84382f | ||
|
ea34f10c09 | ||
|
4e4d32dc97 | ||
|
f1bb0607f7 | ||
|
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 | ||
|
e4a316f62c | ||
|
eb127282ad | ||
|
5b46a0b58c | ||
|
6169a5e7cd | ||
|
f53055db7e | ||
|
8d759a724b | ||
|
f6778a320f | ||
|
607bcf8ace | ||
|
c5d6a2f276 | ||
|
0f0f962d8c | ||
|
0d46e818e1 | ||
|
05f6f7e664 | ||
|
8d49ce902e | ||
|
6d5e9409a5 | ||
|
bda73cf627 | ||
|
e13a187c71 | ||
|
e4dbbe0d55 | ||
|
f09258190a | ||
|
109bcf6e03 | ||
|
3853f70895 | ||
|
9b4bc3ada9 | ||
|
3bc571bacd | ||
|
729a4ee10e | ||
|
3f98dfa059 | ||
|
78791bb7e1 | ||
|
0124a5b1a4 | ||
|
959963f9bc | ||
|
85fc66e8d6 | ||
|
6c1663f386 | ||
|
71cf0316ec | ||
|
dec767f553 | ||
|
a24783f18c | ||
|
9f0956a674 | ||
|
dbd52cbe9c | ||
|
4c8a0a51e9 | ||
|
7a2112a759 | ||
|
9930a4cb15 | ||
|
d36b869e80 | ||
|
43a7e22254 | ||
|
07d33df63a | ||
|
e394b1a573 | ||
|
a30def1fd0 |
26
.classpath
26
.classpath
@ -1,26 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<classpath>
|
|
||||||
<classpathentry kind="src" path="src"/>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.fx.ide.jdt.core.JAVAFX_CONTAINER"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/commons-io-2.5.jar"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/google_apis/google-api-client-1.22.0.jar"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/google_apis/google-api-services-drive-v3-rev68-1.22.0.jar"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/google_apis/google-http-client-1.22.0.jar"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/google_apis/google-http-client-jackson2-1.22.0.jar"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/google_apis/google-oauth-client-1.22.0.jar"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/google_apis/google-oauth-client-java6-1.22.0.jar"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/google_apis/google-oauth-client-jetty-1.22.0.jar"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/google_apis/javax.servlet-api-3.1.0.jar"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/google_apis/jetty-6.1.25.jar"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/google_apis/jetty-util-6.1.25.jar"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/google_apis/jackson-core-2.8.8.jar"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/commons-codec-1.10.jar"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/jfoenix-1.4.0.jar"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/sqlite-jdbc-3.18.0.jar"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/minimal-json-0.9.4.jar"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/junrar-0.7.jar"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/commons-logging-api-1.1.jar"/>
|
|
||||||
<classpathentry kind="lib" path="src/libraries/commons-vfs2-2.1.1744488.2.jar"/>
|
|
||||||
<classpathentry kind="output" path="bin"/>
|
|
||||||
</classpath>
|
|
6
.gitignore
vendored
6
.gitignore
vendored
@ -48,4 +48,8 @@ Temporary Items
|
|||||||
config.xml
|
config.xml
|
||||||
client_secret.json
|
client_secret.json
|
||||||
.directory
|
.directory
|
||||||
|
target/
|
||||||
|
cemu_UI.jar
|
||||||
|
.classpath
|
||||||
|
.project
|
||||||
|
.settings/*
|
||||||
|
23
.project
23
.project
@ -1,23 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<projectDescription>
|
|
||||||
<name>cemu_UI</name>
|
|
||||||
<comment></comment>
|
|
||||||
<projects>
|
|
||||||
</projects>
|
|
||||||
<buildSpec>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
</buildSpec>
|
|
||||||
<natures>
|
|
||||||
<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
|
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
|
||||||
</natures>
|
|
||||||
</projectDescription>
|
|
@ -1,12 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
|
||||||
org.eclipse.jdt.core.compiler.compliance=1.8
|
|
||||||
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
|
||||||
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
|
||||||
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
|
||||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
|
||||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
|
||||||
org.eclipse.jdt.core.compiler.source=1.8
|
|
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.
|
||||||
|
45
README.md
45
README.md
@ -1,48 +1,37 @@
|
|||||||
# cemu_UI
|
# cemu_UI
|
||||||
|
|
||||||
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).
|

|
||||||
|
[](https://git.mosad.xyz/Seil0/cemu_UI/releases)
|
||||||
|
[](https://www.gnu.org/licenses/gpl-3.0)
|
||||||
|
|
||||||
## installation
|
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).
|
||||||
Simply download the cemu_UI.jar from [releases](https://github.com/Seil0/cemu_UI/releases), make sure you have the latest version of java 8 oracle jre/jdk installed, open the file. cemu_UI creats a new directory "C:\Users\USERNAME\Documents\cemu_UI", where the database, settings and covers are stored. **first start can take while!**
|
|
||||||
|
|
||||||
If you want to use the cloud sync function read the [wiki](https://github.com/Seil0/cemu_UI/wiki#cloud-savegame-syncronisation) carefully!
|
## Installation
|
||||||
|
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!**
|
||||||
|
|
||||||
## building from source
|
If you want to use the cloud sync function read the [wiki](https://git.mosad.xyz/Seil0/cemu_UI/wiki#cloud-savegame-syncronisation) carefully!
|
||||||
1. read the [license](https://github.com/Seil0/cemu_UI/blob/master/LICENSE)
|
|
||||||
2. download/clone the git repository
|
### [FAQ](https://git.mosad.xyz/Seil0/cemu_UI/wiki#faq)
|
||||||
3. make sure you have the latest versionj of java 8 oracle jdk installed
|
|
||||||
4. place the unzip repository into your workspace and start eclipse, project should now be there **or** import the project to your workspace
|
|
||||||
|
|
||||||
## 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
|
||||||
|
|
||||||
## [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
|
|
||||||
* [smmdb api](http://smmdb.ddns.net/api) integration
|
|
||||||
|
|
||||||
### If you have another idea, make a "new issue" with the `idea` lable
|
### If you have another idea, make a new issue!
|
||||||
|
|
||||||
## FAQ
|
### [building from source](https://git.mosad.xyz/Seil0/cemu_UI/wiki/Documentation)
|
||||||
|
|
||||||
* My game is not detected automaticaly
|
|
||||||
* You need to add it to the [games.db](https://github.com/Seil0/cemu_UI/blob/master/downloadContent/games.db) database or you add it to the [games.csv](https://github.com/Seil0/cemu_UI/blob/master/downloadContent/games.csv) table so everyone can use it.
|
|
||||||
* How can I update the games.db?
|
|
||||||
* Delete the games.db file in "C:\Users\USERNAME\Documents\cemu_UI" it will be downloaded again at the next start of cemu_UI.
|
|
||||||
* I have another question
|
|
||||||
* make a new issue and let me know
|
|
||||||
|
|
||||||
## screenshots
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
## Screenshots
|
||||||
|
|
||||||
|

|
||||||
|
1
bin/.gitignore
vendored
1
bin/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
/application/
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,117 +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 prefHeight="600.0" prefWidth="892.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MainWindowController">
|
|
||||||
<children>
|
|
||||||
<ScrollPane fx:id="scrollPaneMain" 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>
|
|
||||||
<!-- space between settings sections 35px, between sections elements (label + element) 20px, between label and element 3px(or more) -->
|
|
||||||
<AnchorPane fx:id="settingsAnchorPane" layoutX="38.0" layoutY="27.0" prefHeight="573.0" style="-fx-background-color: white;" visible="false" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="175.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="38.0">
|
|
||||||
<children>
|
|
||||||
<Label layoutX="22.0" layoutY="59.0" text="Cemu Directory" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="59.0" />
|
|
||||||
<JFXTextField fx:id="cemuTextField" layoutX="18.0" layoutY="83.0" maxWidth="305.0" minWidth="305.0" onAction="#cemuTextFieldAction" prefHeight="32.0" prefWidth="305.0" promptText="cemu directory" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="79.0" />
|
|
||||||
<JFXTextField fx:id="romTextField" layoutX="18.0" layoutY="159.0" maxWidth="305.0" minWidth="305.0" onAction="#romTextFieldAction" prefHeight="32.0" prefWidth="305.0" promptText="rom directory" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="151.0" />
|
|
||||||
<JFXButton fx:id="romTFBtn" layoutX="337.0" layoutY="159.0" onAction="#romTFBtnAction" prefHeight="32.0" prefWidth="108.0" text="choose directory" AnchorPane.leftAnchor="333.0" AnchorPane.topAnchor="151.0" />
|
|
||||||
<JFXButton fx:id="cemuTFBtn" layoutX="333.0" layoutY="79.0" onAction="#cemuTFBtnAction" prefHeight="32.0" prefWidth="108.0" text="choose directory" AnchorPane.leftAnchor="333.0" AnchorPane.topAnchor="79.0" />
|
|
||||||
<JFXColorPicker fx:id="colorPicker" layoutX="22.0" layoutY="235.0" onAction="#colorPickerAction" AnchorPane.leftAnchor="16.0" AnchorPane.topAnchor="227.0" />
|
|
||||||
<JFXToggleButton fx:id="fullscreenToggleBtn" layoutX="14.0" layoutY="391.0" onAction="#fullscreenToggleBtnAction" text="start game in fullscreen" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="390.0" />
|
|
||||||
<Label layoutX="22.0" layoutY="135.0" text="Rom Directory" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="131.0" />
|
|
||||||
<Label layoutX="22.0" layoutY="211.0" text="main Color" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="203.0" />
|
|
||||||
<Label layoutX="14.0" layoutY="371.0" text="Cemu Settings" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="350.0">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</Label>
|
|
||||||
<Label 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="14.0" layoutY="264.0" onAction="#cloudSyncToggleBtnAction" text="cloud savegames (Google Drive)" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="267.0" />
|
|
||||||
</children>
|
|
||||||
</AnchorPane>
|
|
||||||
<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" maxHeight="38.0" maxWidth="100.0" onAction="#playBtnAction" ripplerFill="#c92a2a" text="play" visible="false" AnchorPane.bottomAnchor="7.0" AnchorPane.leftAnchor="396.0" AnchorPane.rightAnchor="396.0" AnchorPane.topAnchor="555.0">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</JFXButton>
|
|
||||||
<JFXButton fx:id="timePlayedBtn" buttonType="RAISED" maxHeight="32.0" minWidth="100.0" onAction="#timePlayedBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.rightAnchor="516.5" AnchorPane.topAnchor="558.0">
|
|
||||||
</JFXButton>
|
|
||||||
<JFXButton fx:id="lastTimePlayedBtn" buttonType="RAISED" maxHeight="32.0" minWidth="100.0" onAction="#lastTimePlayedBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="516.5" AnchorPane.topAnchor="558.0" />
|
|
||||||
</children>
|
|
||||||
</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.
@ -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.
@ -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>
|
|
Binary file not shown.
Before Width: | Height: | Size: 1006 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1.1 MiB |
File diff suppressed because it is too large
Load Diff
211
pom.xml
Normal file
211
pom.xml
Normal file
@ -0,0 +1,211 @@
|
|||||||
|
<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.2-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>https://www.mosad.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>org.openjfx</groupId>
|
||||||
|
<artifactId>javafx-controls</artifactId>
|
||||||
|
<version>12.0.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openjfx</groupId>
|
||||||
|
<artifactId>javafx-fxml</artifactId>
|
||||||
|
<version>12.0.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openjfx</groupId>
|
||||||
|
<artifactId>javafx-media</artifactId>
|
||||||
|
<version>12.0.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.jfoenix</groupId>
|
||||||
|
<artifactId>jfoenix</artifactId>
|
||||||
|
<version>9.0.9</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.27.2.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-api</artifactId>
|
||||||
|
<version>2.11.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-core</artifactId>
|
||||||
|
<version>2.11.2</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/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.apis/google-api-services-drive -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.apis</groupId>
|
||||||
|
<artifactId>google-api-services-drive</artifactId>
|
||||||
|
<version>v3-rev136-1.25.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.25.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.25.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.25.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.7</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.mortbay.jetty/jetty -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mortbay.jetty</groupId>
|
||||||
|
<artifactId>jetty</artifactId>
|
||||||
|
<version>6.1.26</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.8.0</version>
|
||||||
|
<configuration>
|
||||||
|
<source>11</source>
|
||||||
|
<target>11</target>
|
||||||
|
<showWarnings>true</showWarnings>
|
||||||
|
<showDeprecation>true</showDeprecation>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>exec-maven-plugin</artifactId>
|
||||||
|
<version>1.6.0</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>java</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<mainClass>com.cemu_UI.application.Main</mainClass>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
|
<version>3.2.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.JavaFX11Main</mainClass>
|
||||||
|
</transformer>
|
||||||
|
</transformers>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
@ -1,153 +0,0 @@
|
|||||||
/**
|
|
||||||
* cemu_UI
|
|
||||||
*
|
|
||||||
* Copyright 2017 <@Seil0>
|
|
||||||
*
|
|
||||||
* "THE CHOCOLATE-WARE LICENSE" (Revision 1):
|
|
||||||
* 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 )
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package application;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import cloudControllerInstances.GoogleDriveController;
|
|
||||||
import javafx.application.Platform;
|
|
||||||
|
|
||||||
public class CloudController {
|
|
||||||
|
|
||||||
public CloudController(Main ma) {
|
|
||||||
main = ma;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Main main;
|
|
||||||
private GoogleDriveController googleDriveController = new GoogleDriveController();
|
|
||||||
|
|
||||||
void initializeConnection(String cloudService, String cemuDirectory) {
|
|
||||||
System.out.println("sartting cloud initialisation... ");
|
|
||||||
if(cloudService.equals("GoogleDrive")) {
|
|
||||||
System.out.println("selected service is Google Drive");
|
|
||||||
try {
|
|
||||||
googleDriveController.main(cemuDirectory);
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(cloudService.equals("Dropbox")) {
|
|
||||||
System.out.println("selected service is Dropbox");
|
|
||||||
}
|
|
||||||
System.out.println("cloud initialisation done!");
|
|
||||||
}
|
|
||||||
|
|
||||||
void stratupCheck(String cloudService, String cemuDirectory) {
|
|
||||||
if(cloudService.equals("GoogleDrive")) {
|
|
||||||
System.out.println("starting startup check google drive...");
|
|
||||||
try {
|
|
||||||
if (!googleDriveController.checkFolder()) {
|
|
||||||
googleDriveController.creatFolder();
|
|
||||||
main.mainWindowController.saveSettings();
|
|
||||||
|
|
||||||
Thread thread = new Thread(new Runnable() {
|
|
||||||
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) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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() {
|
|
||||||
public void run() {
|
|
||||||
Platform.runLater(() -> {
|
|
||||||
main.mainWindowController.getPlayBtn().setText("syncing...");
|
|
||||||
});
|
|
||||||
System.out.println("starting sync in new thread...");
|
|
||||||
|
|
||||||
if(cloudService.equals("GoogleDrive")) {
|
|
||||||
try {
|
|
||||||
googleDriveController.sync(cemuDirectory);
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(cloudService.equals("Dropbox")) {
|
|
||||||
|
|
||||||
}
|
|
||||||
Platform.runLater(() -> {
|
|
||||||
main.mainWindowController.getPlayBtn().setText("play");
|
|
||||||
});
|
|
||||||
main.mainWindowController.saveSettings();
|
|
||||||
System.out.println("sync finished!");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
thread.start();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void uploadFile(String cloudService, File file) {
|
|
||||||
|
|
||||||
//running uploadFile in a new thread, instead of blocking the main thread
|
|
||||||
new Thread() {
|
|
||||||
public void run() {
|
|
||||||
System.out.println("starting uploadFile in new thread...");
|
|
||||||
|
|
||||||
if(cloudService.equals("GoogleDrive")) {
|
|
||||||
try {
|
|
||||||
googleDriveController.uploadFile(file);
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(cloudService.equals("Dropbox")) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.start();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFolderID(String cloudService) {
|
|
||||||
String folderID = "";
|
|
||||||
if(cloudService.equals("GoogleDrive")) {
|
|
||||||
folderID = googleDriveController.getFolderID();
|
|
||||||
}
|
|
||||||
if(cloudService.equals("Dropbox")) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return folderID;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFolderID(String folderID, String cloudService) {
|
|
||||||
if(cloudService.equals("GoogleDrive")) {
|
|
||||||
googleDriveController.setFolderID(folderID);
|
|
||||||
}
|
|
||||||
if(cloudService.equals("Dropbox")) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,176 +0,0 @@
|
|||||||
/**
|
|
||||||
* cemu_UI
|
|
||||||
*
|
|
||||||
* Copyright 2017 <@Seil0>
|
|
||||||
*
|
|
||||||
* "THE CHOCOLATE-WARE LICENSE" (Revision 1):
|
|
||||||
* 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 )
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package application;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.nio.channels.Channels;
|
|
||||||
import java.nio.channels.ReadableByteChannel;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
import javafx.application.Application;
|
|
||||||
import javafx.fxml.FXMLLoader;
|
|
||||||
import javafx.stage.DirectoryChooser;
|
|
||||||
import javafx.stage.Stage;
|
|
||||||
import javafx.scene.Scene;
|
|
||||||
import javafx.scene.control.Alert;
|
|
||||||
import javafx.scene.control.ButtonType;
|
|
||||||
import javafx.scene.control.Alert.AlertType;
|
|
||||||
import javafx.scene.layout.AnchorPane;
|
|
||||||
|
|
||||||
|
|
||||||
public class Main extends Application {
|
|
||||||
|
|
||||||
Stage primaryStage;
|
|
||||||
public MainWindowController mainWindowController; //TODO find a better way
|
|
||||||
CloudController cloudController;
|
|
||||||
private String dirWin = System.getProperty("user.home") + "/Documents/cemu_UI"; //Windows: C:/Users/"User"/Documents/HomeFlix
|
|
||||||
private String dirLinux = System.getProperty("user.home") + "/cemu_UI"; //Linux: /home/"User"/HomeFlix
|
|
||||||
private String gamesDBdownloadURL = "https://github.com/Seil0/cemu_UI/raw/master/downloadContent/games.db";
|
|
||||||
private File directory;
|
|
||||||
private File configFile;
|
|
||||||
private File gamesDBFile;
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
private File localDB;
|
|
||||||
private File pictureCache;
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void start(Stage primaryStage) {
|
|
||||||
this.primaryStage = primaryStage;
|
|
||||||
cloudController = new CloudController(this);
|
|
||||||
mainWindow();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void mainWindow(){
|
|
||||||
try {
|
|
||||||
FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindow.fxml"));
|
|
||||||
AnchorPane pane = loader.load();
|
|
||||||
primaryStage.setResizable(false);
|
|
||||||
primaryStage.setTitle("cemu_UI");
|
|
||||||
// primaryStage.getIcons().add(new Image(Main.class.getResourceAsStream("/resources/Homeflix_Icon_64x64.png"))); //adds application icon
|
|
||||||
|
|
||||||
mainWindowController = loader.getController(); //Link of FXMLController and controller class
|
|
||||||
mainWindowController.setMain(this); //call setMain
|
|
||||||
|
|
||||||
//get os and the right paths
|
|
||||||
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
|
|
||||||
System.out.println("Directory: " + directory.exists());
|
|
||||||
System.out.println("configfile: " + configFile.exists());
|
|
||||||
if(directory.exists() != true){
|
|
||||||
System.out.println("mkdir all");
|
|
||||||
directory.mkdir();
|
|
||||||
pictureCache.mkdir();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(configFile.exists() != true){
|
|
||||||
System.out.println("firststart");
|
|
||||||
firstStart();
|
|
||||||
mainWindowController.setColor("00a8cc");
|
|
||||||
mainWindowController.setxPosHelper(0);
|
|
||||||
mainWindowController.saveSettings();
|
|
||||||
Runtime.getRuntime().exec("java -jar cemu_UI.jar"); //start again (preventing Bugs)
|
|
||||||
System.exit(0); //finishes itself
|
|
||||||
}
|
|
||||||
|
|
||||||
if(pictureCache.exists() != true){
|
|
||||||
pictureCache.mkdir();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(gamesDBFile.exists() != true){
|
|
||||||
try {
|
|
||||||
System.out.print("downloading games.db... ");
|
|
||||||
URL website = new URL(gamesDBdownloadURL);
|
|
||||||
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
|
|
||||||
FileOutputStream fos = new FileOutputStream(gamesDBFile);
|
|
||||||
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
|
|
||||||
fos.close();
|
|
||||||
System.out.println("done!");
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//loading settings and initialize UI, dbController.main() loads all databases
|
|
||||||
mainWindowController.loadSettings();
|
|
||||||
mainWindowController.dbController.main();
|
|
||||||
if(mainWindowController.isCloudSync()) {
|
|
||||||
cloudController.initializeConnection(mainWindowController.getCloudService(), mainWindowController.getCemuPath());
|
|
||||||
cloudController.stratupCheck(mainWindowController.getCloudService(), mainWindowController.getCemuPath());
|
|
||||||
}
|
|
||||||
mainWindowController.addUIData();
|
|
||||||
mainWindowController.initActions();
|
|
||||||
mainWindowController.initUI();
|
|
||||||
|
|
||||||
Scene scene = new Scene(pane); //create new scene, append pane to scene
|
|
||||||
scene.getStylesheets().add(Main.class.getResource("MainWindows.css").toExternalForm());
|
|
||||||
primaryStage.setScene(scene); //append scene to stage
|
|
||||||
primaryStage.show(); //show stage
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void firstStart(){
|
|
||||||
Alert alert = new Alert(AlertType.CONFIRMATION); //new alert with file-chooser
|
|
||||||
alert.setTitle("cemu_UI");
|
|
||||||
alert.setHeaderText("cemu installation");
|
|
||||||
alert.setContentText("please select your cemu installation");
|
|
||||||
|
|
||||||
Optional<ButtonType> result = alert.showAndWait();
|
|
||||||
if (result.get() == ButtonType.OK){
|
|
||||||
DirectoryChooser directoryChooser = new DirectoryChooser();
|
|
||||||
File selectedDirectory = directoryChooser.showDialog(primaryStage);
|
|
||||||
mainWindowController.setCemuPath(selectedDirectory.getAbsolutePath());
|
|
||||||
|
|
||||||
} else {
|
|
||||||
mainWindowController.setCemuPath(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
Alert alert2 = new Alert(AlertType.CONFIRMATION); //new alert with file-chooser
|
|
||||||
alert2.setTitle("cemu_UI");
|
|
||||||
alert2.setHeaderText("rom directory");
|
|
||||||
alert2.setContentText("please select your rom directory");
|
|
||||||
|
|
||||||
Optional<ButtonType> result2 = alert2.showAndWait();
|
|
||||||
if (result2.get() == ButtonType.OK){
|
|
||||||
DirectoryChooser directoryChooser = new DirectoryChooser();
|
|
||||||
File selectedDirectory = directoryChooser.showDialog(primaryStage);
|
|
||||||
mainWindowController.setRomPath(selectedDirectory.getAbsolutePath());
|
|
||||||
|
|
||||||
} else {
|
|
||||||
mainWindowController.setRomPath(null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
launch(args);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,117 +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 prefHeight="600.0" prefWidth="892.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MainWindowController">
|
|
||||||
<children>
|
|
||||||
<ScrollPane fx:id="scrollPaneMain" 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>
|
|
||||||
<!-- space between settings sections 35px, between sections elements (label + element) 20px, between label and element 3px(or more) -->
|
|
||||||
<AnchorPane fx:id="settingsAnchorPane" layoutX="38.0" layoutY="27.0" prefHeight="573.0" style="-fx-background-color: white;" visible="false" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="175.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="38.0">
|
|
||||||
<children>
|
|
||||||
<Label layoutX="22.0" layoutY="59.0" text="Cemu Directory" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="59.0" />
|
|
||||||
<JFXTextField fx:id="cemuTextField" layoutX="18.0" layoutY="83.0" maxWidth="305.0" minWidth="305.0" onAction="#cemuTextFieldAction" prefHeight="32.0" prefWidth="305.0" promptText="cemu directory" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="79.0" />
|
|
||||||
<JFXTextField fx:id="romTextField" layoutX="18.0" layoutY="159.0" maxWidth="305.0" minWidth="305.0" onAction="#romTextFieldAction" prefHeight="32.0" prefWidth="305.0" promptText="rom directory" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="151.0" />
|
|
||||||
<JFXButton fx:id="romTFBtn" layoutX="337.0" layoutY="159.0" onAction="#romTFBtnAction" prefHeight="32.0" prefWidth="108.0" text="choose directory" AnchorPane.leftAnchor="333.0" AnchorPane.topAnchor="151.0" />
|
|
||||||
<JFXButton fx:id="cemuTFBtn" layoutX="333.0" layoutY="79.0" onAction="#cemuTFBtnAction" prefHeight="32.0" prefWidth="108.0" text="choose directory" AnchorPane.leftAnchor="333.0" AnchorPane.topAnchor="79.0" />
|
|
||||||
<JFXColorPicker fx:id="colorPicker" layoutX="22.0" layoutY="235.0" onAction="#colorPickerAction" AnchorPane.leftAnchor="16.0" AnchorPane.topAnchor="227.0" />
|
|
||||||
<JFXToggleButton fx:id="fullscreenToggleBtn" layoutX="14.0" layoutY="391.0" onAction="#fullscreenToggleBtnAction" text="start game in fullscreen" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="390.0" />
|
|
||||||
<Label layoutX="22.0" layoutY="135.0" text="Rom Directory" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="131.0" />
|
|
||||||
<Label layoutX="22.0" layoutY="211.0" text="main Color" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="203.0" />
|
|
||||||
<Label layoutX="14.0" layoutY="371.0" text="Cemu Settings" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="350.0">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</Label>
|
|
||||||
<Label 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="14.0" layoutY="264.0" onAction="#cloudSyncToggleBtnAction" text="cloud savegames (Google Drive)" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="267.0" />
|
|
||||||
</children>
|
|
||||||
</AnchorPane>
|
|
||||||
<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" maxHeight="38.0" maxWidth="100.0" onAction="#playBtnAction" ripplerFill="#c92a2a" text="play" visible="false" AnchorPane.bottomAnchor="7.0" AnchorPane.leftAnchor="396.0" AnchorPane.rightAnchor="396.0" AnchorPane.topAnchor="555.0">
|
|
||||||
<font>
|
|
||||||
<Font name="System Bold" size="14.0" />
|
|
||||||
</font>
|
|
||||||
</JFXButton>
|
|
||||||
<JFXButton fx:id="timePlayedBtn" buttonType="RAISED" maxHeight="32.0" minWidth="100.0" onAction="#timePlayedBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.rightAnchor="516.5" AnchorPane.topAnchor="558.0">
|
|
||||||
</JFXButton>
|
|
||||||
<JFXButton fx:id="lastTimePlayedBtn" buttonType="RAISED" maxHeight="32.0" minWidth="100.0" onAction="#lastTimePlayedBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="516.5" AnchorPane.topAnchor="558.0" />
|
|
||||||
</children>
|
|
||||||
</AnchorPane>
|
|
File diff suppressed because it is too large
Load Diff
@ -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; */
|
|
||||||
}
|
|
@ -1,135 +0,0 @@
|
|||||||
/**
|
|
||||||
* smmdbapi query
|
|
||||||
* api query, return all courses as ArrayList
|
|
||||||
*/
|
|
||||||
package application;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import com.eclipsesource.json.Json;
|
|
||||||
import com.eclipsesource.json.JsonArray;
|
|
||||||
import com.eclipsesource.json.JsonObject;
|
|
||||||
import com.eclipsesource.json.JsonValue;
|
|
||||||
|
|
||||||
import datatypes.SmmdbApiDataType;
|
|
||||||
|
|
||||||
public class SmmdbApiQuery {
|
|
||||||
|
|
||||||
private String URL = "http://smmdb.ddns.net/api/getcourses?";
|
|
||||||
|
|
||||||
public SmmdbApiQuery() {
|
|
||||||
//Auto-generated constructor stub
|
|
||||||
}
|
|
||||||
|
|
||||||
//start api query
|
|
||||||
public ArrayList<SmmdbApiDataType> startQuery() {
|
|
||||||
ArrayList<Integer> courseIDs = new ArrayList<>();
|
|
||||||
ArrayList<SmmdbApiDataType> course = new ArrayList<>();
|
|
||||||
String output = "";
|
|
||||||
|
|
||||||
|
|
||||||
try {
|
|
||||||
URL apiUrl = new URL(URL);
|
|
||||||
BufferedReader ina = new BufferedReader(new InputStreamReader(apiUrl.openStream()));
|
|
||||||
output = ina.readLine();
|
|
||||||
ina.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
System.out.println("error while making api request or reading response");
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
JsonObject mainObject = Json.parse(output).asObject().get("courses").asObject();
|
|
||||||
JsonArray objectAssets = Json.parse(output).asObject().get("order").asArray();
|
|
||||||
|
|
||||||
for (JsonValue asset : objectAssets) {
|
|
||||||
courseIDs.add(asset.asInt());
|
|
||||||
}
|
|
||||||
|
|
||||||
//if value is 9 or "notset" the api returned NULL as value
|
|
||||||
for (int i = 0; i < courseIDs.size(); i++) {
|
|
||||||
int id, owner, coursetype, leveltype, difficulty, lastmodified, uploaded, downloads, stars, hasimage, ispackage, updatereq;
|
|
||||||
String nintendoid, title;
|
|
||||||
JsonObject singleObject = mainObject.get(courseIDs.get(i).toString()).asObject();
|
|
||||||
|
|
||||||
try {
|
|
||||||
id = singleObject.getInt("id", 0);
|
|
||||||
} catch (Exception e) {
|
|
||||||
id = 9;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
owner = singleObject.getInt("owner", 0);
|
|
||||||
} catch (Exception e) {
|
|
||||||
owner = 9;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
coursetype = singleObject.getInt("coursetype", 0);
|
|
||||||
} catch (Exception e) {
|
|
||||||
coursetype = 9;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
leveltype = singleObject.getInt("leveltype", 0);
|
|
||||||
} catch (Exception e) {
|
|
||||||
leveltype = 9;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
difficulty = singleObject.getInt("difficulty", 0);
|
|
||||||
} catch (Exception e) {
|
|
||||||
difficulty = 9;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
lastmodified = singleObject.getInt("lastmodified", 0);
|
|
||||||
} catch (Exception e) {
|
|
||||||
lastmodified = 9;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
uploaded = singleObject.getInt("uploaded", 0);
|
|
||||||
} catch (Exception e) {
|
|
||||||
uploaded = 9;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
downloads = singleObject.getInt("downloads", 0);
|
|
||||||
} catch (Exception e) {
|
|
||||||
downloads = 9;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
stars = singleObject.getInt("stars", 0);
|
|
||||||
} catch (Exception e) {
|
|
||||||
stars = 9;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
hasimage = singleObject.getInt("hasimage", 0);
|
|
||||||
} catch (Exception e) {
|
|
||||||
hasimage = 9;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
ispackage = singleObject.getInt("ispackage", 0);
|
|
||||||
} catch (Exception e) {
|
|
||||||
ispackage = 9;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
updatereq = singleObject.getInt("updatereq", 0);
|
|
||||||
} catch (Exception e) {
|
|
||||||
updatereq = 9;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
nintendoid = singleObject.getString("nintendoid", "");
|
|
||||||
} catch (Exception e) {
|
|
||||||
nintendoid = "notset";
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
title = singleObject.getString("title", "");;
|
|
||||||
} catch (Exception e) {
|
|
||||||
title = "notset";
|
|
||||||
}
|
|
||||||
|
|
||||||
course.add(new SmmdbApiDataType(id, owner, coursetype, leveltype, difficulty, lastmodified, uploaded, downloads,
|
|
||||||
stars, hasimage, ispackage, updatereq, nintendoid, title));
|
|
||||||
}
|
|
||||||
|
|
||||||
return course;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,311 +0,0 @@
|
|||||||
/**
|
|
||||||
* cemu_UI
|
|
||||||
*
|
|
||||||
* Copyright 2017 <@Seil0>
|
|
||||||
*
|
|
||||||
* "THE CHOCOLATE-WARE LICENSE" (Revision 1):
|
|
||||||
* 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 )
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package application;
|
|
||||||
|
|
||||||
import java.awt.Graphics2D;
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.sql.Connection;
|
|
||||||
import java.sql.DriverManager;
|
|
||||||
import java.sql.ResultSet;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.sql.Statement;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
|
||||||
|
|
||||||
import org.apache.commons.io.FileUtils;
|
|
||||||
import org.w3c.dom.Document;
|
|
||||||
import org.xml.sax.SAXException;
|
|
||||||
|
|
||||||
public class dbController {
|
|
||||||
|
|
||||||
public dbController(MainWindowController m) {
|
|
||||||
mainWindowController = m;
|
|
||||||
}
|
|
||||||
|
|
||||||
private MainWindowController mainWindowController;
|
|
||||||
private ArrayList<String> entries = new ArrayList<>();
|
|
||||||
private String DB_PATH;
|
|
||||||
private String DB_PATH_games;
|
|
||||||
private Connection connection = null;
|
|
||||||
private Connection connectionGames = null;
|
|
||||||
|
|
||||||
public void main(){
|
|
||||||
System.out.println("<==========starting loading sql==========>");
|
|
||||||
loadRomDatabase();
|
|
||||||
loadGamesDatabase();
|
|
||||||
createRomDatabase();
|
|
||||||
loadAllRoms();
|
|
||||||
checkRemoveEntry();
|
|
||||||
System.out.println("<==========finished loading sql==========>");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadRomDatabase(){
|
|
||||||
if (System.getProperty("os.name").equals("Linux")) {
|
|
||||||
DB_PATH = System.getProperty("user.home") + "/cemu_UI/localRoms.db";
|
|
||||||
}else{
|
|
||||||
DB_PATH = System.getProperty("user.home") + "\\Documents\\cemu_UI" + "\\" + "localRoms.db";
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
// create a database connection
|
|
||||||
connection = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH);
|
|
||||||
connection.setAutoCommit(false); //AutoCommit to false -> manual commit is active
|
|
||||||
} catch (SQLException e) {
|
|
||||||
// if the error message is "out of memory", it probably means no database file is found
|
|
||||||
System.err.println(e.getMessage());
|
|
||||||
}
|
|
||||||
System.out.println("rom database loaded successfull");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* this method is used to load the games database with additional informations about a game
|
|
||||||
* it is used if a new game is added (automatic or manual)
|
|
||||||
*/
|
|
||||||
private void loadGamesDatabase(){
|
|
||||||
if (System.getProperty("os.name").equals("Linux")) {
|
|
||||||
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 {
|
|
||||||
// create a database connection
|
|
||||||
connectionGames = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH_games);
|
|
||||||
connectionGames.setAutoCommit(false); //AutoCommit to false -> manual commit is active
|
|
||||||
} catch (SQLException e) {
|
|
||||||
// if the error message is "out of memory", it probably means no database file is found
|
|
||||||
System.err.println(e.getMessage());
|
|
||||||
}
|
|
||||||
System.out.println("games database loaded successfull");
|
|
||||||
}
|
|
||||||
|
|
||||||
//creating database, if database has 0 entries search for all .rpx files in the roms directory and add them
|
|
||||||
void createRomDatabase() {
|
|
||||||
try {
|
|
||||||
Statement stmt = connection.createStatement();
|
|
||||||
stmt.executeUpdate("create table if not exists local_roms (title, coverPath, romPath, titleID, productCode, region, lastPlayed, timePlayed)");
|
|
||||||
stmt.close();
|
|
||||||
connection.commit();
|
|
||||||
} catch (SQLException e1) {
|
|
||||||
e1.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
Statement stmt = connection.createStatement();
|
|
||||||
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms");
|
|
||||||
while (rs.next()) {
|
|
||||||
entries.add(rs.getString(2));
|
|
||||||
}
|
|
||||||
stmt.close();
|
|
||||||
rs.close();
|
|
||||||
}catch (SQLException ea){
|
|
||||||
System.err.println("Ups! an error occured!");
|
|
||||||
ea.printStackTrace();
|
|
||||||
}
|
|
||||||
if(entries.size() == 0){
|
|
||||||
loadRomDirectory(mainWindowController.getRomPath());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void addRom(String title, String coverPath, String romPath, String titleID, String productCode, String region, String lastPlayed, String timePlayed) throws SQLException{
|
|
||||||
Statement stmt = connection.createStatement();
|
|
||||||
stmt.executeUpdate("insert into local_roms values ('"+title+"','"+coverPath+"','"+romPath+"','"+titleID+"','"+productCode+"','"+region+"','"+lastPlayed+"','"+timePlayed+"')");
|
|
||||||
connection.commit();
|
|
||||||
stmt.close();
|
|
||||||
System.out.println("added \""+title+"\" to databsae");
|
|
||||||
}
|
|
||||||
|
|
||||||
void removeRom(String titleID) throws SQLException{
|
|
||||||
Statement stmt = connection.createStatement();
|
|
||||||
stmt.executeUpdate("delete from local_roms where titleID = '"+titleID+"'");
|
|
||||||
connection.commit();
|
|
||||||
stmt.close();
|
|
||||||
System.out.println("removed \""+titleID+"\" from databsae");
|
|
||||||
}
|
|
||||||
|
|
||||||
//load all rom's on startup to the UI
|
|
||||||
void loadAllRoms(){
|
|
||||||
System.out.println("loading all rom's on startup to mwc ...");
|
|
||||||
try {
|
|
||||||
Statement stmt = connection.createStatement();
|
|
||||||
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms");
|
|
||||||
while (rs.next()) {
|
|
||||||
mainWindowController.addGame(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4));
|
|
||||||
}
|
|
||||||
stmt.close();
|
|
||||||
rs.close();
|
|
||||||
}catch (Exception e){
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//load one single rom after manual adding one
|
|
||||||
void loadSingleRom(String titleID){
|
|
||||||
System.out.println("loading a single rom (ID: "+titleID+") to mwc ...");
|
|
||||||
try {
|
|
||||||
Statement stmt = connection.createStatement();
|
|
||||||
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms where titleID = '"+titleID+"'");
|
|
||||||
while (rs.next()) {
|
|
||||||
mainWindowController.addGame(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4));
|
|
||||||
}
|
|
||||||
stmt.close();
|
|
||||||
rs.close();
|
|
||||||
}catch (Exception e){
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//get all files with .rpx TODO add other formats
|
|
||||||
void loadRomDirectory(String directory){
|
|
||||||
File dir = new File(directory);
|
|
||||||
File appFile;
|
|
||||||
String[] extensions = new String[] { "rpx", "jsp" };
|
|
||||||
File pictureCache;
|
|
||||||
String coverPath;
|
|
||||||
|
|
||||||
if(System.getProperty("os.name").equals("Linux")){
|
|
||||||
pictureCache = mainWindowController.pictureCacheLinux;
|
|
||||||
}else{
|
|
||||||
pictureCache = mainWindowController.pictureCacheWin;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
Statement stmt = connectionGames.createStatement();
|
|
||||||
System.out.println("Getting all .rpx files in " + dir.getCanonicalPath()+" including those in subdirectories \n");
|
|
||||||
List<File> files = (List<File>) FileUtils.listFiles(dir, extensions, true);
|
|
||||||
for (File file : files) {
|
|
||||||
if(System.getProperty("os.name").equals("Linux")){
|
|
||||||
appFile = new File(file.getParent()+"/app.xml");
|
|
||||||
} else {
|
|
||||||
appFile = new File(file.getParent()+"\\app.xml");
|
|
||||||
}
|
|
||||||
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
|
||||||
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
|
|
||||||
Document document = documentBuilder.parse(appFile);
|
|
||||||
String title_ID = document.getElementsByTagName("title_id").item(0).getTextContent();
|
|
||||||
title_ID = title_ID.substring(0, 8) + "-" + title_ID.substring(8, title_ID.length());
|
|
||||||
System.out.println("Name: "+file.getName()+"; Title ID: "+title_ID);
|
|
||||||
ResultSet rs = stmt.executeQuery("SELECT * FROM games WHERE TitleID = '"+title_ID+"';");
|
|
||||||
while (rs.next()) {
|
|
||||||
System.out.print(rs.getString(2));
|
|
||||||
if (checkEntry(rs.getString(2))) {
|
|
||||||
System.out.println(": game already in database");
|
|
||||||
}else{
|
|
||||||
System.out.println(": add game");
|
|
||||||
System.out.println("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";
|
|
||||||
}
|
|
||||||
|
|
||||||
addRom(rs.getString(2), coverPath, file.getCanonicalPath(), rs.getString(1), rs.getString(3), rs.getString(5),"","0");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
System.out.println("");
|
|
||||||
}
|
|
||||||
} catch (IOException | SQLException | ParserConfigurationException | SAXException e) {
|
|
||||||
System.out.println("Ups something went wrong!");
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean checkEntry(String title) throws SQLException{
|
|
||||||
Statement stmt = connection.createStatement();
|
|
||||||
boolean check = false;
|
|
||||||
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms WHERE title = '"+title+"';");
|
|
||||||
while (rs.next()) {
|
|
||||||
check = true;
|
|
||||||
}
|
|
||||||
return check;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void checkRemoveEntry() {
|
|
||||||
// TODO needs to be implemented!
|
|
||||||
System.out.println("check if entry removed not done yet!");
|
|
||||||
}
|
|
||||||
|
|
||||||
private static BufferedImage resizeImage(BufferedImage originalImage, int type, int IMG_WIDTH, int IMG_HEIGHT) {
|
|
||||||
BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, type);
|
|
||||||
Graphics2D g = resizedImage.createGraphics();
|
|
||||||
g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null);
|
|
||||||
g.dispose();
|
|
||||||
|
|
||||||
return resizedImage;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setLastPlayed(String titleID){
|
|
||||||
try{
|
|
||||||
Statement stmt = connection.createStatement();
|
|
||||||
stmt.executeUpdate("UPDATE local_roms SET lastPlayed=date('now') WHERE titleID = '"+titleID+"';");
|
|
||||||
connection.commit();
|
|
||||||
stmt.close();
|
|
||||||
}catch(SQLException e){
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String getLastPlayed(String titleID){
|
|
||||||
String lastPlayed = null;
|
|
||||||
try{
|
|
||||||
Statement stmt = connection.createStatement();
|
|
||||||
ResultSet rs = stmt.executeQuery("SELECT lastPlayed FROM local_roms WHERE titleID = '"+titleID+"';" );
|
|
||||||
lastPlayed = rs.getString(1);
|
|
||||||
stmt.close();
|
|
||||||
rs.close();
|
|
||||||
}catch(SQLException e){
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return lastPlayed;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setTimePlayed(String timePlayed, String titleID){
|
|
||||||
try{
|
|
||||||
Statement stmt = connection.createStatement();
|
|
||||||
stmt.executeUpdate("UPDATE local_roms SET timePlayed='"+timePlayed+"' WHERE titleID = '"+titleID+"';");
|
|
||||||
connection.commit();
|
|
||||||
stmt.close();
|
|
||||||
}catch(SQLException e){
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String getTimePlayed(String titleID){
|
|
||||||
String timePlayed = null;
|
|
||||||
try{
|
|
||||||
Statement stmt = connection.createStatement();
|
|
||||||
ResultSet rs = stmt.executeQuery("SELECT timePlayed FROM local_roms WHERE titleID = '"+titleID+"';" );
|
|
||||||
timePlayed = rs.getString(1);
|
|
||||||
stmt.close();
|
|
||||||
rs.close();
|
|
||||||
}catch(SQLException e){
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return timePlayed;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,89 +0,0 @@
|
|||||||
/**
|
|
||||||
* cemu_UI
|
|
||||||
*
|
|
||||||
* Copyright 2017 <@Seil0>
|
|
||||||
*
|
|
||||||
* "THE CHOCOLATE-WARE LICENSE" (Revision 1):
|
|
||||||
* 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 )
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
package application;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import javafx.application.Platform;
|
|
||||||
|
|
||||||
public class playGame extends Thread{
|
|
||||||
|
|
||||||
MainWindowController mainWindowController;
|
|
||||||
dbController dbController;
|
|
||||||
|
|
||||||
public playGame(MainWindowController m, dbController db){
|
|
||||||
mainWindowController = m;
|
|
||||||
dbController = db;
|
|
||||||
}
|
|
||||||
|
|
||||||
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()+"\"";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
System.out.println(executeComand);
|
|
||||||
|
|
||||||
p = Runtime.getRuntime().exec(executeComand);
|
|
||||||
p.waitFor();
|
|
||||||
endTime = System.currentTimeMillis();
|
|
||||||
timePlayedNow = (int) Math.floor(((endTime - startTime)/1000/60));
|
|
||||||
timePlayed = Integer.parseInt(dbController.getTimePlayed(selectedGameTitleID))+timePlayedNow;
|
|
||||||
|
|
||||||
dbController.setTimePlayed(Integer.toString(timePlayed), selectedGameTitleID);
|
|
||||||
Platform.runLater(() -> {
|
|
||||||
if(Integer.parseInt(dbController.getTimePlayed(selectedGameTitleID)) > 60){
|
|
||||||
int hoursPlayed = (int) Math.floor(Integer.parseInt(dbController.getTimePlayed(selectedGameTitleID))/60);
|
|
||||||
int minutesPlayed = Integer.parseInt(dbController.getTimePlayed(selectedGameTitleID))-60*hoursPlayed;
|
|
||||||
mainWindowController.timePlayedBtn.setText(hoursPlayed+"h "+minutesPlayed+"min");
|
|
||||||
}else{
|
|
||||||
mainWindowController.timePlayedBtn.setText(dbController.getTimePlayed(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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,295 +0,0 @@
|
|||||||
package cloudControllerInstances;
|
|
||||||
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.apache.commons.io.FileUtils;
|
|
||||||
|
|
||||||
import com.google.api.client.auth.oauth2.Credential;
|
|
||||||
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
|
|
||||||
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
|
|
||||||
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
|
|
||||||
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
|
|
||||||
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
|
|
||||||
import com.google.api.client.http.FileContent;
|
|
||||||
import com.google.api.client.http.HttpTransport;
|
|
||||||
import com.google.api.client.json.JsonFactory;
|
|
||||||
import com.google.api.client.json.jackson2.JacksonFactory;
|
|
||||||
import com.google.api.client.util.DateTime;
|
|
||||||
import com.google.api.client.util.store.FileDataStoreFactory;
|
|
||||||
import com.google.api.services.drive.Drive;
|
|
||||||
import com.google.api.services.drive.Drive.Files;
|
|
||||||
import com.google.api.services.drive.DriveScopes;
|
|
||||||
import com.google.api.services.drive.model.File;
|
|
||||||
import com.google.api.services.drive.model.FileList;
|
|
||||||
|
|
||||||
public class GoogleDriveController {
|
|
||||||
|
|
||||||
Drive service;
|
|
||||||
private String cemuDirectory;
|
|
||||||
private String folderID;
|
|
||||||
private ArrayList<java.io.File> localSavegames = new ArrayList<>();
|
|
||||||
private ArrayList<File> cloudSavegames = new ArrayList<>();
|
|
||||||
private ArrayList<String> localSavegamesName = new ArrayList<>();
|
|
||||||
private ArrayList<String> cloudSavegamesName = new ArrayList<>();
|
|
||||||
|
|
||||||
private final String APPLICATION_NAME ="cemu_Ui Drive API Controller";
|
|
||||||
|
|
||||||
//Directory to store user credentials for this application
|
|
||||||
private final java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("user.home"), ".credentials/cemu_UI_credential");
|
|
||||||
|
|
||||||
//Global instance of the {@link FileDataStoreFactory}
|
|
||||||
private FileDataStoreFactory DATA_STORE_FACTORY;
|
|
||||||
|
|
||||||
//Global instance of the JSON factory
|
|
||||||
private final JsonFactory JSON_FACTORY =JacksonFactory.getDefaultInstance();
|
|
||||||
|
|
||||||
//Global instance of the HTTP transport
|
|
||||||
private HttpTransport HTTP_TRANSPORT;
|
|
||||||
|
|
||||||
/**If modifying these scopes, delete your previously saved credentials
|
|
||||||
* at ~/.credentials/cemu_UI_credential
|
|
||||||
*/
|
|
||||||
private final java.util.Collection<String> SCOPES = DriveScopes.all();
|
|
||||||
|
|
||||||
public GoogleDriveController() {
|
|
||||||
try {
|
|
||||||
HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
|
|
||||||
DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
|
|
||||||
folderID = "";
|
|
||||||
} catch (Throwable t) {
|
|
||||||
t.printStackTrace();
|
|
||||||
System.exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an authorized Credential object.
|
|
||||||
* @return an authorized Credential object.
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
|
||||||
public Credential authorize() throws IOException {
|
|
||||||
// Load client secrets.
|
|
||||||
InputStream in = getClass().getClassLoader().getResourceAsStream("resources/client_secret.json");
|
|
||||||
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
|
|
||||||
|
|
||||||
// Build flow and trigger user authorization request.
|
|
||||||
GoogleAuthorizationCodeFlow flow =
|
|
||||||
new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
|
|
||||||
.setDataStoreFactory(DATA_STORE_FACTORY)
|
|
||||||
.setAccessType("offline")
|
|
||||||
.build();
|
|
||||||
Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
|
|
||||||
System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
|
|
||||||
return credential;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Build and return an authorized Drive client service.
|
|
||||||
* @return an authorized Drive client service
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
|
||||||
public Drive getDriveService() throws IOException {
|
|
||||||
Credential credential = authorize();
|
|
||||||
return new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
|
|
||||||
.setApplicationName(APPLICATION_NAME)
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void main(String cemuDirectory) throws IOException {
|
|
||||||
service = getDriveService();
|
|
||||||
this.cemuDirectory = cemuDirectory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void sync(String cemuDirectory) throws IOException {
|
|
||||||
//in case there is no folderID saved, look it up first
|
|
||||||
if (getFolderID() == "" || getFolderID() == null) {
|
|
||||||
getSavegamesFolderID();
|
|
||||||
}
|
|
||||||
getLocalSavegames();
|
|
||||||
getCloudSavegames();
|
|
||||||
|
|
||||||
// download files from cloud which don't exist locally
|
|
||||||
for (int i = 0; i < cloudSavegames.size(); i++) {
|
|
||||||
|
|
||||||
// if the file exists locally, check which one is newer
|
|
||||||
if (localSavegamesName.contains(cloudSavegames.get(i).getName())) {
|
|
||||||
|
|
||||||
int localSavegamesNumber = localSavegamesName.indexOf(cloudSavegames.get(i).getName());
|
|
||||||
long localModified = new DateTime(localSavegames.get(localSavegamesNumber).lastModified()).getValue();
|
|
||||||
long cloudModified = cloudSavegames.get(i).getModifiedTime().getValue();
|
|
||||||
FileInputStream fis = new FileInputStream(localSavegames.get(localSavegamesNumber));
|
|
||||||
|
|
||||||
if (cloudSavegames.get(i).getMd5Checksum().equals(org.apache.commons.codec.digest.DigestUtils.md5Hex(fis))) {
|
|
||||||
System.out.println("both files are the same, nothing to do");
|
|
||||||
} else {
|
|
||||||
if (localModified >= cloudModified) {
|
|
||||||
System.out.print("local is newer, ");
|
|
||||||
updateFile(cloudSavegames.get(i), localSavegames.get(localSavegamesNumber));
|
|
||||||
} else {
|
|
||||||
System.out.print("cloud is newer, ");
|
|
||||||
downloadFile(cloudSavegames.get(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
System.out.print("file doesn't exist locally, ");
|
|
||||||
downloadFile(cloudSavegames.get(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// upload file to cloud which don't exist in the cloud
|
|
||||||
for (int j = 0; j < localSavegames.size(); j++) {
|
|
||||||
if (!cloudSavegamesName.contains(localSavegamesName.get(j))) {
|
|
||||||
System.out.print("file doesn't exist in the cloud, ");
|
|
||||||
uploadFile(localSavegames.get(j));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//create a folder in google drive
|
|
||||||
public void creatFolder() throws IOException {
|
|
||||||
System.out.println("creating new folder");
|
|
||||||
File fileMetadata = new File();
|
|
||||||
fileMetadata.setName("cemu_savegames");
|
|
||||||
fileMetadata.setMimeType("application/vnd.google-apps.folder");
|
|
||||||
|
|
||||||
File file = service.files().create(fileMetadata).setFields("id").execute();
|
|
||||||
System.out.println("Folder ID: " + file.getId());
|
|
||||||
folderID = file.getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
//check if folder already exist
|
|
||||||
public boolean checkFolder() {
|
|
||||||
try {
|
|
||||||
Files.List request = service.files().list().setQ("mimeType = 'application/vnd.google-apps.folder' and name = 'cemu_savegames'");
|
|
||||||
FileList files = request.execute();
|
|
||||||
if(files.getFiles().size() == 0) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//reading all local savegames
|
|
||||||
private void getLocalSavegames() throws IOException {
|
|
||||||
java.io.File dir = new java.io.File(cemuDirectory+"/mlc01/emulatorSave");
|
|
||||||
String[] extensions = new String[] { "dat","sav","bin" };
|
|
||||||
localSavegames.removeAll(localSavegames);
|
|
||||||
localSavegamesName.removeAll(localSavegamesName);
|
|
||||||
System.out.println("Getting all dat,sav,bin files in " + dir.getCanonicalPath()+" including those in subdirectories");
|
|
||||||
List<java.io.File> files = (List<java.io.File>) FileUtils.listFiles(dir, extensions, true);
|
|
||||||
for (java.io.File file : files) {
|
|
||||||
localSavegamesName.add(file.getParentFile().getName()+"_"+file.getName());
|
|
||||||
localSavegames.add(file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//reading all cloud savegames
|
|
||||||
private void getCloudSavegames() throws IOException {
|
|
||||||
System.out.println("getting all cloud savegames");
|
|
||||||
cloudSavegames.removeAll(cloudSavegames);
|
|
||||||
cloudSavegamesName.removeAll(cloudSavegamesName);
|
|
||||||
Files.List request = service.files().list().setQ("'"+folderID+"' in parents").setFields("nextPageToken, files(id, name, size, modifiedTime, createdTime, md5Checksum)");
|
|
||||||
FileList files = request.execute();
|
|
||||||
|
|
||||||
for (File file : files.getFiles()) {
|
|
||||||
cloudSavegamesName.add(file.getName());
|
|
||||||
cloudSavegames.add(file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void getSavegamesFolderID() throws IOException {
|
|
||||||
Files.List request = service.files().list().setQ("mimeType = 'application/vnd.google-apps.folder' and name = 'cemu_savegames'");
|
|
||||||
FileList files = request.execute();
|
|
||||||
|
|
||||||
try {
|
|
||||||
System.out.println("FolderID: " + files.getFiles().get(0).getId());
|
|
||||||
setFolderID(files.getFiles().get(0).getId());
|
|
||||||
} catch (Exception e) {
|
|
||||||
System.out.println("Oops, something went wrong! It seems that you have more than one folder called 'cemu_savegames'!");
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//upload a file to the cloud from the local savegames folder
|
|
||||||
public void uploadFile(java.io.File uploadFile) throws IOException{
|
|
||||||
System.out.println("uploading " + uploadFile.getName() + "...");
|
|
||||||
File fileMetadata = new File();
|
|
||||||
fileMetadata.setName(uploadFile.getParentFile().getName()+"_"+uploadFile.getName());
|
|
||||||
fileMetadata.setParents(Collections.singletonList(folderID));
|
|
||||||
fileMetadata.setModifiedTime(new DateTime(uploadFile.lastModified()));
|
|
||||||
FileContent mediaContent = new FileContent("", uploadFile);
|
|
||||||
File file = service.files().create(fileMetadata, mediaContent).setFields("id, parents").execute();
|
|
||||||
System.out.println("upload successfull, File ID: " + file.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
//download a file from the cloud to the local savegames folder
|
|
||||||
private void downloadFile(File downloadFile) throws IOException{
|
|
||||||
System.out.print("downloading "+downloadFile.getName()+"... ");
|
|
||||||
java.io.File directory = new java.io.File(cemuDirectory+"/mlc01/emulatorSave/"+ downloadFile.getName().substring(0,8));
|
|
||||||
String file = downloadFile.getName().substring(9,downloadFile.getName().length());
|
|
||||||
if(!directory.exists()) {
|
|
||||||
System.out.print("dir dosent exist... ");
|
|
||||||
directory.mkdir();
|
|
||||||
}
|
|
||||||
|
|
||||||
OutputStream outputStream = new FileOutputStream(directory +"/"+ file);
|
|
||||||
service.files().get(downloadFile.getId()).executeMediaAndDownloadTo(outputStream);
|
|
||||||
outputStream.close();
|
|
||||||
System.out.println("done");
|
|
||||||
}
|
|
||||||
|
|
||||||
//update a file in the cloud, by deleting the old one and uploading an new with the same id
|
|
||||||
private void updateFile(File oldFile, java.io.File newFile) throws IOException {
|
|
||||||
System.out.println("updating " +oldFile.getName()+"... ");
|
|
||||||
service.files().delete(oldFile.getId()).execute(); //deleting old file
|
|
||||||
|
|
||||||
//uploading new file
|
|
||||||
File fileMetadata = new File();
|
|
||||||
fileMetadata.setName(newFile.getParentFile().getName()+"_"+newFile.getName());
|
|
||||||
fileMetadata.setParents(Collections.singletonList(folderID));
|
|
||||||
fileMetadata.setModifiedTime(new DateTime(newFile.lastModified()));
|
|
||||||
|
|
||||||
FileContent mediaContent = new FileContent("", newFile);
|
|
||||||
File file = service.files().create(fileMetadata, mediaContent).setFields("id, parents").execute();
|
|
||||||
System.out.println("File ID: " + file.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void uploadAllFiles() {
|
|
||||||
try {
|
|
||||||
getLocalSavegames();
|
|
||||||
System.out.println("uploading " + localSavegames.size() + " files...");
|
|
||||||
for (int i = 0; i < localSavegames.size(); i++) {
|
|
||||||
uploadFile(localSavegames.get(i));
|
|
||||||
}
|
|
||||||
System.out.println("finished uploading all files!");
|
|
||||||
} catch (IOException e) {
|
|
||||||
//Auto-generated catch block
|
|
||||||
System.out.println("Oops, there went something wrong! Error during uploading all files.");
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public String getFolderID() {
|
|
||||||
return folderID;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFolderID(String folderID) {
|
|
||||||
this.folderID = folderID;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
/**
|
|
||||||
* Datatype used in the TreeTableview for
|
|
||||||
*/
|
|
||||||
package datatypes;
|
|
||||||
|
|
||||||
import com.jfoenix.controls.datamodels.treetable.RecursiveTreeObject;
|
|
||||||
|
|
||||||
import javafx.beans.property.IntegerProperty;
|
|
||||||
import javafx.beans.property.SimpleIntegerProperty;
|
|
||||||
import javafx.beans.property.SimpleStringProperty;
|
|
||||||
import javafx.beans.property.StringProperty;
|
|
||||||
|
|
||||||
public class CourseTableDataType extends RecursiveTreeObject<CourseTableDataType> {
|
|
||||||
|
|
||||||
public final StringProperty title;
|
|
||||||
public final IntegerProperty downloads;
|
|
||||||
public final IntegerProperty stars;
|
|
||||||
public final IntegerProperty id;
|
|
||||||
|
|
||||||
public CourseTableDataType(String title, int downloads, int stars, int id) {
|
|
||||||
this.title = new SimpleStringProperty(title);
|
|
||||||
this.downloads = new SimpleIntegerProperty(downloads);
|
|
||||||
this.stars = new SimpleIntegerProperty(stars);
|
|
||||||
this.id = new SimpleIntegerProperty(id);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,215 +0,0 @@
|
|||||||
/**
|
|
||||||
* Datatype used for the smmdbapi query
|
|
||||||
*/
|
|
||||||
package datatypes;
|
|
||||||
|
|
||||||
import javafx.beans.property.IntegerProperty;
|
|
||||||
import javafx.beans.property.SimpleIntegerProperty;
|
|
||||||
import javafx.beans.property.SimpleStringProperty;
|
|
||||||
import javafx.beans.property.StringProperty;
|
|
||||||
|
|
||||||
public class SmmdbApiDataType {
|
|
||||||
|
|
||||||
private final IntegerProperty id = new SimpleIntegerProperty();
|
|
||||||
private final IntegerProperty owner = new SimpleIntegerProperty();
|
|
||||||
private final IntegerProperty coursetype = new SimpleIntegerProperty();
|
|
||||||
private final IntegerProperty leveltype = new SimpleIntegerProperty();
|
|
||||||
private final IntegerProperty difficulty = new SimpleIntegerProperty();
|
|
||||||
private final IntegerProperty lastmodified = new SimpleIntegerProperty();
|
|
||||||
private final IntegerProperty uploaded = new SimpleIntegerProperty();
|
|
||||||
private final IntegerProperty downloads = new SimpleIntegerProperty();
|
|
||||||
private final IntegerProperty stars = new SimpleIntegerProperty();
|
|
||||||
private final IntegerProperty hasimage = new SimpleIntegerProperty();
|
|
||||||
private final IntegerProperty ispackage = new SimpleIntegerProperty();
|
|
||||||
private final IntegerProperty updatereq = new SimpleIntegerProperty();
|
|
||||||
private final StringProperty nintendoid = new SimpleStringProperty();
|
|
||||||
private final StringProperty title = new SimpleStringProperty();
|
|
||||||
|
|
||||||
public SmmdbApiDataType(final int id, final int owner, final int coursetype, final int leveltype, final int difficulty,
|
|
||||||
final int lastmodified, final int uploaded, final int downloads, final int stars, final int hasimage,
|
|
||||||
final int ispackage, final int updatereq, final String nintendoid, final String title) {
|
|
||||||
this.id.set(id);
|
|
||||||
this.owner.set(owner);
|
|
||||||
this.coursetype.set(coursetype);
|
|
||||||
this.leveltype.set(leveltype);
|
|
||||||
this.difficulty.set(difficulty);
|
|
||||||
this.lastmodified.set(lastmodified);
|
|
||||||
this.uploaded.set(uploaded);
|
|
||||||
this.downloads.set(downloads);
|
|
||||||
this.stars.set(stars);
|
|
||||||
this.hasimage.set(hasimage);
|
|
||||||
this.ispackage.set(ispackage);
|
|
||||||
this.updatereq.set(updatereq);
|
|
||||||
this.nintendoid.set(nintendoid);
|
|
||||||
this.title.set(title);
|
|
||||||
}
|
|
||||||
|
|
||||||
public IntegerProperty idProperty(){
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IntegerProperty ownerProperty(){
|
|
||||||
return owner;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IntegerProperty coursetypeProperty(){
|
|
||||||
return coursetype;
|
|
||||||
}
|
|
||||||
|
|
||||||
public StringProperty nintendoidProperty(){
|
|
||||||
return nintendoid;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IntegerProperty leveltypeProperty(){
|
|
||||||
return leveltype;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IntegerProperty difficultyProperty(){
|
|
||||||
return difficulty;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IntegerProperty lastmodifiedProperty(){
|
|
||||||
return lastmodified;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IntegerProperty uploadedProperty(){
|
|
||||||
return uploaded;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IntegerProperty downloadsProperty(){
|
|
||||||
return downloads;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IntegerProperty starsProperty(){
|
|
||||||
return stars;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IntegerProperty hasimageProperty(){
|
|
||||||
return hasimage;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IntegerProperty ispackageProperty(){
|
|
||||||
return ispackage;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IntegerProperty updatereqProperty(){
|
|
||||||
return updatereq;
|
|
||||||
}
|
|
||||||
|
|
||||||
public StringProperty titleProperty(){
|
|
||||||
return title;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getId() {
|
|
||||||
return idProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getOwner() {
|
|
||||||
return ownerProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getCoursetype() {
|
|
||||||
return coursetypeProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getLeveltype() {
|
|
||||||
return leveltypeProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getDifficulty() {
|
|
||||||
return difficultyProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getLastmodified() {
|
|
||||||
return lastmodifiedProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getUploaded() {
|
|
||||||
return uploadedProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getDownloads() {
|
|
||||||
return downloadsProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getStars() {
|
|
||||||
return starsProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getHasimage() {
|
|
||||||
return hasimageProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getIspackage() {
|
|
||||||
return ispackageProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getUpdatereq() {
|
|
||||||
return updatereqProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNintendoid() {
|
|
||||||
return nintendoidProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTitle() {
|
|
||||||
return titleProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setId(int id) {
|
|
||||||
idProperty().set(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setOwner(int owner) {
|
|
||||||
ownerProperty().set(owner);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setCoursetype(int coursetype) {
|
|
||||||
coursetypeProperty().set(coursetype);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setLeveltype(int leveltype) {
|
|
||||||
leveltypeProperty().set(leveltype);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setDifficulty(int difficulty) {
|
|
||||||
difficultyProperty().set(difficulty);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setLastmodified(int lastmodified) {
|
|
||||||
lastmodifiedProperty().set(lastmodified);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setUploaded(int uploaded) {
|
|
||||||
uploadedProperty().set(uploaded);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setDownloads(int downloads) {
|
|
||||||
downloadsProperty().set(downloads);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setStars(int stars) {
|
|
||||||
starsProperty().set(stars);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setHasimage(int hasimage) {
|
|
||||||
hasimageProperty().set(hasimage);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setIspackage(int ispackage) {
|
|
||||||
ispackageProperty().set(ispackage);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setUpdatereq(int updatereq) {
|
|
||||||
updatereqProperty().set(updatereq);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setNintendoid(String nintendoid) {
|
|
||||||
nintendoidProperty().set(nintendoid);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setTitle(String title) {
|
|
||||||
titleProperty().set(title);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,90 +0,0 @@
|
|||||||
/**
|
|
||||||
* Datatype used for UI ROM elements
|
|
||||||
*/
|
|
||||||
package datatypes;
|
|
||||||
|
|
||||||
import com.jfoenix.controls.JFXButton;
|
|
||||||
|
|
||||||
import javafx.beans.property.SimpleObjectProperty;
|
|
||||||
import javafx.beans.property.SimpleStringProperty;
|
|
||||||
import javafx.beans.property.StringProperty;
|
|
||||||
import javafx.scene.control.Label;
|
|
||||||
import javafx.scene.layout.VBox;
|
|
||||||
|
|
||||||
public class UIROMDataType {
|
|
||||||
|
|
||||||
private final SimpleObjectProperty<VBox> vBox = new SimpleObjectProperty<>();
|
|
||||||
private final SimpleObjectProperty<Label> label = new SimpleObjectProperty<>();
|
|
||||||
private final SimpleObjectProperty<JFXButton> button = new SimpleObjectProperty<>();
|
|
||||||
private final StringProperty titleID = new SimpleStringProperty();
|
|
||||||
private final StringProperty romPath = new SimpleStringProperty();
|
|
||||||
|
|
||||||
public UIROMDataType (final VBox vBox, final Label label, final JFXButton button, final String titleID, final String romPath){
|
|
||||||
this.vBox.set(vBox);
|
|
||||||
this.label.set(label);
|
|
||||||
this.button.set(button);
|
|
||||||
this.titleID.set(titleID);
|
|
||||||
}
|
|
||||||
|
|
||||||
public SimpleObjectProperty<VBox> vBoxProperty(){
|
|
||||||
return vBox;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SimpleObjectProperty<Label> labelProperty(){
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SimpleObjectProperty<JFXButton> buttonProperty(){
|
|
||||||
return button;
|
|
||||||
}
|
|
||||||
|
|
||||||
public StringProperty titleIDProperty(){
|
|
||||||
return titleID;
|
|
||||||
}
|
|
||||||
|
|
||||||
public StringProperty romPathProperty(){
|
|
||||||
return romPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public final VBox getVBox() {
|
|
||||||
return vBoxProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public final Label getLabel() {
|
|
||||||
return labelProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public final JFXButton getButton() {
|
|
||||||
return buttonProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public final String getTitleID(){
|
|
||||||
return titleIDProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public final String getRomPath(){
|
|
||||||
return romPathProperty().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public final void setVBox(VBox vBox) {
|
|
||||||
vBoxProperty().set(vBox);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setLabel(Label label) {
|
|
||||||
labelProperty().set(label);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setButton(JFXButton button) {
|
|
||||||
buttonProperty().set(button);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setTitleID(String titleID){
|
|
||||||
titleIDProperty().set(titleID);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setRomPath(String romPath){
|
|
||||||
romPathProperty().set(romPath);
|
|
||||||
}
|
|
||||||
}
|
|
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.
8
src/main/java/com/cemu_UI/application/JavaFX11Main.java
Normal file
8
src/main/java/com/cemu_UI/application/JavaFX11Main.java
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package com.cemu_UI.application;
|
||||||
|
|
||||||
|
public class JavaFX11Main {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Main.main(args);
|
||||||
|
}
|
||||||
|
}
|
294
src/main/java/com/cemu_UI/application/Main.java
Normal file
294
src/main/java/com/cemu_UI/application/Main.java
Normal file
@ -0,0 +1,294 @@
|
|||||||
|
/**
|
||||||
|
* cemu_UI
|
||||||
|
*
|
||||||
|
* Copyright 2017-2019 <@Seil0>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* 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.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.nio.channels.Channels;
|
||||||
|
import java.nio.channels.ReadableByteChannel;
|
||||||
|
import java.util.Timer;
|
||||||
|
import java.util.TimerTask;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
import com.cemu_UI.controller.CloudController;
|
||||||
|
import com.cemu_UI.controller.XMLController;
|
||||||
|
import com.cemu_UI.uiElements.JFXInfoAlert;
|
||||||
|
import com.cemu_UI.uiElements.JFXOkayCancelAlert;
|
||||||
|
|
||||||
|
import javafx.application.Application;
|
||||||
|
import javafx.beans.value.ChangeListener;
|
||||||
|
import javafx.beans.value.ObservableValue;
|
||||||
|
import javafx.fxml.FXMLLoader;
|
||||||
|
import javafx.scene.Scene;
|
||||||
|
import javafx.scene.control.Alert;
|
||||||
|
import javafx.scene.control.Alert.AlertType;
|
||||||
|
import javafx.scene.layout.AnchorPane;
|
||||||
|
import javafx.stage.DirectoryChooser;
|
||||||
|
import javafx.stage.Stage;
|
||||||
|
|
||||||
|
public class Main extends Application {
|
||||||
|
|
||||||
|
private final String gamesDBdownloadURL = "https://git.mosad.xyz/Seil0/cemu_UI/raw/branch/master/downloadContent/games.db";
|
||||||
|
private static Main main;
|
||||||
|
private static XMLController xmlController;
|
||||||
|
private MainWindowController mainWindowController;
|
||||||
|
private CloudController cloudController;
|
||||||
|
private Stage primaryStage;
|
||||||
|
private AnchorPane pane;
|
||||||
|
private Scene scene;
|
||||||
|
|
||||||
|
private static Logger LOGGER;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void start(Stage primaryStage) {
|
||||||
|
try {
|
||||||
|
LOGGER.info("OS: " + XMLController.getOsName() + " " + XMLController.getOsVers() + " " + XMLController.getOsVers());
|
||||||
|
LOGGER.info("Java: " + XMLController.getJavaVend() + " " + XMLController.getJavaVers());
|
||||||
|
LOGGER.info("User: " + XMLController.getUserName() + " " + XMLController.getUserHome());
|
||||||
|
|
||||||
|
this.primaryStage = primaryStage;
|
||||||
|
mainWindowController = new MainWindowController();
|
||||||
|
main = this;
|
||||||
|
|
||||||
|
mainWindow();
|
||||||
|
initActions();
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.error("ooooops",e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void mainWindow(){
|
||||||
|
try {
|
||||||
|
FXMLLoader loader = new FXMLLoader();
|
||||||
|
loader.setLocation(getClass().getResource("/fxml/MainWindow.fxml"));
|
||||||
|
loader.setController(mainWindowController);
|
||||||
|
pane = (AnchorPane) loader.load();
|
||||||
|
primaryStage.setMinWidth(1130);
|
||||||
|
primaryStage.setMinHeight(600 + 34);
|
||||||
|
primaryStage.setTitle("cemu_UI");
|
||||||
|
// primaryStage.getIcons().add(new Image(Main.class.getResourceAsStream(""))); //adds application icon
|
||||||
|
primaryStage.setOnCloseRequest(event -> System.exit(0));
|
||||||
|
|
||||||
|
// generate window
|
||||||
|
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
|
||||||
|
|
||||||
|
cloudController = CloudController.getInstance(mainWindowController); // call cloudController constructor
|
||||||
|
|
||||||
|
// startup checks
|
||||||
|
// check if client_secret.json is present
|
||||||
|
if (Main.class.getResourceAsStream("/client_secret.json") == null) {
|
||||||
|
LOGGER.error("client_secret is missing!!!!!");
|
||||||
|
|
||||||
|
JFXInfoAlert noCSAlert = new JFXInfoAlert("Error",
|
||||||
|
"client_secret is missing! Please contact the maintainer. \n"
|
||||||
|
+ "If you compiled cemu_UI by yourself see: \n"
|
||||||
|
+ "https://git.mosad.xyz/Seil0/cemu_UI/wiki/Documantation",
|
||||||
|
"-fx-button-type: RAISED; -fx-background-color: #00a8cc; -fx-text-fill: BLACK;", primaryStage);
|
||||||
|
noCSAlert.showAndWait();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!XMLController.getDirCemuUI().exists()) {
|
||||||
|
LOGGER.info("creating cemu_UI directory");
|
||||||
|
XMLController.getDirCemuUI().mkdir();
|
||||||
|
XMLController.getPictureCache().mkdir();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!XMLController.getConfigFile().exists()) {
|
||||||
|
LOGGER.info("firststart, setting default values");
|
||||||
|
firstStart();
|
||||||
|
xmlController.saveSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!XMLController.getPictureCache().exists()) {
|
||||||
|
XMLController.getPictureCache().mkdir();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!XMLController.getRference_gamesFile().exists()) {
|
||||||
|
if (XMLController.getGamesDBFile().exists()) {
|
||||||
|
XMLController.getGamesDBFile().delete();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
LOGGER.info("downloading ReferenceGameList.db... ");
|
||||||
|
URL website = new URL(gamesDBdownloadURL);
|
||||||
|
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
|
||||||
|
FileOutputStream fos = new FileOutputStream(XMLController.getRference_gamesFile());
|
||||||
|
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
|
||||||
|
fos.close();
|
||||||
|
LOGGER.info("finished downloading games.db");
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// init here as it loads the games to the mwc and the gui, therefore the window must exist
|
||||||
|
mainWindowController.init();
|
||||||
|
|
||||||
|
// if cloud sync is activated start sync
|
||||||
|
if (XMLController.isCloudSync()) {
|
||||||
|
cloudController.initializeConnection(XMLController.getCloudService(), XMLController.getCemuPath());
|
||||||
|
cloudController.sync(XMLController.getCloudService(), XMLController.getCemuPath(), XMLController.getDirCemuUIPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
String logPath = "";
|
||||||
|
|
||||||
|
if (System.getProperty("os.name").contains("Windows")) {
|
||||||
|
logPath = System.getProperty("user.home") + "/Documents/cemu_UI/app.log";
|
||||||
|
} else {
|
||||||
|
logPath = System.getProperty("user.home") + "/cemu_UI/app.log";
|
||||||
|
}
|
||||||
|
|
||||||
|
System.setProperty("logFilename", logPath);
|
||||||
|
File logFile = new File(logPath);
|
||||||
|
logFile.delete();
|
||||||
|
LOGGER = LogManager.getLogger(Main.class.getName());
|
||||||
|
|
||||||
|
xmlController = new XMLController();
|
||||||
|
launch(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void firstStart() {
|
||||||
|
|
||||||
|
JFXOkayCancelAlert cemuInstallAlert = new JFXOkayCancelAlert("cemu installation",
|
||||||
|
"please select your cemu installation",
|
||||||
|
"-fx-button-type: RAISED; -fx-background-color: #00a8cc; -fx-text-fill: BLACK;", primaryStage);
|
||||||
|
cemuInstallAlert.setOkayAction(e -> {
|
||||||
|
DirectoryChooser directoryChooser = new DirectoryChooser();
|
||||||
|
File selectedDirectory = directoryChooser.showDialog(primaryStage);
|
||||||
|
XMLController.setCemuPath(selectedDirectory.getAbsolutePath());
|
||||||
|
});
|
||||||
|
cemuInstallAlert.setCancelAction(e -> {
|
||||||
|
XMLController.setCemuPath(null);
|
||||||
|
LOGGER.info("Action canceld by user!");
|
||||||
|
});
|
||||||
|
cemuInstallAlert.showAndWait();
|
||||||
|
|
||||||
|
JFXOkayCancelAlert romDirectoryAlert = new JFXOkayCancelAlert("rom directory",
|
||||||
|
"please select your rom directory",
|
||||||
|
"-fx-button-type: RAISED; -fx-background-color: #00a8cc; -fx-text-fill: BLACK;", primaryStage);
|
||||||
|
romDirectoryAlert.setOkayAction(e -> {
|
||||||
|
DirectoryChooser directoryChooser = new DirectoryChooser();
|
||||||
|
File selectedDirectory = directoryChooser.showDialog(primaryStage);
|
||||||
|
XMLController.setRomDirectoryPath(selectedDirectory.getAbsolutePath());
|
||||||
|
});
|
||||||
|
romDirectoryAlert.setCancelAction(e -> {
|
||||||
|
XMLController.setRomDirectoryPath(null);
|
||||||
|
LOGGER.info("Action canceld by user!");
|
||||||
|
});
|
||||||
|
romDirectoryAlert.showAndWait();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initActions() {
|
||||||
|
final ChangeListener<Number> widthListener = new ChangeListener<Number>() {
|
||||||
|
|
||||||
|
final Timer timer = new Timer();
|
||||||
|
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
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void changed(ObservableValue<? extends Number> observable, Number oldValue, final Number newValue) {
|
||||||
|
|
||||||
|
// if saveTask is already running kill it
|
||||||
|
if (saveTask != null) saveTask.cancel();
|
||||||
|
|
||||||
|
saveTask = new TimerTask() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
XMLController.setWindowWidth(mainWindowController.getMainAnchorPane().getWidth());
|
||||||
|
xmlController.saveSettings();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
timer.schedule(saveTask, delayTime);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
final ChangeListener<Number> heightListener = new ChangeListener<Number>() {
|
||||||
|
|
||||||
|
final Timer timer = new Timer();
|
||||||
|
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
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void changed(ObservableValue<? extends Number> observable, Number oldValue, final Number newValue) {
|
||||||
|
|
||||||
|
if (saveTask != null) saveTask.cancel();
|
||||||
|
|
||||||
|
saveTask = new TimerTask() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
XMLController.setWindowHeight(mainWindowController.getMainAnchorPane().getHeight());
|
||||||
|
xmlController.saveSettings();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
timer.schedule(saveTask, delayTime);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
final ChangeListener<Boolean> maximizeListener = new ChangeListener<Boolean>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void changed(ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) {
|
||||||
|
primaryStage.setMaximized(false);
|
||||||
|
|
||||||
|
Alert alert = new Alert(AlertType.WARNING);
|
||||||
|
alert.setTitle("edit");
|
||||||
|
alert.setHeaderText("cemu_UI");
|
||||||
|
alert.setContentText("maximized Window is not supporte!");
|
||||||
|
alert.initOwner(primaryStage);
|
||||||
|
alert.showAndWait();
|
||||||
|
|
||||||
|
LOGGER.warn("maximized Window is not supported");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// add listener to primaryStage
|
||||||
|
primaryStage.widthProperty().addListener(widthListener);
|
||||||
|
primaryStage.heightProperty().addListener(heightListener);
|
||||||
|
primaryStage.maximizedProperty().addListener(maximizeListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Main getMain() {
|
||||||
|
return main;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CloudController getCloudController() {
|
||||||
|
return cloudController;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AnchorPane getPane() {
|
||||||
|
return pane;
|
||||||
|
}
|
||||||
|
}
|
1422
src/main/java/com/cemu_UI/application/MainWindowController.java
Normal file
1422
src/main/java/com/cemu_UI/application/MainWindowController.java
Normal file
File diff suppressed because it is too large
Load Diff
106
src/main/java/com/cemu_UI/application/playGame.java
Normal file
106
src/main/java/com/cemu_UI/application/playGame.java
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/**
|
||||||
|
* cemu_UI
|
||||||
|
*
|
||||||
|
* Copyright 2017-2019 <@Seil0>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* 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.CloudController;
|
||||||
|
import com.cemu_UI.controller.DBController;
|
||||||
|
import com.cemu_UI.controller.XMLController;
|
||||||
|
|
||||||
|
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 = XMLController.getCemuPath() + "/Cemu.exe";
|
||||||
|
String gameExec = "\"" + mainWindowController.getGameExecutePath() + "\"";
|
||||||
|
long startTime;
|
||||||
|
long endTime;
|
||||||
|
int timePlayedNow;
|
||||||
|
int timePlayed;
|
||||||
|
Process p;
|
||||||
|
|
||||||
|
Platform.runLater(() -> {
|
||||||
|
mainWindowController.getPrimaryStage().setIconified(true); // minimize cemu_UI
|
||||||
|
});
|
||||||
|
startTime = System.currentTimeMillis();
|
||||||
|
try {
|
||||||
|
if (System.getProperty("os.name").equals("Linux")) {
|
||||||
|
if(XMLController.isFullscreen()){
|
||||||
|
p = new ProcessBuilder("wine", cemuBin, "-f", "-g", gameExec).start();
|
||||||
|
} else {
|
||||||
|
p = new ProcessBuilder("wine", cemuBin, "-g", gameExec).start();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(XMLController.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.getPrimaryStage().setIconified(false); // maximize cemu_UI
|
||||||
|
});
|
||||||
|
|
||||||
|
//sync savegame with cloud service
|
||||||
|
if (XMLController.isCloudSync()) {
|
||||||
|
XMLController.setLastLocalSync(Instant.now().getEpochSecond());
|
||||||
|
CloudController.getInstance(mainWindowController).sync(XMLController.getCloudService(),
|
||||||
|
XMLController.getCemuPath(), XMLController.getDirCemuUIPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (IOException | InterruptedException e) {
|
||||||
|
LOGGER.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
227
src/main/java/com/cemu_UI/controller/CloudController.java
Normal file
227
src/main/java/com/cemu_UI/controller/CloudController.java
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
/**
|
||||||
|
* cemu_UI
|
||||||
|
*
|
||||||
|
* Copyright 2017-2019 <@Seil0>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* 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.datatypes.GlobalDataTypes.CloudService;
|
||||||
|
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 {
|
||||||
|
|
||||||
|
// TODO make singleton
|
||||||
|
|
||||||
|
private MainWindowController mwc;
|
||||||
|
private static CloudController instance = null;
|
||||||
|
private XMLController xmlController = new XMLController();
|
||||||
|
private GoogleDriveController googleDriveController = new GoogleDriveController();
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger(CloudController.class.getName());
|
||||||
|
|
||||||
|
public CloudController(MainWindowController mwc) {
|
||||||
|
this.mwc = mwc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CloudController getInstance(MainWindowController mwc) {
|
||||||
|
if (instance == null) {
|
||||||
|
instance = new CloudController(mwc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean initializeConnection(CloudService cloudService, String cemuDirectory) {
|
||||||
|
boolean success = false;
|
||||||
|
LOGGER.info("sartting cloud initialisation ...");
|
||||||
|
|
||||||
|
if(cloudService == CloudService.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 == CloudService.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(CloudService cloudService, String cemuDirectory, String cemu_UIDirectory) {
|
||||||
|
|
||||||
|
// running sync in a new thread, instead of blocking the main thread
|
||||||
|
Thread thread = new Thread(new Runnable() {
|
||||||
|
@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 (XMLController.getLastLocalSync() > lastCloudSync) {
|
||||||
|
LOGGER.info("local is new, going to upload zip");
|
||||||
|
googleDriveController.uploadZipFile(zipFile);
|
||||||
|
} else if (XMLController.getLastLocalSync() < lastCloudSync) {
|
||||||
|
LOGGER.info("cloud is new, going to download zip");
|
||||||
|
unzipSavegames(cemuDirectory, googleDriveController.downloadZipFile(cemu_UIDirectory));
|
||||||
|
XMLController.setLastLocalSync(lastCloudSync);
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
LOGGER.info("nothing to do");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
XMLController.setLastLocalSync(Long.parseLong(zipFile.getName().substring(0, zipFile.getName().length() - 4))); // set time of last sucessfull sync
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Dropbox:
|
||||||
|
// do the thing
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
LOGGER.warn("no cloud vendor found!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
zipFile.delete(); // delete zipfile in cem_UI directory
|
||||||
|
|
||||||
|
Platform.runLater(() -> {
|
||||||
|
mwc.getPlayBtn().setText("play");
|
||||||
|
mwc.getPlayBtn().setDisable(false);
|
||||||
|
xmlController.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(CloudService cloudService) {
|
||||||
|
String folderID = "";
|
||||||
|
if (cloudService != null) {
|
||||||
|
if (cloudService == CloudService.GoogleDrive) {
|
||||||
|
folderID = googleDriveController.getFolderID();
|
||||||
|
}
|
||||||
|
if (cloudService == CloudService.Dropbox) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return folderID;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
395
src/main/java/com/cemu_UI/controller/DBController.java
Normal file
395
src/main/java/com/cemu_UI/controller/DBController.java
Normal file
@ -0,0 +1,395 @@
|
|||||||
|
/**
|
||||||
|
* cemu_UI
|
||||||
|
*
|
||||||
|
* Copyright 2017-2019 <@Seil0>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* 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.awt.Graphics2D;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Statement;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
import com.cemu_UI.datatypes.UIROMDataType;
|
||||||
|
|
||||||
|
import javafx.collections.FXCollections;
|
||||||
|
import javafx.collections.ObservableList;
|
||||||
|
|
||||||
|
public class DBController {
|
||||||
|
|
||||||
|
private static DBController instance = null;
|
||||||
|
private ArrayList<String> entries = new ArrayList<>();
|
||||||
|
private String DB_PATH_LocalGames;
|
||||||
|
private String DB_PATH_ReverenceGames;
|
||||||
|
private Connection connectionLocal = null;
|
||||||
|
private Connection connectionReverence = null;
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger(DBController.class.getName());
|
||||||
|
|
||||||
|
public DBController() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DBController getInstance() {
|
||||||
|
if (instance == null) {
|
||||||
|
instance = new DBController();
|
||||||
|
}
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* initialize the {@link DBController} with the database connection check if
|
||||||
|
* there is a need to create a new database refresh the database
|
||||||
|
*/
|
||||||
|
public void init() {
|
||||||
|
initDatabaseConnection();
|
||||||
|
createRomDatabase();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create a new connection to the HomeFlix.db database
|
||||||
|
* AutoCommit is set to false to prevent some issues, so manual commit is active!
|
||||||
|
*
|
||||||
|
* TODO this should be called LocalGames
|
||||||
|
*/
|
||||||
|
private void initDatabaseConnection() {
|
||||||
|
DB_PATH_LocalGames = XMLController.getDirCemuUI() + "/localRoms.db";
|
||||||
|
DB_PATH_ReverenceGames = XMLController.getRference_gamesFile().getAbsolutePath();
|
||||||
|
|
||||||
|
try {
|
||||||
|
// create a database connection
|
||||||
|
connectionLocal = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH_LocalGames);
|
||||||
|
connectionLocal.setAutoCommit(false);
|
||||||
|
|
||||||
|
connectionReverence = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH_ReverenceGames);
|
||||||
|
connectionReverence.setAutoCommit(false);
|
||||||
|
} 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 Local- or ReverenceGames database", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
LOGGER.info("Local- and ReverenceGames database loaded successfull");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* creating the local_roms table in localRoms.db
|
||||||
|
* if the table has no entries, call loadRomDirectory
|
||||||
|
*
|
||||||
|
* TODO the local_roms table should be called LocalGames
|
||||||
|
*/
|
||||||
|
void createRomDatabase() {
|
||||||
|
try {
|
||||||
|
Statement stmt = connectionLocal.createStatement();
|
||||||
|
stmt.executeUpdate("create table if not exists local_roms (title, coverPath, romPath, titleID, productCode, region, lastPlayed, timePlayed)");
|
||||||
|
connectionLocal.commit();
|
||||||
|
stmt.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
LOGGER.error("error while creating local-games database", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* refresh database to contain all (new added) games
|
||||||
|
*/
|
||||||
|
public void refreshDataBase() {
|
||||||
|
LOGGER.info("<========== starting refreshing database ==========>");
|
||||||
|
|
||||||
|
entries.clear();
|
||||||
|
|
||||||
|
try {
|
||||||
|
Statement stmt = connectionLocal.createStatement();
|
||||||
|
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms");
|
||||||
|
while (rs.next()) {
|
||||||
|
entries.add(rs.getString(2));
|
||||||
|
}
|
||||||
|
stmt.close();
|
||||||
|
rs.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
LOGGER.error("error while loading ROMs from ROM database, local_roms table", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entries.size() == 0) {
|
||||||
|
loadAllGames();
|
||||||
|
}
|
||||||
|
|
||||||
|
LOGGER.info("<========== finished refreshing database ==========>");
|
||||||
|
}
|
||||||
|
|
||||||
|
// add a game to the database
|
||||||
|
public void addGame(String title, String coverPath, String romPath, String titleID, String productCode, String region, String lastPlayed, String timePlayed) throws SQLException{
|
||||||
|
Statement stmt = connectionLocal.createStatement();
|
||||||
|
stmt.executeUpdate("insert into local_roms values ('"+title+"','"+coverPath+"','"+romPath+"','"+titleID+"',"
|
||||||
|
+ "'"+productCode+"','"+region+"','"+lastPlayed+"','"+timePlayed+"')");
|
||||||
|
connectionLocal.commit();
|
||||||
|
stmt.close();
|
||||||
|
LOGGER.info("added \""+title+"\" to ROM database");
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove a game from the database
|
||||||
|
public void removeGame(String titleID) throws SQLException{
|
||||||
|
Statement stmt = connectionLocal.createStatement();
|
||||||
|
stmt.executeUpdate("delete from local_roms where titleID = '"+titleID+"'");
|
||||||
|
connectionLocal.commit();
|
||||||
|
stmt.close();
|
||||||
|
LOGGER.info("removed \""+titleID+"\" from ROM database");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* load all games from the database to a ObservableList, order entries by title
|
||||||
|
* @return a ObservableList that contains all local games from the database
|
||||||
|
*/
|
||||||
|
public ObservableList<UIROMDataType> loadAllGames() {
|
||||||
|
ObservableList<UIROMDataType> games = FXCollections.observableArrayList();
|
||||||
|
LOGGER.info("loading all local games from the database ...");
|
||||||
|
try {
|
||||||
|
Statement stmt = connectionLocal.createStatement();
|
||||||
|
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms");
|
||||||
|
while (rs.next()) {
|
||||||
|
games.add(new UIROMDataType(rs.getString("romPath"), rs.getString("titleID"), rs.getString("title"),
|
||||||
|
rs.getString("coverPath")));
|
||||||
|
}
|
||||||
|
stmt.close();
|
||||||
|
rs.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.error("error while loading all local games from the database", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return games;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* load one game from the database
|
||||||
|
* @param titleID the titleID of the game you wish to get
|
||||||
|
* @return the game you asked for
|
||||||
|
*/
|
||||||
|
public UIROMDataType loadSingleGame(String titleID) {
|
||||||
|
UIROMDataType game = null;
|
||||||
|
LOGGER.info("loading a single game (ID: {}) from the database ...", titleID);
|
||||||
|
try {
|
||||||
|
PreparedStatement ps = connectionLocal.prepareStatement("SELECT * FROM local_roms where titleID = ?");
|
||||||
|
ps.setString(1, titleID);
|
||||||
|
ResultSet rs = ps.executeQuery();
|
||||||
|
|
||||||
|
while (rs.next()) {
|
||||||
|
game = new UIROMDataType(rs.getString("romPath"), rs.getString("titleID"), rs.getString("title"),
|
||||||
|
rs.getString("coverPath"));
|
||||||
|
}
|
||||||
|
rs.close();
|
||||||
|
ps.close();
|
||||||
|
}catch (Exception e){
|
||||||
|
LOGGER.error("error while loading a single game into the mainWindowController", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return game;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 appFile;
|
||||||
|
String[] extensions = new String[] { "rpx", "jsp" };
|
||||||
|
File pictureCache = XMLController.getPictureCache();
|
||||||
|
String coverPath;
|
||||||
|
try {
|
||||||
|
Statement stmt = connectionReverence.createStatement();
|
||||||
|
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) {
|
||||||
|
appFile = new File(file.getParent() + "/app.xml");
|
||||||
|
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
||||||
|
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
|
||||||
|
Document document = documentBuilder.parse(appFile);
|
||||||
|
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());
|
||||||
|
LOGGER.info("Name: " + file.getName() + "; Title ID: " + title_ID);
|
||||||
|
ResultSet rs = stmt.executeQuery("SELECT * FROM games WHERE TitleID = '" + title_ID + "';");
|
||||||
|
|
||||||
|
// 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");
|
||||||
|
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) {
|
||||||
|
LOGGER.error("error while loading ROMs from directory", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 = connectionLocal.createStatement();
|
||||||
|
boolean check = false;
|
||||||
|
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms WHERE title = '"+title+"';");
|
||||||
|
while (rs.next()) {
|
||||||
|
check = true;
|
||||||
|
}
|
||||||
|
return check;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
private void checkRemoveEntry() {
|
||||||
|
/**
|
||||||
|
* TODO needs to be implemented!
|
||||||
|
* don't show ROM on the UI, but keep all parameter in case it's showing up again ask if old data should be used
|
||||||
|
*/
|
||||||
|
//LOGGER.info("check if entry removed not done yet!");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 = connectionLocal.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 = connectionLocal.createStatement();
|
||||||
|
stmt.executeUpdate("UPDATE local_roms SET title = '" + title + "', coverPath = '" + coverPath + "',"
|
||||||
|
+ " romPath = '" + romPath + "' WHERE titleID = '"+titleID+"';");
|
||||||
|
connectionLocal.commit();
|
||||||
|
stmt.close();
|
||||||
|
}catch (Exception e){
|
||||||
|
LOGGER.error("error while setting game info", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastPlayed(String titleID){
|
||||||
|
try{
|
||||||
|
Statement stmt = connectionLocal.createStatement();
|
||||||
|
stmt.executeUpdate("UPDATE local_roms SET lastPlayed=date('now') WHERE titleID = '"+titleID+"';");
|
||||||
|
connectionLocal.commit();
|
||||||
|
stmt.close();
|
||||||
|
}catch(SQLException e){
|
||||||
|
LOGGER.error("failed to set the last played", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLastPlayed(String titleID){
|
||||||
|
String lastPlayed = null;
|
||||||
|
try{
|
||||||
|
Statement stmt = connectionLocal.createStatement();
|
||||||
|
ResultSet rs = stmt.executeQuery("SELECT lastPlayed FROM local_roms WHERE titleID = '"+titleID+"';" );
|
||||||
|
lastPlayed = rs.getString(1);
|
||||||
|
stmt.close();
|
||||||
|
rs.close();
|
||||||
|
}catch(SQLException e){
|
||||||
|
LOGGER.error("failed to get the last played", e);
|
||||||
|
}
|
||||||
|
return lastPlayed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalPlaytime(String timePlayed, String titleID){
|
||||||
|
try{
|
||||||
|
Statement stmt = connectionLocal.createStatement();
|
||||||
|
stmt.executeUpdate("UPDATE local_roms SET timePlayed='"+timePlayed+"' WHERE titleID = '"+titleID+"';");
|
||||||
|
connectionLocal.commit();
|
||||||
|
stmt.close();
|
||||||
|
}catch(SQLException e){
|
||||||
|
LOGGER.error("failed to set total play time", e);
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTotalPlaytime(String titleID){
|
||||||
|
String timePlayed = null;
|
||||||
|
try{
|
||||||
|
Statement stmt = connectionLocal.createStatement();
|
||||||
|
ResultSet rs = stmt.executeQuery("SELECT timePlayed FROM local_roms WHERE titleID = '"+titleID+"';" );
|
||||||
|
timePlayed = rs.getString(1);
|
||||||
|
stmt.close();
|
||||||
|
rs.close();
|
||||||
|
}catch(SQLException e){
|
||||||
|
LOGGER.error("failed to get total play time", e);
|
||||||
|
}
|
||||||
|
return timePlayed;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static BufferedImage resizeImage(BufferedImage originalImage, int type, int IMG_WIDTH, int IMG_HEIGHT) {
|
||||||
|
BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, type);
|
||||||
|
Graphics2D g = resizedImage.createGraphics();
|
||||||
|
g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null);
|
||||||
|
g.dispose();
|
||||||
|
|
||||||
|
return resizedImage;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
155
src/main/java/com/cemu_UI/controller/SmmdbAPIController.java
Normal file
155
src/main/java/com/cemu_UI/controller/SmmdbAPIController.java
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
/**
|
||||||
|
* cemu_UI
|
||||||
|
*
|
||||||
|
* Copyright 2017-2019 <@Seil0>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* 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.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
import com.cemu_UI.datatypes.SmmdbApiDataType;
|
||||||
|
import com.eclipsesource.json.Json;
|
||||||
|
import com.eclipsesource.json.JsonArray;
|
||||||
|
import com.eclipsesource.json.JsonValue;
|
||||||
|
|
||||||
|
public class SmmdbAPIController {
|
||||||
|
|
||||||
|
private String URL = "https://smmdb.ddns.net/api/getcourses?format=json";
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger(SmmdbAPIController.class.getName());
|
||||||
|
|
||||||
|
public SmmdbAPIController() {
|
||||||
|
//Auto-generated constructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* start smmdb api query
|
||||||
|
* @return a ArryList with all courses found at smmdb
|
||||||
|
*/
|
||||||
|
public ArrayList<SmmdbApiDataType> startQuery() {
|
||||||
|
ArrayList<SmmdbApiDataType> course = new ArrayList<>();
|
||||||
|
String output = "";
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
URL apiUrl = new URL(URL);
|
||||||
|
BufferedReader ina = new BufferedReader(new InputStreamReader(apiUrl.openStream()));
|
||||||
|
output = ina.readLine();
|
||||||
|
ina.close();
|
||||||
|
LOGGER.info("response from " + URL + " was valid");
|
||||||
|
LOGGER.info(output);
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOGGER.error("error while making api request or reading response");
|
||||||
|
LOGGER.error("response from " + URL + " was: " + output, e);
|
||||||
|
return course;
|
||||||
|
}
|
||||||
|
|
||||||
|
String apiOutput = "{ \"courses\": " + output + "}";
|
||||||
|
JsonArray items = Json.parse(apiOutput).asObject().get("courses").asArray();
|
||||||
|
|
||||||
|
for (JsonValue item : items) {
|
||||||
|
int courseTheme, gameStyle, difficulty, lastmodified, uploaded, autoScroll, stars ,time;
|
||||||
|
String owner, id, nintendoid, title;
|
||||||
|
|
||||||
|
try {
|
||||||
|
courseTheme = item.asObject().getInt("courseTheme", 9);
|
||||||
|
} catch (Exception e) {
|
||||||
|
courseTheme = 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
gameStyle = item.asObject().getInt("gameStyle", 9);
|
||||||
|
} catch (Exception e) {
|
||||||
|
gameStyle = 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
difficulty = item.asObject().getInt("difficulty", 9);
|
||||||
|
} catch (Exception e) {
|
||||||
|
difficulty = 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
lastmodified = item.asObject().getInt("lastmodified", 9);
|
||||||
|
} catch (Exception e) {
|
||||||
|
lastmodified = 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
uploaded = item.asObject().getInt("uploaded", 9);
|
||||||
|
} catch (Exception e) {
|
||||||
|
uploaded = 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
autoScroll = item.asObject().getInt("autoScroll", 9);
|
||||||
|
} catch (Exception e) {
|
||||||
|
autoScroll = 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
stars = item.asObject().getInt("stars", 9);
|
||||||
|
} catch (Exception e) {
|
||||||
|
stars = 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
time = item.asObject().getInt("time", 9);
|
||||||
|
} catch (Exception e) {
|
||||||
|
time = 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
owner = item.asObject().getString("owner", "");
|
||||||
|
} catch (Exception e) {
|
||||||
|
owner = "notset";
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
id = item.asObject().getString("id", "");
|
||||||
|
} catch (Exception e) {
|
||||||
|
id = "notset";
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
nintendoid = item.asObject().getString("nintendoid", "");
|
||||||
|
} catch (Exception e) {
|
||||||
|
nintendoid = "notset";
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
title = item.asObject().getString("title", "");;
|
||||||
|
} catch (Exception e) {
|
||||||
|
title = "notset";
|
||||||
|
}
|
||||||
|
|
||||||
|
course.add(new SmmdbApiDataType(courseTheme, gameStyle, difficulty, lastmodified, uploaded, autoScroll,
|
||||||
|
stars, time, owner, id, nintendoid, title));
|
||||||
|
}
|
||||||
|
|
||||||
|
return course;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
147
src/main/java/com/cemu_UI/controller/UpdateController.java
Normal file
147
src/main/java/com/cemu_UI/controller/UpdateController.java
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
/**
|
||||||
|
* cemu_UI
|
||||||
|
*
|
||||||
|
* Copyright 2017-2019 <@Seil0>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* 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.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
import javax.swing.ProgressMonitor;
|
||||||
|
import javax.swing.ProgressMonitorInputStream;
|
||||||
|
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
import com.cemu_UI.application.MainWindowController;
|
||||||
|
import com.eclipsesource.json.Json;
|
||||||
|
import com.eclipsesource.json.JsonArray;
|
||||||
|
import com.eclipsesource.json.JsonObject;
|
||||||
|
import com.eclipsesource.json.JsonValue;
|
||||||
|
|
||||||
|
import javafx.application.Platform;
|
||||||
|
|
||||||
|
public class UpdateController implements Runnable {
|
||||||
|
|
||||||
|
private MainWindowController mainWindowController;
|
||||||
|
private int buildNumber;
|
||||||
|
private int updateBuildNumber; // tag_name from gitea
|
||||||
|
private String apiOutput;
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
private String updateName;
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
private String updateChanges;
|
||||||
|
private String browserDownloadUrl; // update download link
|
||||||
|
private String giteaApiRelease = "https://git.mosad.xyz/api/v1/repos/Seil0/cemu_UI/releases";
|
||||||
|
private URL giteaApiUrl;
|
||||||
|
private boolean useBeta;
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger(UpdateController.class.getName());
|
||||||
|
|
||||||
|
/**
|
||||||
|
* updater for cemu_UI, checks for Updates and download it
|
||||||
|
*/
|
||||||
|
public UpdateController(MainWindowController mwc, String buildNumber, boolean useBeta) {
|
||||||
|
mainWindowController = mwc;
|
||||||
|
this.buildNumber = Integer.parseInt(buildNumber);
|
||||||
|
this.useBeta = useBeta;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
LOGGER.info("beta:" + useBeta + "; checking for updates ...");
|
||||||
|
Platform.runLater(() -> {
|
||||||
|
mainWindowController.getUpdateBtn().setText(XMLController.getLocalBundle().getString("updateBtnChecking"));
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
giteaApiUrl = new URL(giteaApiRelease);
|
||||||
|
|
||||||
|
BufferedReader ina = new BufferedReader(new InputStreamReader(giteaApiUrl.openStream()));
|
||||||
|
apiOutput = ina.readLine();
|
||||||
|
ina.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Platform.runLater(() -> {
|
||||||
|
LOGGER.error("could not check update version", e);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonArray objectArray = Json.parse("{\"items\": " + apiOutput + "}").asObject().get("items").asArray();
|
||||||
|
JsonValue object = objectArray.get(0).asObject(); // set to the latest release as default
|
||||||
|
JsonObject objectAsset = object.asObject().get("assets").asArray().get(0).asObject();
|
||||||
|
|
||||||
|
for(JsonValue objectIt : objectArray) {
|
||||||
|
// TODO note this will download still the pre-release if there's a more recent stable version
|
||||||
|
if(objectIt.asObject().getBoolean("prerelease", false) == useBeta) {
|
||||||
|
// we found the needed release either beta or not
|
||||||
|
object = objectIt;
|
||||||
|
objectAsset = objectIt.asObject().get("assets").asArray().get(0).asObject();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
updateBuildNumber = Integer.parseInt(object.asObject().getString("tag_name", ""));
|
||||||
|
updateName = object.asObject().getString("name", "");
|
||||||
|
updateChanges = object.asObject().getString("body", "");
|
||||||
|
|
||||||
|
LOGGER.info("Build: " + buildNumber + ", Update: " + updateBuildNumber);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare the program BuildNumber with the current BuildNumber
|
||||||
|
* if buildNumber < updateBuildNumber then perform a update
|
||||||
|
*/
|
||||||
|
if (buildNumber >= updateBuildNumber) {
|
||||||
|
Platform.runLater(() -> {
|
||||||
|
mainWindowController.getUpdateBtn().setText(XMLController.getLocalBundle().getString("updateBtnNoUpdateAvailable"));
|
||||||
|
});
|
||||||
|
LOGGER.info("no update available");
|
||||||
|
} else {
|
||||||
|
Platform.runLater(() -> {
|
||||||
|
mainWindowController.getUpdateBtn().setText(XMLController.getLocalBundle().getString("updateBtnUpdateAvailable"));
|
||||||
|
});
|
||||||
|
LOGGER.info("update available");
|
||||||
|
browserDownloadUrl = objectAsset.getString("browser_download_url", "");
|
||||||
|
LOGGER.info("download link: " + browserDownloadUrl);
|
||||||
|
try {
|
||||||
|
// open new Http connection, ProgressMonitorInputStream for downloading the data
|
||||||
|
HttpURLConnection connection = (HttpURLConnection) new URL(browserDownloadUrl).openConnection();
|
||||||
|
ProgressMonitorInputStream pmis = new ProgressMonitorInputStream(null, "Downloading...", connection.getInputStream());
|
||||||
|
ProgressMonitor pm = pmis.getProgressMonitor();
|
||||||
|
pm.setMillisToDecideToPopup(0);
|
||||||
|
pm.setMillisToPopup(0);
|
||||||
|
pm.setMinimum(0);// set beginning of the progress bar to 0
|
||||||
|
pm.setMaximum(connection.getContentLength());// set the end to the file length
|
||||||
|
FileUtils.copyInputStreamToFile(pmis, new File("cemu_UI_update.jar")); // download update
|
||||||
|
org.apache.commons.io.FileUtils.copyFile(new File("cemu_UI_update.jar"), new File("cemu_UI.jar"));
|
||||||
|
org.apache.commons.io.FileUtils.deleteQuietly(new File("cemu_UI_update.jar")); // delete update
|
||||||
|
new ProcessBuilder("java", "-jar", "cemu_UI.jar").start(); // start the new application
|
||||||
|
System.exit(0); // close the current application
|
||||||
|
} catch (IOException e) {
|
||||||
|
Platform.runLater(() -> {
|
||||||
|
LOGGER.info("could not download update files", e);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
419
src/main/java/com/cemu_UI/controller/XMLController.java
Normal file
419
src/main/java/com/cemu_UI/controller/XMLController.java
Normal file
@ -0,0 +1,419 @@
|
|||||||
|
/**
|
||||||
|
* cemu_UI
|
||||||
|
*
|
||||||
|
* Copyright 2017-2019 <@Seil0>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cemu_UI.controller;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
import com.cemu_UI.datatypes.GlobalDataTypes.CloudService;
|
||||||
|
|
||||||
|
public class XMLController {
|
||||||
|
|
||||||
|
private static final String userHome = System.getProperty("user.home");
|
||||||
|
private static final String userName = System.getProperty("user.name");
|
||||||
|
private static final String osName = System.getProperty("os.name");
|
||||||
|
private static final String osArch = System.getProperty("os.arch");
|
||||||
|
private static final String osVers = System.getProperty("os.version");
|
||||||
|
private static final String javaVers = System.getProperty("java.version");
|
||||||
|
private static final String javaVend = System.getProperty("java.vendor");
|
||||||
|
private static final String sysLocal = System.getProperty("user.language") + "_" + System.getProperty("user.country");
|
||||||
|
private static String dirCemuUIPath;
|
||||||
|
private static File dirCemuUI;
|
||||||
|
private static File configFile;
|
||||||
|
private static File gamesDBFile;
|
||||||
|
private static File reference_gamesFile;
|
||||||
|
private static File pictureCache;
|
||||||
|
|
||||||
|
// user settings
|
||||||
|
private static String color = "00a8cc";
|
||||||
|
private static String usrLocal = sysLocal;
|
||||||
|
private static boolean autoUpdate = false;
|
||||||
|
private static boolean useBeta = false;
|
||||||
|
private static boolean fullscreen = false;
|
||||||
|
private static boolean cloudSync = false;
|
||||||
|
private static ResourceBundle localBundle = ResourceBundle.getBundle("locals.cemu_UI-Local", Locale.US);
|
||||||
|
|
||||||
|
private static String cemuPath;
|
||||||
|
private static String romDirectoryPath;
|
||||||
|
private static String folderID;
|
||||||
|
private static CloudService cloudService;
|
||||||
|
private static long lastLocalSync;
|
||||||
|
private static double windowWidth;
|
||||||
|
private static double windowHeight;
|
||||||
|
|
||||||
|
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger(XMLController.class.getName());
|
||||||
|
private Properties props = new Properties();
|
||||||
|
|
||||||
|
public XMLController() {
|
||||||
|
|
||||||
|
if (osName.contains("Windows")) {
|
||||||
|
dirCemuUIPath = userHome + "/Documents/cemu_UI";
|
||||||
|
} else {
|
||||||
|
dirCemuUIPath = userHome + "/cemu_UI";
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the concrete files
|
||||||
|
dirCemuUI = new File(dirCemuUIPath);
|
||||||
|
configFile = new File(dirCemuUI + "/config.xml");
|
||||||
|
gamesDBFile = new File(dirCemuUI + "/games.db");
|
||||||
|
reference_gamesFile = new File(dirCemuUI + "/reference_games.db");
|
||||||
|
pictureCache= new File(dirCemuUI+"/picture_cache");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* save settings to the config.xml file
|
||||||
|
*/
|
||||||
|
public void saveSettings() {
|
||||||
|
LOGGER.info("saving Settings ...");
|
||||||
|
|
||||||
|
try {
|
||||||
|
props.setProperty("cemuPath", getCemuPath());
|
||||||
|
props.setProperty("romPath", getRomDirectoryPath());
|
||||||
|
props.setProperty("color", getColor());
|
||||||
|
props.setProperty("language", getUsrLocal());
|
||||||
|
props.setProperty("fullscreen", String.valueOf(isFullscreen()));
|
||||||
|
props.setProperty("cloudSync", String.valueOf(isCloudSync()));
|
||||||
|
props.setProperty("autoUpdate", String.valueOf(isAutoUpdate()));
|
||||||
|
props.setProperty("useBeta", String.valueOf(isUseBeta()));
|
||||||
|
if (getCloudService() == null) {
|
||||||
|
props.setProperty("cloudService", "");
|
||||||
|
props.setProperty("folderID", "");
|
||||||
|
props.setProperty("lastLocalSync", "");
|
||||||
|
} else {
|
||||||
|
props.setProperty("cloudService", getCloudService().toString());
|
||||||
|
props.setProperty("folderID", getFolderID());
|
||||||
|
props.setProperty("lastLocalSync", Long.toString(getLastLocalSync()));
|
||||||
|
}
|
||||||
|
|
||||||
|
props.setProperty("windowWidth", Double.toString(getWindowWidth()));
|
||||||
|
props.setProperty("windowHeight", Double.toString(getWindowHeight()));
|
||||||
|
|
||||||
|
OutputStream outputStream = new FileOutputStream(XMLController.getConfigFile()); // new output-stream
|
||||||
|
props.storeToXML(outputStream, "cemu_UI settings"); // write new .xml
|
||||||
|
outputStream.close();
|
||||||
|
LOGGER.info("saving Settings done!");
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOGGER.error("an error occured", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* loading saved settings from the config.xml file
|
||||||
|
* if a value is not present, default is used instead
|
||||||
|
*/
|
||||||
|
public void loadSettings() {
|
||||||
|
LOGGER.info("loading settings ...");
|
||||||
|
try {
|
||||||
|
InputStream inputStream = new FileInputStream(XMLController.getConfigFile());
|
||||||
|
props.loadFromXML(inputStream); // new input-stream from .xml
|
||||||
|
|
||||||
|
try {
|
||||||
|
setCemuPath(props.getProperty("cemuPath"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.error("cloud not load cemuPath", e);
|
||||||
|
setCemuPath("");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
setRomDirectoryPath(props.getProperty("romPath"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.error("could not load romPath", e);
|
||||||
|
setRomDirectoryPath("");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
setColor(props.getProperty("color"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.error("could not load color value, setting default instead", e);
|
||||||
|
setColor("00a8cc");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (props.getProperty("language") == null) {
|
||||||
|
LOGGER.error("cloud not load language, setting default instead");
|
||||||
|
setUsrLocal("en_US");
|
||||||
|
} else {
|
||||||
|
setUsrLocal(props.getProperty("language"));
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
setFullscreen(Boolean.parseBoolean(props.getProperty("fullscreen")));
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.error("could not load fullscreen, setting default instead", e);
|
||||||
|
setFullscreen(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
setCloudSync(Boolean.parseBoolean(props.getProperty("cloudSync")));
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.error("could not load cloudSync, setting default instead", e);
|
||||||
|
setCloudSync(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
setAutoUpdate(Boolean.parseBoolean(props.getProperty("autoUpdate")));
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.error("cloud not load autoUpdate", e);
|
||||||
|
setAutoUpdate(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
setUseBeta(Boolean.parseBoolean(props.getProperty("useBeta")));
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.error("cloud not load autoUpdate", e);
|
||||||
|
setUseBeta(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
switch (props.getProperty("cloudService")) {
|
||||||
|
case "GoogleDrive":
|
||||||
|
setCloudService(CloudService.GoogleDrive);
|
||||||
|
break;
|
||||||
|
case "Dropbox":
|
||||||
|
setCloudService(CloudService.Dropbox);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.error("could not load cloudSync", e);
|
||||||
|
setCloudService(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
setFolderID(props.getProperty("folderID"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.error("could not load folderID, disable cloud sync. Please contact an developer", e);
|
||||||
|
setCloudSync(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
setLastLocalSync(Long.parseLong(props.getProperty("lastLocalSync")));
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.error("could not load lastSuccessSync, setting default instead", e);
|
||||||
|
setLastLocalSync(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
setWindowWidth(Double.parseDouble(props.getProperty("windowWidth")));
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.error("could not load windowWidth, setting default instead", e);
|
||||||
|
setWindowWidth(904);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
setWindowHeight(Double.parseDouble(props.getProperty("windowHeight")));
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.error("could not load windowHeight, setting default instead", e);
|
||||||
|
setWindowHeight(600);
|
||||||
|
}
|
||||||
|
|
||||||
|
inputStream.close();
|
||||||
|
LOGGER.info("loading settings done!");
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOGGER.error("an error occured", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// getters for application variables
|
||||||
|
|
||||||
|
public static String getUserHome() {
|
||||||
|
return userHome;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getUserName() {
|
||||||
|
return userName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getOsName() {
|
||||||
|
return osName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getOsArch() {
|
||||||
|
return osArch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getOsVers() {
|
||||||
|
return osVers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getJavaVers() {
|
||||||
|
return javaVers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getJavaVend() {
|
||||||
|
return javaVend;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getSysLocal() {
|
||||||
|
return sysLocal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getDirCemuUIPath() {
|
||||||
|
return dirCemuUIPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static File getDirCemuUI() {
|
||||||
|
return dirCemuUI;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static File getConfigFile() {
|
||||||
|
return configFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static File getGamesDBFile() {
|
||||||
|
return gamesDBFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static File getRference_gamesFile() {
|
||||||
|
return reference_gamesFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static File getPictureCache() {
|
||||||
|
return pictureCache;
|
||||||
|
}
|
||||||
|
|
||||||
|
// getters & setters for user settings
|
||||||
|
|
||||||
|
public static String getColor() {
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setColor(String color) {
|
||||||
|
XMLController.color = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getUsrLocal() {
|
||||||
|
return usrLocal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setUsrLocal(String usrLocal) {
|
||||||
|
XMLController.usrLocal = usrLocal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isAutoUpdate() {
|
||||||
|
return autoUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setAutoUpdate(boolean autoUpdate) {
|
||||||
|
XMLController.autoUpdate = autoUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isUseBeta() {
|
||||||
|
return useBeta;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setUseBeta(boolean useBeta) {
|
||||||
|
XMLController.useBeta = useBeta;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isFullscreen() {
|
||||||
|
return fullscreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setFullscreen(boolean fullscreen) {
|
||||||
|
XMLController.fullscreen = fullscreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isCloudSync() {
|
||||||
|
return cloudSync;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setCloudSync(boolean cloudSync) {
|
||||||
|
XMLController.cloudSync = cloudSync;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ResourceBundle getLocalBundle() {
|
||||||
|
return localBundle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setLocalBundle(ResourceBundle localBundle) {
|
||||||
|
XMLController.localBundle = localBundle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getCemuPath() {
|
||||||
|
return cemuPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setCemuPath(String cemuPath) {
|
||||||
|
XMLController.cemuPath = cemuPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getRomDirectoryPath() {
|
||||||
|
return romDirectoryPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setRomDirectoryPath(String romDirectoryPath) {
|
||||||
|
XMLController.romDirectoryPath = romDirectoryPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static String getFolderID() {
|
||||||
|
return folderID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setFolderID(String folderID) {
|
||||||
|
XMLController.folderID = folderID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CloudService getCloudService() {
|
||||||
|
return cloudService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setCloudService(CloudService cloudService) {
|
||||||
|
XMLController.cloudService = cloudService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long getLastLocalSync() {
|
||||||
|
return lastLocalSync;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setLastLocalSync(long lastLocalSync) {
|
||||||
|
XMLController.lastLocalSync = lastLocalSync;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double getWindowWidth() {
|
||||||
|
return windowWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setWindowWidth(double windowWidth) {
|
||||||
|
XMLController.windowWidth = windowWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double getWindowHeight() {
|
||||||
|
return windowHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setWindowHeight(double windowHeight) {
|
||||||
|
XMLController.windowHeight = windowHeight;
|
||||||
|
}
|
||||||
|
}
|
47
src/main/java/com/cemu_UI/datatypes/CourseTableDataType.java
Normal file
47
src/main/java/com/cemu_UI/datatypes/CourseTableDataType.java
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/**
|
||||||
|
* cemu_UI
|
||||||
|
*
|
||||||
|
* Copyright 2017-2019 <@Seil0>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cemu_UI.datatypes;
|
||||||
|
|
||||||
|
import com.jfoenix.controls.datamodels.treetable.RecursiveTreeObject;
|
||||||
|
|
||||||
|
import javafx.beans.property.IntegerProperty;
|
||||||
|
import javafx.beans.property.SimpleIntegerProperty;
|
||||||
|
import javafx.beans.property.SimpleStringProperty;
|
||||||
|
import javafx.beans.property.StringProperty;
|
||||||
|
|
||||||
|
public class CourseTableDataType extends RecursiveTreeObject<CourseTableDataType> {
|
||||||
|
|
||||||
|
public final StringProperty title;
|
||||||
|
public final StringProperty id;
|
||||||
|
public final IntegerProperty time;
|
||||||
|
public final IntegerProperty stars;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data type used in the TreeTableview for
|
||||||
|
*/
|
||||||
|
public CourseTableDataType(String title, String id, int time, int stars) {
|
||||||
|
this.title = new SimpleStringProperty(title);
|
||||||
|
this.id = new SimpleStringProperty(id);
|
||||||
|
this.time = new SimpleIntegerProperty(time);
|
||||||
|
this.stars = new SimpleIntegerProperty(stars);
|
||||||
|
}
|
||||||
|
}
|
29
src/main/java/com/cemu_UI/datatypes/GlobalDataTypes.java
Normal file
29
src/main/java/com/cemu_UI/datatypes/GlobalDataTypes.java
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* cemu_UI
|
||||||
|
*
|
||||||
|
* Copyright 2017-2019 <@Seil0>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cemu_UI.datatypes;
|
||||||
|
|
||||||
|
public class GlobalDataTypes {
|
||||||
|
|
||||||
|
public enum CloudService {
|
||||||
|
GoogleDrive, Dropbox
|
||||||
|
}
|
||||||
|
}
|
209
src/main/java/com/cemu_UI/datatypes/SmmdbApiDataType.java
Normal file
209
src/main/java/com/cemu_UI/datatypes/SmmdbApiDataType.java
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
/**
|
||||||
|
* cemu_UI
|
||||||
|
*
|
||||||
|
* Copyright 2017-2019 <@Seil0>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cemu_UI.datatypes;
|
||||||
|
|
||||||
|
import javafx.beans.property.IntegerProperty;
|
||||||
|
import javafx.beans.property.SimpleIntegerProperty;
|
||||||
|
import javafx.beans.property.SimpleStringProperty;
|
||||||
|
import javafx.beans.property.StringProperty;
|
||||||
|
|
||||||
|
public class SmmdbApiDataType {
|
||||||
|
|
||||||
|
private final IntegerProperty courseTheme = new SimpleIntegerProperty();
|
||||||
|
private final IntegerProperty gameStyle = new SimpleIntegerProperty();
|
||||||
|
private final IntegerProperty difficulty = new SimpleIntegerProperty();
|
||||||
|
private final IntegerProperty lastmodified = new SimpleIntegerProperty();
|
||||||
|
private final IntegerProperty uploaded = new SimpleIntegerProperty();
|
||||||
|
private final IntegerProperty autoScroll = new SimpleIntegerProperty();
|
||||||
|
private final IntegerProperty stars = new SimpleIntegerProperty();
|
||||||
|
private final IntegerProperty time = new SimpleIntegerProperty();
|
||||||
|
private final StringProperty owner = new SimpleStringProperty();
|
||||||
|
private final StringProperty id = new SimpleStringProperty();
|
||||||
|
private final StringProperty nintendoid = new SimpleStringProperty();
|
||||||
|
private final StringProperty title = new SimpleStringProperty();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data type used for the smmdbapi query
|
||||||
|
*/
|
||||||
|
public SmmdbApiDataType(final int courseTheme, final int gameStyle, final int difficulty, final int lastmodified,
|
||||||
|
final int uploaded, final int autoScroll, final int stars, final int time,
|
||||||
|
final String owner, final String id, final String nintendoid, final String title) {
|
||||||
|
this.id.set(id);
|
||||||
|
this.owner.set(owner);
|
||||||
|
this.courseTheme.set(courseTheme);
|
||||||
|
this.gameStyle.set(gameStyle);
|
||||||
|
this.difficulty.set(difficulty);
|
||||||
|
this.lastmodified.set(lastmodified);
|
||||||
|
this.uploaded.set(uploaded);
|
||||||
|
this.autoScroll.set(autoScroll);
|
||||||
|
this.stars.set(stars);
|
||||||
|
this.time.set(time);
|
||||||
|
this.nintendoid.set(nintendoid);
|
||||||
|
this.title.set(title);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntegerProperty courseThemeProperty(){
|
||||||
|
return courseTheme;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public IntegerProperty gameStyleProperty(){
|
||||||
|
return gameStyle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntegerProperty difficultyProperty(){
|
||||||
|
return difficulty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntegerProperty lastmodifiedProperty(){
|
||||||
|
return lastmodified;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntegerProperty uploadedProperty(){
|
||||||
|
return uploaded;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntegerProperty autoScrollProperty(){
|
||||||
|
return autoScroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntegerProperty starsProperty(){
|
||||||
|
return stars;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntegerProperty timeProperty(){
|
||||||
|
return time;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StringProperty ownerProperty(){
|
||||||
|
return owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StringProperty idProperty(){
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StringProperty nintendoidProperty(){
|
||||||
|
return nintendoid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StringProperty titleProperty(){
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCourseTheme() {
|
||||||
|
return courseThemeProperty().get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getGameStyle() {
|
||||||
|
return gameStyleProperty().get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDifficulty() {
|
||||||
|
return difficultyProperty().get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLastmodified() {
|
||||||
|
return lastmodifiedProperty().get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getUploaded() {
|
||||||
|
return uploadedProperty().get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAutoScroll() {
|
||||||
|
return autoScrollProperty().get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getStars() {
|
||||||
|
return starsProperty().get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getTime() {
|
||||||
|
return timeProperty().get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOwner() {
|
||||||
|
return ownerProperty().get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return idProperty().get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNintendoid() {
|
||||||
|
return nintendoidProperty().get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return titleProperty().get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setCourseTheme(int courseTheme) {
|
||||||
|
courseThemeProperty().set(courseTheme);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setGameStyle(int gameStyle) {
|
||||||
|
gameStyleProperty().set(gameStyle);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setDifficulty(int difficulty) {
|
||||||
|
difficultyProperty().set(difficulty);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setLastmodified(int lastmodified) {
|
||||||
|
lastmodifiedProperty().set(lastmodified);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setUploaded(int uploaded) {
|
||||||
|
uploadedProperty().set(uploaded);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setAutoScroll(int autoScroll) {
|
||||||
|
autoScrollProperty().set(autoScroll);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setStars(int stars) {
|
||||||
|
starsProperty().set(stars);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setTime(int time) {
|
||||||
|
timeProperty().set(time);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setOwner(String owner) {
|
||||||
|
ownerProperty().set(owner);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setId(String id) {
|
||||||
|
idProperty().set(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setNintendoid(String nintendoid) {
|
||||||
|
nintendoidProperty().set(nintendoid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setTitle(String title) {
|
||||||
|
titleProperty().set(title);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
131
src/main/java/com/cemu_UI/datatypes/UIROMDataType.java
Normal file
131
src/main/java/com/cemu_UI/datatypes/UIROMDataType.java
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
/**
|
||||||
|
* cemu_UI
|
||||||
|
*
|
||||||
|
* Copyright 2017-2019 <@Seil0>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cemu_UI.datatypes;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import com.jfoenix.controls.JFXButton;
|
||||||
|
|
||||||
|
import javafx.geometry.Insets;
|
||||||
|
import javafx.scene.control.ContextMenu;
|
||||||
|
import javafx.scene.control.Label;
|
||||||
|
import javafx.scene.image.Image;
|
||||||
|
import javafx.scene.image.ImageView;
|
||||||
|
import javafx.scene.layout.VBox;
|
||||||
|
import javafx.scene.text.Font;
|
||||||
|
import javafx.scene.text.FontWeight;
|
||||||
|
|
||||||
|
public class UIROMDataType extends VBox {
|
||||||
|
|
||||||
|
private String romPath;
|
||||||
|
private String titleID;
|
||||||
|
private String name;
|
||||||
|
private Label label = new Label();
|
||||||
|
private JFXButton button = new JFXButton();
|
||||||
|
private ImageView imageView = new ImageView();
|
||||||
|
|
||||||
|
public UIROMDataType(String romPath, String titleID, String name, String coverPath) {
|
||||||
|
this();
|
||||||
|
|
||||||
|
this.romPath = romPath;
|
||||||
|
this.titleID = titleID;
|
||||||
|
this.name = name;
|
||||||
|
|
||||||
|
label.setText(name);
|
||||||
|
imageView.setImage(new Image(new File(coverPath).toURI().toString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public UIROMDataType(String romPath, String titleID, String name, String coverPath, ContextMenu contextMenu) {
|
||||||
|
this();
|
||||||
|
|
||||||
|
this.romPath = romPath;
|
||||||
|
this.titleID = titleID;
|
||||||
|
this.name = name;
|
||||||
|
|
||||||
|
label.setText(name);
|
||||||
|
imageView.setImage(new Image(new File(coverPath).toURI().toString()));
|
||||||
|
button.setContextMenu(contextMenu);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UIROMDataType() {
|
||||||
|
super.getChildren().addAll(label, button);
|
||||||
|
|
||||||
|
label.setMaxWidth(200);
|
||||||
|
label.setPadding(new Insets(0,0,0,8));
|
||||||
|
label.setFont(Font.font("System", FontWeight.BOLD, 14));
|
||||||
|
|
||||||
|
imageView.setFitHeight(300);
|
||||||
|
imageView.setFitWidth(200);
|
||||||
|
|
||||||
|
button.setStyle("-fx-effect: dropshadow(three-pass-box, rgba(0,0,0,0.8), 10, 0, 0, 3); ");
|
||||||
|
button.setGraphic(imageView);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRomPath() {
|
||||||
|
return romPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitleID() {
|
||||||
|
return titleID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Label getLabel() {
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
public JFXButton getButton() {
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImageView getImageView() {
|
||||||
|
return imageView;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRomPath(String romPath) {
|
||||||
|
this.romPath = romPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitleID(String titleID) {
|
||||||
|
this.titleID = titleID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLabel(Label label) {
|
||||||
|
this.label = label;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setButton(JFXButton button) {
|
||||||
|
this.button = button;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setImageView(ImageView imageView) {
|
||||||
|
this.imageView = imageView;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
250
src/main/java/com/cemu_UI/uiElements/JFXEditGameAlert.java
Normal file
250
src/main/java/com/cemu_UI/uiElements/JFXEditGameAlert.java
Normal file
@ -0,0 +1,250 @@
|
|||||||
|
/**
|
||||||
|
* cemu_UI
|
||||||
|
*
|
||||||
|
* Copyright 2017-2019 <@Seil0>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cemu_UI.uiElements;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import com.cemu_UI.application.MainWindowController;
|
||||||
|
import com.cemu_UI.controller.XMLController;
|
||||||
|
import com.jfoenix.controls.JFXAlert;
|
||||||
|
import com.jfoenix.controls.JFXButton;
|
||||||
|
import com.jfoenix.controls.JFXDialogLayout;
|
||||||
|
|
||||||
|
import javafx.event.ActionEvent;
|
||||||
|
import javafx.geometry.Insets;
|
||||||
|
import javafx.scene.control.Label;
|
||||||
|
import javafx.scene.control.TextField;
|
||||||
|
import javafx.scene.layout.GridPane;
|
||||||
|
import javafx.scene.layout.VBox;
|
||||||
|
import javafx.scene.text.Text;
|
||||||
|
import javafx.stage.FileChooser;
|
||||||
|
import javafx.stage.Stage;
|
||||||
|
|
||||||
|
public class JFXEditGameAlert {
|
||||||
|
|
||||||
|
private String headingText;
|
||||||
|
private String bodyText;
|
||||||
|
private String title = "";
|
||||||
|
private String coverPath = "";
|
||||||
|
private String romPath = "";
|
||||||
|
private String titleID = "";
|
||||||
|
private String btnStyle;
|
||||||
|
private int mode;
|
||||||
|
private Stage stage;
|
||||||
|
private MainWindowController mwc; // TODO remove this!
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new JFoenix Alert to show some information with okay and cancel option
|
||||||
|
* @param headingText Heading text of the alert
|
||||||
|
* @param bodyText Content text of the alert
|
||||||
|
* @param btnStyle Style of the buttons
|
||||||
|
* @param mode Set to 0 for add and 1 for edit mode
|
||||||
|
* @param stage Stage to which the Alert belongs
|
||||||
|
* @param mwc a mwc dep, it's horrible i know
|
||||||
|
*/
|
||||||
|
public JFXEditGameAlert(String headingText, String bodyText, String btnStyle, int mode, Stage stage, MainWindowController mwc) {
|
||||||
|
this.headingText = headingText;
|
||||||
|
this.bodyText = bodyText;
|
||||||
|
this.btnStyle = btnStyle;
|
||||||
|
this.mode = mode;
|
||||||
|
this.stage = stage;
|
||||||
|
this.mwc = mwc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showAndWait( ) {
|
||||||
|
JFXAlert<Void> alert = new JFXAlert<>(stage);
|
||||||
|
|
||||||
|
TextField gameTitleTF = new TextField();
|
||||||
|
gameTitleTF.setPromptText(XMLController.getLocalBundle().getString("gameTitle"));
|
||||||
|
TextField gameTitleIDTF = new TextField();
|
||||||
|
gameTitleIDTF.setPromptText(XMLController.getLocalBundle().getString("titleID"));
|
||||||
|
TextField romPathTF = new TextField();
|
||||||
|
romPathTF.setPromptText(XMLController.getLocalBundle().getString("romPath"));
|
||||||
|
TextField gameCoverTF = new TextField();
|
||||||
|
gameCoverTF.setPromptText(XMLController.getLocalBundle().getString("coverPath"));
|
||||||
|
|
||||||
|
if (mode == 1) {
|
||||||
|
gameTitleTF.setText(title);
|
||||||
|
gameTitleIDTF.setText(titleID);
|
||||||
|
romPathTF.setText(romPath);
|
||||||
|
gameCoverTF.setText(coverPath);
|
||||||
|
|
||||||
|
gameTitleIDTF.setEditable(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
JFXButton okayBtn = new JFXButton(XMLController.getLocalBundle().getString("okayBtnText"));
|
||||||
|
okayBtn.setOnAction(event -> {
|
||||||
|
if (romPathTF.getText().toString().length() == 0 || gameCoverTF.getText().toString().length() == 0
|
||||||
|
|| gameTitleTF.getText().toString().length() == 0
|
||||||
|
|| gameTitleIDTF.getText().toString().length() == 0) {
|
||||||
|
|
||||||
|
// addGame error dialog
|
||||||
|
JFXInfoAlert errorDialog = new JFXInfoAlert(
|
||||||
|
XMLController.getLocalBundle().getString("editGameDialogHeadingTextError"),
|
||||||
|
XMLController.getLocalBundle().getString("editGameDialogBodyTextError"), btnStyle, stage);
|
||||||
|
errorDialog.showAndWait();
|
||||||
|
} else {
|
||||||
|
switch (mode) {
|
||||||
|
case 0:
|
||||||
|
// add-mode title, coverPath, romPath, titleID
|
||||||
|
mwc.addBtnReturn(gameTitleTF.getText().toString(), gameCoverTF.getText().toString(),
|
||||||
|
romPathTF.getText().toString(), gameTitleIDTF.getText().toString());
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
// edit mode
|
||||||
|
mwc.editBtnReturn(gameTitleTF.getText().toString(), gameCoverTF.getText().toString(),
|
||||||
|
romPathTF.getText().toString(), gameTitleIDTF.getText().toString());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
alert.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
okayBtn.setButtonType(com.jfoenix.controls.JFXButton.ButtonType.RAISED);
|
||||||
|
okayBtn.setPrefHeight(32);
|
||||||
|
okayBtn.setStyle(btnStyle);
|
||||||
|
|
||||||
|
JFXButton cancelBtn = new JFXButton(XMLController.getLocalBundle().getString("cancelBtnText"));
|
||||||
|
cancelBtn.addEventHandler(ActionEvent.ACTION, (e)-> alert.close());
|
||||||
|
cancelBtn.setButtonType(com.jfoenix.controls.JFXButton.ButtonType.RAISED);
|
||||||
|
cancelBtn.setPrefHeight(32);
|
||||||
|
cancelBtn.setStyle(btnStyle);
|
||||||
|
|
||||||
|
JFXButton selectPathBtn = new JFXButton(XMLController.getLocalBundle().getString("editGameDialogSelectPathBtn"));
|
||||||
|
selectPathBtn.setPrefWidth(110);
|
||||||
|
selectPathBtn.setStyle(btnStyle);
|
||||||
|
selectPathBtn.setOnAction(event -> {
|
||||||
|
FileChooser romDirectoryChooser = new FileChooser();
|
||||||
|
File romDirectory = romDirectoryChooser.showOpenDialog(stage);
|
||||||
|
romPathTF.setText(romDirectory.getAbsolutePath());
|
||||||
|
});
|
||||||
|
|
||||||
|
JFXButton selectCoverBtn = new JFXButton(XMLController.getLocalBundle().getString("editGameDialogSelectCoverBtn"));
|
||||||
|
selectCoverBtn.setPrefWidth(110);
|
||||||
|
selectCoverBtn.setStyle(btnStyle);
|
||||||
|
selectCoverBtn.setOnAction(event -> {
|
||||||
|
FileChooser coverDirectoryChooser = new FileChooser();
|
||||||
|
File coverDirectory = coverDirectoryChooser.showOpenDialog(stage);
|
||||||
|
gameCoverTF.setText(coverDirectory.getAbsolutePath());
|
||||||
|
});
|
||||||
|
|
||||||
|
GridPane grid = new GridPane();
|
||||||
|
grid.setHgap(10);
|
||||||
|
grid.setVgap(10);
|
||||||
|
grid.setPadding(new Insets(15, 10, 10, 10));
|
||||||
|
grid.add(new Label(XMLController.getLocalBundle().getString("gameTitle") + ":"), 0, 0);
|
||||||
|
grid.add(gameTitleTF, 1, 0);
|
||||||
|
grid.add(new Label(XMLController.getLocalBundle().getString("titleID") + ":"), 0, 1);
|
||||||
|
grid.add(gameTitleIDTF, 1, 1);
|
||||||
|
grid.add(new Label(XMLController.getLocalBundle().getString("romPath") + ":"), 0, 2);
|
||||||
|
grid.add(romPathTF, 1, 2);
|
||||||
|
grid.add(selectPathBtn, 2, 2);
|
||||||
|
grid.add(new Label(XMLController.getLocalBundle().getString("coverPath") + ":"), 0, 3);
|
||||||
|
grid.add(gameCoverTF, 1, 3);
|
||||||
|
grid.add(selectCoverBtn, 2, 3);
|
||||||
|
|
||||||
|
VBox vbox = new VBox();
|
||||||
|
vbox.getChildren().addAll(new Text(bodyText), grid);
|
||||||
|
|
||||||
|
JFXDialogLayout content = new JFXDialogLayout();
|
||||||
|
content.setActions(cancelBtn, okayBtn);
|
||||||
|
content.setHeading(new Text(headingText));
|
||||||
|
content.setBody(vbox);
|
||||||
|
alert.setContent(content);
|
||||||
|
alert.showAndWait();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHeadingText() {
|
||||||
|
return headingText;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBodyText() {
|
||||||
|
return bodyText;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCoverPath() {
|
||||||
|
return coverPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRomPath() {
|
||||||
|
return romPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitleID() {
|
||||||
|
return titleID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBtnStyle() {
|
||||||
|
return btnStyle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMode() {
|
||||||
|
return mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Stage getStage() {
|
||||||
|
return stage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHeadingText(String headingText) {
|
||||||
|
this.headingText = headingText;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBodyText(String bodyText) {
|
||||||
|
this.bodyText = bodyText;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCoverPath(String coverPath) {
|
||||||
|
this.coverPath = coverPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRomPath(String romPath) {
|
||||||
|
this.romPath = romPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitleID(String titleID) {
|
||||||
|
this.titleID = titleID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBtnStyle(String btnStyle) {
|
||||||
|
this.btnStyle = btnStyle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMode(int mode) {
|
||||||
|
this.mode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStage(Stage stage) {
|
||||||
|
this.stage = stage;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user