2017-04-06 12:00:36 +02:00
/ * *
* cemu_UI
*
2019-05-16 15:09:01 +02:00
* Copyright 2017 - 2019 < @Seil0 >
2017-04-06 12:00:36 +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-06 12:00:36 +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-06 12:00:36 +02:00
* /
2019-05-16 15:09:01 +02:00
2017-11-13 16:44:39 +01:00
package com.cemu_UI.application ;
2017-03-23 13:44:21 +01:00
import java.awt.Graphics2D ;
import java.awt.image.BufferedImage ;
2017-12-06 13:39:00 +01:00
import java.io.BufferedReader ;
2017-03-23 13:44:21 +01:00
import java.io.File ;
import java.io.IOException ;
2017-12-06 13:39:00 +01:00
import java.io.InputStreamReader ;
2017-03-28 17:40:01 +02:00
import java.math.BigInteger ;
2017-06-18 14:45:13 +02:00
import java.net.HttpURLConnection ;
2017-06-18 00:33:07 +02:00
import java.net.MalformedURLException ;
import java.net.URISyntaxException ;
import java.net.URL ;
2017-03-23 13:44:21 +01:00
import java.sql.SQLException ;
2017-03-23 16:17:38 +01:00
import java.time.LocalDate ;
import java.time.format.DateTimeFormatter ;
2017-06-18 13:01:04 +02:00
import java.util.ArrayList ;
2017-12-19 19:08:12 +01:00
import java.util.Locale ;
2017-03-23 13:44:21 +01:00
import java.util.Properties ;
2017-12-19 19:08:12 +01:00
import java.util.ResourceBundle ;
2017-12-06 13:39:00 +01:00
2017-03-23 13:44:21 +01:00
import javax.imageio.ImageIO ;
2017-06-18 14:45:13 +02:00
import javax.swing.ProgressMonitor ;
import javax.swing.ProgressMonitorInputStream ;
2017-03-23 13:44:21 +01:00
import org.apache.commons.io.FileUtils ;
2017-08-27 20:44:08 +02:00
import org.apache.logging.log4j.LogManager ;
import org.apache.logging.log4j.Logger ;
2017-12-06 13:39:00 +01:00
2018-02-18 18:27:36 +01:00
import com.cemu_UI.controller.DBController ;
2017-11-14 12:02:39 +01:00
import com.cemu_UI.controller.SmmdbAPIController ;
2017-11-13 16:44:39 +01:00
import com.cemu_UI.controller.UpdateController ;
2019-01-22 19:21:38 +01:00
import com.cemu_UI.controller.XMLController ;
2017-11-13 16:44:39 +01:00
import com.cemu_UI.datatypes.CourseTableDataType ;
2018-12-02 23:51:14 +01:00
import com.cemu_UI.datatypes.GlobalDataTypes.CloudService ;
2017-11-13 16:44:39 +01:00
import com.cemu_UI.datatypes.SmmdbApiDataType ;
import com.cemu_UI.datatypes.UIROMDataType ;
2017-11-15 15:58:23 +01:00
import com.cemu_UI.uiElements.JFXEditGameDialog ;
2018-06-12 16:01:21 +02:00
import com.cemu_UI.uiElements.JFXInfoAlert ;
2019-04-09 00:42:39 +02:00
import com.cemu_UI.uiElements.JFXOkayCancelAlert ;
2017-12-09 10:16:03 +01:00
import com.cemu_UI.uiElements.JFXTextAreaInfoDialog ;
2017-03-23 13:44:21 +01:00
import com.jfoenix.controls.JFXButton ;
import com.jfoenix.controls.JFXColorPicker ;
import com.jfoenix.controls.JFXHamburger ;
2017-11-27 10:57:16 +01:00
import com.jfoenix.controls.JFXSpinner ;
2017-03-23 13:44:21 +01:00
import com.jfoenix.controls.JFXTextField ;
import com.jfoenix.controls.JFXToggleButton ;
2017-06-16 16:23:03 +02:00
import com.jfoenix.controls.JFXTreeTableColumn ;
import com.jfoenix.controls.JFXTreeTableView ;
2017-03-23 13:44:21 +01:00
import com.jfoenix.transitions.hamburger.HamburgerBackArrowBasicTransition ;
2017-05-25 19:07:16 +02:00
2017-03-23 13:44:21 +01:00
import javafx.animation.TranslateTransition ;
2017-11-27 10:57:16 +01:00
import javafx.application.Platform ;
2017-06-16 16:23:03 +02:00
import javafx.beans.value.ChangeListener ;
import javafx.beans.value.ObservableValue ;
2017-04-06 12:00:36 +02:00
import javafx.collections.FXCollections ;
import javafx.collections.ObservableList ;
2017-03-23 13:44:21 +01:00
import javafx.event.ActionEvent ;
import javafx.event.EventHandler ;
import javafx.fxml.FXML ;
2017-11-10 15:58:20 +01:00
import javafx.scene.control.ChoiceBox ;
2017-03-23 13:44:21 +01:00
import javafx.scene.control.ContextMenu ;
import javafx.scene.control.Label ;
import javafx.scene.control.MenuItem ;
import javafx.scene.control.ScrollPane ;
2017-06-16 16:23:03 +02:00
import javafx.scene.control.TreeItem ;
2017-03-23 13:44:21 +01:00
import javafx.scene.image.Image ;
import javafx.scene.image.ImageView ;
2017-07-16 00:13:43 +02:00
import javafx.scene.input.MouseButton ;
2017-03-23 13:44:21 +01:00
import javafx.scene.input.MouseEvent ;
import javafx.scene.layout.AnchorPane ;
2019-05-16 15:09:01 +02:00
import javafx.scene.layout.FlowPane ;
2017-03-23 13:44:21 +01:00
import javafx.scene.layout.HBox ;
import javafx.scene.layout.VBox ;
import javafx.scene.paint.Color ;
2017-03-26 14:21:19 +02:00
import javafx.scene.paint.Paint ;
2017-03-23 13:44:21 +01:00
import javafx.scene.text.Font ;
import javafx.scene.text.FontWeight ;
2017-06-18 13:01:04 +02:00
import javafx.scene.text.Text ;
2017-06-18 00:33:07 +02:00
import javafx.scene.text.TextFlow ;
2017-03-23 13:44:21 +01:00
import javafx.stage.DirectoryChooser ;
2019-01-22 19:21:38 +01:00
import javafx.stage.Stage ;
2017-03-23 13:44:21 +01:00
import javafx.util.Duration ;
2017-08-26 00:13:09 +02:00
import net.lingala.zip4j.core.ZipFile ;
import net.lingala.zip4j.exception.ZipException ;
2017-03-23 13:44:21 +01:00
public class MainWindowController {
2017-11-24 21:40:02 +01:00
2018-12-02 23:51:14 +01:00
@FXML private JFXButton aboutBtn ;
@FXML private JFXButton settingsBtn ;
@FXML private JFXButton addBtn ;
@FXML private JFXButton reloadRomsBtn ;
@FXML private JFXButton smmdbBtn ;
@FXML private JFXButton cemuTFBtn ;
@FXML private JFXButton romTFBtn ;
@FXML private JFXButton updateBtn ;
@FXML private JFXButton smmdbDownloadBtn ;
@FXML private JFXButton playBtn ;
@FXML private JFXButton lastTimePlayedBtn ;
@FXML JFXButton totalPlaytimeBtn ;
@FXML private JFXHamburger menuHam ;
@FXML private JFXTextField cemuTextField ;
@FXML private JFXTextField romTextField ;
@FXML private JFXTextField courseSearchTextFiled ;
@FXML private JFXTextField executeCommandTextFiled ;
2018-06-12 16:24:12 +02:00
2018-12-02 23:51:14 +01:00
@FXML private TextFlow smmdbTextFlow ;
2018-06-12 16:24:12 +02:00
2018-12-02 23:51:14 +01:00
@FXML private JFXColorPicker colorPicker ;
2018-06-12 16:24:12 +02:00
2018-12-02 23:51:14 +01:00
@FXML private JFXToggleButton cloudSyncToggleBtn ;
@FXML private JFXToggleButton autoUpdateToggleBtn ;
@FXML private JFXToggleButton fullscreenToggleBtn ;
2017-12-18 09:58:32 +01:00
2018-12-02 23:51:14 +01:00
@FXML private ChoiceBox < String > languageChoisBox ;
@FXML private ChoiceBox < String > branchChoisBox ;
2017-11-24 21:40:02 +01:00
2018-12-02 23:51:14 +01:00
@FXML private AnchorPane mainAnchorPane ;
@FXML private AnchorPane gamesAnchorPane ;
@FXML private AnchorPane settingsAnchorPane ;
@FXML private AnchorPane smmdbAnchorPane ;
2019-05-16 15:09:01 +02:00
@FXML private FlowPane gamesFlowPane ;
2017-11-24 21:40:02 +01:00
2018-12-02 23:51:14 +01:00
@FXML private ScrollPane mainScrollPane ;
@FXML private ScrollPane settingsScrollPane ;
@FXML private ScrollPane smmdbScrollPane ;
@FXML private ScrollPane smmdbImageViewScrollPane ;
2017-11-24 21:40:02 +01:00
2018-12-02 23:51:14 +01:00
@FXML private VBox sideMenuVBox ;
2017-11-24 21:40:02 +01:00
2018-12-02 23:51:14 +01:00
@FXML private HBox topHBox ;
@FXML private HBox bottomHBox ;
2017-11-24 21:40:02 +01:00
2018-12-02 23:51:14 +01:00
@FXML private ImageView smmdbImageView ;
2017-11-24 21:40:02 +01:00
2018-12-02 23:51:14 +01:00
@FXML private Label helpLbl ;
@FXML private Label cemu_UISettingsLbl ;
@FXML private Label cemuDirectoryLbl ;
@FXML private Label romDirectoryLbl ;
@FXML private Label mainColorLbl ;
@FXML private Label languageLbl ;
@FXML private Label updateLbl ;
@FXML private Label branchLbl ;
@FXML private Label cemuSettingsLbl ;
@FXML private Label licensesLbl ;
2017-11-24 21:40:02 +01:00
2018-12-02 23:51:14 +01:00
@FXML private JFXTreeTableView < CourseTableDataType > courseTreeTable = new JFXTreeTableView < CourseTableDataType > ( ) ;
2017-11-24 21:40:02 +01:00
2018-12-02 23:51:14 +01:00
@FXML private TreeItem < CourseTableDataType > root = new TreeItem < > ( new CourseTableDataType ( " " , " " , 0 , 0 ) ) ;
2017-11-24 21:40:02 +01:00
2018-12-02 23:51:14 +01:00
@FXML private JFXTreeTableColumn < CourseTableDataType , String > titleColumn = new JFXTreeTableColumn < > ( " title " ) ;
@FXML private JFXTreeTableColumn < CourseTableDataType , String > idColumn = new JFXTreeTableColumn < > ( " id " ) ;
@FXML private JFXTreeTableColumn < CourseTableDataType , Integer > starsColumn = new JFXTreeTableColumn < > ( " stars " ) ;
@FXML private JFXTreeTableColumn < CourseTableDataType , Integer > timeColumn = new JFXTreeTableColumn < > ( " time " ) ;
2017-11-24 21:40:02 +01:00
2018-04-05 09:54:45 +02:00
private Main main ;
private DBController dbController ;
private SmmdbAPIController smmdbAPIController ;
private playGame playGame ;
2017-11-24 21:40:02 +01:00
private static MainWindowController MWC ;
private UpdateController updateController ;
2019-01-22 19:21:38 +01:00
private XMLController xmlController ;
private Stage primaryStage ;
2017-11-24 21:40:02 +01:00
private boolean menuTrue = false ;
private boolean playTrue = false ;
private String gameExecutePath ;
private String dialogBtnStyle ;
private String selectedGameTitleID ;
private String selectedGameTitle ;
private String id ;
2018-12-02 23:51:14 +01:00
private String version = " 0.3.2 " ;
private String buildNumber = " 085 " ;
2018-04-28 12:17:12 +02:00
private String versionName = " Purple Comet " ;
2017-11-24 21:40:02 +01:00
private int xPos = - 200 ;
private int yPos = 17 ;
2019-05-15 16:19:31 +02:00
private int xNextElement = 0 ;
private int oldXNextElement ;
2017-11-24 21:40:02 +01:00
private int selectedUIDataIndex ;
private int selected ;
2017-03-23 13:44:21 +01:00
private DirectoryChooser directoryChooser = new DirectoryChooser ( ) ;
2017-11-10 15:58:20 +01:00
private ObservableList < String > branches = FXCollections . observableArrayList ( " stable " , " beta " ) ;
2017-12-19 19:08:12 +01:00
private ObservableList < String > languages = FXCollections . observableArrayList ( " English (en_US) " , " Deutsch (de_DE) " ) ;
2018-02-24 17:00:43 +01:00
private ObservableList < String > smmIDs = FXCollections . observableArrayList ( " fe31b7f2 " , " 44fc5929 " ) ;
2017-06-16 23:35:56 +02:00
private ObservableList < UIROMDataType > games = FXCollections . observableArrayList ( ) ;
2017-06-16 16:37:56 +02:00
ObservableList < SmmdbApiDataType > courses = FXCollections . observableArrayList ( ) ;
2017-12-11 10:31:23 +01:00
ObservableList < SmmdbApiDataType > filteredCourses = FXCollections . observableArrayList ( ) ;
2017-06-18 13:01:04 +02:00
ArrayList < Text > courseText = new ArrayList < Text > ( ) ;
ArrayList < Text > nameText = new ArrayList < Text > ( ) ;
2017-11-24 21:40:02 +01:00
Properties props = new Properties ( ) ;
Properties gameProps = new Properties ( ) ;
private static final Logger LOGGER = LogManager . getLogger ( MainWindowController . class . getName ( ) ) ;
private HamburgerBackArrowBasicTransition burgerTask ;
private MenuItem edit = new MenuItem ( " edit " ) ;
private MenuItem remove = new MenuItem ( " remove " ) ;
private MenuItem addUpdate = new MenuItem ( " update " ) ;
private MenuItem addDLC = new MenuItem ( " add DLC " ) ;
2017-11-20 11:32:14 +01:00
private ContextMenu gameContextMenu = new ContextMenu ( edit , remove , addUpdate , addDLC ) ;
2017-03-23 13:44:21 +01:00
private Label lastGameLabel = new Label ( ) ;
2017-11-24 21:40:02 +01:00
2017-11-13 16:44:39 +01:00
private ImageView add_circle_black = new ImageView ( new Image ( " icons/ic_add_circle_black_24dp_1x.png " ) ) ;
private ImageView info_black = new ImageView ( new Image ( " icons/ic_info_black_24dp_1x.png " ) ) ;
private ImageView settings_black = new ImageView ( new Image ( " icons/ic_settings_black_24dp_1x.png " ) ) ;
2017-11-24 21:40:02 +01:00
private ImageView cached_black = new ImageView ( new Image ( " icons/ic_cached_black_24dp_1x.png " ) ) ;
2017-11-13 16:44:39 +01:00
private ImageView smmdb_black = new ImageView ( new Image ( " icons/ic_get_app_black_24dp_1x.png " ) ) ;
private ImageView add_circle_white = new ImageView ( new Image ( " icons/ic_add_circle_white_24dp_1x.png " ) ) ;
private ImageView info_white = new ImageView ( new Image ( " icons/ic_info_white_24dp_1x.png " ) ) ;
private ImageView settings_white = new ImageView ( new Image ( " icons/ic_settings_white_24dp_1x.png " ) ) ;
private ImageView cached_white = new ImageView ( new Image ( " icons/ic_cached_white_24dp_1x.png " ) ) ;
private ImageView smmdb_white = new ImageView ( new Image ( " icons/ic_get_app_white_24dp_1x.png " ) ) ;
private Image close_black = new Image ( " icons/close_black_2048x2048.png " ) ;
2017-12-12 11:19:33 +01:00
2017-12-19 19:08:12 +01:00
// language support
private ResourceBundle bundle ;
private String language ;
2017-12-19 21:35:49 +01:00
private String lastPlayed ;
private String today ;
private String yesterday ;
2017-12-19 22:18:22 +01:00
private String never ;
2017-12-19 19:08:12 +01:00
2018-06-12 16:24:12 +02:00
public MainWindowController ( Main main ) {
2019-01-22 19:21:38 +01:00
xmlController = new XMLController ( ) ;
2018-06-12 16:24:12 +02:00
this . main = main ;
2019-01-22 19:21:38 +01:00
dbController = new DBController ( this ) ;
2017-11-14 12:02:39 +01:00
smmdbAPIController = new SmmdbAPIController ( ) ;
2017-03-23 13:44:21 +01:00
}
2017-11-27 10:57:16 +01:00
/ * *
* initialize the MainWindowController
* loadSettings , checkAutoUpdate , initUI and initActions
* /
2018-06-12 16:24:12 +02:00
public void init ( ) {
2019-01-22 19:21:38 +01:00
xmlController . loadSettings ( ) ; // load settings
2017-11-27 10:57:16 +01:00
checkAutoUpdate ( ) ;
initUI ( ) ;
initActions ( ) ;
}
/ * *
* initialize all variable UI parameters and elements
* /
private void initUI ( ) {
2017-10-14 15:42:13 +02:00
LOGGER . info ( " initializing UI ... " ) ;
2019-01-22 19:21:38 +01:00
primaryStage = ( Stage ) mainAnchorPane . getScene ( ) . getWindow ( ) ; // set primary stage for dialogs
// TODO this is broken
if ( XMLController . getWindowWidth ( ) > 100 & & XMLController . getWindowHeight ( ) > 100 ) {
mainAnchorPane . setPrefSize ( XMLController . getWindowWidth ( ) , XMLController . getWindowHeight ( ) ) ;
2017-09-12 20:13:26 +02:00
}
2019-01-22 19:21:38 +01:00
cemuTextField . setText ( XMLController . getCemuPath ( ) ) ;
romTextField . setText ( XMLController . getRomDirectoryPath ( ) ) ;
colorPicker . setValue ( Color . valueOf ( XMLController . getColor ( ) ) ) ;
fullscreenToggleBtn . setSelected ( XMLController . isFullscreen ( ) ) ;
cloudSyncToggleBtn . setSelected ( XMLController . isCloudSync ( ) ) ;
autoUpdateToggleBtn . setSelected ( XMLController . isAutoUpdate ( ) ) ;
2017-11-10 15:58:20 +01:00
branchChoisBox . setItems ( branches ) ;
2017-12-18 09:58:32 +01:00
languageChoisBox . setItems ( languages ) ;
bottomHBox . setPickOnBounds ( false ) ;
2017-11-10 15:58:20 +01:00
2019-01-22 19:21:38 +01:00
if ( XMLController . isUseBeta ( ) ) {
2017-11-10 15:58:20 +01:00
branchChoisBox . getSelectionModel ( ) . select ( 1 ) ;
} else {
branchChoisBox . getSelectionModel ( ) . select ( 0 ) ;
}
2017-03-23 13:44:21 +01:00
applyColor ( ) ;
2017-06-16 16:23:03 +02:00
2017-11-24 17:07:53 +01:00
// initialize courseTable
2017-12-11 10:31:23 +01:00
titleColumn . setPrefWidth ( 185 ) ;
timeColumn . setPrefWidth ( 112 ) ;
starsColumn . setPrefWidth ( 90 ) ;
2017-06-16 16:23:03 +02:00
courseTreeTable . setRoot ( root ) ;
courseTreeTable . setShowRoot ( false ) ;
courseTreeTable . setEditable ( false ) ;
titleColumn . setCellValueFactory ( cellData - > cellData . getValue ( ) . getValue ( ) . title ) ;
2017-08-26 00:13:09 +02:00
idColumn . setCellValueFactory ( cellData - > cellData . getValue ( ) . getValue ( ) . id ) ;
2017-06-16 16:23:03 +02:00
starsColumn . setCellValueFactory ( cellData - > cellData . getValue ( ) . getValue ( ) . stars . asObject ( ) ) ;
2017-08-26 00:13:09 +02:00
timeColumn . setCellValueFactory ( cellData - > cellData . getValue ( ) . getValue ( ) . time . asObject ( ) ) ;
2017-06-16 16:23:03 +02:00
2017-08-27 18:21:56 +02:00
courseTreeTable . getColumns ( ) . add ( titleColumn ) ;
courseTreeTable . getColumns ( ) . add ( timeColumn ) ;
courseTreeTable . getColumns ( ) . add ( starsColumn ) ;
courseTreeTable . getColumns ( ) . add ( idColumn ) ;
2017-11-24 17:07:53 +01:00
courseTreeTable . getColumns ( ) . get ( 3 ) . setVisible ( false ) ; // the idColumn should not bee displayed
2017-10-14 15:42:13 +02:00
2017-12-19 19:08:12 +01:00
setUILanguage ( ) ;
2017-10-14 15:42:13 +02:00
LOGGER . info ( " initializing UI done " ) ;
2017-03-23 13:44:21 +01:00
}
2017-08-26 00:13:09 +02:00
/ * *
* initialize all actions not initialized by a own method
* /
2017-11-27 10:57:16 +01:00
private void initActions ( ) {
2017-09-12 19:45:39 +02:00
LOGGER . info ( " initializing Actions ... " ) ;
2017-03-23 13:44:21 +01:00
2017-11-15 21:21:52 +01:00
MWC = this ;
2017-10-30 18:28:58 +01:00
burgerTask = new HamburgerBackArrowBasicTransition ( menuHam ) ;
2017-03-23 13:44:21 +01:00
menuHam . addEventHandler ( MouseEvent . MOUSE_PRESSED , ( e ) - > {
2017-06-16 16:23:03 +02:00
if ( playTrue ) {
2017-03-23 13:44:21 +01:00
playBtnSlideOut ( ) ;
}
2019-04-09 00:42:39 +02:00
2017-10-13 21:15:51 +02:00
if ( menuTrue ) {
2017-03-23 13:44:21 +01:00
sideMenuSlideOut ( ) ;
burgerTask . setRate ( - 1 . 0 ) ;
burgerTask . play ( ) ;
menuTrue = false ;
2017-10-30 18:28:58 +01:00
} else {
2017-06-16 16:23:03 +02:00
sideMenuSlideIn ( ) ;
burgerTask . setRate ( 1 . 0 ) ;
burgerTask . play ( ) ;
menuTrue = true ;
2017-03-23 13:44:21 +01:00
}
2019-04-09 00:42:39 +02:00
if ( settingsScrollPane . isVisible ( ) ) {
2017-10-24 22:41:56 +02:00
settingsScrollPane . setVisible ( false ) ;
2019-01-22 19:21:38 +01:00
xmlController . saveSettings ( ) ;
2017-03-23 13:44:21 +01:00
}
2019-04-09 00:42:39 +02:00
if ( smmdbAnchorPane . isVisible ( ) ) {
2017-06-16 16:23:03 +02:00
smmdbAnchorPane . setVisible ( false ) ;
}
2017-03-23 13:44:21 +01:00
} ) ;
edit . setOnAction ( new EventHandler < ActionEvent > ( ) {
2017-11-24 21:36:03 +01:00
@Override
public void handle ( ActionEvent event ) {
try {
LOGGER . info ( " edit " + selectedGameTitleID ) ;
String [ ] gameInfo = dbController . getGameInfo ( selectedGameTitleID ) ;
// new edit dialog
2019-04-09 00:42:39 +02:00
String headingText = bundle . getString ( " editHeadingText " ) + " \" " + selectedGameTitle + " \" " ;
JFXEditGameDialog editGameDialog = new JFXEditGameDialog ( headingText , bundle . getString ( " editBodyText " ) , dialogBtnStyle , 450 ,
2019-01-22 19:21:38 +01:00
300 , 1 , MWC , primaryStage , main . getPane ( ) ) ;
2017-11-24 21:36:03 +01:00
editGameDialog . setTitle ( gameInfo [ 0 ] ) ;
editGameDialog . setCoverPath ( gameInfo [ 1 ] ) ;
editGameDialog . setRomPath ( gameInfo [ 2 ] ) ;
editGameDialog . setTitleID ( gameInfo [ 3 ] ) ;
editGameDialog . show ( ) ;
2017-11-24 17:07:53 +01:00
} catch ( Exception e ) {
LOGGER . warn ( " trying to edit " + selectedGameTitleID + " ,which is not a valid type! " , e ) ;
}
2017-11-24 21:36:03 +01:00
}
2017-03-23 13:44:21 +01:00
} ) ;
remove . setOnAction ( new EventHandler < ActionEvent > ( ) {
2017-06-29 14:52:58 +02:00
@Override
2017-11-24 21:36:03 +01:00
public void handle ( ActionEvent event ) {
try {
LOGGER . info ( " remove " + selectedGameTitle + " ( " + selectedGameTitleID + " ) " ) ;
2019-04-09 00:42:39 +02:00
String headingText = bundle . getString ( " removeHeadingText " ) + " \" " + selectedGameTitle + " \" " ;
String bodyText = bundle . getString ( " removeBodyText " ) + " " + selectedGameTitle + " ? " ;
JFXOkayCancelAlert removeGameAlert = new JFXOkayCancelAlert ( headingText ,
bodyText , dialogBtnStyle , primaryStage ) ;
2019-05-16 15:09:01 +02:00
removeGameAlert . setOkayAction ( e - > {
try {
games . remove ( selectedUIDataIndex ) ; // remove game form games-list
dbController . removeGame ( selectedGameTitleID ) ; // remove game from database
refreshUIData ( ) ; // refresh all games at gamesAnchorPane (UI)
} catch ( Exception ex ) {
LOGGER . error ( " error while removing ROM from database! " , ex ) ;
}
} ) ;
removeGameAlert . setCancelAction ( e - > LOGGER . info ( " Action canceld by user! " ) ) ;
2019-04-09 00:42:39 +02:00
removeGameAlert . showAndWait ( ) ;
2017-11-24 21:36:03 +01:00
} catch ( Exception e ) {
LOGGER . error ( " error while removing " + selectedGameTitle + " ( " + selectedGameTitleID + " ) " , e ) ;
}
2017-03-23 13:44:21 +01:00
}
} ) ;
2017-11-20 11:32:14 +01:00
addUpdate . setOnAction ( new EventHandler < ActionEvent > ( ) {
2017-11-24 21:36:03 +01:00
@Override
public void handle ( ActionEvent event ) {
try {
LOGGER . info ( " update: " + selectedGameTitleID ) ;
2019-04-09 00:42:39 +02:00
2017-11-24 21:36:03 +01:00
EventHandler < ActionEvent > okayAction = new EventHandler < ActionEvent > ( ) {
@Override
public void handle ( ActionEvent event ) {
DirectoryChooser directoryChooser = new DirectoryChooser ( ) ;
2019-01-22 19:21:38 +01:00
File selectedDirecroty = directoryChooser . showDialog ( primaryStage ) ;
2017-11-24 21:36:03 +01:00
String updatePath = selectedDirecroty . getAbsolutePath ( ) ;
2017-11-24 17:07:53 +01:00
String [ ] parts = selectedGameTitleID . split ( " - " ) ; // split string into 2 parts at "-"
2017-11-24 21:36:03 +01:00
File srcDir = new File ( updatePath ) ;
2019-01-22 19:21:38 +01:00
File destDir = new File ( XMLController . getCemuPath ( ) + " /mlc01/usr/title/ " + parts [ 0 ] + " / " + parts [ 1 ] ) ;
2017-11-24 21:36:03 +01:00
// if directory doesn't exist create it
if ( destDir . exists ( ) ! = true ) {
destDir . mkdir ( ) ;
}
try {
LOGGER . info ( " copying the content of " + updatePath + " to " + destDir . toString ( ) ) ;
2019-04-09 00:42:39 +02:00
playBtn . setText ( bundle . getString ( " playBtnUpdating " ) ) ;
2017-11-24 21:36:03 +01:00
playBtn . setDisable ( true ) ;
2017-12-26 17:33:14 +01:00
FileUtils . copyDirectory ( srcDir , destDir ) ;
2019-04-09 00:42:39 +02:00
playBtn . setText ( bundle . getString ( " playBtnPlay " ) ) ;
2017-11-22 23:30:20 +01:00
playBtn . setDisable ( false ) ;
LOGGER . info ( " copying files done! " ) ;
} catch ( IOException e ) {
e . printStackTrace ( ) ;
}
2017-11-24 21:36:03 +01:00
}
} ;
EventHandler < ActionEvent > cancelAction = new EventHandler < ActionEvent > ( ) {
2017-11-22 23:30:20 +01:00
@Override
public void handle ( ActionEvent event ) {
2017-12-12 11:19:33 +01:00
LOGGER . info ( " Action canceld by user! " ) ;
2017-03-23 13:44:21 +01:00
}
2017-11-22 23:30:20 +01:00
} ;
2017-11-24 21:36:03 +01:00
2019-04-09 00:42:39 +02:00
String headingText = bundle . getString ( " addUpdateHeadingText " ) + " \" " + selectedGameTitle + " \" " ;
JFXOkayCancelAlert updateGameAlert = new JFXOkayCancelAlert ( headingText ,
bundle . getString ( " addUpdateBodyText " ) , dialogBtnStyle , primaryStage ) ;
updateGameAlert . setOkayAction ( okayAction ) ;
updateGameAlert . setCancelAction ( cancelAction ) ;
updateGameAlert . showAndWait ( ) ;
2017-11-24 21:36:03 +01:00
} catch ( Exception e ) {
LOGGER . warn ( " trying to update " + selectedGameTitleID + " ,which is not a valid type! " , e ) ;
}
}
2017-03-23 13:44:21 +01:00
} ) ;
addDLC . setOnAction ( new EventHandler < ActionEvent > ( ) {
2017-11-24 21:36:03 +01:00
@Override
public void handle ( ActionEvent event ) {
try {
LOGGER . info ( " add DLC: " + selectedGameTitleID ) ;
2019-04-09 00:42:39 +02:00
String headingText = bundle . getString ( " addDLCHeadingText " ) + " \" " + selectedGameTitle + " \" " ;
2017-11-24 21:36:03 +01:00
EventHandler < ActionEvent > okayAction = new EventHandler < ActionEvent > ( ) {
@Override
public void handle ( ActionEvent event ) {
DirectoryChooser directoryChooser = new DirectoryChooser ( ) ;
2019-01-22 19:21:38 +01:00
File selectedDirecroty = directoryChooser . showDialog ( primaryStage ) ;
2017-11-24 21:36:03 +01:00
String dlcPath = selectedDirecroty . getAbsolutePath ( ) ;
String [ ] parts = selectedGameTitleID . split ( " - " ) ; // split string into 2 parts at "-"
File srcDir = new File ( dlcPath ) ;
2019-01-22 19:21:38 +01:00
File destDir = new File ( XMLController . getCemuPath ( ) + " /mlc01/usr/title/ " + parts [ 0 ] + " / " + parts [ 1 ] + " /aoc " ) ;
2017-11-24 21:36:03 +01:00
// if directory doesn't exist create it
if ( destDir . exists ( ) ! = true ) {
destDir . mkdir ( ) ;
}
try {
LOGGER . info ( " copying the content of " + dlcPath + " to " + destDir . toString ( ) ) ;
2019-04-09 00:42:39 +02:00
playBtn . setText ( bundle . getString ( " playBtnCopyingFiles " ) ) ;
2017-11-24 21:36:03 +01:00
playBtn . setDisable ( true ) ;
2017-12-26 17:33:14 +01:00
FileUtils . copyDirectory ( srcDir , destDir ) ;
2019-04-09 00:42:39 +02:00
playBtn . setText ( bundle . getString ( " playBtnPlay " ) ) ;
2017-11-24 21:36:03 +01:00
playBtn . setDisable ( false ) ;
LOGGER . info ( " copying files done! " ) ;
} catch ( IOException e ) {
e . printStackTrace ( ) ;
}
}
} ;
2017-11-22 23:30:20 +01:00
EventHandler < ActionEvent > cancelAction = new EventHandler < ActionEvent > ( ) {
@Override
public void handle ( ActionEvent event ) {
2017-12-12 11:19:33 +01:00
LOGGER . info ( " Action canceld by user! " ) ;
2017-03-26 14:21:19 +02:00
}
2017-11-22 23:30:20 +01:00
} ;
2019-04-09 00:42:39 +02:00
JFXOkayCancelAlert addDLCAlert = new JFXOkayCancelAlert ( headingText ,
bundle . getString ( " addDLCBodyText " ) , dialogBtnStyle , primaryStage ) ;
addDLCAlert . setOkayAction ( okayAction ) ;
addDLCAlert . setCancelAction ( cancelAction ) ;
addDLCAlert . showAndWait ( ) ;
2017-11-24 21:36:03 +01:00
} catch ( Exception e ) {
LOGGER . warn ( " trying to add a dlc to " + selectedGameTitleID + " ,which is not a valid type! " , e ) ;
}
}
2017-03-23 13:44:21 +01:00
} ) ;
gamesAnchorPane . addEventHandler ( MouseEvent . MOUSE_CLICKED , new EventHandler < MouseEvent > ( ) {
2017-11-24 21:36:03 +01:00
@Override
public void handle ( MouseEvent event ) {
if ( playTrue ) {
playBtnSlideOut ( ) ;
2017-03-23 13:44:21 +01:00
}
2017-11-24 21:36:03 +01:00
}
2017-03-23 13:44:21 +01:00
} ) ;
topHBox . addEventHandler ( MouseEvent . MOUSE_CLICKED , new EventHandler < MouseEvent > ( ) {
2017-11-24 21:36:03 +01:00
@Override
public void handle ( MouseEvent event ) {
if ( playTrue ) {
playBtnSlideOut ( ) ;
2017-03-23 13:44:21 +01:00
}
2017-11-24 21:36:03 +01:00
}
2017-03-23 13:44:21 +01:00
} ) ;
2017-06-16 16:23:03 +02:00
2017-12-11 10:31:23 +01:00
courseSearchTextFiled . textProperty ( ) . addListener ( new ChangeListener < String > ( ) {
@Override
public void changed ( ObservableValue < ? extends String > observable , String oldValue , String newValue ) {
filteredCourses . removeAll ( filteredCourses ) ;
root . getChildren ( ) . remove ( 0 , root . getChildren ( ) . size ( ) ) ;
for ( int i = 0 ; i < courses . size ( ) ; i + + ) {
2019-04-09 00:42:39 +02:00
if ( courses . get ( i ) . getTitle ( ) . toLowerCase ( ) . contains ( courseSearchTextFiled . getText ( ) . toLowerCase ( ) ) ) {
2017-12-11 10:31:23 +01:00
// add data from courses to filteredCourses where title contains search input
filteredCourses . add ( courses . get ( i ) ) ;
}
}
for ( int i = 0 ; i < filteredCourses . size ( ) ; i + + ) {
CourseTableDataType helpCourse = new CourseTableDataType ( filteredCourses . get ( i ) . getTitle ( ) ,
filteredCourses . get ( i ) . getId ( ) , filteredCourses . get ( i ) . getTime ( ) ,
filteredCourses . get ( i ) . getStars ( ) ) ;
root . getChildren ( ) . add ( new TreeItem < CourseTableDataType > ( helpCourse ) ) ; // add data to root-node
}
}
} ) ;
2017-11-24 17:07:53 +01:00
// Change-listener for TreeTable
2017-11-24 21:36:03 +01:00
courseTreeTable . getSelectionModel ( ) . selectedItemProperty ( ) . addListener ( new ChangeListener < Object > ( ) {
@Override
public void changed ( ObservableValue < ? > observable , Object oldVal , Object newVal ) {
selected = courseTreeTable . getSelectionModel ( ) . getSelectedIndex ( ) ; // get selected item
2017-08-26 00:13:09 +02:00
2017-11-24 21:36:03 +01:00
id = idColumn . getCellData ( selected ) ; // get name of selected item
for ( int i = 0 ; i < courses . size ( ) ; i + + ) {
if ( courses . get ( i ) . getId ( ) = = id ) {
try {
URL url = new URL ( " https://smmdb.ddns.net/courseimg/ " + id + " _full?v=1 " ) ;
2017-12-11 16:44:47 +01:00
Image sourceImage = new Image ( url . toURI ( ) . toString ( ) ) ;
2017-12-11 11:31:39 +01:00
2017-12-11 16:44:47 +01:00
// scale image to 142px
double scalefactor = 142 / sourceImage . getHeight ( ) ; // calculate scaling factor
int nWidth = ( int ) Math . rint ( scalefactor * sourceImage . getWidth ( ) ) ;
int nHeight = ( int ) Math . rint ( scalefactor * sourceImage . getHeight ( ) ) ;
Image scaledImage = new Image ( url . toURI ( ) . toString ( ) , nWidth , nHeight , false , true ) ; // generate a scaled image
2017-12-11 11:31:39 +01:00
2017-12-11 16:44:47 +01:00
smmdbImageView . setFitWidth ( scaledImage . getWidth ( ) ) ; // set ImageView width to the image width
smmdbImageView . setImage ( scaledImage ) ; // set imageview to image
2017-11-24 21:36:03 +01:00
} catch ( MalformedURLException | URISyntaxException e ) {
2017-12-11 16:44:47 +01:00
LOGGER . warn ( " There was either a problem or no image! " , e ) ;
2017-11-24 21:36:03 +01:00
smmdbImageView . setImage ( close_black ) ;
2017-06-16 23:35:56 +02:00
}
2017-11-24 21:36:03 +01:00
addCourseDescription ( courses . get ( i ) ) ;
}
2017-06-16 16:23:03 +02:00
}
2017-11-24 21:36:03 +01:00
}
} ) ;
2017-07-16 00:13:43 +02:00
2019-05-16 15:09:01 +02:00
helpLbl . setOnMouseClicked ( e - > {
if ( e . getButton ( ) . equals ( MouseButton . PRIMARY ) ) {
Main . getMain ( ) . getHostServices ( ) . showDocument ( " https://git.mosad.xyz/Seil0/cemu_UI/issues/3 " ) ;
2017-11-24 21:36:03 +01:00
}
2017-07-16 00:13:43 +02:00
} ) ;
2017-12-19 19:08:12 +01:00
2019-05-16 15:09:01 +02:00
languageChoisBox . getSelectionModel ( ) . selectedIndexProperty ( ) . addListener ( ( e , oldValue , newValue ) - > {
String language = languageChoisBox . getItems ( ) . get ( ( int ) newValue ) . toString ( ) ;
language = language . substring ( language . length ( ) - 6 , language . length ( ) - 1 ) ; // reading only en_US from
// English (en_US)
XMLController . setUsrLocal ( language ) ;
setUILanguage ( ) ;
xmlController . saveSettings ( ) ;
2019-01-22 19:21:38 +01:00
} ) ;
2017-11-24 21:36:03 +01:00
2019-05-16 15:09:01 +02:00
branchChoisBox . getSelectionModel ( ) . selectedIndexProperty ( ) . addListener ( ( e , oldValue , newValue ) - > {
if ( branchChoisBox . getItems ( ) . get ( ( int ) newValue ) . toString ( ) = = " beta " ) {
XMLController . setUseBeta ( true ) ;
} else {
XMLController . setUseBeta ( false ) ;
2017-11-24 21:36:03 +01:00
}
2019-05-16 15:09:01 +02:00
xmlController . saveSettings ( ) ;
2017-11-24 21:36:03 +01:00
} ) ;
2017-11-20 11:32:14 +01:00
2019-05-16 15:09:01 +02:00
licensesLbl . setOnMouseClicked ( e - > {
if ( e . getButton ( ) . equals ( MouseButton . PRIMARY ) ) {
2017-12-19 21:35:49 +01:00
2019-05-16 15:09:01 +02:00
EventHandler < ActionEvent > cancelAction = cE - > {
String bodyText = " " ;
2017-12-06 13:39:00 +01:00
2019-05-16 15:09:01 +02:00
try {
BufferedReader licenseBR = new BufferedReader (
new InputStreamReader ( getClass ( ) . getResourceAsStream ( " /licenses/licenses_show.txt " ) ) ) ;
String currentLine ;
while ( ( currentLine = licenseBR . readLine ( ) ) ! = null ) {
bodyText = bodyText + currentLine + " \ n " ;
2017-11-26 11:35:02 +01:00
}
2019-05-16 15:09:01 +02:00
licenseBR . close ( ) ;
} catch ( IOException ex ) {
LOGGER . error ( " Cloud not read the license file! " , ex ) ;
}
JFXTextAreaInfoDialog licenseDialog = new JFXTextAreaInfoDialog ( " cemu_UI " , " " ,
dialogBtnStyle , 510 , 450 , main . getPane ( ) ) ;
licenseDialog . getTextArea ( ) . setEditable ( false ) ;
licenseDialog . show ( ) ;
} ;
JFXOkayCancelAlert licenseOverviewAlert = new JFXOkayCancelAlert (
bundle . getString ( " licensesLblHeadingText " ) , bundle . getString ( " licensesLblBodyText " ) ,
dialogBtnStyle , primaryStage ) ;
licenseOverviewAlert . setOkayAction ( oE - > { } ) ;
licenseOverviewAlert . setCancelAction ( cancelAction ) ;
licenseOverviewAlert . setCancelText ( bundle . getString ( " showLicenses " ) ) ;
licenseOverviewAlert . showAndWait ( ) ;
}
2017-11-20 11:32:14 +01:00
} ) ;
2018-01-19 01:14:01 +01:00
2019-05-16 15:09:01 +02:00
cemuTextField . textProperty ( ) . addListener ( ( e , oldValue , newValue ) - > {
if ( new File ( newValue ) . exists ( ) ) {
XMLController . setCemuPath ( newValue ) ;
xmlController . saveSettings ( ) ;
} else {
String bodyText = newValue + " : No such file or directory " ;
JFXInfoAlert fileErrorDialog = new JFXInfoAlert ( " Waring! " , bodyText , dialogBtnStyle , primaryStage ) ;
fileErrorDialog . showAndWait ( ) ;
LOGGER . warn ( newValue + " : No such file or directory " ) ;
2018-01-19 01:14:01 +01:00
}
} ) ;
2019-05-16 15:09:01 +02:00
romTextField . textProperty ( ) . addListener ( ( e , oldValue , newValue ) - > {
if ( new File ( newValue ) . exists ( ) ) {
XMLController . setRomDirectoryPath ( newValue ) ;
xmlController . saveSettings ( ) ;
reloadRoms ( ) ;
} else {
String bodyText = newValue + " : No such file or directory " ;
JFXInfoAlert fileErrorDialog = new JFXInfoAlert ( " Waring! " , bodyText , dialogBtnStyle , primaryStage ) ;
fileErrorDialog . showAndWait ( ) ;
LOGGER . warn ( newValue + " : No such file or directory " ) ;
2018-01-19 01:14:01 +01:00
}
} ) ;
2017-09-15 19:23:44 +02:00
2017-08-27 20:44:08 +02:00
LOGGER . info ( " initializing Actions done! " ) ;
2017-03-23 13:44:21 +01:00
}
2017-11-24 21:36:03 +01:00
@FXML
2018-06-12 16:24:12 +02:00
private void detailsSlideoutBtnAction ( ) {
2017-11-24 21:36:03 +01:00
playBtnSlideOut ( ) ;
}
2017-03-23 13:44:21 +01:00
@FXML
2018-06-12 16:01:21 +02:00
private void aboutBtnAction ( ) {
2017-11-10 17:11:19 +01:00
String bodyText = " cemu_UI by @Seil0 \ nVersion: " + version + " ( " + buildNumber + " ) \" " + versionName + " \" \ n "
2019-04-09 00:42:39 +02:00
+ bundle . getString ( " aboutBtnBodyText " ) ;
2018-06-12 16:01:21 +02:00
2019-04-09 00:42:39 +02:00
JFXInfoAlert infoAlert = new JFXInfoAlert ( bundle . getString ( " aboutBtnHeadingText " ) , bodyText , dialogBtnStyle , primaryStage ) ;
2018-06-12 16:01:21 +02:00
infoAlert . showAndWait ( ) ;
2017-03-23 16:17:38 +01:00
}
2017-03-23 13:44:21 +01:00
2017-11-24 21:36:03 +01:00
@FXML
2018-06-12 16:24:12 +02:00
private void settingsBtnAction ( ) {
2019-04-09 00:42:39 +02:00
if ( smmdbAnchorPane . isVisible ( ) ) {
2017-11-24 21:36:03 +01:00
smmdbAnchorPane . setVisible ( false ) ;
}
2019-04-09 00:42:39 +02:00
settingsScrollPane . setVisible ( ! settingsScrollPane . isVisible ( ) ) ;
xmlController . saveSettings ( ) ; // saving settings to be sure
2017-11-24 21:36:03 +01:00
}
2017-03-23 13:44:21 +01:00
2017-11-24 21:36:03 +01:00
@FXML
2018-06-12 16:24:12 +02:00
private void reloadRomsBtnAction ( ) throws IOException {
2018-01-31 17:01:47 +01:00
reloadRoms ( ) ;
2017-11-24 21:36:03 +01:00
}
2017-03-25 15:18:45 +01:00
2017-11-24 21:36:03 +01:00
@FXML
2018-06-12 16:24:12 +02:00
private void smmdbBtnAction ( ) {
2017-11-24 21:36:03 +01:00
// show smmdbAnchorPane
2019-04-09 00:42:39 +02:00
smmdbAnchorPane . setVisible ( ! smmdbAnchorPane . isVisible ( ) ) ;
if ( smmdbAnchorPane . isVisible ( ) ) {
2017-12-09 13:10:19 +01:00
// start query in new thread
Thread thread = new Thread ( new Runnable ( ) {
@Override
public void run ( ) {
Platform . runLater ( ( ) - > {
2019-04-09 00:42:39 +02:00
smmdbDownloadBtn . setText ( bundle . getString ( " smmdbDownloadBtnLoading " ) ) ;
2017-12-09 13:10:19 +01:00
smmdbDownloadBtn . setDisable ( true ) ;
root . getChildren ( ) . remove ( 0 , root . getChildren ( ) . size ( ) ) ;
} ) ;
courses . removeAll ( courses ) ; // remove existing courses
courses . addAll ( smmdbAPIController . startQuery ( ) ) ; // start query
// add query response to courseTreeTable
for ( int i = 0 ; i < courses . size ( ) ; i + + ) {
CourseTableDataType helpCourse = new CourseTableDataType ( courses . get ( i ) . getTitle ( ) ,
courses . get ( i ) . getId ( ) , courses . get ( i ) . getTime ( ) , courses . get ( i ) . getStars ( ) ) ;
Platform . runLater ( ( ) - > {
root . getChildren ( ) . add ( new TreeItem < CourseTableDataType > ( helpCourse ) ) ; // add data to root-node
2019-04-09 00:42:39 +02:00
smmdbDownloadBtn . setText ( bundle . getString ( " smmdbDownloadBtnDownload " ) ) ;
2017-12-09 13:10:19 +01:00
smmdbDownloadBtn . setDisable ( false ) ;
} ) ;
}
}
} ) ;
thread . start ( ) ;
2017-11-24 21:36:03 +01:00
}
}
2017-03-25 15:18:45 +01:00
2017-11-24 21:36:03 +01:00
@FXML
2018-06-12 16:24:12 +02:00
private void playBtnAction ( ) throws InterruptedException , IOException {
2017-11-24 21:36:03 +01:00
dbController . setLastPlayed ( selectedGameTitleID ) ;
playGame = new playGame ( this , dbController ) ;
playGame . start ( ) ;
}
@FXML
2018-06-12 16:24:12 +02:00
private void totalPlaytimeBtnAction ( ) {
2018-02-18 18:27:36 +01:00
2017-11-24 21:36:03 +01:00
}
@FXML
2018-06-12 16:24:12 +02:00
private void lastTimePlayedBtnAction ( ) {
2018-02-18 13:57:30 +01:00
2017-11-24 21:36:03 +01:00
}
2017-03-23 13:44:21 +01:00
2017-11-24 21:36:03 +01:00
@FXML
2018-06-12 16:24:12 +02:00
private void cemuTFBtnAction ( ) {
2019-01-22 19:21:38 +01:00
File cemuDirectory = directoryChooser . showDialog ( primaryStage ) ;
2018-02-18 18:27:36 +01:00
if ( cemuDirectory ! = null ) {
cemuTextField . setText ( cemuDirectory . getAbsolutePath ( ) ) ;
2017-11-24 21:36:03 +01:00
}
}
2017-03-23 13:44:21 +01:00
2017-11-24 21:36:03 +01:00
@FXML
2018-06-12 16:24:12 +02:00
private void romTFBtnAction ( ) {
2019-01-22 19:21:38 +01:00
File romDirectory = directoryChooser . showDialog ( primaryStage ) ;
2018-02-18 18:27:36 +01:00
if ( romDirectory ! = null ) {
romTextField . setText ( romDirectory . getAbsolutePath ( ) ) ;
2017-11-24 21:36:03 +01:00
}
}
2017-03-23 13:44:21 +01:00
2017-11-24 21:36:03 +01:00
@FXML
2018-06-12 16:24:12 +02:00
private void updateBtnAction ( ) {
2019-01-22 19:21:38 +01:00
updateController = new UpdateController ( this , buildNumber , XMLController . isUseBeta ( ) ) ;
2017-11-06 10:42:31 +01:00
Thread updateThread = new Thread ( updateController ) ;
updateThread . setName ( " Updater " ) ;
2017-11-24 21:36:03 +01:00
updateThread . start ( ) ;
2017-10-24 22:41:56 +02:00
}
2017-11-24 21:36:03 +01:00
@FXML
2018-06-12 16:24:12 +02:00
private void autoUpdateToggleBtnAction ( ) {
2019-01-22 19:21:38 +01:00
XMLController . setAutoUpdate ( ! XMLController . isAutoUpdate ( ) ) ;
xmlController . saveSettings ( ) ;
2017-11-24 21:36:03 +01:00
}
2017-12-11 10:31:23 +01:00
@FXML
2018-06-12 16:24:12 +02:00
private void courseSearchTextFiledAction ( ) {
2017-12-11 10:31:23 +01:00
// not in use
}
2017-10-24 22:41:56 +02:00
2017-06-18 00:33:07 +02:00
@FXML
2018-06-12 16:24:12 +02:00
private void smmdbDownloadBtnAction ( ) {
2017-08-25 14:57:15 +02:00
String downloadUrl = " http://smmdb.ddns.net/api/downloadcourse?id= " + id + " &type=zip " ;
2019-01-22 19:21:38 +01:00
String downloadFileURL = XMLController . getCemuPath ( ) + " / " + id + " .zip " ; // getCemuPath() + "/" + smmID + "/" + id + ".rar"
String outputFile = XMLController . getCemuPath ( ) + " / " ;
2017-07-13 22:26:32 +02:00
2017-06-18 00:33:07 +02:00
try {
2017-12-09 13:10:19 +01:00
LOGGER . info ( " beginning download ... " ) ;
2017-06-18 14:45:13 +02:00
HttpURLConnection conn = ( HttpURLConnection ) new URL ( downloadUrl ) . openConnection ( ) ;
ProgressMonitorInputStream pmis = new ProgressMonitorInputStream ( null , " Downloading... " , conn . getInputStream ( ) ) ;
ProgressMonitor pm = pmis . getProgressMonitor ( ) ;
pm . setMillisToDecideToPopup ( 0 ) ;
pm . setMillisToPopup ( 0 ) ;
pm . setMinimum ( 0 ) ; // tell the progress bar that we start at the beginning of the stream
pm . setMaximum ( conn . getContentLength ( ) ) ; // tell the progress bar the total number of bytes we are going to read.
2017-11-24 17:07:53 +01:00
FileUtils . copyInputStreamToFile ( pmis , new File ( downloadFileURL ) ) ; // download file + "/mlc01/emulatorSave"
2017-07-16 00:13:43 +02:00
pmis . close ( ) ;
2017-08-30 11:29:58 +02:00
LOGGER . info ( " downloaded successfull " ) ;
2017-07-16 00:13:43 +02:00
File downloadFile = new File ( downloadFileURL ) ;
2017-08-26 00:13:09 +02:00
String source = downloadFileURL ;
String destination = null ;
2017-08-27 17:25:41 +02:00
int highestCourseNumber = 0 ;
String courseName = null ;
2017-08-26 00:13:09 +02:00
for ( int i = 0 ; i < smmIDs . size ( ) ; i + + ) {
2017-08-27 17:25:41 +02:00
File smmDirectory = new File ( outputFile + " mlc01/emulatorSave/ " + smmIDs . get ( i ) ) ;
if ( smmDirectory . exists ( ) ) {
2017-12-11 15:51:04 +01:00
LOGGER . info ( " found smm directory: " + smmDirectory . getAbsolutePath ( ) ) ;
2017-08-27 17:25:41 +02:00
File [ ] courses = smmDirectory . listFiles ( File : : isDirectory ) ;
2017-11-24 17:07:53 +01:00
// get all existing courses in smm directory, new name is highest number +1
2017-08-27 17:25:41 +02:00
for ( int j = 0 ; j < courses . length ; j + + ) {
int courseNumber = Integer . parseInt ( courses [ j ] . getName ( ) . substring ( 6 ) ) ;
if ( courseNumber > highestCourseNumber ) {
highestCourseNumber = courseNumber ;
}
2017-08-26 00:13:09 +02:00
}
2017-08-27 17:25:41 +02:00
String number = " 000 " + ( highestCourseNumber + 1 ) ;
courseName = " course " + number . substring ( number . length ( ) - 3 , number . length ( ) ) ;
2017-12-09 13:10:19 +01:00
File courseDirectory = new File ( outputFile + " mlc01/emulatorSave/ " + smmIDs . get ( i ) + " / " ) ;
2017-08-26 00:13:09 +02:00
destination = courseDirectory . getPath ( ) ;
2017-12-09 13:10:19 +01:00
}
2017-07-13 22:26:32 +02:00
}
2017-07-16 00:13:43 +02:00
2017-12-09 13:10:19 +01:00
if ( destination ! = null ) {
try {
ZipFile zipFile = new ZipFile ( source ) ;
zipFile . extractAll ( destination ) ;
// rename zip-file
File course = new File ( destination + " /course000 " ) ;
course . renameTo ( new File ( destination + " / " + courseName ) ) ;
LOGGER . info ( " Added new course: " + courseName + " , full path is: " + destination + " / " + courseName ) ;
} catch ( ZipException e ) {
LOGGER . error ( " an error occurred during unziping the file! " , e ) ;
}
2017-07-13 22:26:32 +02:00
}
2017-08-27 17:25:41 +02:00
2017-07-16 00:13:43 +02:00
downloadFile . delete ( ) ;
2017-06-18 14:45:13 +02:00
} catch ( IOException e ) {
2017-08-30 11:29:58 +02:00
LOGGER . error ( " something went wrong during downloading the course " , e ) ;
2017-06-18 00:33:07 +02:00
}
}
2017-11-24 21:36:03 +01:00
@FXML
2018-06-12 16:24:12 +02:00
private void fullscreenToggleBtnAction ( ) {
2019-01-22 19:21:38 +01:00
XMLController . setFullscreen ( ! XMLController . isFullscreen ( ) ) ;
xmlController . saveSettings ( ) ;
2017-11-24 21:36:03 +01:00
}
2017-04-17 00:58:49 +02:00
@FXML
2018-06-12 16:24:12 +02:00
private void cloudSyncToggleBtnAction ( ) {
2019-01-22 19:21:38 +01:00
XMLController . setCloudSync ( ! XMLController . isCloudSync ( ) ) ;
2019-05-16 15:09:01 +02:00
if ( XMLController . isCloudSync ( ) ) {
EventHandler < ActionEvent > okayAction = e - > {
// TODO rework for other cloud services
// CloudService service = CloudService.GoogleDrive;
XMLController . setCloudService ( CloudService . GoogleDrive ) ;
// start cloud sync in new thread
Thread thread = new Thread ( new Runnable ( ) {
@Override
public void run ( ) {
if ( main . getCloudController ( ) . initializeConnection ( XMLController . getCloudService ( ) ,
XMLController . getCemuPath ( ) ) ) {
main . getCloudController ( ) . sync ( XMLController . getCloudService ( ) , XMLController . getCemuPath ( ) ,
XMLController . getDirCemuUIPath ( ) ) ;
xmlController . saveSettings ( ) ;
} else {
cloudSyncToggleBtn . setSelected ( false ) ;
// cloud sync init error dialog
JFXInfoAlert cloudSyncErrorDialog = new JFXInfoAlert (
bundle . getString ( " cloudSyncErrorHeadingText " ) ,
bundle . getString ( " cloudSyncErrorBodyText " ) , dialogBtnStyle , primaryStage ) ;
cloudSyncErrorDialog . showAndWait ( ) ;
2018-02-04 15:19:36 +01:00
}
2019-05-16 15:09:01 +02:00
}
} ) ;
thread . start ( ) ;
} ;
2019-04-09 00:42:39 +02:00
JFXOkayCancelAlert cloudSyncWarningAlert = new JFXOkayCancelAlert (
bundle . getString ( " cloudSyncWaringHeadingText " ) , bundle . getString ( " cloudSyncWaringHeadingText " ) ,
dialogBtnStyle , primaryStage ) ;
cloudSyncWarningAlert . setOkayAction ( okayAction ) ;
2019-05-16 15:09:01 +02:00
cloudSyncWarningAlert . setCancelAction ( e - > cloudSyncToggleBtn . setSelected ( false ) ) ;
2019-04-09 00:42:39 +02:00
cloudSyncWarningAlert . showAndWait ( ) ;
2019-05-16 15:09:01 +02:00
}
2017-03-23 13:44:21 +01:00
}
2017-11-24 21:36:03 +01:00
@FXML
2018-06-12 16:24:12 +02:00
private void colorPickerAction ( ) {
2017-11-24 21:36:03 +01:00
editColor ( colorPicker . getValue ( ) . toString ( ) ) ;
applyColor ( ) ;
}
2017-03-23 13:44:21 +01:00
2017-11-24 21:36:03 +01:00
@FXML
2018-06-12 16:24:12 +02:00
private void addBtnAction ( ) {
2019-04-09 00:42:39 +02:00
JFXEditGameDialog addGameDialog = new JFXEditGameDialog ( bundle . getString ( " addGameBtnHeadingText " ) ,
bundle . getString ( " addGameBtnBodyText " ) , dialogBtnStyle , 450 , 300 , 0 , this , primaryStage ,
main . getPane ( ) ) ;
2017-11-15 15:58:23 +01:00
addGameDialog . show ( ) ;
2017-11-24 21:36:03 +01:00
}
2017-11-15 21:21:52 +01:00
/ * *
* process the returning data from the addGame dialog
* and add them to the database and the UI
* /
public void addBtnReturn ( String title , String coverPath , String romPath , String titleID ) {
2017-11-15 15:58:23 +01:00
/ * *
2017-11-04 17:04:21 +01:00
* if one parameter dosen ' t contain any value do not add the game
2017-10-31 14:11:17 +01:00
* else convert the cover to . png add copy it into the picture cache ,
2017-03-23 13:44:21 +01:00
* then add the rom to the local_roms database
* /
2017-10-31 14:11:17 +01:00
if ( romPath . length ( ) = = 0 | | coverPath . length ( ) = = 0 | | title . length ( ) = = 0 | | titleID . length ( ) = = 0 ) {
2017-08-30 11:29:58 +02:00
LOGGER . info ( " No parameter set! " ) ;
2017-11-06 10:00:10 +01:00
//addGame error dialog
2019-04-09 00:42:39 +02:00
JFXInfoAlert errorDialog = new JFXInfoAlert ( bundle . getString ( " addBtnReturnErrorHeadingText " ) ,
bundle . getString ( " addBtnReturnErrorBodyText " ) , dialogBtnStyle , primaryStage ) ;
2018-06-12 16:01:21 +02:00
errorDialog . showAndWait ( ) ;
2017-11-15 15:58:23 +01:00
2017-12-12 12:02:28 +01:00
} else {
2019-01-22 19:21:38 +01:00
File pictureCache = XMLController . getPictureCache ( ) ;
2017-11-15 15:58:23 +01:00
String coverName = new File ( coverPath ) . getName ( ) ;
2017-03-23 13:44:21 +01:00
try {
2017-10-30 17:52:45 +01:00
BufferedImage originalImage = ImageIO . read ( new File ( coverPath ) ) ; //load cover
2017-03-26 14:21:19 +02:00
int type = originalImage . getType ( ) = = 0 ? BufferedImage . TYPE_INT_ARGB : originalImage . getType ( ) ;
BufferedImage resizeImagePNG = resizeImage ( originalImage , type , 400 , 600 ) ;
2017-12-12 19:19:01 +01:00
coverPath = pictureCache + " / " + coverName ;
2017-12-12 12:02:28 +01:00
ImageIO . write ( resizeImagePNG , " png " , new File ( coverPath ) ) ; //save image to pictureCache
2017-03-23 13:44:21 +01:00
} catch ( IOException e ) {
2017-10-30 17:52:45 +01:00
LOGGER . error ( " Ops something went wrong! Error while resizing cover. " , e ) ;
2017-03-23 13:44:21 +01:00
}
2017-11-24 21:36:03 +01:00
try {
2017-11-27 10:57:16 +01:00
dbController . addGame ( title , coverPath , romPath , titleID , " " , " " , " " , " 0 " ) ;
dbController . loadSingleGame ( titleID ) ;
2017-11-24 21:36:03 +01:00
if ( menuTrue ) {
2017-11-15 21:21:52 +01:00
sideMenuSlideOut ( ) ;
burgerTask . setRate ( - 1 . 0 ) ;
burgerTask . play ( ) ;
menuTrue = false ;
}
2017-10-30 18:28:58 +01:00
refreshUIData ( ) ;
2017-03-23 13:44:21 +01:00
} catch ( SQLException e ) {
2017-10-30 17:52:45 +01:00
LOGGER . error ( " Oops, something went wrong! Error while adding a game. " , e ) ;
2017-03-23 13:44:21 +01:00
}
}
}
2017-11-15 15:58:23 +01:00
2017-11-24 21:36:03 +01:00
public void editBtnReturn ( String title , String coverPath , String romPath , String titleID ) {
2017-11-15 21:21:52 +01:00
dbController . setGameInfo ( title , coverPath , romPath , titleID ) ;
games . remove ( selectedUIDataIndex ) ;
2017-11-27 10:57:16 +01:00
dbController . loadSingleGame ( titleID ) ;
2017-11-15 21:21:52 +01:00
refreshUIData ( ) ;
2017-11-24 21:36:03 +01:00
2017-11-15 21:21:52 +01:00
LOGGER . info ( " successfully edited " + titleID + " , new name is \" " + title + " \" " ) ;
2017-11-24 21:36:03 +01:00
}
2017-11-15 21:21:52 +01:00
2017-05-25 19:07:16 +02:00
/ * *
2017-10-15 13:37:45 +02:00
* add game to games ( ArrayList ) and initialize all needed actions ( start , time stamps , titleID )
2017-05-25 19:07:16 +02:00
* @param title : game title
* @param coverPath : path to cover ( cache )
2017-10-15 13:37:45 +02:00
* @param romPath : path to ROM file ( . rpx )
2017-11-27 10:57:16 +01:00
* @param titleID : game ID
2017-05-25 19:07:16 +02:00
* /
2017-11-13 16:44:39 +01:00
public void addGame ( String title , String coverPath , String romPath , String titleID ) {
2019-05-15 16:39:00 +02:00
UIROMDataType uiROMElement = new UIROMDataType ( title , coverPath , gameContextMenu ) ;
2017-03-23 13:44:21 +01:00
2017-10-15 13:37:45 +02:00
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 ) ) {
2017-12-19 22:18:22 +01:00
lastTimePlayedBtn . setText ( lastPlayed + never ) ;
2017-10-15 13:37:45 +02:00
totalPlaytimeBtn . setText ( dbController . getTotalPlaytime ( titleID ) + " min " ) ;
} else {
DateTimeFormatter dtf = DateTimeFormatter . ofPattern ( " yyyy-MM-dd " ) ;
2017-12-19 21:35:49 +01:00
int tToday = Integer . parseInt ( dtf . format ( LocalDate . now ( ) ) . replaceAll ( " - " , " " ) ) ;
int tYesterday = Integer . parseInt ( dtf . format ( LocalDate . now ( ) . minusDays ( 1 ) ) . replaceAll ( " - " , " " ) ) ;
int tLastPlayedDay = Integer . parseInt ( dbController . getLastPlayed ( titleID ) . replaceAll ( " - " , " " ) ) ;
2017-10-15 13:37:45 +02:00
2017-12-19 21:35:49 +01:00
if ( tLastPlayedDay = = tToday ) {
lastTimePlayedBtn . setText ( lastPlayed + today ) ;
} else if ( tLastPlayedDay = = tYesterday ) {
lastTimePlayedBtn . setText ( lastPlayed + yesterday ) ;
2017-10-15 13:37:45 +02:00
} else {
2017-12-19 21:35:49 +01:00
lastTimePlayedBtn . setText ( lastPlayed + dbController . getLastPlayed ( titleID ) ) ;
2017-10-15 13:37:45 +02:00
}
}
2017-11-24 17:07:53 +01:00
/ * *
* setting total playtime , if total playtime > 60 minutes , format is " x hours x
* minutes " (x h x min), else only minutes are showed
* /
2017-10-15 13:37:45 +02:00
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 ( ) ;
2017-10-30 18:28:58 +01:00
burgerTask . setRate ( - 1 . 0 ) ;
burgerTask . play ( ) ;
menuTrue = false ;
2017-10-15 13:37:45 +02:00
}
}
} ) ;
// add uiROMElement to games list
games . add ( uiROMElement ) ;
2017-04-06 12:00:36 +02:00
}
2018-02-18 13:57:30 +01:00
/ * *
* reload all ROMs from the ROM directory
* /
2018-01-31 17:01:47 +01:00
public void reloadRoms ( ) {
JFXSpinner spinner = new JFXSpinner ( ) ;
spinner . setPrefSize ( 30 , 30 ) ;
AnchorPane . setTopAnchor ( spinner , ( main . getPane ( ) . getPrefHeight ( ) - spinner . getPrefHeight ( ) ) / 2 ) ;
AnchorPane . setLeftAnchor ( spinner , ( main . getPane ( ) . getPrefWidth ( ) - spinner . getPrefWidth ( ) ) / 2 ) ;
Thread thread = new Thread ( new Runnable ( ) {
@Override
public void run ( ) {
Platform . runLater ( ( ) - > {
//remove all games form gamesAnchorPane
gamesAnchorPane . getChildren ( ) . removeAll ( gamesAnchorPane . getChildren ( ) ) ;
main . getPane ( ) . getChildren ( ) . add ( spinner ) ; // add spinner to pane
} ) ;
2019-01-22 19:21:38 +01:00
dbController . loadRomDirectory ( XMLController . getRomDirectoryPath ( ) ) ; // reload the ROM directory
2018-01-31 17:01:47 +01:00
games . removeAll ( games ) ; // remove all games from the mwc game list
dbController . loadAllGames ( ) ; // load all games from the database to the mwc
Platform . runLater ( ( ) - > {
refreshUIData ( ) ; // refresh the list of games displayed on screen
main . getPane ( ) . getChildren ( ) . remove ( spinner ) ;
} ) ;
}
} ) ;
thread . start ( ) ;
}
2019-05-15 16:39:00 +02:00
// remove all games from gamesAnchorPane and add them afterwards
public void refreshUIData ( ) {
// remove all games form gamesAnchorPane
gamesAnchorPane . getChildren ( ) . clear ( ) ;
// reset position
xPos = - 200 ;
yPos = 17 ;
xNextElement = 0 ;
// add all games to gamesAnchorPane (UI)
2019-05-16 15:09:01 +02:00
// for (UIROMDataType game : games) {
// generatePosition();
//
// game.setLayoutX(xPos);
// game.setLayoutY(yPos);
// gamesAnchorPane.getChildren().add(game);
// }
// TODO
gamesFlowPane . getChildren ( ) . addAll ( games ) ;
2019-05-15 16:39:00 +02:00
}
2017-12-19 19:08:12 +01:00
2018-02-18 13:57:30 +01:00
// set the selected local strings to all needed elements
2017-12-19 19:08:12 +01:00
void setUILanguage ( ) {
2019-01-22 19:21:38 +01:00
switch ( XMLController . getUsrLocal ( ) ) {
2019-04-09 00:42:39 +02:00
case " en_US " :
XMLController . setLocalBundle ( ResourceBundle . getBundle ( " locals.cemu_UI-Local " , Locale . US ) ) ; // us_English
bundle = ResourceBundle . getBundle ( " locals.cemu_UI-Local " , Locale . US ) ; // us_English
2017-12-19 19:08:12 +01:00
languageChoisBox . getSelectionModel ( ) . select ( 0 ) ;
break ;
2019-04-09 00:42:39 +02:00
case " de_DE " :
XMLController . setLocalBundle ( ResourceBundle . getBundle ( " locals.cemu_UI-Local " , Locale . GERMAN ) ) ; // German
bundle = ResourceBundle . getBundle ( " locals.cemu_UI-Local " , Locale . GERMAN ) ; // German
languageChoisBox . getSelectionModel ( ) . select ( 1 ) ;
2017-12-19 19:08:12 +01:00
break ;
2019-04-09 00:42:39 +02:00
default :
XMLController . setLocalBundle ( ResourceBundle . getBundle ( " locals.cemu_UI-Local " , Locale . US ) ) ; // default local
bundle = ResourceBundle . getBundle ( " locals.cemu_UI-Local " , Locale . US ) ; // default local
languageChoisBox . getSelectionModel ( ) . select ( 0 ) ;
2017-12-19 19:08:12 +01:00
break ;
}
// Buttons
aboutBtn . setText ( bundle . getString ( " aboutBtn " ) ) ;
settingsBtn . setText ( bundle . getString ( " settingsBtn " ) ) ;
addBtn . setText ( bundle . getString ( " addBtn " ) ) ;
reloadRomsBtn . setText ( bundle . getString ( " reloadRomsBtn " ) ) ;
smmdbBtn . setText ( bundle . getString ( " smmdbBtn " ) ) ;
cemuTFBtn . setText ( bundle . getString ( " cemuTFBtn " ) ) ;
romTFBtn . setText ( bundle . getString ( " romTFBtn " ) ) ;
updateBtn . setText ( bundle . getString ( " updateBtnCheckNow " ) ) ;
smmdbDownloadBtn . setText ( bundle . getString ( " smmdbDownloadBtn " ) ) ;
playBtn . setText ( bundle . getString ( " playBtn " ) ) ;
2017-12-19 22:18:22 +01:00
cloudSyncToggleBtn . setText ( bundle . getString ( " cloudSyncToggleBtn " ) ) ;
autoUpdateToggleBtn . setText ( bundle . getString ( " autoUpdateToggleBtn " ) ) ;
2017-12-21 11:02:54 +01:00
fullscreenToggleBtn . setText ( bundle . getString ( " fullscreenToggleBtn " ) ) ;
2017-12-19 19:08:12 +01:00
// Labels
cemu_UISettingsLbl . setText ( bundle . getString ( " cemu_UISettingsLbl " ) ) ;
cemuDirectoryLbl . setText ( bundle . getString ( " cemuDirectoryLbl " ) ) ;
romDirectoryLbl . setText ( bundle . getString ( " romDirectoryLbl " ) ) ;
mainColorLbl . setText ( bundle . getString ( " mainColorLbl " ) ) ;
languageLbl . setText ( bundle . getString ( " languageLbl " ) ) ;
updateLbl . setText ( bundle . getString ( " updateLbl " ) ) ;
branchLbl . setText ( bundle . getString ( " branchLbl " ) ) ;
cemuSettingsLbl . setText ( bundle . getString ( " cemuSettingsLbl " ) ) ;
licensesLbl . setText ( bundle . getString ( " licensesLbl " ) ) ;
// Columns
titleColumn . setText ( bundle . getString ( " titleColumn " ) ) ;
idColumn . setText ( bundle . getString ( " idColumn " ) ) ;
starsColumn . setText ( bundle . getString ( " starsColumn " ) ) ;
timeColumn . setText ( bundle . getString ( " timeColumn " ) ) ;
// Strings
2017-12-19 21:35:49 +01:00
lastPlayed = bundle . getString ( " lastPlayed " ) ;
today = bundle . getString ( " today " ) ;
yesterday = bundle . getString ( " yesterday " ) ;
2017-12-19 22:18:22 +01:00
never = bundle . getString ( " never " ) ;
2017-12-19 19:08:12 +01:00
}
2017-11-24 21:36:03 +01:00
2018-02-18 13:57:30 +01:00
// if AutoUpdate, then check for updates
2017-11-27 10:57:16 +01:00
private void checkAutoUpdate ( ) {
2017-11-24 21:36:03 +01:00
2019-01-22 19:21:38 +01:00
if ( XMLController . isAutoUpdate ( ) ) {
2017-11-24 21:36:03 +01:00
try {
LOGGER . info ( " AutoUpdate: looking for updates on startup ... " ) ;
2019-01-22 19:21:38 +01:00
updateController = new UpdateController ( this , buildNumber , XMLController . isUseBeta ( ) ) ;
2017-11-24 21:36:03 +01:00
Thread updateThread = new Thread ( updateController ) ;
updateThread . setName ( " Updater " ) ;
updateThread . start ( ) ;
updateThread . join ( ) ;
} catch ( InterruptedException e ) {
e . printStackTrace ( ) ;
}
}
}
2017-11-06 10:42:31 +01:00
2017-11-24 21:36:03 +01:00
private void addCourseDescription ( SmmdbApiDataType course ) {
String courseTheme ;
String gameStyle ;
String difficulty ;
String autoscroll ;
smmdbTextFlow . getChildren ( ) . remove ( 0 , smmdbTextFlow . getChildren ( ) . size ( ) ) ;
nameText . clear ( ) ;
courseText . clear ( ) ;
switch ( course . getCourseTheme ( ) ) {
2017-06-18 13:01:04 +02:00
case 0 :
2017-08-26 00:13:09 +02:00
courseTheme = " Ground " ;
2017-06-18 13:01:04 +02:00
break ;
case 1 :
2017-08-26 00:13:09 +02:00
courseTheme = " Underground " ;
2017-06-18 13:01:04 +02:00
break ;
case 2 :
2017-08-26 00:13:09 +02:00
courseTheme = " Castle " ;
break ;
case 3 :
courseTheme = " Airship " ;
break ;
case 4 :
courseTheme = " Underwater " ;
break ;
case 5 :
courseTheme = " Ghost House " ;
2017-06-18 13:01:04 +02:00
break ;
default :
2017-08-26 00:13:09 +02:00
courseTheme = " notset " ;
2017-06-18 13:01:04 +02:00
break ;
}
2017-11-24 21:36:03 +01:00
switch ( course . getGameStyle ( ) ) {
2017-06-18 13:01:04 +02:00
case 0 :
2017-08-26 00:13:09 +02:00
gameStyle = " SMB " ;
2017-06-18 13:01:04 +02:00
break ;
case 1 :
2017-08-26 00:13:09 +02:00
gameStyle = " SMB3 " ;
2017-06-18 13:01:04 +02:00
break ;
case 2 :
2017-08-26 00:13:09 +02:00
gameStyle = " SMW " ;
2017-06-18 13:01:04 +02:00
break ;
case 3 :
2017-08-26 00:13:09 +02:00
gameStyle = " NSMBU " ;
2017-06-18 13:01:04 +02:00
break ;
default :
2017-08-26 00:13:09 +02:00
gameStyle = " notset " ;
2017-06-18 13:01:04 +02:00
break ;
}
2017-11-24 21:36:03 +01:00
switch ( course . getDifficulty ( ) ) {
2017-06-18 13:01:04 +02:00
case 0 :
difficulty = " Easy " ;
break ;
case 1 :
difficulty = " Normal " ;
break ;
case 2 :
difficulty = " Expert " ;
break ;
case 3 :
difficulty = " Super Expert " ;
break ;
case 4 :
difficulty = " Mixed " ;
break ;
default :
difficulty = " notset " ;
break ;
}
2017-11-24 21:36:03 +01:00
switch ( course . getAutoScroll ( ) ) {
2017-08-26 00:13:09 +02:00
case 0 :
autoscroll = " disabled " ;
break ;
case 1 :
autoscroll = " slow " ;
break ;
case 2 :
autoscroll = " medium " ;
break ;
case 3 :
autoscroll = " fast " ;
break ;
default :
autoscroll = " notset " ;
break ;
}
2017-11-24 21:36:03 +01:00
nameText . add ( 0 , new Text ( " title " + " : " ) ) ;
nameText . add ( 1 , new Text ( " owner " + " : " ) ) ;
nameText . add ( 2 , new Text ( " Course-Theme " + " : " ) ) ;
nameText . add ( 3 , new Text ( " Game-Style " + " : " ) ) ;
nameText . add ( 4 , new Text ( " difficulty " + " : " ) ) ;
nameText . add ( 5 , new Text ( " Auto-Scroll " + " : " ) ) ;
nameText . add ( 6 , new Text ( " Time " + " : " ) ) ;
nameText . add ( 7 , new Text ( " lastmodified " + " : " ) ) ;
nameText . add ( 8 , new Text ( " uploaded " + " : " ) ) ;
nameText . add ( 9 , new Text ( " nintendoid " + " : " ) ) ;
courseText . add ( 0 , new Text ( course . getTitle ( ) + " \ n " ) ) ;
courseText . add ( 1 , new Text ( course . getOwner ( ) + " \ n " ) ) ;
courseText . add ( 2 , new Text ( courseTheme + " \ n " ) ) ;
courseText . add ( 3 , new Text ( gameStyle + " \ n " ) ) ;
courseText . add ( 4 , new Text ( difficulty + " \ n " ) ) ;
courseText . add ( 5 , new Text ( autoscroll + " \ n " ) ) ;
courseText . add ( 6 , new Text ( course . getTime ( ) + " \ n " ) ) ;
courseText . add ( 7 , new Text ( new java . util . Date ( ( long ) course . getLastmodified ( ) * 1000 ) + " \ n " ) ) ;
courseText . add ( 8 , new Text ( new java . util . Date ( ( long ) course . getUploaded ( ) * 1000 ) + " \ n " ) ) ;
courseText . add ( 9 , new Text ( course . getNintendoid ( ) + " \ n " ) ) ;
for ( int i = 0 ; i < nameText . size ( ) ; i + + ) {
nameText . get ( i ) . setFont ( Font . font ( " System " , FontWeight . BOLD , 14 ) ) ;
courseText . get ( i ) . setFont ( Font . font ( " System " , 14 ) ) ;
smmdbTextFlow . getChildren ( ) . addAll ( nameText . get ( i ) , courseText . get ( i ) ) ;
2017-06-18 13:01:04 +02:00
}
2017-11-24 21:36:03 +01:00
}
2017-03-23 13:44:21 +01:00
2017-08-26 00:13:09 +02:00
/ * *
2019-05-15 16:19:31 +02:00
* xMaxElements based on window width - 36
2017-08-26 00:13:09 +02:00
* calculates how many games can be displayed in one row
* /
2017-06-18 13:01:04 +02:00
private void generatePosition ( ) {
2019-05-15 16:19:31 +02:00
int xMaxElements = ( int ) Math . floor ( ( mainAnchorPane . getWidth ( ) - 36 ) / 217 ) ;
2019-05-15 16:39:00 +02:00
2019-05-15 16:19:31 +02:00
if ( xNextElement > = xMaxElements ) {
oldXNextElement = xNextElement ;
2017-03-23 13:44:21 +01:00
xPos = 17 ;
yPos = yPos + 345 ;
2019-05-15 16:19:31 +02:00
xNextElement = 1 ;
2017-03-23 13:44:21 +01:00
} else {
xPos = xPos + 217 ;
2019-05-15 16:19:31 +02:00
xNextElement + + ;
2017-03-23 13:44:21 +01:00
}
}
2018-02-18 13:57:30 +01:00
// change the color of all needed GUI elements
2017-06-18 13:01:04 +02:00
private void applyColor ( ) {
2019-01-22 19:21:38 +01:00
String boxStyle = " -fx-background-color: # " + XMLController . getColor ( ) + " ; " ;
String btnStyleBlack = " -fx-button-type: RAISED; -fx-background-color: # " + XMLController . getColor ( ) + " ; -fx-text-fill: BLACK; " ;
String btnStyleWhite = " -fx-button-type: RAISED; -fx-background-color: # " + XMLController . getColor ( ) + " ; -fx-text-fill: WHITE; " ;
BigInteger icolor = new BigInteger ( XMLController . getColor ( ) , 16 ) ;
2017-03-28 17:40:01 +02:00
BigInteger ccolor = new BigInteger ( " 78909cff " , 16 ) ;
2017-03-23 13:44:21 +01:00
2017-03-28 17:40:01 +02:00
sideMenuVBox . setStyle ( boxStyle ) ;
topHBox . setStyle ( boxStyle ) ;
2019-01-22 19:21:38 +01:00
cemuTextField . setFocusColor ( Color . valueOf ( XMLController . getColor ( ) ) ) ;
romTextField . setFocusColor ( Color . valueOf ( XMLController . getColor ( ) ) ) ;
2017-03-23 13:44:21 +01:00
2017-11-24 21:36:03 +01:00
if ( icolor . compareTo ( ccolor ) = = - 1 ) {
2017-08-01 20:11:17 +02:00
dialogBtnStyle = btnStyleWhite ;
2017-11-24 21:36:03 +01:00
2017-03-28 17:40:01 +02:00
aboutBtn . setStyle ( " -fx-text-fill: WHITE; " ) ;
settingsBtn . setStyle ( " -fx-text-fill: WHITE; " ) ;
addBtn . setStyle ( " -fx-text-fill: WHITE; " ) ;
reloadRomsBtn . setStyle ( " -fx-text-fill: WHITE; " ) ;
2017-05-25 19:07:16 +02:00
smmdbBtn . setStyle ( " -fx-text-fill: WHITE; " ) ;
2017-03-28 17:40:01 +02:00
playBtn . setStyle ( " -fx-text-fill: WHITE; -fx-font-family: Roboto Medium; " ) ;
cemuTFBtn . setStyle ( btnStyleWhite ) ;
romTFBtn . setStyle ( btnStyleWhite ) ;
2017-10-24 22:41:56 +02:00
updateBtn . setStyle ( btnStyleWhite ) ;
2017-06-18 00:33:07 +02:00
smmdbDownloadBtn . setStyle ( btnStyleWhite ) ;
2017-03-28 17:40:01 +02:00
playBtn . setStyle ( btnStyleWhite ) ;
2017-10-24 22:41:56 +02:00
2017-03-28 17:40:01 +02:00
aboutBtn . setGraphic ( info_white ) ;
settingsBtn . setGraphic ( settings_white ) ;
addBtn . setGraphic ( add_circle_white ) ;
reloadRomsBtn . setGraphic ( cached_white ) ;
2017-05-25 19:07:16 +02:00
smmdbBtn . setGraphic ( smmdb_white ) ;
2018-04-28 12:53:01 +02:00
menuHam . getStyleClass ( ) . clear ( ) ;
2017-03-31 19:19:34 +02:00
menuHam . getStyleClass ( ) . add ( " jfx-hamburgerW " ) ;
2017-11-24 21:36:03 +01:00
} else {
2017-08-01 20:11:17 +02:00
dialogBtnStyle = btnStyleBlack ;
2017-11-24 21:36:03 +01:00
2017-03-28 17:40:01 +02:00
aboutBtn . setStyle ( " -fx-text-fill: BLACK; " ) ;
settingsBtn . setStyle ( " -fx-text-fill: BLACK; " ) ;
addBtn . setStyle ( " -fx-text-fill: BLACK; " ) ;
reloadRomsBtn . setStyle ( " -fx-text-fill: BLACK; " ) ;
2017-05-25 19:07:16 +02:00
smmdbBtn . setStyle ( " -fx-text-fill: BLACK; " ) ;
2017-03-28 17:40:01 +02:00
playBtn . setStyle ( " -fx-text-fill: BLACK; -fx-font-family: Roboto Medium; " ) ;
cemuTFBtn . setStyle ( btnStyleBlack ) ;
romTFBtn . setStyle ( btnStyleBlack ) ;
2017-10-24 22:41:56 +02:00
updateBtn . setStyle ( btnStyleBlack ) ;
2017-06-18 00:33:07 +02:00
smmdbDownloadBtn . setStyle ( btnStyleBlack ) ;
2017-03-28 17:40:01 +02:00
playBtn . setStyle ( btnStyleBlack ) ;
2017-11-24 21:36:03 +01:00
2017-03-28 17:40:01 +02:00
aboutBtn . setGraphic ( info_black ) ;
settingsBtn . setGraphic ( settings_black ) ;
addBtn . setGraphic ( add_circle_black ) ;
reloadRomsBtn . setGraphic ( cached_black ) ;
2017-05-25 19:07:16 +02:00
smmdbBtn . setGraphic ( smmdb_black ) ;
2018-04-28 12:53:01 +02:00
menuHam . getStyleClass ( ) . clear ( ) ;
2017-03-31 19:19:34 +02:00
menuHam . getStyleClass ( ) . add ( " jfx-hamburgerB " ) ;
2017-03-28 17:40:01 +02:00
}
2017-11-24 21:36:03 +01:00
for ( int i = 0 ; i < games . size ( ) ; i + + ) {
2019-01-22 19:21:38 +01:00
games . get ( i ) . getButton ( ) . setRipplerFill ( Paint . valueOf ( XMLController . getColor ( ) ) ) ;
2017-03-23 13:44:21 +01:00
}
2018-02-18 18:27:36 +01:00
}
2017-03-23 13:44:21 +01:00
private void sideMenuSlideIn ( ) {
sideMenuVBox . setVisible ( true ) ;
//slide in in 400ms
TranslateTransition translateTransition = new TranslateTransition ( Duration . millis ( 400 ) , sideMenuVBox ) ;
2017-03-31 19:19:34 +02:00
translateTransition . setFromX ( - 175 ) ;
2017-03-23 13:44:21 +01:00
translateTransition . setToX ( 0 ) ;
2017-11-28 13:55:07 +01:00
translateTransition . play ( ) ;
2017-03-23 13:44:21 +01:00
}
private void sideMenuSlideOut ( ) {
//slide out in 400ms
TranslateTransition translateTransition = new TranslateTransition ( Duration . millis ( 400 ) , sideMenuVBox ) ;
translateTransition . setFromX ( 0 ) ;
2017-03-31 19:19:34 +02:00
translateTransition . setToX ( - 175 ) ;
2017-11-28 13:55:07 +01:00
translateTransition . play ( ) ;
2017-03-23 13:44:21 +01:00
}
private void playBtnSlideIn ( ) {
2017-12-18 09:58:32 +01:00
bottomHBox . setVisible ( true ) ;
2017-03-23 13:44:21 +01:00
playTrue = true ;
2017-03-25 15:18:45 +01:00
2017-12-18 09:58:32 +01:00
TranslateTransition playBtnTransition = new TranslateTransition ( Duration . millis ( 300 ) , bottomHBox ) ;
2017-11-28 13:55:07 +01:00
playBtnTransition . setFromY ( 56 ) ;
2017-03-25 15:18:45 +01:00
playBtnTransition . setToY ( 0 ) ;
playBtnTransition . play ( ) ;
2017-03-23 13:44:21 +01:00
}
2017-11-15 22:00:28 +01:00
private void playBtnSlideOut ( ) {
2017-03-23 13:44:21 +01:00
playTrue = false ;
2017-12-18 09:58:32 +01:00
TranslateTransition playBtnTransition = new TranslateTransition ( Duration . millis ( 300 ) , bottomHBox ) ;
2017-03-25 15:18:45 +01:00
playBtnTransition . setFromY ( 0 ) ;
playBtnTransition . setToY ( 56 ) ;
playBtnTransition . play ( ) ;
2017-03-23 16:17:38 +01:00
}
2017-03-23 13:44:21 +01:00
private void editColor ( String input ) {
StringBuilder sb = new StringBuilder ( input ) ;
sb . delete ( 0 , 2 ) ;
2019-01-22 19:21:38 +01:00
XMLController . setColor ( sb . toString ( ) ) ;
xmlController . saveSettings ( ) ;
2017-03-23 13:44:21 +01:00
}
2017-06-18 13:01:04 +02:00
@SuppressWarnings ( " unused " )
2017-08-26 00:13:09 +02:00
/ * *
* @return the main color in hexadecimal format
* /
2017-06-18 13:01:04 +02:00
private String hexToRgb ( ) {
2019-01-22 19:21:38 +01:00
LOGGER . info ( XMLController . getColor ( ) ) ;
int hex = Integer . parseInt ( XMLController . getColor ( ) . substring ( 0 , 5 ) , 16 ) ;
2017-06-18 13:01:04 +02:00
int r = ( hex & 0xFF0000 ) > > 16 ;
int g = ( hex & 0xFF00 ) > > 8 ;
int b = ( hex & 0xFF ) ;
return r + " , " + g + " , " + b ;
}
2017-08-26 00:13:09 +02:00
/ * *
*
* @param originalImage original image which size is changed
* @param type type of the original image ( PNG , JPEG , . . . )
* @param imgWidth wanted width
* @param imgHeigth wanted height
* @return the rezised image
* /
2017-03-26 14:21:19 +02:00
private static BufferedImage resizeImage ( BufferedImage originalImage , int type , int imgWidth , int imgHeigth ) {
BufferedImage resizedImage = new BufferedImage ( imgWidth , imgHeigth , type ) ;
2017-03-23 13:44:21 +01:00
Graphics2D g = resizedImage . createGraphics ( ) ;
2017-03-26 14:21:19 +02:00
g . drawImage ( originalImage , 0 , 0 , imgWidth , imgHeigth , null ) ;
2017-03-23 13:44:21 +01:00
g . dispose ( ) ;
return resizedImage ;
}
2018-04-05 09:54:45 +02:00
public Main getMain ( ) {
return main ;
}
public DBController getDbController ( ) {
return dbController ;
}
2017-03-23 13:44:21 +01:00
2019-01-22 19:21:38 +01:00
public Stage getPrimaryStage ( ) {
return primaryStage ;
2017-03-23 13:44:21 +01:00
}
2017-03-28 17:40:01 +02:00
public String getGameExecutePath ( ) {
return gameExecutePath ;
}
public void setGameExecutePath ( String gameExecutePath ) {
this . gameExecutePath = gameExecutePath ;
}
public String getSelectedGameTitleID ( ) {
return selectedGameTitleID ;
}
public void setSelectedGameTitleID ( String selectedGameTitleID ) {
this . selectedGameTitleID = selectedGameTitleID ;
}
2017-05-07 19:57:55 +02:00
public JFXButton getPlayBtn ( ) {
return playBtn ;
}
public void setPlayBtn ( JFXButton playBtn ) {
this . playBtn = playBtn ;
}
2017-09-15 19:23:44 +02:00
2019-05-15 16:19:31 +02:00
public int getOldXNextElement ( ) {
return oldXNextElement ;
2017-09-15 19:23:44 +02:00
}
2017-12-19 19:08:12 +01:00
public String getLanguage ( ) {
return language ;
}
public void setLanguage ( String language ) {
this . language = language ;
}
2017-12-19 21:35:49 +01:00
public ResourceBundle getBundle ( ) {
return bundle ;
}
2017-09-15 19:23:44 +02:00
public AnchorPane getMainAnchorPane ( ) {
return mainAnchorPane ;
}
2017-09-12 20:13:26 +02:00
2017-11-06 10:42:31 +01:00
public JFXButton getUpdateBtn ( ) {
return updateBtn ;
}
2017-03-23 13:44:21 +01:00
}