@ -1,7 +1,7 @@
/ * *
* cemu_UI
*
* Copyright 2017 - 2018 < @Seil0 >
* Copyright 2017 - 2019 < @Seil0 >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
@ -18,6 +18,7 @@
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston ,
* MA 02110 - 1301 , USA .
* /
package com.cemu_UI.application ;
import java.io.File ;
@ -26,7 +27,6 @@ import java.io.IOException;
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 ;
@ -34,51 +34,44 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger ;
import com.cemu_UI.controller.CloudController ;
import com.cemu_UI.controller.XMLController ;
import com.cemu_UI.uiElements.JFXInfoAlert ;
import com.cemu_UI.uiElements.JFXOkayCancelAlert ;
import javafx.application.Application ;
import javafx.beans.value.ChangeListener ;
import javafx.beans.value.ObservableValue ;
import javafx.fxml.FXMLLoader ;
import javafx.stage.DirectoryChooser ;
import javafx.stage.Stage ;
import javafx.scene.Scene ;
import javafx.scene.control.Alert ;
import javafx.scene.control.ButtonType ;
import javafx.scene.control.Alert.AlertType ;
import javafx.scene.layout.AnchorPane ;
import javafx.stage.DirectoryChooser ;
import javafx.stage.Stage ;
public class Main extends Application {
private Stage primaryStage ;
private final String gamesDBdownloadURL = "https://git.mosad.xyz/Seil0/cemu_UI/raw/branch/master/downloadContent/games.db" ;
private static Main main ;
private static XMLController xmlController ;
private MainWindowController mainWindowController ;
private CloudController cloudController ;
private Stage primaryStage ;
private AnchorPane pane ;
private Scene scene ;
private static 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" ;
private static String dirCemuUI ;
private static File directory ;
private static File configFile ;
private static File gamesDBFile ;
private static File reference_gamesFile ;
private static File pictureCache ;
private static Logger LOGGER ;
@Override
public void start ( Stage primaryStage ) {
try {
LOGGER . info ( "OS: " + osName + " " + osVers + " " + osArch ) ;
LOGGER . info ( "Java: " + javaVend + " " + javaVers ) ;
LOGGER . info ( "User: " + userName + " " + userHome ) ;
LOGGER . info ( "OS: " + XMLController . getOsName ( ) + " " + XMLController . getOsVers ( ) + " " + XMLController . getOsVers ( ) ) ;
LOGGER . info ( "Java: " + XMLController . getJavaVend ( ) + " " + XMLController . getJavaVers ( ) ) ;
LOGGER . info ( "User: " + XMLController . getUserName ( ) + " " + XMLController . getUserHome ( ) ) ;
this . primaryStage = primaryStage ;
mainWindowController = new MainWindowController ( this ) ;
mainWindowController = new MainWindowController ( ) ;
main = this ;
mainWindow ( ) ;
initActions ( ) ;
@ -91,14 +84,14 @@ public class Main extends Application {
private void mainWindow ( ) {
try {
FXMLLoader loader = new FXMLLoader ( ) ;
loader . setLocation ( ClassLoader . getSystem Resource ( "fxml/MainWindow.fxml" ) ) ;
loader . setLocation ( getClass ( ) . getResource ( "/ fxml/MainWindow.fxml" ) ) ;
loader . setController ( mainWindowController ) ;
pane = ( AnchorPane ) loader . load ( ) ;
primaryStage . setMinWidth ( 265 . 0 0) ;
primaryStage . setMinHeight ( 425 . 00 ) ;
primaryStage . setMinWidth ( 113 0) ;
primaryStage . setMinHeight ( 600 + 34 ) ;
primaryStage . setTitle ( "cemu_UI" ) ;
/ / primaryStage . getIcons ( ) . add ( new Image ( Main . class . getResourceAsStream ( "" ) ) ) ; / / adds application icon
primaryStage . setOnCloseRequest ( event - > System . exit ( 1 ) ) ;
primaryStage . setOnCloseRequest ( event - > System . exit ( 0 ) ) ;
/ / generate window
scene = new Scene ( pane ) ; / / create new scene , append pane to scene
@ -106,51 +99,46 @@ public class Main extends Application {
primaryStage . setScene ( scene ) ; / / append scene to stage
primaryStage . show ( ) ; / / show stage
cloudController = new CloudController ( mainWindowController ) ; / / call cloudController constructor
cloudController = CloudController . getInstance ( mainWindowController ) ; / / call cloudController constructor
/ / startup checks
/ / check if client_secret . json is present
if ( Main . class . getResourceAsStream ( "/client_secret.json" ) = = null ) {
LOGGER . error ( "client_secret is missing!!!!!" ) ;
Alert alert = new Alert ( AlertType . ERROR ) ;
alert . setTitle ( "cemu_UI" ) ;
alert . setHeaderText ( "Error" ) ;
alert . setContentText ( "client_secret is missing! Please contact the maintainer. \nIf you compiled cemu_UI by yourself see: \nhttps://github.com/Seil0/cemu_UI/wiki/Documantation" ) ;
alert . showAndWait ( ) ;
JFXInfoAlert noCSAlert = new JFXInfoAlert ( "Error" ,
"client_secret is missing! Please contact the maintainer. \n"
+ "If you compiled cemu_UI by yourself see: \n"
+ "https://git.mosad.xyz/Seil0/cemu_UI/wiki/Documantation" ,
"-fx-button-type: RAISED; -fx-background-color: #00a8cc; -fx-text-fill: BLACK;" , primaryStage ) ;
noCSAlert . showAndWait ( ) ;
}
if ( ! directory . exists ( ) ) {
if ( ! XMLController . getDirCemuUI ( ) . exists ( ) ) {
LOGGER . info ( "creating cemu_UI directory" ) ;
directory . mkdir ( ) ;
pictureCache . mkdir ( ) ;
XMLController . getDirCemuUI ( ) . mkdir ( ) ;
XMLController . getPictureCache ( ) . mkdir ( ) ;
}
if ( ! configFile . exists ( ) ) {
if ( ! XMLController . getC onfigFile( ) . exists ( ) ) {
LOGGER . info ( "firststart, setting default values" ) ;
firstStart ( ) ;
mainWindowController . setColor ( "00a8cc" ) ;
mainWindowController . setAutoUpdate ( false ) ;
mainWindowController . setLanguage ( "en_US" ) ;
mainWindowController . setLastLocalSync ( 0 ) ;
mainWindowController . setxPosHelper ( 0 ) ;
mainWindowController . saveSettings ( ) ;
xmlController . saveSettings ( ) ;
}
if ( ! pictureCache . exists ( ) ) {
pictureCache . mkdir ( ) ;
if ( ! XMLController . getPictureCache ( ) . exists ( ) ) {
XMLController . getPictureCache ( ) . mkdir ( ) ;
}
if ( ! reference_gamesFile . exists ( ) ) {
if ( gamesDBFile . exists ( ) ) {
gamesDBFile . delete ( ) ;
if ( ! XMLController . getRference_gamesFile ( ) . exists ( ) ) {
if ( XMLController . getGamesDBFile ( ) . exists ( ) ) {
XMLController . getGamesDBFile ( ) . delete ( ) ;
}
try {
LOGGER . info ( "downloading ReferenceGameList.db... " ) ;
URL website = new URL ( gamesDBdownloadURL ) ;
ReadableByteChannel rbc = Channels . newChannel ( website . openStream ( ) ) ;
FileOutputStream fos = new FileOutputStream ( reference_gamesFile ) ;
FileOutputStream fos = new FileOutputStream ( XMLCont roll er . getR ference_gamesFile( ) ) ;
fos . getChannel ( ) . transferFrom ( rbc , 0 , Long . MAX_VALUE ) ;
fos . close ( ) ;
LOGGER . info ( "finished downloading games.db" ) ;
@ -161,12 +149,11 @@ public class Main extends Application {
/ / init here as it loads the games to the mwc and the gui , therefore the window must exist
mainWindowController . init ( ) ;
mainWindowController . getDbController ( ) . init ( ) ;
/ / if cloud sync is activated start sync
if ( mainWindow Controller. isCloudSync ( ) ) {
cloudController . initializeConnection ( mainWindow Controller. getCloudService ( ) , mainWindow Controller. getCemuPath ( ) ) ;
cloudController . sync ( mainWindow Controller. getCloudService ( ) , mainWindow Controller. getCemuPath ( ) , directory . getPath ( ) ) ;
if ( XML Controller . isCloudSync ( ) ) {
cloudController . initializeConnection ( XML Controller. getCloudService ( ) , XML Controller. getCemuPath ( ) ) ;
cloudController . sync ( XML Controller. getCloudService ( ) , XML Controller. getCemuPath ( ) , XMLController . getDirCemuUI Path ( ) ) ;
}
} catch ( IOException e ) {
@ -175,56 +162,53 @@ public class Main extends Application {
}
public static void main ( String [ ] args ) {
String logPath = "" ;
if ( osName . contains ( "Windows" ) ) {
dirCemuUI = userHome + "/Documents/cemu_UI" ;
if ( System . getProperty ( "os.name" ) . contains ( "Windows" ) ) {
logPath = System . getProperty ( "user.home" ) + "/Documents/cemu_UI/app.log " ;
} else {
dirCemuUI = userHome + "/cemu_UI" ;
logPath = System . getProperty ( "user.home" ) + "/cemu_UI/app.log " ;
}
directory = new File ( dirCemuUI ) ;
configFile = new File ( dirCemuUI + "/config.xml" ) ;
gamesDBFile = new File ( dirCemuUI + "/games.db" ) ;
reference_gamesFile = new File ( dirCemuUI + "/reference_games.db" ) ;
pictureCache = new File ( dirCemuUI + "/picture_cache" ) ;
/ / delete old log file and create new
System . setProperty ( "logFilename" , dirCemuUI + "/app.log" ) ;
File logFile = new File ( dirCemuUI + "/app.log" ) ;
System . setProperty ( "logFilename" , logPath ) ;
File logFile = new File ( logPath ) ;
logFile . delete ( ) ;
LOGGER = LogManager . getLogger ( Main . class . getName ( ) ) ;
xmlController = new XMLController ( ) ;
launch ( args ) ;
}
private void firstStart ( ) {
Alert alert = new Alert ( AlertType . CONFIRMATION ) ; / / new alert with file - chooser
alert . setTitle ( "cemu_UI" ) ;
alert . setHeaderText ( "cemu installation" ) ;
alert . setContentText ( "please select your cemu installation" ) ;
Optional < ButtonType > result = alert . showAndWait ( ) ;
if ( result . get ( ) = = ButtonType . OK ) {
JFXOkayCancelAlert cemuInstallAlert = new JFXOkayCancelAlert ( "cemu installation" ,
"please select your cemu installation" ,
"-fx-button-type: RAISED; -fx-background-color: #00a8cc; -fx-text-fill: BLACK;" , primaryStage ) ;
cemuInstallAlert . setOkayAction ( e - > {
DirectoryChooser directoryChooser = new DirectoryChooser ( ) ;
File selectedDirectory = directoryChooser . showDialog ( primaryStage ) ;
mainWindowController . setCemuPath ( selectedDirectory . getAbsolutePath ( ) ) ;
} else {
mainWindowController . setCemuPath ( null ) ;
}
XMLController . setCemuPath ( selectedDirectory . getAbsolutePath ( ) ) ;
} ) ;
cemuInstallAlert . setCancelAction ( e - > {
XMLController . setCemuPath ( null ) ;
LOGGER . info ( "Action canceld by user!" ) ;
} ) ;
cemuInstallAlert . showAndWait ( ) ;
Alert alert2 = new Alert ( AlertType . CONFIRMATION ) ; / / new alert with file - chooser
alert2 . setTitle ( "cemu_UI" ) ;
alert2 . setHeaderText ( "rom directory" ) ;
alert2 . setContentText ( "please select your rom directory" ) ;
Optional < ButtonType > result2 = alert2 . showAndWait ( ) ;
if ( result2 . get ( ) = = ButtonType . OK ) {
JFXOkayCancelAlert romDirectoryAlert = new JFXOkayCancelAlert ( "rom directory" ,
"please select your rom directory" ,
"-fx-button-type: RAISED; -fx-background-color: #00a8cc; -fx-text-fill: BLACK;" , primaryStage ) ;
romDirectoryAlert . setOkayAction ( e - > {
DirectoryChooser directoryChooser = new DirectoryChooser ( ) ;
File selectedDirectory = directoryChooser . showDialog ( primaryStage ) ;
mainWindowController . setRomDirectoryPath ( selectedDirectory . getAbsolutePath ( ) ) ;
} else {
mainWindowController . setRomDirectoryPath ( null ) ;
}
XMLController . setRomDirectoryPath ( selectedDirectory . getAbsolutePath ( ) ) ;
} ) ;
romDirectoryAlert . setCancelAction ( e - > {
XMLController . setRomDirectoryPath ( null ) ;
LOGGER . info ( "Action canceld by user!" ) ;
} ) ;
romDirectoryAlert . showAndWait ( ) ;
}
private void initActions ( ) {
@ -236,12 +220,6 @@ public class Main extends Application {
@Override
public void changed ( ObservableValue < ? extends Number > observable , Number oldValue , final Number newValue ) {
int xPosHelperMax = ( int ) Math . floor ( ( mainWindowController . getMainAnchorPane ( ) . getWidth ( ) - 36 ) / 217 ) ;
/ / 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 ( ) ;
@ -249,7 +227,8 @@ public class Main extends Application {
saveTask = new TimerTask ( ) {
@Override
public void run ( ) {
mainWindowController . saveSettings ( ) ;
XMLController . setWindowWidth ( mainWindowController . getMainAnchorPane ( ) . getWidth ( ) ) ;
xmlController . saveSettings ( ) ;
}
} ;
timer . schedule ( saveTask , delayTime ) ;
@ -270,7 +249,8 @@ public class Main extends Application {
saveTask = new TimerTask ( ) {
@Override
public void run ( ) {
mainWindowController . saveSettings ( ) ;
XMLController . setWindowHeight ( mainWindowController . getMainAnchorPane ( ) . getHeight ( ) ) ;
xmlController . saveSettings ( ) ;
}
} ;
timer . schedule ( saveTask , delayTime ) ;
@ -299,48 +279,16 @@ public class Main extends Application {
primaryStage . heightProperty ( ) . addListener ( heightListener ) ;
primaryStage . maximizedProperty ( ) . addListener ( maximizeListener ) ;
}
public Stage getPrimaryStage ( ) {
return primaryStage ;
}
public void setPrimaryStage ( Stage primaryStage ) {
this . primaryStage = primaryStage ;
public static Main getMain ( ) {
return main ;
}
public CloudController getCloudController ( ) {
return cloudController ;
}
public void setCloudController ( CloudController cloudController ) {
this . cloudController = cloudController ;
}
public AnchorPane getPane ( ) {
return pane ;
}
public void setPane ( AnchorPane pane ) {
this . pane = pane ;
}
public File getDirectory ( ) {
return directory ;
}
public File getConfigFile ( ) {
return configFile ;
}
public File getGamesDBFile ( ) {
return gamesDBFile ;
}
public File getReference_gamesFile ( ) {
return reference_gamesFile ;
}
public File getPictureCache ( ) {
return pictureCache ;
}
}