17 Commits
0.1.7 ... 0.2.0

Author SHA1 Message Date
0f0f962d8c update to version 0.2.0 "Puzzle Plank Galaxy" 2017-10-24 21:07:49 +02:00
0d46e818e1 code clean up
* removed old addGame() methode
2017-10-24 21:06:25 +02:00
05f6f7e664 code clean up
* Code is under GNU GPL version 3 now
* reworked the addGame() Method
* text fixes
2017-10-15 13:37:45 +02:00
8d49ce902e updated libraries
* jfoenix 1.8.0 -> 1.9.1
* code clean up
2017-10-15 12:29:18 +02:00
6d5e9409a5 window resize workaround
* added a workaround for the resizing option (this could be a linux specific bug, windows was not tested)
* begun reworking of the addGames() Method, not activated yet
2017-10-14 15:42:13 +02:00
bda73cf627 code clean up 2017-10-13 21:15:51 +02:00
e13a187c71 Update README.md 2017-09-17 21:48:32 +02:00
e4dbbe0d55 Update README.md 2017-09-16 18:52:45 +02:00
f09258190a save windows size only if ther is 500ms no action
* if the window is resized, the new size is only saved if no resize
action is done for 5000ms
2017-09-16 17:08:50 +02:00
109bcf6e03 performance improvements
* call refreshUIData() only if there is enough space for another column
2017-09-15 19:23:44 +02:00
3853f70895 removed workaround for SmmdbApiQuery 2017-09-14 00:05:16 +02:00
9b4bc3ada9 Merge remote-tracking branch 'origin/master' 2017-09-13 23:58:58 +02:00
3bc571bacd window resize performance tuning
* only call refreshUI if space change is enough
* added FIXME for pane.setPrefWidth under windows, other parts that are affected see issue main.1
2017-09-13 23:57:29 +02:00
729a4ee10e fixed generating position
* ROM covers are placed now correctly on resize action
2017-09-13 00:14:54 +02:00
3f98dfa059 save window size 2017-09-12 20:13:26 +02:00
78791bb7e1 added a resize option
* if the window is resized and ther is enough space for a new column, the UI will be adapt to fit the new size
2017-09-12 19:45:39 +02:00
0124a5b1a4 Update README.md 2017-09-12 15:33:25 +02:00
42 changed files with 511 additions and 200 deletions

View File

