Compare commits
59 Commits
Author | SHA1 | Date | |
---|---|---|---|
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 |
54
.classpath
54
.classpath
@ -1,29 +1,33 @@
|
||||
<?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="src" output="target/classes" path="src/main/java">
|
||||
<attributes>
|
||||
<attribute name="optional" value="true"/>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
|
||||
<attributes>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
|
||||
<attributes>
|
||||
<attribute name="optional" value="true"/>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="src" path="src/test/main"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
|
||||
<attributes>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<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/minimal-json-0.9.4.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/commons-logging-api-1.1.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/commons-vfs2-2.1.1744488.2.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/flow-8.0.1.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/zip4j-1.3.2.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/log4j-api-2.8.2.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/log4j-core-2.8.2.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/sqlite-jdbc-3.20.0.jar"/>
|
||||
<classpathentry kind="lib" path="src/libraries/jfoenix-1.9.1.jar"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
|
||||
<attributes>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="output" path="target/classes"/>
|
||||
</classpath>
|
||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -48,4 +48,5 @@ Temporary Items
|
||||
config.xml
|
||||
client_secret.json
|
||||
.directory
|
||||
|
||||
target/
|
||||
cemu_UI.jar
|
||||
|
6
.project
6
.project
@ -15,8 +15,14 @@
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.m2e.core.maven2Builder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
||||
<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
|
5
.settings/org.eclipse.core.resources.prefs
Normal file
5
.settings/org.eclipse.core.resources.prefs
Normal file
@ -0,0 +1,5 @@
|
||||
eclipse.preferences.version=1
|
||||
encoding//src/main/java=UTF-8
|
||||
encoding//src/main/resources=UTF-8
|
||||
encoding//src/test/java=UTF-8
|
||||
encoding/<project>=UTF-8
|
@ -9,4 +9,5 @@ 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.problem.forbiddenReference=warning
|
||||
org.eclipse.jdt.core.compiler.source=1.8
|
||||
|
4
.settings/org.eclipse.m2e.core.prefs
Normal file
4
.settings/org.eclipse.m2e.core.prefs
Normal file
@ -0,0 +1,4 @@
|
||||
activeProfiles=
|
||||
eclipse.preferences.version=1
|
||||
resolveWorkspaceProjects=true
|
||||
version=1
|
1
.travis.yml
Normal file
1
.travis.yml
Normal file
@ -0,0 +1 @@
|
||||
language: java
|
27
CONTRIBUTING.md
Normal file
27
CONTRIBUTING.md
Normal file
@ -0,0 +1,27 @@
|
||||
# Contributing to cemu_UI
|
||||
The following is a set of guidelines for contributing to cemu_UI.
|
||||
|
||||
## Java 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):
|
||||
<@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
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
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
|
||||
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.}
|
||||
Copyright (C) {year} {name of author}
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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
|
||||
@ -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
|
||||
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 is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
15
README.md
15
README.md
@ -1,32 +1,27 @@
|
||||
# cemu_UI
|
||||
|
||||

