4 Commits
0.1.2 ... 0.1.3

Author SHA1 Message Date
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 219 additions and 49 deletions

View File

@ -1,13 +1,13 @@
# cemu_UI # cemu_UI
cemu_UI is a simple graphical frontend for cemu, a Wii U emulator. cemu_UI is a simple graphical frontend for [cemu](http://cemu.info/), a Wii U emulator.
![Screenshot](/downloadContent/cemu_UI4.png) ![Screenshot](/downloadContent/cemu_UI4.png)
## Features ## Features
* launch Games * launch Games
* time played in total * Time played in total
* last time played * last time played
* easyer way to add updates & DLCs (only adding not downloading!) * easyer way to add updates & DLCs (only adding not downloading!)
* automatic rom detection (only .rpx files with a app.xml) * automatic rom detection (only .rpx files with a app.xml)
@ -16,6 +16,12 @@ cemu_UI is a simple graphical frontend for cemu, a Wii U emulator.
## planed Features (no ETA) ## planed Features (no ETA)
* Controller support * Controller support
* cloud savegames
* more UI improvements * more UI improvements
* support more rom file formats in automatic detection * support more rom file formats in automatic detection
## 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.

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; package application;
import java.io.File; import java.io.File;
@ -105,6 +126,7 @@ public class Main extends Application {
//loading settings and initialize UI //loading settings and initialize UI
mainWindowController.loadSettings(); mainWindowController.loadSettings();
mainWindowController.dbController.main(); mainWindowController.dbController.main();
mainWindowController.addUIData();
mainWindowController.initActions(); mainWindowController.initActions();
mainWindowController.initUI(); mainWindowController.initUI();

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; package application;
import java.awt.Graphics2D; import java.awt.Graphics2D;
@ -12,7 +33,6 @@ import java.math.BigInteger;
import java.sql.SQLException; import java.sql.SQLException;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Optional; import java.util.Optional;
import java.util.Properties; import java.util.Properties;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
@ -28,6 +48,8 @@ import com.jfoenix.transitions.hamburger.HamburgerBackArrowBasicTransition;
import javafx.animation.FadeTransition; import javafx.animation.FadeTransition;
import javafx.animation.ParallelTransition; import javafx.animation.ParallelTransition;
import javafx.animation.TranslateTransition; import javafx.animation.TranslateTransition;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.event.EventHandler; import javafx.event.EventHandler;
import javafx.fxml.FXML; import javafx.fxml.FXML;
@ -133,6 +155,7 @@ public class MainWindowController {
private int xPos = -200; private int xPos = -200;
private int yPos = 17; private int yPos = 17;
private int xPosHelper; private int xPosHelper;
private int selectedUIDataIndex;
private FileChooser fileChooser = new FileChooser(); private FileChooser fileChooser = new FileChooser();
private DirectoryChooser directoryChooser = new DirectoryChooser(); private DirectoryChooser directoryChooser = new DirectoryChooser();
private File dirWin = new File(System.getProperty("user.home") + "/Documents/cemu_UI"); 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"); private File fileLinux = new File(dirLinux + "/config.xml");
File pictureCacheWin = new File(dirWin+"/picture_cache"); File pictureCacheWin = new File(dirWin+"/picture_cache");
File pictureCacheLinux = new File(dirLinux+"/picture_cache"); File pictureCacheLinux = new File(dirLinux+"/picture_cache");
private ArrayList<JFXButton> gameCover = new ArrayList<JFXButton>(); private ObservableList<uiDataType> games = FXCollections.observableArrayList();
private ArrayList<Label> gameLabel = new ArrayList<Label>();
private ArrayList<VBox> gameVBox = new ArrayList<VBox>();
Properties props = new Properties(); Properties props = new Properties();
Properties gameProps = new Properties(); Properties gameProps = new Properties();
private MenuItem edit = new MenuItem("edit"); private MenuItem edit = new MenuItem("edit");
@ -151,7 +172,6 @@ public class MainWindowController {
private MenuItem update = new MenuItem("update"); private MenuItem update = new MenuItem("update");
private MenuItem addDLC = new MenuItem("add DLC"); private MenuItem addDLC = new MenuItem("add DLC");
private ContextMenu gameContextMenu = new ContextMenu(edit, remove, update, addDLC); private ContextMenu gameContextMenu = new ContextMenu(edit, remove, update, addDLC);
private MouseEvent selectedEvent;
private Label lastGameLabel = new Label(); private Label lastGameLabel = new Label();
private ImageView add_circle_black = new ImageView(new Image("recources/icons/ic_add_circle_black_24dp_1x.png")); 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(); alert.showAndWait();
} }
else{ else{
int i = gameCover.indexOf((selectedEvent).getSource());
Alert alert = new Alert(AlertType.CONFIRMATION); Alert alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("remove"); alert.setTitle("remove");
alert.setHeaderText("cemu_UI"); alert.setHeaderText("cemu_UI");
@ -248,29 +266,29 @@ public class MainWindowController {
Optional<ButtonType> result = alert.showAndWait(); Optional<ButtonType> result = alert.showAndWait();
if (result.get() == ButtonType.OK){ if (result.get() == ButtonType.OK){
try { try {
gameVBox.remove(i); //remove all elements from gamesAnchorPane
gameCover.remove(i); for(int i=0; i< games.size(); i++){
gameLabel.remove(i); gamesAnchorPane.getChildren().remove(games.get(i).getVBox());
}
//remove game from database
games.remove(selectedUIDataIndex);
dbController.removeRom(selectedGameTitleID); dbController.removeRom(selectedGameTitleID);
gamesAnchorPane.getChildren().remove(i); gamesAnchorPane.getChildren().removeAll(games);
//reset position
//TODO remove if animations are done xPos = -200;
Runtime.getRuntime().exec("java -jar cemu_UI.jar"); //start again (preventing Bugs) yPos = 17;
System.exit(0); //finishes itself xPosHelper = 0;
//add all games to gamesAnchorPane
} catch (SQLException | IOException e) { 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(); 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
} }
} }
}); });
@ -643,11 +661,13 @@ public class MainWindowController {
Image coverImage = new Image(coverFile.toURI().toString()); Image coverImage = new Image(coverFile.toURI().toString());
generatePosition(); generatePosition();
gameVBox.add(VBox);
gameCover.add(gameBtn); VBox.setLayoutX(getxPos());
gameLabel.add(gameTitleLabel); VBox.setLayoutY(getyPos());
VBox.getChildren().addAll(gameTitleLabel,gameBtn);
gameTitleLabel.setMaxWidth(200); gameTitleLabel.setMaxWidth(200);
gameTitleLabel.setPadding(new Insets(0,0,0,8)); gameTitleLabel.setPadding(new Insets(0,0,0,8));
gameTitleLabel.setFont(Font.font("System", FontWeight.BOLD, 14));
imageView.setImage(coverImage); imageView.setImage(coverImage);
imageView.setFitHeight(300); imageView.setFitHeight(300);
imageView.setFitWidth(200); imageView.setFitWidth(200);
@ -659,14 +679,19 @@ public class MainWindowController {
public void handle(MouseEvent event) { public void handle(MouseEvent event) {
System.out.println("selected: "+title+"; ID: "+titleID); 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; gameExecutePath = romPath;
selectedGameTitleID = titleID; selectedGameTitleID = titleID;
selectedGameTitle = title; selectedGameTitle = title;
selectedEvent = event;
lastGameLabel.setStyle("-fx-underline: false;"); lastGameLabel.setStyle("-fx-underline: false;");
gameLabel.get(gameCover.indexOf(event.getSource())).setStyle("-fx-underline: true;"); games.get(selectedUIDataIndex).getLabel().setStyle("-fx-underline: true;");
lastGameLabel = gameLabel.get(gameCover.indexOf(event.getSource())); lastGameLabel = games.get(selectedUIDataIndex).getLabel();
if(dbController.getLastPlayed(titleID).equals("") || dbController.getLastPlayed(titleID).equals(null)){ if(dbController.getLastPlayed(titleID).equals("") || dbController.getLastPlayed(titleID).equals(null)){
lastTimePlayedBtn.setText("Last played, never"); lastTimePlayedBtn.setText("Last played, never");
@ -674,12 +699,13 @@ public class MainWindowController {
}else{ }else{
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd"); DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
int localInt = Integer.parseInt(dtf.format(LocalDate.now()).replaceAll("-", "")); int today = Integer.parseInt(dtf.format(LocalDate.now()).replaceAll("-", ""));
int lastInt = Integer.parseInt(dbController.getLastPlayed(titleID).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"); lastTimePlayedBtn.setText("Last played, today");
}else if(localInt-1 == lastInt){ }else if(yesterday == lastday){
lastTimePlayedBtn.setText("Last played, yesterday"); lastTimePlayedBtn.setText("Last played, yesterday");
}else{ }else{
lastTimePlayedBtn.setText("Last played, "+dbController.getLastPlayed(titleID)); lastTimePlayedBtn.setText("Last played, "+dbController.getLastPlayed(titleID));
@ -699,11 +725,13 @@ public class MainWindowController {
} }
}); });
gameTitleLabel.setFont(Font.font("System", FontWeight.BOLD, 14)); games.add(new uiDataType(VBox, gameTitleLabel, gameBtn, titleID, romPath));
VBox.getChildren().addAll(gameTitleLabel,gameBtn); }
VBox.setLayoutX(getxPos());
VBox.setLayoutY(getyPos()); void addUIData(){
gamesAnchorPane.getChildren().add(VBox); 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"); menuHam.getStyleClass().add("jfx-hamburgerB");
} }
for(int i=0; i<gameCover.size(); i++){ for(int i=0; i<games.size(); i++){
gameCover.get(i).setRipplerFill(Paint.valueOf(getColor())); 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; package application;
import java.awt.Graphics2D; import java.awt.Graphics2D;

View File

@ -40,7 +40,13 @@ public class playGame extends Thread{
dbController.setTimePlayed(Integer.toString(timePlayed), selectedGameTitleID); dbController.setTimePlayed(Integer.toString(timePlayed), selectedGameTitleID);
Platform.runLater(() -> { 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); mainWindowController.main.primaryStage.setIconified(false);
}); });
}catch (IOException | InterruptedException e){ }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);
}
}