@ -23,7 +23,7 @@
<classpathentry kind="lib" path="src/libraries/zip4j-1.3.2.jar"/>
<classpathentry kind="lib" path="src/libraries/log4j-api-2.8.2.jar"/>
<classpathentry kind="lib" path="src/libraries/log4j-core-2.8.2.jar"/>
<classpathentry kind="lib" path="src/libraries/jfoenix-1.8.0.jar"/>
<classpathentry kind="lib" path="src/libraries/sqlite-jdbc-3.20.0.jar"/>
<classpathentry kind="lib" path="src/libraries/jfoenix-1.9.1.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@ -1,5 +1,9 @@
# cemu_UI
![Total Downloads](https://img.shields.io/github/downloads/Seil0/cemu_UI/total.svg?style=flat-square)
[![Latest](https://img.shields.io/github/release/Seil0/cemu_UI/all.svg?style=flat-square)](https://github.com/Seil0/cemu_UI/releases)
[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg?style=flat-square)](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
@ -32,14 +36,7 @@ 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 ![#f03c15](https://placehold.it/15/fbca04/000000?text=+)`idea` lable
## FAQ
* 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
## [FAQ](https://github.com/Seil0/cemu_UI/wiki#faq)
## Screenshots

2
bin/.gitignore vendored
View File

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

Binary file not shown.

View File

@ -16,7 +16,7 @@
<?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">
<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>
@ -61,7 +61,7 @@
</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">
<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" />
@ -105,13 +105,13 @@
</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">
<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" maxHeight="32.0" minWidth="100.0" onAction="#totalPlaytimeBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.rightAnchor="516.5" AnchorPane.topAnchor="558.0">
<JFXButton 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" 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" />
<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.

View File

@ -3,14 +3,22 @@
*
* 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 )
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package application;
import java.io.File;

View File

@ -3,14 +3,22 @@
*
* 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 )
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package application;
import java.io.File;
@ -20,10 +28,14 @@ import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.util.Optional;
import java.util.Timer;
import java.util.TimerTask;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXMLLoader;
import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;
@ -57,34 +69,33 @@ public class Main extends Application {
this.primaryStage = primaryStage;
cloudController = new CloudController(this);
mainWindow();
initActions();
}
private void mainWindow(){
try {
FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindow.fxml"));
pane = loader.load();
primaryStage.setResizable(false);
// 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
mainWindowController.setMain(this); //call setMain
//get os and the right paths
if(System.getProperty("os.name").equals("Linux")){
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");
pane.setPrefWidth(904); //this could be a kde plasma specific issue
}else{
} 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");
pane.setPrefWidth(892);
}
//startup checks
@ -101,27 +112,27 @@ public class Main extends Application {
LOGGER.info("Directory: " + directory.exists());
LOGGER.info("Configfile: " + configFile.exists());
if(!directory.exists()){
if (!directory.exists()) {
LOGGER.info("creating cemu_UI directory");
directory.mkdir();
pictureCache.mkdir();
}
if(!configFile.exists()){
if (!configFile.exists()) {
LOGGER.info("firststart, setting default values");
firstStart();
mainWindowController.setColor("00a8cc");
mainWindowController.setxPosHelper(0);
mainWindowController.saveSettings();
Runtime.getRuntime().exec("java -jar cemu_UI.jar"); //start again (preventing Bugs)
System.exit(0); //finishes itselfdownloading games.db...
System.exit(0); //finishes itself
}
if(pictureCache.exists() != true){
if (pictureCache.exists() != true) {
pictureCache.mkdir();
}
if(gamesDBFile.exists() != true){
if (gamesDBFile.exists() != true) {
try {
LOGGER.info("downloading games.db... ");
URL website = new URL(gamesDBdownloadURL);
@ -137,14 +148,14 @@ public class Main extends Application {
//loading settings and initialize UI, dbController.main() loads all databases
mainWindowController.loadSettings();
mainWindowController.initActions();
mainWindowController.initUI();
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 = new Scene(pane); //create new scene, append pane to scene
scene.getStylesheets().add(Main.class.getResource("MainWindows.css").toExternalForm());
@ -162,7 +173,7 @@ public class Main extends Application {
alert.setContentText("please select your cemu installation");
Optional<ButtonType> result = alert.showAndWait();
if (result.get() == ButtonType.OK){
if (result.get() == ButtonType.OK) {
DirectoryChooser directoryChooser = new DirectoryChooser();
File selectedDirectory = directoryChooser.showDialog(primaryStage);
mainWindowController.setCemuPath(selectedDirectory.getAbsolutePath());
@ -177,7 +188,7 @@ public class Main extends Application {
alert2.setContentText("please select your rom directory");
Optional<ButtonType> result2 = alert2.showAndWait();
if (result2.get() == ButtonType.OK){
if (result2.get() == ButtonType.OK) {
DirectoryChooser directoryChooser = new DirectoryChooser();
File selectedDirectory = directoryChooser.showDialog(primaryStage);
mainWindowController.setRomPath(selectedDirectory.getAbsolutePath());
@ -187,6 +198,81 @@ public class Main extends Application {
}
}
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) {
int xPosHelperMax = (int) Math.floor((mainWindowController.getMainAnchorPane().getWidth() - 36) / 217);
mainWindowController.refreshplayBtnPosition();
//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 != null) saveTask.cancel();
saveTask = new TimerTask() {
@Override
public void run() {
mainWindowController.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() {
mainWindowController.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 void main(String[] args) {
//delete old log file and create new
if(System.getProperty("os.name").equals("Linux")){

View File

@ -16,7 +16,7 @@
<?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">
<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>
@ -61,7 +61,7 @@
</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">
<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" />
@ -105,13 +105,13 @@
</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">
<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" maxHeight="32.0" minWidth="100.0" onAction="#totalPlaytimeBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.rightAnchor="516.5" AnchorPane.topAnchor="558.0">
<JFXButton 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" 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" />
<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>

View File

@ -3,14 +3,22 @@
*
* 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 )
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package application;
import java.awt.Desktop;
@ -34,7 +42,6 @@ import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Optional;
import java.util.Properties;
import javax.imageio.ImageIO;
import javax.swing.ProgressMonitor;
import javax.swing.ProgressMonitorInputStream;
@ -162,6 +169,9 @@ public class MainWindowController {
@FXML
private AnchorPane gamesAnchorPane;
@FXML
private AnchorPane mainAnchorPane;
@FXML
private ScrollPane scrollPaneMain;
@ -218,14 +228,17 @@ public class MainWindowController {
private String selectedGameTitleID;
private String selectedGameTitle;
private String id;
private String version = "0.1.7";
private String buildNumber = "039";
private String versionName = "Throwback Galaxy";
private String version = "0.2.0";
private String buildNumber = "043";
private String versionName = "Puzzle Plank Galaxy";
private int xPos = -200;
private int yPos = 17;
private int xPosHelper;
private int oldXPosHelper;
private int selectedUIDataIndex;
private int selected;
private double windowWidth;
private double windowHeight;
private DirectoryChooser directoryChooser = new DirectoryChooser();
private File dirWin = new File(System.getProperty("user.home") + "/Documents/cemu_UI");
private File dirLinux = new File(System.getProperty("user.home") + "/cemu_UI");
@ -266,7 +279,14 @@ public class MainWindowController {
smmdbApiQuery = new SmmdbApiQuery();
}
void initUI(){
void initUI() {
LOGGER.info("initializing UI ...");
if (getWindowWidth() > 100 && getWindowHeight() > 100) {
mainAnchorPane.setPrefSize(getWindowWidth(), getWindowHeight());
}
refreshplayBtnPosition();
cemuTextField.setText(cemuPath);
romTextField.setText(romPath);
colorPicker.setValue(Color.valueOf(getColor()));
@ -294,20 +314,22 @@ public class MainWindowController {
courseTreeTable.getColumns().add(starsColumn);
courseTreeTable.getColumns().add(idColumn);
courseTreeTable.getColumns().get(3).setVisible(false); //hide idColumn (important)
LOGGER.info("initializing UI done");
}
/**
* initialize all actions not initialized by a own method
*/
void initActions() {
LOGGER.info("initializing Actions... ");
LOGGER.info("initializing Actions ...");
HamburgerBackArrowBasicTransition burgerTask = new HamburgerBackArrowBasicTransition(menuHam);
menuHam.addEventHandler(MouseEvent.MOUSE_PRESSED, (e)->{
if (playTrue) {
playBtnSlideOut();
}
if (menuTrue){
if (menuTrue) {
sideMenuSlideOut();
burgerTask.setRate(-1.0);
burgerTask.play();
@ -334,9 +356,9 @@ public class MainWindowController {
edit.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("edit "+selectedGameTitleID);
LOGGER.info("edit "+selectedGameTitleID);
if(selectedGameTitleID == null){
System.out.println("trying to edit null! null is not valid!");
LOGGER.warn("trying to edit null! null is not valid!");
Alert alert = new Alert(AlertType.WARNING);
alert.setTitle("edit");
alert.setHeaderText("cemu_UI");
@ -344,7 +366,7 @@ public class MainWindowController {
alert.initOwner(main.primaryStage);
alert.showAndWait();
}else{
System.out.println("show edit window TODO!"); //TODO show edit window
//TODO show edit window
}
}
});
@ -352,9 +374,9 @@ public class MainWindowController {
remove.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("remove "+selectedGameTitleID);
LOGGER.info("remove "+selectedGameTitleID);
if(selectedGameTitleID == null){
System.out.println("trying to remove null! null is not valid!");
LOGGER.warn("trying to remove null! null is not valid!");
Alert alert = new Alert(AlertType.WARNING);
alert.setTitle("remove");
alert.setHeaderText("cemu_UI");
@ -373,28 +395,14 @@ public class MainWindowController {
Optional<ButtonType> result = alert.showAndWait();
if (result.get() == ButtonType.OK){
try {
//remove all elements from gamesAnchorPane
for(int i=0; i< games.size(); i++){
gamesAnchorPane.getChildren().remove(games.get(i).getVBox());
}
//remove game from database
//remove game from database
games.remove(selectedUIDataIndex);
dbController.removeRom(selectedGameTitleID);
//remove all games form gamesAnchorPane (UI)
gamesAnchorPane.getChildren().removeAll(gamesAnchorPane.getChildren());
//reset position
xPos = -200;
yPos = 17;
xPosHelper = 0;
//add all games to gamesAnchorPane (UI)
for(int i=0; i< games.size(); i++){
generatePosition();
games.get(i).getVBox().setLayoutX(getxPos());
games.get(i).getVBox().setLayoutY(getyPos());
gamesAnchorPane.getChildren().add(games.get(i).getVBox());
}
//refresh all games at gamesAnchorPane (UI)
refreshUIData();
} catch (Exception e) {
e.printStackTrace();
LOGGER.error("error!",e);
}
}
}
@ -406,9 +414,9 @@ public class MainWindowController {
public void handle(ActionEvent event) {
String titleID = selectedGameTitleID;
String updatePath;
System.out.println("update: "+selectedGameTitleID);
LOGGER.info("update: "+selectedGameTitleID);
if(selectedGameTitleID == null){
LOGGER.error("trying to update null! null is not valid!");
LOGGER.warn("trying to update null! null is not valid!");
Alert alert = new Alert(AlertType.WARNING);
alert.setTitle("edit");
alert.setHeaderText("cemu_UI");
@ -465,7 +473,7 @@ public class MainWindowController {
LOGGER.info("add DLC: "+selectedGameTitleID);
if(selectedGameTitleID == null){
System.out.println("trying to add a dlc to null! null is not valid!");
LOGGER.warn("trying to add a dlc to null! null is not valid!");
Alert alert = new Alert(AlertType.WARNING);
alert.setTitle("add DLC");
alert.setHeaderText("cemu_UI");
@ -561,7 +569,6 @@ public class MainWindowController {
@Override
public void handle(MouseEvent mouseEvent) {
if(mouseEvent.getButton().equals(MouseButton.PRIMARY)){
System.out.println("I'll help you");
try {
Desktop.getDesktop().browse(new URI("https://github.com/Seil0/cemu_UI/issues/3"));
} catch (IOException | URISyntaxException e) {
@ -570,6 +577,7 @@ public class MainWindowController {
}
}
});
LOGGER.info("initializing Actions done!");
}
@ -683,8 +691,7 @@ public class MainWindowController {
Runtime.getRuntime().exec("java -jar cemu_UI.jar"); //start again
System.exit(0); //finishes itself
} catch (IOException e) {
System.out.println("es ist ein Fehler aufgetreten");
e.printStackTrace();
LOGGER.error("an error occurred", e);
}
}
}
@ -702,8 +709,7 @@ public class MainWindowController {
Runtime.getRuntime().exec("java -jar cemu_UI.jar"); //start again
System.exit(0); //finishes itself
} catch (IOException e) {
System.out.println("es ist ein Fehler aufgetreten");
e.printStackTrace();
LOGGER.error("an error occurred", e);
}
}
}
@ -958,101 +964,136 @@ public class MainWindowController {
}
/**
* add game to the program and initialize all needed actions (start, time stamps, titleID)
* add game to games (ArrayList) and initialize all needed actions (start, time stamps, titleID)
* @param title : game title
* @param coverPath : path to cover (cache)
* @param romPath : path to rom file (.rpx)
* @param titleID : rom ID
* @param romPath : path to ROM file (.rpx)
* @param titleID : ROM ID
*/
void addGame(String title, String coverPath, String romPath, String titleID){
ImageView imageView = new ImageView();
Label gameTitleLabel = new Label(title);
File coverFile = new File(coverPath);
VBox VBox = new VBox();
Label gameTitleLabel = new Label();
JFXButton gameBtn = new JFXButton();
Image coverImage = new Image(coverFile.toURI().toString());
ImageView imageView = new ImageView();
Image coverImage = new Image(new File(coverPath).toURI().toString());
generatePosition();
LOGGER.info("add " + getxPos()); //TODO debug
VBox.setLayoutX(getxPos());
VBox.setLayoutY(getyPos());
VBox.getChildren().addAll(gameTitleLabel,gameBtn);
gameTitleLabel.setMaxWidth(200);
gameTitleLabel.setPadding(new Insets(0,0,0,8));
gameTitleLabel.setFont(Font.font("System", FontWeight.BOLD, 14));
imageView.setImage(coverImage);
imageView.setFitHeight(300);
imageView.setFitWidth(200);
gameBtn.setGraphic(imageView);
gameBtn.setContextMenu(gameContextMenu);
gameBtn.setStyle("-fx-effect: dropshadow(three-pass-box, rgba(0,0,0,0.8), 10, 0, 0, 3); ");
gameBtn.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
LOGGER.info("selected: "+title+"; ID: "+titleID);
//getting the selected game index by comparing event.getSource() with games.get(i).getButton()
for(int i=0; i<games.size(); i++){
if(games.get(i).getButton() == event.getSource()){
selectedUIDataIndex = i;
}
}
gameExecutePath = romPath;
selectedGameTitleID = titleID;
selectedGameTitle = title;
//underling selected Label
lastGameLabel.setStyle("-fx-underline: false;");
games.get(selectedUIDataIndex).getLabel().setStyle("-fx-underline: true;");
lastGameLabel = games.get(selectedUIDataIndex).getLabel();
//setting last played
if(dbController.getLastPlayed(titleID).equals("") || dbController.getLastPlayed(titleID).equals(null)){
lastTimePlayedBtn.setText("Last played, never");
totalPlaytimeBtn.setText(dbController.getTotalPlaytime(titleID)+ " min");
}else{
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
int today = Integer.parseInt(dtf.format(LocalDate.now()).replaceAll("-", ""));
int yesterday = Integer.parseInt(dtf.format(LocalDate.now().minusDays(1)).replaceAll("-", ""));
int lastday = Integer.parseInt(dbController.getLastPlayed(titleID).replaceAll("-", ""));
if(today == lastday){
lastTimePlayedBtn.setText("Last played, today");
}else if(yesterday == lastday){
lastTimePlayedBtn.setText("Last played, yesterday");
}else{
lastTimePlayedBtn.setText("Last played, "+dbController.getLastPlayed(titleID));
}
if(Integer.parseInt(dbController.getTotalPlaytime(titleID)) > 60){
int hoursPlayed = (int) Math.floor(Integer.parseInt(dbController.getTotalPlaytime(titleID))/60);
int minutesPlayed = Integer.parseInt(dbController.getTotalPlaytime(titleID))-60*hoursPlayed;
totalPlaytimeBtn.setText(hoursPlayed+"h "+minutesPlayed+"min");
}else{
totalPlaytimeBtn.setText(dbController.getTotalPlaytime(titleID)+ " min");
}
}
if (!playTrue) {
playBtnSlideIn();
}
if (menuTrue) {
UIROMDataType uiROMElement = new UIROMDataType(VBox, gameTitleLabel, gameBtn, imageView, titleID, romPath);
uiROMElement.getLabel().setText(title);
uiROMElement.getLabel().setMaxWidth(200);
uiROMElement.getLabel().setPadding(new Insets(0,0,0,8));
uiROMElement.getLabel().setFont(Font.font("System", FontWeight.BOLD, 14));
// i think we can do this locally and remove the imageView from the data type since it's used as graphic
uiROMElement.getImageView().setImage(coverImage);
uiROMElement.getImageView().setFitHeight(300);
uiROMElement.getImageView().setFitWidth(200);
uiROMElement.getButton().setGraphic(uiROMElement.getImageView());
uiROMElement.getButton().setContextMenu(gameContextMenu);
uiROMElement.getButton().setStyle("-fx-effect: dropshadow(three-pass-box, rgba(0,0,0,0.8), 10, 0, 0, 3); ");
uiROMElement.getButton().addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
LOGGER.info("selected: " + title + "; ID: " + titleID);
// getting the selected game index by comparing event.getSource() with games.get(i).getButton()
for (int i = 0; i < games.size(); i++) {
if (games.get(i).getButton() == event.getSource()) {
selectedUIDataIndex = i;
}
}
gameExecutePath = romPath;
selectedGameTitleID = titleID;
selectedGameTitle = title;
// underlining selected Label
lastGameLabel.setStyle("-fx-underline: false;");
games.get(selectedUIDataIndex).getLabel().setStyle("-fx-underline: true;");
lastGameLabel = games.get(selectedUIDataIndex).getLabel();
// setting last played, if lastPlayed is empty game was never played before, else set correct date
if (dbController.getLastPlayed(titleID).equals("") || dbController.getLastPlayed(titleID).equals(null)) {
lastTimePlayedBtn.setText("Last played, never");
totalPlaytimeBtn.setText(dbController.getTotalPlaytime(titleID) + " min");
} else {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
int today = Integer.parseInt(dtf.format(LocalDate.now()).replaceAll("-", ""));
int yesterday = Integer.parseInt(dtf.format(LocalDate.now().minusDays(1)).replaceAll("-", ""));
int lastPlayedDay = Integer.parseInt(dbController.getLastPlayed(titleID).replaceAll("-", ""));
if (lastPlayedDay == today) {
lastTimePlayedBtn.setText("Last played, today");
} else if (lastPlayedDay == yesterday) {
lastTimePlayedBtn.setText("Last played, yesterday");
} else {
lastTimePlayedBtn.setText("Last played, " + dbController.getLastPlayed(titleID));
}
}
// setting total playtime, if total playtime > 60 minutes, format is "x hours x minutes" (x h x min),
// else only minutes are showed
if (Integer.parseInt(dbController.getTotalPlaytime(titleID)) > 60) {
int hoursPlayed = (int) Math.floor(Integer.parseInt(dbController.getTotalPlaytime(titleID)) / 60);
int minutesPlayed = Integer.parseInt(dbController.getTotalPlaytime(titleID)) - 60 * hoursPlayed;
totalPlaytimeBtn.setText(hoursPlayed + " h " + minutesPlayed + " min");
} else {
totalPlaytimeBtn.setText(dbController.getTotalPlaytime(titleID) + " min");
}
if (!playTrue) {
playBtnSlideIn();
}
if (menuTrue) {
sideMenuSlideOut();
}
}
});
games.add(new UIROMDataType(VBox, gameTitleLabel, gameBtn, titleID, romPath));
}
});
uiROMElement.getVBox().setLayoutX(getxPos());
uiROMElement.getVBox().setLayoutY(getyPos());
uiROMElement.getVBox().getChildren().addAll(gameTitleLabel,gameBtn);
// add uiROMElement to games list
games.add(uiROMElement);
}
//add all games to the UI (only called on startup)
void addUIData(){
//add all games saved in games(ArrayList) to gamesAnchorPane
void addUIData() {
for(int i=0; i<games.size(); i++){
gamesAnchorPane.getChildren().add(games.get(i).getVBox());
}
}
//remove all games from gamesAnchorPane and add them afterwards
void refreshUIData() {
//remove all games form gamesAnchorPane
gamesAnchorPane.getChildren().removeAll(gamesAnchorPane.getChildren());
//reset position
xPos = -200;
yPos = 17;
xPosHelper = 0;
//add all games to gamesAnchorPane (UI)
for(int i=0; i< games.size(); i++){
generatePosition();
games.get(i).getVBox().setLayoutX(getxPos());
games.get(i).getVBox().setLayoutY(getyPos());
gamesAnchorPane.getChildren().add(games.get(i).getVBox());
}
}
void refreshplayBtnPosition() {
playBtn.setLayoutX((main.pane.getWidth()/2)-50);
totalPlaytimeBtn.setLayoutX((main.pane.getWidth()/2)-50-20.5-100);
lastTimePlayedBtn.setLayoutX((main.pane.getWidth()/2)+50+20.5);
}
private void addCourseDescription(SmmdbApiDataType course) {
String courseTheme;
String gameStyle;
@ -1173,19 +1214,23 @@ public class MainWindowController {
}
//TODO Changelistener for resizing
/**
* xPosHelper based on window width = -24(Windows)/-36(Linux)
* calculates how many games can be displayed in one row
*/
private void generatePosition() {
int xPosHelperMax;
if(System.getProperty("os.name").equals("Linux")){
xPosHelperMax = (int) Math.floor((main.pane.getPrefWidth() - 36) / 217);
//FIXME somehow the window width is set to 8, if we can find a way to get always the real window with
//(at the beginning we have to use prefWidth after resizing Width) we can remove this
if (mainAnchorPane.getWidth() < 10) {
xPosHelperMax = (int) Math.floor((mainAnchorPane.getPrefWidth() - 36) / 217);
} else {
xPosHelperMax = (int) Math.floor((main.pane.getPrefWidth() - 24) / 217);
xPosHelperMax = (int) Math.floor((mainAnchorPane.getWidth() - 36) / 217);
}
if(xPosHelper == xPosHelperMax){
oldXPosHelper = xPosHelper;
xPos = 17;
yPos = yPos + 345;
xPosHelper = 1;
@ -1193,7 +1238,9 @@ public class MainWindowController {
xPos = xPos + 217;
xPosHelper++;
}
// System.out.println("Breit: " + main.pane.getPrefWidth());
System.out.println("Breit: " + mainAnchorPane.getPrefWidth());
System.out.println("Breit2: " + mainAnchorPane.getWidth());
// System.out.println("xPosHelper: " + xPosHelper);
// System.out.println("yPos: " + yPos);
// System.out.println("xPos: " + xPos);
@ -1275,6 +1322,8 @@ public class MainWindowController {
props.setProperty("cloudService", getCloudService());
}
props.setProperty("folderID", main.cloudController.getFolderID(getCloudService()));
props.setProperty("windowWidth", String.valueOf(mainAnchorPane.getWidth()));
props.setProperty("windowHeight", String.valueOf(mainAnchorPane.getHeight()));
if(System.getProperty("os.name").equals("Linux")){
outputStream = new FileOutputStream(configFileLinux);
}else{
@ -1352,6 +1401,20 @@ public class MainWindowController {
setCloudSync(false);
}
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) {
@ -1443,7 +1506,7 @@ public class MainWindowController {
* @return the main color in hexadecimal format
*/
private String hexToRgb() {
System.out.println(getColor());
LOGGER.info(getColor());
int hex = Integer.parseInt(getColor().substring(0, 5), 16);
int r = (hex & 0xFF0000) >> 16;
@ -1566,4 +1629,32 @@ public class MainWindowController {
this.playBtn = playBtn;
}
public double getWindowWidth() {
return windowWidth;
}
public void setWindowWidth(double windowWidth) {
this.windowWidth = windowWidth;
}
public double getWindowHeight() {
return windowHeight;
}
public void setWindowHeight(double windowHeight) {
this.windowHeight = windowHeight;
}
public int getOldXPosHelper() {
return oldXPosHelper;
}
public void setOldXPosHelper(int oldXPosHelper) {
this.oldXPosHelper = oldXPosHelper;
}
public AnchorPane getMainAnchorPane() {
return mainAnchorPane;
}
}

View File

@ -1,7 +1,24 @@
/**
* smmdbapi query
* api query, return all courses as ArrayList
* cemu_UI
*
* Copyright 2017 <@Seil0>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package application;
import java.io.BufferedReader;
@ -21,8 +38,7 @@ import datatypes.SmmdbApiDataType;
public class SmmdbApiQuery {
//FIXME limit=70 as workaround for to long response, courseDataGz is to long
private String URL = "http://smmdb.ddns.net/api/getcourses?format=json&limit=70";
private String URL = "http://smmdb.ddns.net/api/getcourses?format=json";
private static final Logger LOGGER = LogManager.getLogger(SmmdbApiQuery.class.getName());
public SmmdbApiQuery() {
@ -43,8 +59,8 @@ public class SmmdbApiQuery {
BufferedReader ina = new BufferedReader(new InputStreamReader(apiUrl.openStream()));
output = ina.readLine();
ina.close();
System.out.println(output);
LOGGER.info("response from " + URL + " was valid");
LOGGER.info(output);
} catch (IOException e) {
LOGGER.error("error while making api request or reading response");
LOGGER.error("response from " + URL + " was: " + output, e);

View File

@ -3,14 +3,22 @@
*
* 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 )
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package application;
import java.awt.Graphics2D;

View File

@ -3,13 +3,20 @@
*
* 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 )
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package application;

View File

@ -1,3 +1,24 @@
/**
* 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 cloudControllerInstances;
import java.io.FileInputStream;

View File

@ -1,6 +1,24 @@
/**
* Datatype used in the TreeTableview for
* 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 datatypes;
import com.jfoenix.controls.datamodels.treetable.RecursiveTreeObject;
@ -16,7 +34,10 @@ public class CourseTableDataType extends RecursiveTreeObject<CourseTableDataType
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);

View File

@ -1,6 +1,24 @@
/**
* Datatype used for the smmdbapi query
* 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 datatypes;
import javafx.beans.property.IntegerProperty;
@ -23,6 +41,9 @@ public class SmmdbApiDataType {
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) {

View File

@ -1,6 +1,24 @@
/**
* Datatype used for UI ROM elements
* 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 datatypes;
import com.jfoenix.controls.JFXButton;
@ -9,6 +27,7 @@ import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.control.Label;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
public class UIROMDataType {
@ -16,14 +35,20 @@ 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 SimpleObjectProperty<ImageView> imageView = 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){
/**
* Data type used for UI ROM elements all uiROMElemts are of this data type
*/
public UIROMDataType (final VBox vBox, final Label label, final JFXButton button, final ImageView imageView, final String titleID, final String romPath){
this.vBox.set(vBox);
this.label.set(label);
this.button.set(button);
this.imageView.set(imageView);
this.titleID.set(titleID);
this.romPath.set(romPath);
}
public SimpleObjectProperty<VBox> vBoxProperty(){
@ -38,6 +63,10 @@ public class UIROMDataType {
return button;
}
public SimpleObjectProperty<ImageView> imageViewProperty(){
return imageView;
}
public StringProperty titleIDProperty(){
return titleID;
}
@ -59,6 +88,10 @@ public class UIROMDataType {
return buttonProperty().get();
}
public final ImageView getImageView() {
return imageViewProperty().get();
}
public final String getTitleID(){
return titleIDProperty().get();
}
@ -80,6 +113,10 @@ public class UIROMDataType {
buttonProperty().set(button);
}
public final void setImageView(ImageView imageView) {
imageViewProperty().set(imageView);
}
public final void setTitleID(String titleID){
titleIDProperty().set(titleID);
}