11 Commits
0.1.2 ... 0.1.4

Author SHA1 Message Date
2b0be67917 updated a few linux paths 2017-04-08 02:25:23 +02:00
71530c030a Update README.md 2017-04-08 01:03:22 +02:00
98122a5e56 Update README.md 2017-04-08 00:58:41 +02:00
febdc0d096 Update README.md 2017-04-08 00:56:41 +02:00
f6d704a5d5 Update README.md 2017-04-07 16:59:26 +02:00
fd0ca2c7fb Update README.md 2017-04-07 10:56:35 +02:00
c7fefb146a a few typo fixes 2017-04-06 23:20:43 +02:00
b94f842cc4 clean up
*code clean up
*fixed a few minor ui bugs
2017-04-06 12:00:43 +02:00
bee962276c Update README.md 2017-04-01 22:13:33 +02:00
f752130d9b Update README.md 2017-04-01 22:11:39 +02:00
b103c1438c Update README.md 2017-04-01 19:57:43 +02:00
18 changed files with 246 additions and 58 deletions

View File

@ -1,13 +1,13 @@
# cemu_UI
cemu_UI is a simple graphical frontend for cemu, a Wii U emulator.
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).
![Screenshot](/downloadContent/cemu_UI4.png)
## Features
* launch Games
* time played in total
* Time played in total
* last time played
* easyer way to add updates & DLCs (only adding not downloading!)
* automatic rom detection (only .rpx files with a app.xml)
@ -16,6 +16,25 @@ cemu_UI is a simple graphical frontend for cemu, a Wii U emulator.
## planed Features (no ETA)
* Controller support
* cloud savegames
* more UI improvements
* support more rom file formats in automatic detection
### If you have another idea, make a "new issue" with the ![#f03c15](https://placehold.it/15/fbca04/000000?text=+)`idea` lable
## 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.
## building from source
1. download/clone the git repository
2. make sure you have the latest versionj of java 8 oracle jdk installed
3. place the unzip repository into your workspace and start eclipse, project should now be there **or** import the project to your workspace
## 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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

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 application;
import java.io.File;
@ -105,6 +126,7 @@ public class Main extends Application {
//loading settings and initialize UI
mainWindowController.loadSettings();
mainWindowController.dbController.main();
mainWindowController.addUIData();
mainWindowController.initActions();
mainWindowController.initUI();
@ -121,7 +143,7 @@ public class Main extends Application {
Alert alert = new Alert(AlertType.CONFIRMATION); //new alert with file-chooser
alert.setTitle("cemu_UI");
alert.setHeaderText("cemu installation");
alert.setContentText("pleas select your cemu installation");
alert.setContentText("please select your cemu installation");
Optional<ButtonType> result = alert.showAndWait();
if (result.get() == ButtonType.OK){
@ -136,7 +158,7 @@ public class Main extends Application {
Alert alert2 = new Alert(AlertType.CONFIRMATION); //new alert with file-chooser
alert2.setTitle("cemu_UI");
alert2.setHeaderText("rom directory");
alert2.setContentText("pleas select your rom directory");
alert2.setContentText("please select your rom directory");
Optional<ButtonType> result2 = alert2.showAndWait();
if (result2.get() == ButtonType.OK){

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 application;
import java.awt.Graphics2D;
@ -12,7 +33,6 @@ import java.math.BigInteger;
import java.sql.SQLException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Optional;
import java.util.Properties;
import javax.imageio.ImageIO;
@ -28,6 +48,8 @@ import com.jfoenix.transitions.hamburger.HamburgerBackArrowBasicTransition;
import javafx.animation.FadeTransition;
import javafx.animation.ParallelTransition;
import javafx.animation.TranslateTransition;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
@ -126,13 +148,14 @@ public class MainWindowController {
private String selectedGameTitleID;
private String selectedGameTitle;
private String color;
private String version = "0.1.2";
private String buildNumber = "001";
private String version = "0.1.3";
private String buildNumber = "002";
@SuppressWarnings("unused")
private String versionName = "";
private int xPos = -200;
private int yPos = 17;
private int xPosHelper;
private int selectedUIDataIndex;
private FileChooser fileChooser = new FileChooser();
private DirectoryChooser directoryChooser = new DirectoryChooser();
private File dirWin = new File(System.getProperty("user.home") + "/Documents/cemu_UI");
@ -141,9 +164,7 @@ public class MainWindowController {
private File fileLinux = new File(dirLinux + "/config.xml");
File pictureCacheWin = new File(dirWin+"/picture_cache");
File pictureCacheLinux = new File(dirLinux+"/picture_cache");
private ArrayList<JFXButton> gameCover = new ArrayList<JFXButton>();
private ArrayList<Label> gameLabel = new ArrayList<Label>();
private ArrayList<VBox> gameVBox = new ArrayList<VBox>();
private ObservableList<uiDataType> games = FXCollections.observableArrayList();
Properties props = new Properties();
Properties gameProps = new Properties();
private MenuItem edit = new MenuItem("edit");
@ -151,7 +172,6 @@ public class MainWindowController {
private MenuItem update = new MenuItem("update");
private MenuItem addDLC = new MenuItem("add DLC");
private ContextMenu gameContextMenu = new ContextMenu(edit, remove, update, addDLC);
private MouseEvent selectedEvent;
private Label lastGameLabel = new Label();
private ImageView add_circle_black = new ImageView(new Image("recources/icons/ic_add_circle_black_24dp_1x.png"));
@ -237,8 +257,6 @@ public class MainWindowController {
alert.showAndWait();
}
else{
int i = gameCover.indexOf((selectedEvent).getSource());
Alert alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("remove");
alert.setHeaderText("cemu_UI");
@ -248,29 +266,29 @@ public class MainWindowController {
Optional<ButtonType> result = alert.showAndWait();
if (result.get() == ButtonType.OK){
try {
gameVBox.remove(i);
gameCover.remove(i);
gameLabel.remove(i);
//remove all elements from gamesAnchorPane
for(int i=0; i< games.size(); i++){
gamesAnchorPane.getChildren().remove(games.get(i).getVBox());
}
//remove game from database
games.remove(selectedUIDataIndex);
dbController.removeRom(selectedGameTitleID);
gamesAnchorPane.getChildren().remove(i);
//TODO remove if animations are done
Runtime.getRuntime().exec("java -jar cemu_UI.jar"); //start again (preventing Bugs)
System.exit(0); //finishes itself
} catch (SQLException | IOException e) {
gamesAnchorPane.getChildren().removeAll(games);
//reset position
xPos = -200;
yPos = 17;
xPosHelper = 0;
//add all games to gamesAnchorPane
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());
}
} catch (Exception e) {
e.printStackTrace();
}
}
//TODO nachr<68>ck animation
// platz(i)/4 -> aufrunden = Reihe; plath(i)-(platz(i)/4 -> abrunden*4)
// jetzt haben wir den platz des gel<65>schten elements und l<>nnen alle nachfolgenden nachr<68>cken
// double a = 13;
// double b = 4;
// a = a/b;
// System.out.println(Math.ceil(a)); //aufrunden
// System.out.println(Math.floor(a)); //abrunden
}
}
});
@ -471,7 +489,7 @@ public class MainWindowController {
saveSettings();
cemuTextField.setText(getCemuPath());
try {
Runtime.getRuntime().exec("java -jar ProjectHomeFlix.jar"); //start again
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");
@ -490,7 +508,7 @@ public class MainWindowController {
saveSettings();
cemuTextField.setText(getCemuPath());
try {
Runtime.getRuntime().exec("java -jar ProjectHomeFlix.jar"); //start again
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");
@ -643,11 +661,13 @@ public class MainWindowController {
Image coverImage = new Image(coverFile.toURI().toString());
generatePosition();
gameVBox.add(VBox);
gameCover.add(gameBtn);
gameLabel.add(gameTitleLabel);
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);
@ -659,27 +679,33 @@ public class MainWindowController {
public void handle(MouseEvent event) {
System.out.println("selected: "+title+"; ID: "+titleID);
for(int i=0; i<games.size(); i++){
if(games.get(i).getButton() == event.getSource()){
selectedUIDataIndex = i;
}
}
gameExecutePath = romPath;
selectedGameTitleID = titleID;
selectedGameTitle = title;
selectedEvent = event;
lastGameLabel.setStyle("-fx-underline: false;");
gameLabel.get(gameCover.indexOf(event.getSource())).setStyle("-fx-underline: true;");
lastGameLabel = gameLabel.get(gameCover.indexOf(event.getSource()));
games.get(selectedUIDataIndex).getLabel().setStyle("-fx-underline: true;");
lastGameLabel = games.get(selectedUIDataIndex).getLabel();
if(dbController.getLastPlayed(titleID).equals("") || dbController.getLastPlayed(titleID).equals(null)){
lastTimePlayedBtn.setText("Last played, never");
timePlayedBtn.setText(dbController.getTimePlayed(titleID)+ " min");
}else{
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
int localInt = Integer.parseInt(dtf.format(LocalDate.now()).replaceAll("-", ""));
int lastInt = Integer.parseInt(dbController.getLastPlayed(titleID).replaceAll("-", ""));
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(localInt == lastInt){
if(today == lastday){
lastTimePlayedBtn.setText("Last played, today");
}else if(localInt-1 == lastInt){
}else if(yesterday == lastday){
lastTimePlayedBtn.setText("Last played, yesterday");
}else{
lastTimePlayedBtn.setText("Last played, "+dbController.getLastPlayed(titleID));
@ -698,12 +724,14 @@ public class MainWindowController {
}
}
});
gameTitleLabel.setFont(Font.font("System", FontWeight.BOLD, 14));
VBox.getChildren().addAll(gameTitleLabel,gameBtn);
VBox.setLayoutX(getxPos());
VBox.setLayoutY(getyPos());
gamesAnchorPane.getChildren().add(VBox);
games.add(new uiDataType(VBox, gameTitleLabel, gameBtn, titleID, romPath));
}
void addUIData(){
for(int i=0; i<games.size(); i++){
gamesAnchorPane.getChildren().add(games.get(i).getVBox());
}
}
@ -765,8 +793,8 @@ public class MainWindowController {
menuHam.getStyleClass().add("jfx-hamburgerB");
}
for(int i=0; i<gameCover.size(); i++){
gameCover.get(i).setRipplerFill(Paint.valueOf(getColor()));
for(int i=0; i<games.size(); i++){
games.get(i).getButton().setRipplerFill(Paint.valueOf(getColor()));
}
}

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 application;
import java.awt.Graphics2D;
@ -47,7 +68,7 @@ public class dbController {
private void loadRomDatabase(){
if (System.getProperty("os.name").equals("Linux")) {
DB_PATH = System.getProperty("user.home") + "/localRoms.db";
DB_PATH = System.getProperty("user.home") + "/cemu_UI/localRoms.db";
}else{
DB_PATH = System.getProperty("user.home") + "\\Documents\\cemu_UI" + "\\" + "localRoms.db";
}
@ -68,7 +89,7 @@ public class dbController {
*/
private void loadGamesDatabase(){
if (System.getProperty("os.name").equals("Linux")) {
DB_PATH_games = System.getProperty("user.home") + "/games.db";
DB_PATH_games = System.getProperty("user.home") + "/cemu_UI/games.db";
}else{
DB_PATH_games = System.getProperty("user.home") + "\\Documents\\cemu_UI" + "\\" + "games.db";
}
@ -162,6 +183,7 @@ public class dbController {
//get all files with .rpx TODO add other formats
void loadRomDirectory(String directory){
File dir = new File(directory);
File appFile;
String[] extensions = new String[] { "rpx", "jsp" };
File pictureCache;
String coverPath;
@ -177,7 +199,11 @@ public class dbController {
System.out.println("Getting all .rpx files in " + dir.getCanonicalPath()+" including those in subdirectories \n");
List<File> files = (List<File>) FileUtils.listFiles(dir, extensions, true);
for (File file : files) {
File appFile = new File(file.getParent()+"\\app.xml");
if(System.getProperty("os.name").equals("Linux")){
appFile = new File(file.getParent()+"/app.xml");
} else {
appFile = new File(file.getParent()+"\\app.xml");
}
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse(appFile);

View File

@ -40,7 +40,13 @@ public class playGame extends Thread{
dbController.setTimePlayed(Integer.toString(timePlayed), selectedGameTitleID);
Platform.runLater(() -> {
mainWindowController.timePlayedBtn.setText(dbController.getTimePlayed(selectedGameTitleID)+ " min");
if(Integer.parseInt(dbController.getTimePlayed(selectedGameTitleID)) > 60){
int hoursPlayed = (int) Math.floor(Integer.parseInt(dbController.getTimePlayed(selectedGameTitleID))/60);
int minutesPlayed = Integer.parseInt(dbController.getTimePlayed(selectedGameTitleID))-60*hoursPlayed;
mainWindowController.timePlayedBtn.setText(hoursPlayed+"h "+minutesPlayed+"min");
}else{
mainWindowController.timePlayedBtn.setText(dbController.getTimePlayed(selectedGameTitleID)+ " min");
}
mainWindowController.main.primaryStage.setIconified(false);
});
}catch (IOException | InterruptedException e){

View File

@ -0,0 +1,87 @@
package application;
import com.jfoenix.controls.JFXButton;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
public class uiDataType {
private final SimpleObjectProperty<VBox> vBox = new SimpleObjectProperty<>();
private final SimpleObjectProperty<Label> label = new SimpleObjectProperty<>();
private final SimpleObjectProperty<JFXButton> button = new SimpleObjectProperty<>();
private final StringProperty titleID = new SimpleStringProperty();
private final StringProperty romPath = new SimpleStringProperty();
public uiDataType (final VBox vBox, final Label label, final JFXButton button, final String titleID, final String romPath){
this.vBox.set(vBox);
this.label.set(label);
this.button.set(button);
this.titleID.set(titleID);
}
public SimpleObjectProperty<VBox> vBoxProperty(){
return vBox;
}
public SimpleObjectProperty<Label> labelProperty(){
return label;
}
public SimpleObjectProperty<JFXButton> buttonProperty(){
return button;
}
public StringProperty titleIDProperty(){
return titleID;
}
public StringProperty romPathProperty(){
return romPath;
}
public final VBox getVBox() {
return vBoxProperty().get();
}
public final Label getLabel() {
return labelProperty().get();
}
public final JFXButton getButton() {
return buttonProperty().get();
}
public final String getTitleID(){
return titleIDProperty().get();
}
public final String getRomPath(){
return romPathProperty().get();
}
public final void setVBox(VBox vBox) {
vBoxProperty().set(vBox);
}
public final void setLabel(Label label) {
labelProperty().set(label);
}
public final void setButton(JFXButton button) {
buttonProperty().set(button);
}
public final void setTitleID(String titleID){
titleIDProperty().set(titleID);
}
public final void setRomPath(String romPath){
romPathProperty().set(romPath);
}
}