2017-04-17 01:02:43 +02:00
/ * *
* cemu_UI
*
2019-03-01 19:03:30 +01:00
* Copyright 2017 - 2019 < @Seil0 >
2017-04-17 01:02:43 +02:00
*
2017-10-15 13:37:45 +02:00
* 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 .
2017-04-17 01:02:43 +02:00
*
2017-10-15 13:37:45 +02:00
* 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 .
2017-04-17 01:02:43 +02:00
* /
2019-05-15 16:25:08 +02:00
2017-11-13 16:44:39 +01:00
package com.cemu_UI.application ;
2017-04-17 01:02:43 +02:00
import java.io.File ;
import java.io.FileOutputStream ;
import java.io.IOException ;
import java.net.URL ;
import java.nio.channels.Channels ;
import java.nio.channels.ReadableByteChannel ;
2017-09-16 17:08:50 +02:00
import java.util.Timer ;
import java.util.TimerTask ;
2017-08-27 20:44:08 +02:00
import org.apache.logging.log4j.LogManager ;
import org.apache.logging.log4j.Logger ;
2017-11-13 16:44:39 +01:00
import com.cemu_UI.controller.CloudController ;
2019-01-22 19:21:38 +01:00
import com.cemu_UI.controller.XMLController ;
2019-05-16 15:09:01 +02:00
import com.cemu_UI.uiElements.JFXOkayCancelAlert ;
2017-11-13 16:44:39 +01:00
2017-04-17 01:02:43 +02:00
import javafx.application.Application ;
2017-09-12 19:45:39 +02:00
import javafx.beans.value.ChangeListener ;
import javafx.beans.value.ObservableValue ;
2017-04-17 01:02:43 +02:00
import javafx.fxml.FXMLLoader ;
import javafx.scene.Scene ;
import javafx.scene.control.Alert ;
import javafx.scene.control.Alert.AlertType ;
import javafx.scene.layout.AnchorPane ;
2019-05-16 15:09:01 +02:00
import javafx.stage.DirectoryChooser ;
import javafx.stage.Stage ;
2017-04-17 01:02:43 +02:00
public class Main extends Application {
2019-04-09 00:42:39 +02:00
private final String gamesDBdownloadURL = " https://git.mosad.xyz/Seil0/cemu_UI/raw/branch/master/downloadContent/games.db " ;
2019-01-14 20:16:19 +01:00
private static Main main ;
2019-04-09 00:42:39 +02:00
private static XMLController xmlController ;
2017-12-18 09:58:32 +01:00
private MainWindowController mainWindowController ;
private CloudController cloudController ;
2019-04-09 00:42:39 +02:00
private Stage primaryStage ;
2017-12-18 09:58:32 +01:00
private AnchorPane pane ;
private Scene scene ;
2019-04-09 00:42:39 +02:00
2017-09-02 17:38:40 +02:00
private static Logger LOGGER ;
2017-04-17 01:02:43 +02:00
@Override
public void start ( Stage primaryStage ) {
2017-11-13 16:44:39 +01:00
try {
2019-01-22 19:21:38 +01:00
LOGGER . info ( " OS: " + XMLController . getOsName ( ) + " " + XMLController . getOsVers ( ) + " " + XMLController . getOsVers ( ) ) ;
LOGGER . info ( " Java: " + XMLController . getJavaVend ( ) + " " + XMLController . getJavaVers ( ) ) ;
LOGGER . info ( " User: " + XMLController . getUserName ( ) + " " + XMLController . getUserHome ( ) ) ;
2018-06-12 16:24:12 +02:00
2017-11-13 16:44:39 +01:00
this . primaryStage = primaryStage ;
2019-05-18 13:19:34 +02:00
mainWindowController = new MainWindowController ( ) ;
2019-01-14 20:16:19 +01:00
main = this ;
2018-06-12 16:24:12 +02:00
2017-11-13 16:44:39 +01:00
mainWindow ( ) ;
initActions ( ) ;
} catch ( Exception e ) {
LOGGER . error ( " ooooops " , e ) ;
}
2017-04-17 01:02:43 +02:00
}
private void mainWindow ( ) {
try {
2017-11-13 16:44:39 +01:00
FXMLLoader loader = new FXMLLoader ( ) ;
2018-10-01 21:20:35 +02:00
loader . setLocation ( getClass ( ) . getResource ( " /fxml/MainWindow.fxml " ) ) ;
2018-06-12 16:24:12 +02:00
loader . setController ( mainWindowController ) ;
2017-11-13 16:44:39 +01:00
pane = ( AnchorPane ) loader . load ( ) ;
2018-06-12 16:24:12 +02:00
primaryStage . setMinWidth ( 265 . 00 ) ;
primaryStage . setMinHeight ( 425 . 00 ) ;
2017-04-17 01:02:43 +02:00
primaryStage . setTitle ( " cemu_UI " ) ;
2018-06-12 16:24:12 +02:00
// primaryStage.getIcons().add(new Image(Main.class.getResourceAsStream(""))); //adds application icon
primaryStage . setOnCloseRequest ( event - > System . exit ( 1 ) ) ;
2017-04-17 01:02:43 +02:00
2018-06-12 16:24:12 +02:00
// generate window
scene = new Scene ( pane ) ; // create new scene, append pane to scene
scene . getStylesheets ( ) . add ( Main . class . getResource ( " /css/MainWindows.css " ) . toExternalForm ( ) ) ;
primaryStage . setScene ( scene ) ; // append scene to stage
primaryStage . show ( ) ; // show stage
2019-05-18 13:19:34 +02:00
cloudController = CloudController . getInstance ( mainWindowController ) ; // call cloudController constructor
2017-04-17 01:02:43 +02:00
2017-11-24 17:07:53 +01:00
// startup checks
2018-02-17 17:49:12 +01:00
// check if client_secret.json is present
2017-11-13 16:44:39 +01:00
if ( Main . class . getResourceAsStream ( " /client_secret.json " ) = = null ) {
2017-08-27 20:44:08 +02:00
LOGGER . error ( " client_secret is missing!!!!! " ) ;
2019-05-16 15:09:01 +02:00
JFXOkayCancelAlert noCSAlert = new JFXOkayCancelAlert ( " Error " ,
" client_secret is missing! Please contact the maintainer. \ nIf you compiled cemu_UI by yourself see: \ nhttps://git.mosad.xyz/Seil0/cemu_UI/wiki/Documantation " ,
" -fx-button-type: RAISED; -fx-background-color: #00a8cc; -fx-text-fill: BLACK; " , primaryStage ) ;
noCSAlert . setOkayAction ( e - > { } ) ;
noCSAlert . setCancelAction ( e - > { } ) ;
noCSAlert . showAndWait ( ) ;
2017-08-26 00:13:09 +02:00
}
2019-01-22 19:21:38 +01:00
if ( ! XMLController . getDirCemuUI ( ) . exists ( ) ) {
2017-08-27 20:44:08 +02:00
LOGGER . info ( " creating cemu_UI directory " ) ;
2019-01-22 19:21:38 +01:00
XMLController . getDirCemuUI ( ) . mkdir ( ) ;
XMLController . getPictureCache ( ) . mkdir ( ) ;
2017-04-17 01:02:43 +02:00
}
2019-01-22 19:21:38 +01:00
if ( ! XMLController . getConfigFile ( ) . exists ( ) ) {
2017-08-27 20:44:08 +02:00
LOGGER . info ( " firststart, setting default values " ) ;
2017-04-17 01:02:43 +02:00
firstStart ( ) ;
2019-01-22 19:21:38 +01:00
xmlController . saveSettings ( ) ;
2017-04-17 01:02:43 +02:00
}
2019-01-22 19:21:38 +01:00
if ( ! XMLController . getPictureCache ( ) . exists ( ) ) {
XMLController . getPictureCache ( ) . mkdir ( ) ;
2017-04-17 01:02:43 +02:00
}
2019-01-22 19:21:38 +01:00
if ( ! XMLController . getRference_gamesFile ( ) . exists ( ) ) {
if ( XMLController . getGamesDBFile ( ) . exists ( ) ) {
XMLController . getGamesDBFile ( ) . delete ( ) ;
2017-12-12 12:02:28 +01:00
}
2017-04-17 01:02:43 +02:00
try {
2017-12-12 12:02:28 +01:00
LOGGER . info ( " downloading ReferenceGameList.db... " ) ;
2017-04-17 01:02:43 +02:00
URL website = new URL ( gamesDBdownloadURL ) ;
ReadableByteChannel rbc = Channels . newChannel ( website . openStream ( ) ) ;
2019-01-22 19:21:38 +01:00
FileOutputStream fos = new FileOutputStream ( XMLController . getRference_gamesFile ( ) ) ;
2017-04-17 01:02:43 +02:00
fos . getChannel ( ) . transferFrom ( rbc , 0 , Long . MAX_VALUE ) ;
fos . close ( ) ;
2017-08-27 20:44:08 +02:00
LOGGER . info ( " finished downloading games.db " ) ;
2017-04-17 01:02:43 +02:00
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
}
2018-02-24 17:00:43 +01:00
// init here as it loads the games to the mwc and the gui, therefore the window must exist
2017-11-27 10:57:16 +01:00
mainWindowController . init ( ) ;
2017-12-12 23:52:54 +01:00
2017-12-07 22:52:32 +01:00
// if cloud sync is activated start sync
2019-01-22 19:21:38 +01:00
if ( XMLController . isCloudSync ( ) ) {
2019-04-09 00:42:39 +02:00
cloudController . initializeConnection ( XMLController . getCloudService ( ) , XMLController . getCemuPath ( ) ) ;
cloudController . sync ( XMLController . getCloudService ( ) , XMLController . getCemuPath ( ) , XMLController . getDirCemuUIPath ( ) ) ;
2018-01-31 17:01:47 +01:00
}
2017-04-17 01:02:43 +02:00
2018-06-12 16:24:12 +02:00
} catch ( IOException e ) {
e . printStackTrace ( ) ;
}
}
public static void main ( String [ ] args ) {
2019-01-22 19:21:38 +01:00
String logPath = " " ;
2018-06-12 16:24:12 +02:00
2019-01-22 19:21:38 +01:00
if ( System . getProperty ( " os.name " ) . contains ( " Windows " ) ) {
logPath = System . getProperty ( " user.home " ) + " /Documents/cemu_UI/app.log " ;
2018-06-12 16:24:12 +02:00
} else {
2019-01-22 19:21:38 +01:00
logPath = System . getProperty ( " user.home " ) + " /cemu_UI/app.log " ;
2018-06-12 16:24:12 +02:00
}
2019-01-22 19:21:38 +01:00
System . setProperty ( " logFilename " , logPath ) ;
File logFile = new File ( logPath ) ;
2018-06-12 16:24:12 +02:00
logFile . delete ( ) ;
LOGGER = LogManager . getLogger ( Main . class . getName ( ) ) ;
2019-01-22 19:21:38 +01:00
xmlController = new XMLController ( ) ;
2018-06-12 16:24:12 +02:00
launch ( args ) ;
2017-04-17 01:02:43 +02:00
}
2018-02-04 15:19:36 +01:00
private void firstStart ( ) {
2019-05-16 15:09:01 +02:00
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 - > {
2017-04-17 01:02:43 +02:00
DirectoryChooser directoryChooser = new DirectoryChooser ( ) ;
File selectedDirectory = directoryChooser . showDialog ( primaryStage ) ;
2019-05-16 15:09:01 +02:00
XMLController . setCemuPath ( selectedDirectory . getAbsolutePath ( ) ) ;
} ) ;
cemuInstallAlert . setCancelAction ( e - > {
2019-01-22 19:21:38 +01:00
XMLController . setCemuPath ( null ) ;
2019-05-16 15:09:01 +02:00
LOGGER . info ( " Action canceld by user! " ) ;
} ) ;
cemuInstallAlert . showAndWait ( ) ;
2017-04-17 01:02:43 +02:00
2019-05-16 15:09:01 +02:00
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 - > {
2017-04-17 01:02:43 +02:00
DirectoryChooser directoryChooser = new DirectoryChooser ( ) ;
2018-01-19 01:14:01 +01:00
File selectedDirectory = directoryChooser . showDialog ( primaryStage ) ;
2019-01-22 19:21:38 +01:00
XMLController . setRomDirectoryPath ( selectedDirectory . getAbsolutePath ( ) ) ;
2019-05-16 15:09:01 +02:00
} ) ;
romDirectoryAlert . setCancelAction ( e - > {
2019-01-22 19:21:38 +01:00
XMLController . setRomDirectoryPath ( null ) ;
2019-05-16 15:09:01 +02:00
LOGGER . info ( " Action canceld by user! " ) ;
} ) ;
romDirectoryAlert . showAndWait ( ) ;
2017-04-17 01:02:43 +02:00
}
2017-09-12 19:45:39 +02:00
private void initActions ( ) {
2017-09-15 19:23:44 +02:00
final ChangeListener < Number > widthListener = new ChangeListener < Number > ( ) {
2017-09-16 17:08:50 +02:00
final Timer timer = new Timer ( ) ;
2017-11-24 17:07:53 +01:00
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
2017-09-15 19:23:44 +02:00
2017-09-12 19:45:39 +02:00
@Override
public void changed ( ObservableValue < ? extends Number > observable , Number oldValue , final Number newValue ) {
2017-09-15 19:23:44 +02:00
2017-11-24 17:07:53 +01:00
// if saveTask is already running kill it
2017-09-16 17:08:50 +02:00
if ( saveTask ! = null ) saveTask . cancel ( ) ;
saveTask = new TimerTask ( ) {
@Override
2018-02-18 18:27:36 +01:00
public void run ( ) {
2019-01-22 19:21:38 +01:00
XMLController . setWindowWidth ( mainWindowController . getMainAnchorPane ( ) . getWidth ( ) ) ;
xmlController . saveSettings ( ) ;
2017-09-16 17:08:50 +02:00
}
} ;
timer . schedule ( saveTask , delayTime ) ;
2017-09-12 19:45:39 +02:00
}
} ;
2017-09-15 19:23:44 +02:00
final ChangeListener < Number > heightListener = new ChangeListener < Number > ( ) {
2017-09-16 17:08:50 +02:00
final Timer timer = new Timer ( ) ;
2017-11-24 17:07:53 +01:00
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
2017-09-16 17:08:50 +02:00
2017-09-15 19:23:44 +02:00
@Override
public void changed ( ObservableValue < ? extends Number > observable , Number oldValue , final Number newValue ) {
2017-09-16 17:08:50 +02:00
if ( saveTask ! = null ) saveTask . cancel ( ) ;
saveTask = new TimerTask ( ) {
@Override
2018-02-18 18:27:36 +01:00
public void run ( ) {
2019-01-22 19:21:38 +01:00
XMLController . setWindowHeight ( mainWindowController . getMainAnchorPane ( ) . getHeight ( ) ) ;
xmlController . saveSettings ( ) ;
2017-09-16 17:08:50 +02:00
}
} ;
timer . schedule ( saveTask , delayTime ) ;
2017-09-15 19:23:44 +02:00
}
} ;
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 " ) ;
}
} ;
2017-11-24 17:07:53 +01:00
// add listener to primaryStage
2017-09-15 19:23:44 +02:00
primaryStage . widthProperty ( ) . addListener ( widthListener ) ;
primaryStage . heightProperty ( ) . addListener ( heightListener ) ;
primaryStage . maximizedProperty ( ) . addListener ( maximizeListener ) ;
2017-09-12 19:45:39 +02:00
}
2019-01-14 20:16:19 +01:00
public static Main getMain ( ) {
return main ;
}
2017-12-12 11:19:33 +01:00
public CloudController getCloudController ( ) {
return cloudController ;
}
public AnchorPane getPane ( ) {
return pane ;
}
2017-04-17 01:02:43 +02:00
}