|
||||
[](https://travis-ci.org/Seil0/cemu_UI)
|
||||
[](https://github.com/Seil0/cemu_UI/releases)
|
||||
[](https://www.gnu.org/licenses/gpl-3.0)
|
||||
|
||||
cemu_UI is a simple, material design graphical frontend for [cemu](http://cemu.info/), a Wii U emulator. Downloads can be found [here](https://github.com/Seil0/cemu_UI/releases).
|
||||
|
||||
## Installation
|
||||
Simply download the cemu_UI.jar from [releases](https://github.com/Seil0/cemu_UI/releases), make sure you have the latest version of java 8 oracle jre/jdk installed, open the file. cemu_UI creats a new directory "C:\Users\USERNAME\Documents\cemu_UI", where the database, settings and covers are stored. **first start can take while!**
|
||||
Simply download the cemu_UI.jar from [releases](https://github.com/Seil0/cemu_UI/releases), make sure you have the latest version of java 8 oracle jre/jdk installed and open the file. cemu_UI creats a new directory "C:\Users\USERNAME\Documents\cemu_UI", where the database, settings and covers are stored. **first start can take while!**
|
||||
|
||||
If you want to use the cloud sync function read the [wiki](https://github.com/Seil0/cemu_UI/wiki#cloud-savegame-syncronisation) carefully!
|
||||
|
||||
## building from source
|
||||
1. read the [license](https://github.com/Seil0/cemu_UI/blob/master/LICENSE)
|
||||
2. download/clone the git repository
|
||||
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
|
||||
|
||||
* launch Games
|
||||
* Time played in total
|
||||
* 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)
|
||||
* customisable UI
|
||||
* [sync savegames via google drive](https://github.com/Seil0/cemu_UI/wiki)
|
||||
* [smmdb api](http://smmdb.ddns.net/api) integration
|
||||
* [smmdb api](https://github.com/Tarnadas/smmdb) integration
|
||||
|
||||
## [planed Features](https://github.com/Seil0/cemu_UI/projects/1) (no ETA)
|
||||
|
||||
@ -37,6 +32,8 @@ If you want to use the cloud sync function read the [wiki](https://github.com/Se
|
||||
### If you have another idea, make a "new issue" with the `idea` lable
|
||||
|
||||
## [FAQ](https://github.com/Seil0/cemu_UI/wiki#faq)
|
||||
|
||||
### [building from source](https://github.com/Seil0/cemu_UI/wiki/Documantation)
|
||||
|
||||
## 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 fx:id="mainAnchorPane" prefHeight="600.0" prefWidth="904.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" 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" layoutX="396.0" maxHeight="28.0" minWidth="100.0" onAction="#playBtnAction" ripplerFill="#00aacc" text="play" textAlignment="CENTER" visible="false" AnchorPane.bottomAnchor="12.0">
|
||||
<font>
|
||||
<Font name="System Bold" size="14.0" />
|
||||
</font>
|
||||
</JFXButton>
|
||||
<JFXButton fx:id="totalPlaytimeBtn" buttonType="RAISED" layoutX="275.5" maxHeight="32.0" minWidth="100.0" onAction="#totalPlaytimeBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" text="0 h 0 min" visible="false" AnchorPane.bottomAnchor="10.0">
|
||||
</JFXButton>
|
||||
<JFXButton fx:id="lastTimePlayedBtn" buttonType="RAISED" layoutX="516.5" maxHeight="32.0" minWidth="100.0" onAction="#lastTimePlayedBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" text="Last played, never" visible="false" AnchorPane.bottomAnchor="10.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
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>
|
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.2.2-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>cemu_UI</name>
|
||||
<url>http://www.kellerkinder.xyz</url>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<maven.compiler.source>1.8</maven.compiler.source>
|
||||
<maven.compiler.target>1.8</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>3.8.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.jfoenix</groupId>
|
||||
<artifactId>jfoenix</artifactId>
|
||||
<version>1.11.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.eclipsesource.minimal-json</groupId>
|
||||
<artifactId>minimal-json</artifactId>
|
||||
<version>0.9.4</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.xerial</groupId>
|
||||
<artifactId>sqlite-jdbc</artifactId>
|
||||
<version>3.21.0.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-api</artifactId>
|
||||
<version>2.9.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-core</artifactId>
|
||||
<version>2.9.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
<version>2.5</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-vfs2 -->
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-vfs2</artifactId>
|
||||
<version>2.2</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
|
||||
<dependency>
|
||||
<groupId>commons-codec</groupId>
|
||||
<artifactId>commons-codec</artifactId>
|
||||
<version>1.11</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/io.datafx/flow -->
|
||||
<dependency>
|
||||
<groupId>io.datafx</groupId>
|
||||
<artifactId>flow</artifactId>
|
||||
<version>8.0.1</version>
|
||||
</dependency>
|
||||
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/net.lingala.zip4j/zip4j -->
|
||||
<dependency>
|
||||
<groupId>net.lingala.zip4j</groupId>
|
||||
<artifactId>zip4j</artifactId>
|
||||
<version>1.3.2</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Google Drive-API libraries-->
|
||||
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
|
||||
<dependency>
|
||||
<groupId>commons-logging</groupId>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
<version>1.1.1</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/com.google.api-client/google-api-client -->
|
||||
<dependency>
|
||||
<groupId>com.google.api-client</groupId>
|
||||
<artifactId>google-api-client</artifactId>
|
||||
<version>1.23.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/com.google.apis/google-api-services-drive -->
|
||||
<dependency>
|
||||
<groupId>com.google.apis</groupId>
|
||||
<artifactId>google-api-services-drive</artifactId>
|
||||
<version>v3-rev87-1.23.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/com.google.http-client/google-http-client -->
|
||||
<dependency>
|
||||
<groupId>com.google.http-client</groupId>
|
||||
<artifactId>google-http-client</artifactId>
|
||||
<version>1.23.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/com.google.http-client/google-http-client-jackson2 -->
|
||||
<dependency>
|
||||
<groupId>com.google.http-client</groupId>
|
||||
<artifactId>google-http-client-jackson2</artifactId>
|
||||
<version>1.23.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client -->
|
||||
<dependency>
|
||||
<groupId>com.google.oauth-client</groupId>
|
||||
<artifactId>google-oauth-client</artifactId>
|
||||
<version>1.23.0</version>
|
||||
</dependency>
|
||||
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client-java6 -->
|
||||
<dependency>
|
||||
<groupId>com.google.oauth-client</groupId>
|
||||
<artifactId>google-oauth-client-java6</artifactId>
|
||||
<version>1.23.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client-jetty -->
|
||||
<dependency>
|
||||
<groupId>com.google.oauth-client</groupId>
|
||||
<artifactId>google-oauth-client-jetty</artifactId>
|
||||
<version>1.23.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-core</artifactId>
|
||||
<version>2.9.2</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
|
||||
<dependency>
|
||||
<groupId>javax.servlet</groupId>
|
||||
<artifactId>javax.servlet-api</artifactId>
|
||||
<version>4.0.0-b01</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/org.mortbay.jetty/jetty -->
|
||||
<dependency>
|
||||
<groupId>org.mortbay.jetty</groupId>
|
||||
<artifactId>jetty</artifactId>
|
||||
<version>6.1.26</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/org.mortbay.jetty/jetty-util -->
|
||||
<dependency>
|
||||
<groupId>org.mortbay.jetty</groupId>
|
||||
<artifactId>jetty-util</artifactId>
|
||||
<version>6.1.26</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
||||
<plugins>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>3.1.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<shadedArtifactAttached>true</shadedArtifactAttached>
|
||||
<transformers>
|
||||
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
|
||||
<mainClass>com.cemu_UI.application.Main</mainClass>
|
||||
</transformer>
|
||||
</transformers>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
@ -1,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 fx:id="mainAnchorPane" prefHeight="600.0" prefWidth="904.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" 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" layoutX="396.0" maxHeight="28.0" minWidth="100.0" onAction="#playBtnAction" ripplerFill="#00aacc" text="play" textAlignment="CENTER" visible="false" AnchorPane.bottomAnchor="12.0">
|
||||
<font>
|
||||
<Font name="System Bold" size="14.0" />
|
||||
</font>
|
||||
</JFXButton>
|
||||
<JFXButton fx:id="totalPlaytimeBtn" buttonType="RAISED" layoutX="275.5" maxHeight="32.0" minWidth="100.0" onAction="#totalPlaytimeBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" text="0 h 0 min" visible="false" AnchorPane.bottomAnchor="10.0">
|
||||
</JFXButton>
|
||||
<JFXButton fx:id="lastTimePlayedBtn" buttonType="RAISED" layoutX="516.5" maxHeight="32.0" minWidth="100.0" onAction="#lastTimePlayedBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" text="Last played, never" visible="false" AnchorPane.bottomAnchor="10.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
File diff suppressed because it is too large
Load Diff
@ -1,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.
@ -1,20 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Configuration status="INFO">
|
||||
<Appenders>
|
||||
|
||||
<Console name="console" target="SYSTEM_OUT">
|
||||
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] %c{1} - %msg%n" />
|
||||
</Console>
|
||||
|
||||
<File name="file" fileName="${sys:logFilename}" immediateFlush="true">
|
||||
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] %c{1} - %msg%n" />
|
||||
</File>
|
||||
|
||||
</Appenders>
|
||||
<Loggers>
|
||||
<Root level="debug" additivity="false">
|
||||
<AppenderRef ref="console" />
|
||||
<AppenderRef ref="file"/>
|
||||
</Root>
|
||||
</Loggers>
|
||||
</Configuration>
|
@ -19,7 +19,7 @@
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
package application;
|
||||
package com.cemu_UI.application;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
@ -33,6 +33,9 @@ import java.util.TimerTask;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import com.cemu_UI.controller.CloudController;
|
||||
|
||||
import javafx.application.Application;
|
||||
import javafx.beans.value.ChangeListener;
|
||||
import javafx.beans.value.ObservableValue;
|
||||
@ -49,13 +52,20 @@ import javafx.scene.layout.AnchorPane;
|
||||
public class Main extends Application {
|
||||
|
||||
Stage primaryStage;
|
||||
public MainWindowController mainWindowController; //TODO find a better way
|
||||
public MainWindowController mainWindowController; // TODO find a better way
|
||||
CloudController cloudController;
|
||||
AnchorPane pane;
|
||||
private Scene scene;
|
||||
private String dirWin = System.getProperty("user.home") + "/Documents/cemu_UI"; //Windows: C:/Users/"User"/Documents/cemu_UI
|
||||
private String dirLinux = System.getProperty("user.home") + "/cemu_UI"; //Linux: /home/"User"/cemu_UI
|
||||
Scene scene; // TODO make private
|
||||
private static String userHome = System.getProperty("user.home");
|
||||
private static String userName = System.getProperty("user.name");
|
||||
private static String osName = System.getProperty("os.name");
|
||||
private static String osArch = System.getProperty("os.arch");
|
||||
private static String osVers = System.getProperty("os.version");
|
||||
private static String javaVers = System.getProperty("java.version");
|
||||
private static String javaVend= System.getProperty("java.vendor");
|
||||
private String gamesDBdownloadURL = "https://github.com/Seil0/cemu_UI/raw/master/downloadContent/games.db";
|
||||
public String dirWin = userHome + "/Documents/cemu_UI"; // Windows: C:/Users/"User"/Documents/cemu_UI
|
||||
public String dirLinux = userHome + "/cemu_UI"; // Linux: /home/"User"/cemu_UI
|
||||
private File directory;
|
||||
private File configFile;
|
||||
private File gamesDBFile;
|
||||
@ -66,25 +76,33 @@ public class Main extends Application {
|
||||
|
||||
@Override
|
||||
public void start(Stage primaryStage) {
|
||||
this.primaryStage = primaryStage;
|
||||
cloudController = new CloudController(this);
|
||||
mainWindow();
|
||||
initActions();
|
||||
try {
|
||||
LOGGER.info("OS: " + osName + " " + osVers + " " + osArch);
|
||||
LOGGER.info("Java: " + javaVend + " " + javaVers);
|
||||
LOGGER.info("User: " + userName + " " + userHome);
|
||||
this.primaryStage = primaryStage;
|
||||
mainWindow();
|
||||
initActions();
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("ooooops",e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void mainWindow(){
|
||||
try {
|
||||
FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindow.fxml"));
|
||||
pane = loader.load();
|
||||
// primaryStage.setResizable(false);
|
||||
FXMLLoader loader = new FXMLLoader();
|
||||
loader.setLocation(ClassLoader.getSystemResource("fxml/MainWindow.fxml"));
|
||||
pane = (AnchorPane) loader.load();
|
||||
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
|
||||
mainWindowController = loader.getController(); // Link of FXMLController and controller class
|
||||
mainWindowController.setMain(this); // call setMain
|
||||
cloudController = new CloudController(mainWindowController); // call cloudController constructor
|
||||
|
||||
//get os and the right paths
|
||||
if (System.getProperty("os.name").equals("Linux")) {
|
||||
// get OS and the specific paths
|
||||
if (osName.equals("Linux")) {
|
||||
directory = new File(dirLinux);
|
||||
configFile = new File(dirLinux + "/config.xml");
|
||||
gamesDBFile = new File(dirLinux + "/games.db");
|
||||
@ -98,9 +116,9 @@ public class Main extends Application {
|
||||
pictureCache= new File(dirWin+"/picture_cache");
|
||||
}
|
||||
|
||||
//startup checks
|
||||
//check if client_secret.jason is present
|
||||
if (Main.class.getResourceAsStream("/resources/client_secret.json") == null) {
|
||||
// startup checks
|
||||
// check if client_secret.jason is present
|
||||
if (Main.class.getResourceAsStream("/client_secret.json") == null) {
|
||||
LOGGER.error("client_secret is missing!!!!!");
|
||||
|
||||
Alert alert = new Alert(AlertType.ERROR);
|
||||
@ -110,8 +128,6 @@ public class Main extends Application {
|
||||
alert.showAndWait();
|
||||
}
|
||||
|
||||
LOGGER.info("Directory: " + directory.exists());
|
||||
LOGGER.info("Configfile: " + configFile.exists());
|
||||
if (!directory.exists()) {
|
||||
LOGGER.info("creating cemu_UI directory");
|
||||
directory.mkdir();
|
||||
@ -122,6 +138,7 @@ public class Main extends Application {
|
||||
LOGGER.info("firststart, setting default values");
|
||||
firstStart();
|
||||
mainWindowController.setColor("00a8cc");
|
||||
mainWindowController.setAutoUpdate(false);
|
||||
mainWindowController.setxPosHelper(0);
|
||||
mainWindowController.saveSettings();
|
||||
Runtime.getRuntime().exec("java -jar cemu_UI.jar"); //start again (preventing Bugs)
|
||||
@ -146,28 +163,27 @@ public class Main extends Application {
|
||||
}
|
||||
}
|
||||
|
||||
//loading settings and initialize UI, dbController.main() loads all databases
|
||||
mainWindowController.loadSettings();
|
||||
mainWindowController.initActions();
|
||||
mainWindowController.initUI();
|
||||
// loading settings and initialize UI, dbController.main() loads all databases
|
||||
mainWindowController.init();
|
||||
mainWindowController.dbController.main();
|
||||
// if cloud sync is activated start sync
|
||||
if(mainWindowController.isCloudSync()) {
|
||||
cloudController.initializeConnection(mainWindowController.getCloudService(), mainWindowController.getCemuPath());
|
||||
cloudController.stratupCheck(mainWindowController.getCloudService(), mainWindowController.getCemuPath());
|
||||
}
|
||||
mainWindowController.addUIData();
|
||||
|
||||
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
|
||||
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
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void firstStart(){
|
||||
Alert alert = new Alert(AlertType.CONFIRMATION); //new alert with file-chooser
|
||||
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");
|
||||
@ -182,7 +198,7 @@ public class Main extends Application {
|
||||
mainWindowController.setCemuPath(null);
|
||||
}
|
||||
|
||||
Alert alert2 = new Alert(AlertType.CONFIRMATION); //new alert with file-chooser
|
||||
Alert alert2 = new Alert(AlertType.CONFIRMATION); // new alert with file-chooser
|
||||
alert2.setTitle("cemu_UI");
|
||||
alert2.setHeaderText("rom directory");
|
||||
alert2.setContentText("please select your rom directory");
|
||||
@ -202,8 +218,8 @@ public class Main extends Application {
|
||||
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
|
||||
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) {
|
||||
@ -211,12 +227,12 @@ public class Main extends Application {
|
||||
|
||||
mainWindowController.refreshplayBtnPosition();
|
||||
|
||||
//call only if there is enough space for a new row
|
||||
// call only if there is enough space for a new row
|
||||
if (mainWindowController.getOldXPosHelper() != xPosHelperMax) {
|
||||
mainWindowController.refreshUIData();
|
||||
}
|
||||
|
||||
//if saveTask is already running kill it
|
||||
// if saveTask is already running kill it
|
||||
if (saveTask != null) saveTask.cancel();
|
||||
|
||||
saveTask = new TimerTask() {
|
||||
@ -232,8 +248,8 @@ public class Main extends Application {
|
||||
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
|
||||
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) {
|
||||
@ -267,24 +283,29 @@ public class Main extends Application {
|
||||
}
|
||||
};
|
||||
|
||||
//add listener to primaryStage
|
||||
// add listener to primaryStage
|
||||
primaryStage.widthProperty().addListener(widthListener);
|
||||
primaryStage.heightProperty().addListener(heightListener);
|
||||
primaryStage.maximizedProperty().addListener(maximizeListener);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
//delete old log file and create new
|
||||
if(System.getProperty("os.name").equals("Linux")){
|
||||
System.setProperty("logFilename", System.getProperty("user.home") + "/cemu_UI/app.log");
|
||||
File logFile = new File(System.getProperty("user.home") + "/cemu_UI/app.log");
|
||||
// delete old log file and create new
|
||||
if(osName.equals("Linux")){
|
||||
System.setProperty("logFilename", userHome + "/cemu_UI/app.log");
|
||||
File logFile = new File(userHome + "/cemu_UI/app.log");
|
||||
logFile.delete();
|
||||
}else{
|
||||
System.setProperty("logFilename", System.getProperty("user.home") + "/Documents/cemu_UI/app.log");
|
||||
File logFile = new File(System.getProperty("user.home") + "/Documents/cemu_UI/app.log");
|
||||
System.setProperty("logFilename", userHome + "/Documents/cemu_UI/app.log");
|
||||
File logFile = new File(userHome + "/Documents/cemu_UI/app.log");
|
||||
logFile.delete();
|
||||
}
|
||||
LOGGER = LogManager.getLogger(Main.class.getName());
|
||||
launch(args);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop() {
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
1930
src/main/java/com/cemu_UI/application/MainWindowController.java
Normal file
1930
src/main/java/com/cemu_UI/application/MainWindowController.java
Normal file
File diff suppressed because it is too large
Load Diff
@ -19,13 +19,15 @@
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
package application;
|
||||
package com.cemu_UI.application;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import com.cemu_UI.controller.dbController;
|
||||
|
||||
import javafx.application.Platform;
|
||||
|
||||
public class playGame extends Thread{
|
||||
@ -34,7 +36,7 @@ public class playGame extends Thread{
|
||||
dbController dbController;
|
||||
private static final Logger LOGGER = LogManager.getLogger(playGame.class.getName());
|
||||
|
||||
public playGame(MainWindowController m, dbController db){
|
||||
public playGame(MainWindowController m, com.cemu_UI.controller.dbController db){
|
||||
mainWindowController = m;
|
||||
dbController = db;
|
||||
}
|
@ -19,7 +19,7 @@
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
package application;
|
||||
package com.cemu_UI.controller;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
@ -27,52 +27,60 @@ import java.io.IOException;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import cloudControllerInstances.GoogleDriveController;
|
||||
import com.cemu_UI.application.MainWindowController;
|
||||
import com.cemu_UI.vendorCloudController.GoogleDriveController;
|
||||
|
||||
import javafx.application.Platform;
|
||||
|
||||
public class CloudController {
|
||||
|
||||
public CloudController(Main ma) {
|
||||
main = ma;
|
||||
public CloudController(MainWindowController mwc) {
|
||||
this.mwc = mwc;
|
||||
}
|
||||
|
||||
private Main main;
|
||||
private MainWindowController mwc;
|
||||
private GoogleDriveController googleDriveController = new GoogleDriveController();
|
||||
private static final Logger LOGGER = LogManager.getLogger(CloudController.class.getName());
|
||||
|
||||
void initializeConnection(String cloudService, String cemuDirectory) {
|
||||
public boolean initializeConnection(String cloudService, String cemuDirectory) {
|
||||
boolean success = false;
|
||||
LOGGER.info("sartting cloud initialisation ...");
|
||||
|
||||
if(cloudService.equals("GoogleDrive")) {
|
||||
LOGGER.info("selected service is Google Drive");
|
||||
try {
|
||||
googleDriveController.main(cemuDirectory);
|
||||
} catch (IOException e) {
|
||||
LOGGER.error("error while initialize connection", e);
|
||||
return success;
|
||||
}
|
||||
success = true;
|
||||
}
|
||||
|
||||
if(cloudService.equals("Dropbox")) {
|
||||
LOGGER.info("selected service is Dropbox");
|
||||
}
|
||||
LOGGER.info("cloud initialisation done!");
|
||||
return success;
|
||||
}
|
||||
|
||||
void stratupCheck(String cloudService, String cemuDirectory) {
|
||||
public void stratupCheck(String cloudService, String cemuDirectory) {
|
||||
if(cloudService.equals("GoogleDrive")) {
|
||||
LOGGER.info("starting startup check google drive ...");
|
||||
try {
|
||||
if (!googleDriveController.checkFolder()) {
|
||||
googleDriveController.creatFolder();
|
||||
main.mainWindowController.saveSettings();
|
||||
mwc.saveSettings();
|
||||
|
||||
Thread thread = new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Platform.runLater(() -> {
|
||||
main.mainWindowController.getPlayBtn().setText("syncing...");
|
||||
mwc.getPlayBtn().setText("syncing...");
|
||||
});
|
||||
googleDriveController.uploadAllFiles();
|
||||
Platform.runLater(() -> {
|
||||
main.mainWindowController.getPlayBtn().setText("play");
|
||||
mwc.getPlayBtn().setText("play");
|
||||
});
|
||||
}
|
||||
});
|
||||
@ -91,14 +99,14 @@ public class CloudController {
|
||||
|
||||
|
||||
|
||||
void sync(String cloudService, String cemuDirectory) {
|
||||
public void sync(String cloudService, String cemuDirectory) {
|
||||
|
||||
//running sync in a new thread, instead of blocking the main thread
|
||||
Thread thread = new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Platform.runLater(() -> {
|
||||
main.mainWindowController.getPlayBtn().setText("syncing...");
|
||||
mwc.getPlayBtn().setText("syncing...");
|
||||
});
|
||||
LOGGER.info("starting synchronization in new thread ...");
|
||||
|
||||
@ -113,9 +121,9 @@ public class CloudController {
|
||||
|
||||
}
|
||||
Platform.runLater(() -> {
|
||||
main.mainWindowController.getPlayBtn().setText("play");
|
||||
mwc.getPlayBtn().setText("play");
|
||||
mwc.saveSettings();
|
||||
});
|
||||
main.mainWindowController.saveSettings();
|
||||
LOGGER.info("synchronization successful!");
|
||||
}
|
||||
});
|
@ -19,7 +19,7 @@
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
package application;
|
||||
package com.cemu_UI.controller;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
@ -30,18 +30,17 @@ 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;
|
||||
|
||||
import datatypes.SmmdbApiDataType;
|
||||
|
||||
public class SmmdbApiQuery {
|
||||
public class SmmdbAPIController {
|
||||
|
||||
private String URL = "http://smmdb.ddns.net/api/getcourses?format=json";
|
||||
private static final Logger LOGGER = LogManager.getLogger(SmmdbApiQuery.class.getName());
|
||||
private String URL = "https://smmdb.ddns.net/api/getcourses?format=json";
|
||||
private static final Logger LOGGER = LogManager.getLogger(SmmdbAPIController.class.getName());
|
||||
|
||||
public SmmdbApiQuery() {
|
||||
public SmmdbAPIController() {
|
||||
//Auto-generated constructor stub
|
||||
}
|
||||
|
||||
@ -64,6 +63,7 @@ public class SmmdbApiQuery {
|
||||
} 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 + "}";
|
159
src/main/java/com/cemu_UI/controller/UpdateController.java
Normal file
159
src/main/java/com/cemu_UI/controller/UpdateController.java
Normal file
@ -0,0 +1,159 @@
|
||||
/**
|
||||
* cemu_UI
|
||||
*
|
||||
* Copyright 2017 <@Seil0>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
package 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 String buildNumber;
|
||||
private String apiOutput;
|
||||
private String updateBuildNumber; // tag_name from Github
|
||||
private String browserDownloadUrl; // update download link
|
||||
private String githubApiRelease = "https://api.github.com/repos/Seil0/cemu_UI/releases/latest";
|
||||
private String githubApiBeta = "https://api.github.com/repos/Seil0/cemu_UI/releases";
|
||||
private URL githubApiUrl;
|
||||
private boolean useBeta;
|
||||
private static final Logger LOGGER = LogManager.getLogger(UpdateController.class.getName());
|
||||
|
||||
/**
|
||||
* updater for cemu_UI based on Project HomeFlix checks for Updates and download
|
||||
* it in case there is one
|
||||
*/
|
||||
public UpdateController(MainWindowController mwc, String buildNumber, boolean useBeta) {
|
||||
mainWindowController = mwc;
|
||||
this.buildNumber = buildNumber;
|
||||
this.useBeta = useBeta;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
LOGGER.info("beta:" + useBeta + "; checking for updates ...");
|
||||
Platform.runLater(() -> {
|
||||
mainWindowController.getUpdateBtn().setText("checking for updates ...");
|
||||
});
|
||||
|
||||
try {
|
||||
|
||||
if (useBeta) {
|
||||
githubApiUrl = new URL(githubApiBeta);
|
||||
} else {
|
||||
githubApiUrl = new URL(githubApiRelease);
|
||||
}
|
||||
|
||||
// URL githubApiUrl = new URL(githubApiRelease);
|
||||
BufferedReader ina = new BufferedReader(new InputStreamReader(githubApiUrl.openStream()));
|
||||
apiOutput = ina.readLine();
|
||||
ina.close();
|
||||
} catch (IOException e) {
|
||||
Platform.runLater(() -> {
|
||||
LOGGER.error("could not check update version", e);
|
||||
});
|
||||
}
|
||||
|
||||
if (useBeta) {
|
||||
JsonArray objectArray = Json.parse("{\"items\": " + apiOutput + "}").asObject().get("items").asArray();
|
||||
JsonValue object = objectArray.get(0);
|
||||
JsonArray objectAssets = object.asObject().get("assets").asArray();
|
||||
|
||||
updateBuildNumber = object.asObject().getString("tag_name", "");
|
||||
// updateName = object.asObject().getString("name", "");
|
||||
// updateChanges = object.asObject().getString("body", "");
|
||||
|
||||
for (JsonValue asset : objectAssets) {
|
||||
browserDownloadUrl = asset.asObject().getString("browser_download_url", "");
|
||||
}
|
||||
|
||||
} else {
|
||||
JsonObject object = Json.parse(apiOutput).asObject();
|
||||
JsonArray objectAssets = Json.parse(apiOutput).asObject().get("assets").asArray();
|
||||
|
||||
updateBuildNumber = object.getString("tag_name", "");
|
||||
// updateName = object.getString("name", "");
|
||||
// updateChanges = object.getString("body", "");
|
||||
for (JsonValue asset : objectAssets) {
|
||||
browserDownloadUrl = asset.asObject().getString("browser_download_url", "");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
LOGGER.info("Build: " + buildNumber + ", Update: " + updateBuildNumber);
|
||||
|
||||
// Compares the program BuildNumber with the current BuildNumber if program
|
||||
// BuildNumber < current BuildNumber then perform a update
|
||||
int iversion = Integer.parseInt(buildNumber);
|
||||
int iaktVersion = Integer.parseInt(updateBuildNumber.replace(".", ""));
|
||||
|
||||
if (iversion >= iaktVersion) {
|
||||
Platform.runLater(() -> {
|
||||
mainWindowController.getUpdateBtn().setText("no update available");
|
||||
});
|
||||
LOGGER.info("no update available");
|
||||
} else {
|
||||
Platform.runLater(() -> {
|
||||
mainWindowController.getUpdateBtn().setText("update available");
|
||||
});
|
||||
LOGGER.info("update available");
|
||||
LOGGER.info("download link: " + browserDownloadUrl);
|
||||
try {
|
||||
// open new Http connection, ProgressMonitorInputStream for downloading the data
|
||||
HttpURLConnection conn = (HttpURLConnection) new URL(browserDownloadUrl).openConnection();
|
||||
ProgressMonitorInputStream pmis = new ProgressMonitorInputStream(null, "Downloading...", conn.getInputStream());
|
||||
ProgressMonitor pm = pmis.getProgressMonitor();
|
||||
pm.setMillisToDecideToPopup(0);
|
||||
pm.setMillisToPopup(0);
|
||||
pm.setMinimum(0);// tell the progress bar that we start at the beginning of the stream
|
||||
pm.setMaximum(conn.getContentLength());// tell the progress bar the total number of bytes we are going to read.
|
||||
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")); // TODO rename update to old name
|
||||
org.apache.commons.io.FileUtils.deleteQuietly(new File("cemu_UI_update.jar")); // delete update
|
||||
Runtime.getRuntime().exec("java -jar cemu_UI.jar"); // start again
|
||||
System.exit(0); // finishes itself
|
||||
} catch (IOException e) {
|
||||
Platform.runLater(() -> {
|
||||
LOGGER.info("could not download update files", e);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -19,7 +19,7 @@
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
package application;
|
||||
package com.cemu_UI.controller;
|
||||
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
@ -45,6 +45,8 @@ import org.apache.logging.log4j.Logger;
|
||||
import org.w3c.dom.Document;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import com.cemu_UI.application.MainWindowController;
|
||||
|
||||
public class dbController {
|
||||
|
||||
public dbController(MainWindowController m) {
|
||||
@ -53,7 +55,7 @@ public class dbController {
|
||||
|
||||
private MainWindowController mainWindowController;
|
||||
private ArrayList<String> entries = new ArrayList<>();
|
||||
private String DB_PATH;
|
||||
private String DB_PATH_localRoms;
|
||||
private String DB_PATH_games;
|
||||
private Connection connection = null;
|
||||
private Connection connectionGames = null;
|
||||
@ -64,20 +66,25 @@ public class dbController {
|
||||
loadRomDatabase();
|
||||
loadGamesDatabase();
|
||||
createRomDatabase();
|
||||
loadAllRoms();
|
||||
loadAllGames();
|
||||
checkRemoveEntry();
|
||||
LOGGER.info("<==========finished loading sql==========>");
|
||||
}
|
||||
|
||||
/**
|
||||
* set the path to the localRoms.db file and initialize the connection
|
||||
*
|
||||
* TODO this should be called LocalGames
|
||||
*/
|
||||
private void loadRomDatabase(){
|
||||
if (System.getProperty("os.name").equals("Linux")) {
|
||||
DB_PATH = System.getProperty("user.home") + "/cemu_UI/localRoms.db";
|
||||
DB_PATH_localRoms = System.getProperty("user.home") + "/cemu_UI/localRoms.db";
|
||||
}else{
|
||||
DB_PATH = System.getProperty("user.home") + "\\Documents\\cemu_UI" + "\\" + "localRoms.db";
|
||||
DB_PATH_localRoms = System.getProperty("user.home") + "\\Documents\\cemu_UI" + "\\" + "localRoms.db";
|
||||
}
|
||||
try {
|
||||
// create a database connection
|
||||
connection = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH);
|
||||
connection = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH_localRoms);
|
||||
connection.setAutoCommit(false); //AutoCommit to false -> manual commit is active
|
||||
} catch (SQLException e) {
|
||||
// if the error message is "out of memory", it probably means no database file is found
|
||||
@ -87,28 +94,35 @@ public class dbController {
|
||||
}
|
||||
|
||||
/**
|
||||
* 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)
|
||||
* set the path to the localRoms.db file and initialize the connection
|
||||
*
|
||||
* games.dbcontains a reverence list to for the automatic detection mode
|
||||
* TODO this should be called ReferenceGameList the games table should be called reference_games
|
||||
*/
|
||||
private void loadGamesDatabase(){
|
||||
private void loadGamesDatabase() {
|
||||
if (System.getProperty("os.name").equals("Linux")) {
|
||||
DB_PATH_games = System.getProperty("user.home") + "/cemu_UI/games.db";
|
||||
}else{
|
||||
} 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
|
||||
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
|
||||
LOGGER.error("error while loading the games database", e);
|
||||
}
|
||||
LOGGER.info("games database loaded successfull");
|
||||
}
|
||||
|
||||
//creating database, if database has 0 entries search for all .rpx files in the roms directory and add them
|
||||
void createRomDatabase() {
|
||||
|
||||
/**
|
||||
* creating the local_roms table in localRoms.db
|
||||
* if the table has no entries, call loadRomDirectory
|
||||
*
|
||||
* TODO the local_roms table should be called local_games
|
||||
*/
|
||||
void createRomDatabase() {
|
||||
try {
|
||||
Statement stmt = connection.createStatement();
|
||||
stmt.executeUpdate("create table if not exists local_roms (title, coverPath, romPath, titleID, productCode, region, lastPlayed, timePlayed)");
|
||||
@ -117,32 +131,34 @@ public class dbController {
|
||||
} catch (SQLException e) {
|
||||
LOGGER.error("error while creating ROM database", e);
|
||||
}
|
||||
|
||||
try {
|
||||
Statement stmt = connection.createStatement();
|
||||
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms");
|
||||
while (rs.next()) {
|
||||
|
||||
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 e){
|
||||
} catch (SQLException e) {
|
||||
LOGGER.error("error while loading ROMs from ROM database, local_roms table", e);
|
||||
}
|
||||
if(entries.size() == 0){
|
||||
if (entries.size() == 0) {
|
||||
loadRomDirectory(mainWindowController.getRomPath());
|
||||
}
|
||||
}
|
||||
|
||||
void addRom(String title, String coverPath, String romPath, String titleID, String productCode, String region, String lastPlayed, String timePlayed) throws SQLException{
|
||||
// add a Ggame to the database
|
||||
public void addGame(String title, String coverPath, String romPath, String titleID, String productCode, String region, String lastPlayed, String timePlayed) throws SQLException{
|
||||
Statement stmt = connection.createStatement();
|
||||
stmt.executeUpdate("insert into local_roms values ('"+title+"','"+coverPath+"','"+romPath+"','"+titleID+"','"+productCode+"','"+region+"','"+lastPlayed+"','"+timePlayed+"')");
|
||||
stmt.executeUpdate("insert into local_roms values ('"+title+"','"+coverPath+"','"+romPath+"','"+titleID+"',"
|
||||
+ "'"+productCode+"','"+region+"','"+lastPlayed+"','"+timePlayed+"')");
|
||||
connection.commit();
|
||||
stmt.close();
|
||||
LOGGER.info("added \""+title+"\" to ROM database");
|
||||
}
|
||||
|
||||
void removeRom(String titleID) throws SQLException{
|
||||
public void removeGame(String titleID) throws SQLException{
|
||||
Statement stmt = connection.createStatement();
|
||||
stmt.executeUpdate("delete from local_roms where titleID = '"+titleID+"'");
|
||||
connection.commit();
|
||||
@ -151,8 +167,8 @@ public class dbController {
|
||||
}
|
||||
|
||||
//load all ROMs on startup to the mainWindowController
|
||||
void loadAllRoms(){
|
||||
LOGGER.info("loading all rom's on startup into the mainWindowController ...");
|
||||
void loadAllGames(){
|
||||
LOGGER.info("loading all games on startup into the mainWindowController ...");
|
||||
try {
|
||||
Statement stmt = connection.createStatement();
|
||||
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms");
|
||||
@ -162,13 +178,13 @@ public class dbController {
|
||||
stmt.close();
|
||||
rs.close();
|
||||
}catch (Exception e){
|
||||
LOGGER.error("error while loading all ROMs into the mainWindowController", e);
|
||||
LOGGER.error("error while loading all games into the mainWindowController", e);
|
||||
}
|
||||
}
|
||||
|
||||
//load one single ROM after manual adding into the mainWindowController
|
||||
void loadSingleRom(String titleID){
|
||||
LOGGER.info("loading a single ROM (ID: "+titleID+") into the mainWindowController ...");
|
||||
public void loadSingleGame(String titleID){
|
||||
LOGGER.info("loading a single game (ID: "+titleID+") into the mainWindowController ...");
|
||||
try {
|
||||
Statement stmt = connection.createStatement();
|
||||
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms where titleID = '"+titleID+"'");
|
||||
@ -178,12 +194,15 @@ public class dbController {
|
||||
stmt.close();
|
||||
rs.close();
|
||||
}catch (Exception e){
|
||||
LOGGER.error("error while loading a single ROM into the mainWindowController", e);
|
||||
LOGGER.error("error while loading a single game into the mainWindowController", e);
|
||||
}
|
||||
}
|
||||
|
||||
//get all files with .rpx TODO add other formats
|
||||
void loadRomDirectory(String directory){
|
||||
/**
|
||||
* get all .rpx files from a given directory and add them to the games database if they don't exist there
|
||||
* @param directory where to search for the .rpx files
|
||||
*/
|
||||
public void loadRomDirectory(String directory){
|
||||
File dir = new File(directory);
|
||||
File appFile;
|
||||
String[] extensions = new String[] { "rpx", "jsp" };
|
||||
@ -191,15 +210,16 @@ public class dbController {
|
||||
String coverPath;
|
||||
|
||||
if(System.getProperty("os.name").equals("Linux")){
|
||||
pictureCache = mainWindowController.pictureCacheLinux;
|
||||
pictureCache = mainWindowController.getPictureCacheLinux();
|
||||
}else{
|
||||
pictureCache = mainWindowController.pictureCacheWin;
|
||||
pictureCache = mainWindowController.getPictureCacheWin();
|
||||
}
|
||||
|
||||
try {
|
||||
Statement stmt = connectionGames.createStatement();
|
||||
LOGGER.info("Getting all .rpx files in " + dir.getCanonicalPath()+" including those in subdirectories");
|
||||
Statement stmt = connectionGames.createStatement();
|
||||
List<File> files = (List<File>) FileUtils.listFiles(dir, extensions, true);
|
||||
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) {
|
||||
if(System.getProperty("os.name").equals("Linux")){
|
||||
appFile = new File(file.getParent()+"/app.xml");
|
||||
@ -209,10 +229,11 @@ public class dbController {
|
||||
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
||||
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
|
||||
Document document = documentBuilder.parse(appFile);
|
||||
String title_ID = document.getElementsByTagName("title_id").item(0).getTextContent();
|
||||
String title_ID = document.getElementsByTagName("title_id").item(0).getTextContent(); //get titile_ID from app.xml
|
||||
title_ID = title_ID.substring(0, 8) + "-" + title_ID.substring(8, title_ID.length());
|
||||
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 (checkEntry(rs.getString(2))) {
|
||||
LOGGER.info(rs.getString(2) + ": game already in database");
|
||||
@ -230,7 +251,7 @@ public class dbController {
|
||||
}
|
||||
|
||||
LOGGER.info(rs.getString(2) + ": adding ROM");
|
||||
addRom(rs.getString(2), coverPath, file.getCanonicalPath(), rs.getString(1), rs.getString(3), rs.getString(5),"","0");
|
||||
addGame(rs.getString(2), coverPath, file.getCanonicalPath(), rs.getString(1), rs.getString(3), rs.getString(5),"","0");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -266,7 +287,45 @@ public class dbController {
|
||||
return resizedImage;
|
||||
}
|
||||
|
||||
void setLastPlayed(String titleID){
|
||||
/**
|
||||
* getting info for a game with titleID
|
||||
* @param titleID Title-ID of the Game
|
||||
* @return title, coverPath, romPath, titleID (in this order)
|
||||
*/
|
||||
public String[] getGameInfo(String titleID){
|
||||
String[] gameInfo = new String[4];
|
||||
LOGGER.info("getting game info for titleID: "+titleID+" ...");
|
||||
try {
|
||||
Statement stmt = connection.createStatement();
|
||||
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms where titleID = '"+titleID+"'");
|
||||
while (rs.next()) {
|
||||
gameInfo[0] = rs.getString(1);// title
|
||||
gameInfo[1] = rs.getString(2);// coverPath
|
||||
gameInfo[2] = rs.getString(3);// romPath
|
||||
gameInfo[3] = rs.getString(4);// titleID
|
||||
}
|
||||
stmt.close();
|
||||
rs.close();
|
||||
}catch (Exception e){
|
||||
LOGGER.error("error while getting game info", e);
|
||||
}
|
||||
return gameInfo;
|
||||
}
|
||||
|
||||
public void setGameInfo(String title, String coverPath, String romPath, String titleID){
|
||||
LOGGER.info("setting game info for titleID: "+titleID+" ...");
|
||||
try {
|
||||
Statement stmt = connection.createStatement();
|
||||
stmt.executeUpdate("UPDATE local_roms SET title = '" + title + "', coverPath = '" + coverPath + "',"
|
||||
+ " romPath = '" + romPath + "' WHERE titleID = '"+titleID+"';");
|
||||
connection.commit();
|
||||
stmt.close();
|
||||
}catch (Exception e){
|
||||
LOGGER.error("error while setting game info", e);
|
||||
}
|
||||
}
|
||||
|
||||
public void setLastPlayed(String titleID){
|
||||
try{
|
||||
Statement stmt = connection.createStatement();
|
||||
stmt.executeUpdate("UPDATE local_roms SET lastPlayed=date('now') WHERE titleID = '"+titleID+"';");
|
||||
@ -277,7 +336,7 @@ public class dbController {
|
||||
}
|
||||
}
|
||||
|
||||
String getLastPlayed(String titleID){
|
||||
public String getLastPlayed(String titleID){
|
||||
String lastPlayed = null;
|
||||
try{
|
||||
Statement stmt = connection.createStatement();
|
||||
@ -291,7 +350,7 @@ public class dbController {
|
||||
return lastPlayed;
|
||||
}
|
||||
|
||||
void setTotalPlaytime(String timePlayed, String titleID){
|
||||
public void setTotalPlaytime(String timePlayed, String titleID){
|
||||
try{
|
||||
Statement stmt = connection.createStatement();
|
||||
stmt.executeUpdate("UPDATE local_roms SET timePlayed='"+timePlayed+"' WHERE titleID = '"+titleID+"';");
|
||||
@ -303,7 +362,7 @@ public class dbController {
|
||||
}
|
||||
}
|
||||
|
||||
String getTotalPlaytime(String titleID){
|
||||
public String getTotalPlaytime(String titleID){
|
||||
String timePlayed = null;
|
||||
try{
|
||||
Statement stmt = connection.createStatement();
|
||||
@ -317,5 +376,5 @@ public class dbController {
|
||||
return timePlayed;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
@ -19,7 +19,7 @@
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
package datatypes;
|
||||
package com.cemu_UI.datatypes;
|
||||
|
||||
import com.jfoenix.controls.datamodels.treetable.RecursiveTreeObject;
|
||||
|
@ -19,7 +19,7 @@
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
package datatypes;
|
||||
package com.cemu_UI.datatypes;
|
||||
|
||||
import javafx.beans.property.IntegerProperty;
|
||||
import javafx.beans.property.SimpleIntegerProperty;
|
@ -19,7 +19,7 @@
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
package datatypes;
|
||||
package com.cemu_UI.datatypes;
|
||||
|
||||
import com.jfoenix.controls.JFXButton;
|
||||
|
233
src/main/java/com/cemu_UI/uiElements/JFXEditGameDialog.java
Normal file
233
src/main/java/com/cemu_UI/uiElements/JFXEditGameDialog.java
Normal file
@ -0,0 +1,233 @@
|
||||
/**
|
||||
* cemu_UI
|
||||
*
|
||||
* Copyright 2017 <@Seil0>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
|
||||
package com.cemu_UI.uiElements;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import com.cemu_UI.application.MainWindowController;
|
||||
import com.jfoenix.controls.JFXButton;
|
||||
import com.jfoenix.controls.JFXDialog;
|
||||
import com.jfoenix.controls.JFXDialogLayout;
|
||||
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.event.EventHandler;
|
||||
import javafx.geometry.Insets;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.control.TextField;
|
||||
import javafx.scene.layout.AnchorPane;
|
||||
import javafx.scene.layout.GridPane;
|
||||
import javafx.scene.layout.Pane;
|
||||
import javafx.scene.layout.StackPane;
|
||||
import javafx.scene.layout.VBox;
|
||||
import javafx.scene.text.Text;
|
||||
import javafx.stage.FileChooser;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
public class JFXEditGameDialog {
|
||||
|
||||
private String headingText;
|
||||
private String bodyText;
|
||||
private String dialogBtnStyle;
|
||||
private String title = "";
|
||||
private String coverPath = "";
|
||||
private String romPath = "";
|
||||
private String titleID = "";
|
||||
private int dialogWidth;
|
||||
private int dialogHeight;
|
||||
private int mode;
|
||||
private Stage stage;
|
||||
private Pane pane;
|
||||
private MainWindowController mwc;
|
||||
|
||||
/**
|
||||
* Creates a new JFoenix Dialog to show some information with okay and cancel option
|
||||
* @param headingText Heading Text, just the heading
|
||||
* @param bodyText body Text, all other text belongs here
|
||||
* @param dialogBtnStyle Style of the okay button
|
||||
* @param dialogWidth dialog width
|
||||
* @param dialogHeight dialog height
|
||||
* @param mode set to 0 for add and 1 for edit mode
|
||||
* @param stage the primary stage
|
||||
* @param pane pane to which the dialog belongs
|
||||
*/
|
||||
public JFXEditGameDialog(String headingText, String bodyText, String dialogBtnStyle, int dialogWidth,
|
||||
int dialogHeight, int mode, MainWindowController mwc, Stage stage, Pane pane) {
|
||||
this.headingText = headingText;
|
||||
this.bodyText = bodyText;
|
||||
this.dialogBtnStyle = dialogBtnStyle;
|
||||
this.dialogWidth = dialogWidth;
|
||||
this.dialogHeight = dialogHeight;
|
||||
this.mode = mode;
|
||||
this.mwc = mwc;
|
||||
this.stage = stage;
|
||||
this.pane = pane;
|
||||
}
|
||||
|
||||
public void show() {
|
||||
JFXDialogLayout content = new JFXDialogLayout();
|
||||
StackPane stackPane = new StackPane();
|
||||
stackPane.autosize();
|
||||
JFXDialog dialog = new JFXDialog(stackPane, content, JFXDialog.DialogTransition.LEFT, true);
|
||||
|
||||
Label placeholder = new Label();
|
||||
placeholder.setPrefSize(15, 10);
|
||||
|
||||
TextField gameTitleTF = new TextField();
|
||||
gameTitleTF.setPromptText("game tile");
|
||||
TextField gameTitleIDTF = new TextField();
|
||||
gameTitleIDTF.setPromptText("title ID");
|
||||
TextField romPathTF = new TextField();
|
||||
romPathTF.setPromptText("ROM path");
|
||||
TextField gameCoverTF = new TextField();
|
||||
gameCoverTF.setPromptText("cover path");
|
||||
|
||||
if (mode == 1) {
|
||||
gameTitleTF.setText(title);
|
||||
gameTitleIDTF.setText(titleID);
|
||||
romPathTF.setText(romPath);
|
||||
gameCoverTF.setText(coverPath);
|
||||
|
||||
gameTitleIDTF.setEditable(false);
|
||||
}
|
||||
|
||||
JFXButton okayBtn = new JFXButton("Okay");
|
||||
okayBtn.setOnAction(new EventHandler<ActionEvent>() {
|
||||
@Override
|
||||
public void handle(ActionEvent event) {
|
||||
if (romPathTF.getText().toString().length() == 0 || gameCoverTF.getText().toString().length() == 0
|
||||
|| gameTitleTF.getText().toString().length() == 0 || gameTitleIDTF.getText().toString().length() == 0) {
|
||||
|
||||
// LOGGER.info("No parameter set!");
|
||||
|
||||
// addGame error dialog
|
||||
String headingTextError = "Error while adding a new Game!";
|
||||
String bodyTextError = "There was some truble adding your game."
|
||||
+ "\nOne of the needed values was empty, please try again to add your game.";
|
||||
JFXInfoDialog errorDialog = new JFXInfoDialog(headingTextError, bodyTextError, dialogBtnStyle, 350,170, pane);
|
||||
errorDialog.show();
|
||||
} 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());
|
||||
dialog.close();
|
||||
break;
|
||||
case 1:
|
||||
// edit mode
|
||||
mwc.editBtnReturn(gameTitleTF.getText().toString(), gameCoverTF.getText().toString(),
|
||||
romPathTF.getText().toString(), gameTitleIDTF.getText().toString());
|
||||
dialog.close();
|
||||
break;
|
||||
default:
|
||||
dialog.close();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
okayBtn.setButtonType(com.jfoenix.controls.JFXButton.ButtonType.RAISED);
|
||||
okayBtn.setPrefHeight(32);
|
||||
okayBtn.setStyle(dialogBtnStyle);
|
||||
|
||||
JFXButton cancelBtn = new JFXButton("Cancel");
|
||||
cancelBtn.setOnAction(new EventHandler<ActionEvent>() {
|
||||
@Override
|
||||
public void handle(ActionEvent event) {
|
||||
dialog.close();
|
||||
}
|
||||
});
|
||||
cancelBtn.setButtonType(com.jfoenix.controls.JFXButton.ButtonType.RAISED);
|
||||
cancelBtn.setPrefHeight(32);
|
||||
cancelBtn.setStyle(dialogBtnStyle);
|
||||
|
||||
JFXButton selectPathBtn = new JFXButton("select .rpx file");
|
||||
selectPathBtn.setPrefWidth(110);
|
||||
selectPathBtn.setStyle(dialogBtnStyle);
|
||||
selectPathBtn.setOnAction(new EventHandler<ActionEvent>() {
|
||||
@Override
|
||||
public void handle(ActionEvent event) {
|
||||
FileChooser romDirectoryChooser = new FileChooser();
|
||||
File romDirectory = romDirectoryChooser.showOpenDialog(stage);
|
||||
romPathTF.setText(romDirectory.getAbsolutePath());
|
||||
}
|
||||
});
|
||||
|
||||
JFXButton selectCoverBtn = new JFXButton("select cover file");
|
||||
selectCoverBtn.setPrefWidth(110);
|
||||
selectCoverBtn.setStyle(dialogBtnStyle);
|
||||
selectCoverBtn.setOnAction(new EventHandler<ActionEvent>() {
|
||||
@Override
|
||||
public void handle(ActionEvent 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("game title:"), 0, 0);
|
||||
grid.add(gameTitleTF, 1, 0);
|
||||
grid.add(new Label("title id:"), 0, 1);
|
||||
grid.add(gameTitleIDTF, 1, 1);
|
||||
grid.add(new Label("ROM path:"), 0, 2);
|
||||
grid.add(romPathTF, 1, 2);
|
||||
grid.add(selectPathBtn, 2, 2);
|
||||
grid.add(new Label("cover path:"), 0, 3);
|
||||
grid.add(gameCoverTF, 1, 3);
|
||||
grid.add(selectCoverBtn, 2, 3);
|
||||
|
||||
Text bdyText = new Text(bodyText);
|
||||
|
||||
VBox vbox = new VBox();
|
||||
vbox.getChildren().addAll(bdyText, grid);
|
||||
|
||||
content.setHeading(new Text(headingText));
|
||||
content.setBody(vbox);
|
||||
content.setActions(cancelBtn, placeholder, okayBtn);
|
||||
content.setPrefSize(dialogWidth, dialogHeight);
|
||||
pane.getChildren().add(stackPane);
|
||||
AnchorPane.setTopAnchor(stackPane, (pane.getHeight()-content.getPrefHeight())/2);
|
||||
AnchorPane.setLeftAnchor(stackPane, (pane.getWidth()-content.getPrefWidth())/2);
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
public 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;
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user