Settings-tab refactoring: move Tinfoil-related options block to separate fxml, create controller, update names, remove code redundancy and simplify.

master
Dmitry Isaenko 2020-07-30 02:31:37 +03:00
parent ceb6949667
commit d1500f264b
6 changed files with 262 additions and 200 deletions

View File

@ -199,7 +199,7 @@ public class FrontController implements Initializable {
else
fileChooser.setInitialDirectory(new File(System.getProperty("user.home")));
if (getSelectedProtocol().equals("TinFoil") && MediatorControl.getInstance().getContoller().getSettingsCtrlr().getTfXciNszXczSupport())
if (getSelectedProtocol().equals("TinFoil") && MediatorControl.getInstance().getContoller().getSettingsCtrlr().getTinfoilSettings().isXciNszXczSupport())
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("NSP/XCI/NSZ/XCZ", "*.nsp", "*.xci", "*.nsz", "*.xcz"));
else if (getSelectedProtocol().equals("GoldLeaf") && (! MediatorControl.getInstance().getContoller().getSettingsCtrlr().getNSPFileFilterForGL()))
fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("Any file", "*.*"),
@ -273,24 +273,25 @@ public class FrontController implements Initializable {
}
else { // NET INSTALL OVER TINFOIL
final String ipValidationPattern = "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";
final SettingsBlockTinfoilController tinfoilSettings = settings.getTinfoilSettings();
if (settings.isNsIpValidate() && ! getNsIp().matches(ipValidationPattern)) {
if (tinfoilSettings.isValidateNSHostName() && ! getNsIp().matches(ipValidationPattern)) {
if (!ServiceWindow.getConfirmationWindow(resourceBundle.getString("windowTitleBadIp"), resourceBundle.getString("windowBodyBadIp")))
return;
}
String nsIP = getNsIp();
if (! settings.getExpertModeSelected())
if (! tinfoilSettings.isExpertModeSelected())
usbNetCommunications = new NETCommunications(nspToUpload, nsIP, false, "", "", "");
else {
usbNetCommunications = new NETCommunications(
nspToUpload,
nsIP,
settings.getNotServeSelected(),
settings.getAutoIpSelected()?"":settings.getHostIp(),
settings.getRandPortSelected()?"":settings.getHostPort(),
settings.getNotServeSelected()?settings.getHostExtra():""
tinfoilSettings.isNoRequestsServe(),
tinfoilSettings.isAutoDetectIp()?"":tinfoilSettings.getHostIp(),
tinfoilSettings.isRandomlySelectPort()?"":tinfoilSettings.getHostPort(),
tinfoilSettings.isNoRequestsServe()?tinfoilSettings.getHostExtra():""
);
}
}
@ -330,8 +331,9 @@ public class FrontController implements Initializable {
private void handleDrop(DragEvent event){
List<File> filesDropped = event.getDragboard().getFiles();
SettingsController settingsController = MediatorControl.getInstance().getContoller().getSettingsCtrlr();
SettingsBlockTinfoilController tinfoilSettings = settingsController.getTinfoilSettings();
if (getSelectedProtocol().equals("TinFoil") && settingsController.getTfXciNszXczSupport())
if (getSelectedProtocol().equals("TinFoil") && tinfoilSettings.isXciNszXczSupport())
filesDropped.removeIf(file -> ! file.getName().toLowerCase().matches("(.*\\.nsp$)|(.*\\.xci$)|(.*\\.nsz$)|(.*\\.xcz$)"));
else if (getSelectedProtocol().equals("GoldLeaf") && (! settingsController.getNSPFileFilterForGL()))
filesDropped.removeIf(file -> (file.isDirectory() && ! file.getName().toLowerCase().matches(".*\\.nsp$")));

View File

@ -0,0 +1,161 @@
/*
Copyright 2019-2020 Dmitry Isaenko
This file is part of NS-USBloader.
NS-USBloader 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.
NS-USBloader 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 NS-USBloader. If not, see <https://www.gnu.org/licenses/>.
*/
package nsusbloader.Controllers;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.layout.VBox;
import nsusbloader.AppPreferences;
import nsusbloader.ServiceWindow;
import java.net.URL;
import java.util.ResourceBundle;
public class SettingsBlockTinfoilController implements Initializable {
@FXML
private CheckBox xciNszXczSupportCB,
validateNSHostNameCB,
networkExpertModeCB,
autoDetectIpCB,
randomlySelectPortCB,
noRequestsServeCB;
@FXML
private VBox networkExpertSettingsVBox;
@FXML
private TextField pcIpTF,
pcPortTF,
pcExtraTF;
private ResourceBundle resourceBundle;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
this.resourceBundle = resourceBundle;
final AppPreferences preferences = AppPreferences.getInstance();
networkExpertSettingsVBox.disableProperty().bind(networkExpertModeCB.selectedProperty().not());
pcIpTF.disableProperty().bind(autoDetectIpCB.selectedProperty());
pcPortTF.disableProperty().bind(randomlySelectPortCB.selectedProperty());
pcExtraTF.disableProperty().bind(noRequestsServeCB.selectedProperty().not());
xciNszXczSupportCB.setSelected(preferences.getTfXCI());
validateNSHostNameCB.setSelected(preferences.getNsIpValidationNeeded());
networkExpertModeCB.setSelected(preferences.getExpertMode());
pcIpTF.setText(preferences.getHostIp());
pcPortTF.setText(preferences.getHostPort());
pcExtraTF.setText(preferences.getHostExtra());
autoDetectIpCB.setSelected(preferences.getAutoDetectIp());
randomlySelectPortCB.setSelected(preferences.getRandPort());
boolean noServeRequestsFlag = preferences.getNotServeRequests();
if (noServeRequestsFlag){
noServeRequestAction(true);
}
noRequestsServeCB.setSelected(noServeRequestsFlag);
pcIpTF.setTextFormatter(buildSpacelessTextFormatter());
pcPortTF.setTextFormatter(buildPortTextFormatter());
pcExtraTF.setTextFormatter(buildSpacelessTextFormatter());
autoDetectIpCB.setOnAction(e->pcIpTF.requestFocus());
randomlySelectPortCB.setOnAction(e->pcPortTF.requestFocus());
noRequestsServeCB.selectedProperty().addListener(((observableValue, oldValue, newValue) -> noServeRequestAction(newValue)));
}
private TextFormatter buildSpacelessTextFormatter(){
return new TextFormatter<>(change -> {
String text = change.getControlNewText();
if (text.contains(" ") || text.contains("\t")){
return null;
}
return change;
});
}
private TextFormatter buildPortTextFormatter(){
final String PORT_NUMBER_PATTERN = "^[0-9]{0,5}$";
return new TextFormatter<>(change -> {
String text = change.getControlNewText();
if (text.isEmpty()) {
return change;
}
if (! text.matches(PORT_NUMBER_PATTERN)) {
return null;
}
int newPortNumber = Integer.parseInt(text);
if (newPortNumber > 65535 || newPortNumber == 0) {
ServiceWindow.getErrorNotification(resourceBundle.getString("windowTitleErrorPort"),
resourceBundle.getString("windowBodyErrorPort"));
return null;
}
return change;
});
}
private void noServeRequestAction(boolean isNoServe){
if (isNoServe){
autoDetectIpCB.setDisable(true);
autoDetectIpCB.setSelected(false);
randomlySelectPortCB.setDisable(true);
randomlySelectPortCB.setSelected(false);
}
else {
autoDetectIpCB.setDisable(false);
autoDetectIpCB.setSelected(true);
randomlySelectPortCB.setDisable(false);
randomlySelectPortCB.setSelected(true);
}
}
public String getHostIp(){ return pcIpTF.getText(); }
public String getHostPort(){ return pcPortTF.getText(); }
public String getHostExtra(){ return pcExtraTF.getText(); }
public boolean isXciNszXczSupport(){ return xciNszXczSupportCB.isSelected(); }
public boolean isExpertModeSelected(){ return networkExpertModeCB.isSelected(); }
public boolean isAutoDetectIp(){ return autoDetectIpCB.isSelected(); }
public boolean isRandomlySelectPort(){ return randomlySelectPortCB.isSelected(); }
public boolean isNoRequestsServe(){ return noRequestsServeCB.isSelected(); }
public boolean isValidateNSHostName(){ return validateNSHostNameCB.isSelected(); }
public void updatePreferencesOnExit(){
AppPreferences preferences = AppPreferences.getInstance();
preferences.setNsIpValidationNeeded(isValidateNSHostName());
preferences.setExpertMode(isExpertModeSelected());
preferences.setAutoDetectIp(isAutoDetectIp());
preferences.setRandPort(isRandomlySelectPort());
preferences.setNotServeRequests(isNoRequestsServe());
preferences.setHostIp(getHostIp());
preferences.setHostPort(getHostPort());
preferences.setHostExtra(getHostExtra());
preferences.setTfXCI(isXciNszXczSupport());
}
}

View File

@ -38,21 +38,7 @@ import java.util.*;
public class SettingsController implements Initializable {
@FXML
private CheckBox nspFilesFilterForGLCB,
validateNSHostNameCb,
expertModeCb,
autoDetectIpCb,
randPortCb,
dontServeCb,
autoCheckUpdCb,
tfXciSpprtCb;
@FXML
private TextField pcIpTextField,
pcPortTextField,
pcExtraTextField;
@FXML
private VBox expertSettingsVBox;
autoCheckUpdCb;
@FXML
private Hyperlink newVersionLink;
@ -67,6 +53,9 @@ public class SettingsController implements Initializable {
@FXML
private ChoiceBox<String> glVersionChoiceBox;
@FXML
private SettingsBlockTinfoilController settingsBlockTinfoilController;
private HostServices hostServices;
public static final String[] glSupportedVersions = {"v0.5", "v0.7.x", "v0.8"};
@ -79,95 +68,8 @@ public class SettingsController implements Initializable {
final AppPreferences preferences = AppPreferences.getInstance();
nspFilesFilterForGLCB.setSelected(preferences.getNspFileFilterGL());
validateNSHostNameCb.setSelected(preferences.getNsIpValidationNeeded());
expertSettingsVBox.setDisable(! preferences.getExpertMode());
expertModeCb.setSelected(preferences.getExpertMode());
expertModeCb.setOnAction(e-> expertSettingsVBox.setDisable(! expertModeCb.isSelected()));
autoDetectIpCb.setSelected(preferences.getAutoDetectIp());
pcIpTextField.setDisable(preferences.getAutoDetectIp());
autoDetectIpCb.setOnAction(e->{
pcIpTextField.setDisable(autoDetectIpCb.isSelected());
if (! autoDetectIpCb.isSelected())
pcIpTextField.requestFocus();
});
randPortCb.setSelected(preferences.getRandPort());
pcPortTextField.setDisable(preferences.getRandPort());
randPortCb.setOnAction(e->{
pcPortTextField.setDisable(randPortCb.isSelected());
if (! randPortCb.isSelected())
pcPortTextField.requestFocus();
});
if (preferences.getNotServeRequests()){
dontServeCb.setSelected(true);
autoDetectIpCb.setSelected(false);
autoDetectIpCb.setDisable(true);
pcIpTextField.setDisable(false);
randPortCb.setSelected(false);
randPortCb.setDisable(true);
pcPortTextField.setDisable(false);
}
pcExtraTextField.setDisable(! preferences.getNotServeRequests());
dontServeCb.setOnAction(e->{
if (dontServeCb.isSelected()){
autoDetectIpCb.setSelected(false);
autoDetectIpCb.setDisable(true);
pcIpTextField.setDisable(false);
randPortCb.setSelected(false);
randPortCb.setDisable(true);
pcPortTextField.setDisable(false);
pcExtraTextField.setDisable(false);
pcIpTextField.requestFocus();
}
else {
autoDetectIpCb.setDisable(false);
autoDetectIpCb.setSelected(true);
pcIpTextField.setDisable(true);
randPortCb.setDisable(false);
randPortCb.setSelected(true);
pcPortTextField.setDisable(true);
pcExtraTextField.setDisable(true);
}
});
pcIpTextField.setText(preferences.getHostIp());
pcPortTextField.setText(preferences.getHostPort());
pcExtraTextField.setText(preferences.getHostExtra());
pcIpTextField.setTextFormatter(new TextFormatter<>(change -> {
if (change.getControlNewText().contains(" ") | change.getControlNewText().contains("\t"))
return null;
else
return change;
}));
pcPortTextField.setTextFormatter(new TextFormatter<>(change -> {
if (change.getControlNewText().matches("^[0-9]{0,5}$")) {
if (!change.getControlNewText().isEmpty()
&& ((Integer.parseInt(change.getControlNewText()) > 65535) || (Integer.parseInt(change.getControlNewText()) == 0))
) {
ServiceWindow.getErrorNotification(resourceBundle.getString("windowTitleErrorPort"), resourceBundle.getString("windowBodyErrorPort"));
return null;
}
return change;
}
else
return null;
}));
pcExtraTextField.setTextFormatter(new TextFormatter<>(change -> {
if (change.getControlNewText().contains(" ") | change.getControlNewText().contains("\t"))
return null;
else
return change;
}));
newVersionLink.setVisible(false);
newVersionLink.setOnAction(e-> hostServices.showDocument(newVersionLink.getText()));
@ -182,8 +84,6 @@ public class SettingsController implements Initializable {
setDriversInstallFeature();
tfXciSpprtCb.setSelected(preferences.getTfXCI());
SettingsLanguagesSetup settingsLanguagesSetup = new SettingsLanguagesSetup();
langCB.setItems(settingsLanguagesSetup.getLanguages());
langCB.getSelectionModel().select(settingsLanguagesSetup.getRecentLanguage());
@ -247,18 +147,8 @@ public class SettingsController implements Initializable {
}
public boolean getNSPFileFilterForGL(){return nspFilesFilterForGLCB.isSelected(); }
public boolean getExpertModeSelected(){ return expertModeCb.isSelected(); }
public boolean getAutoIpSelected(){ return autoDetectIpCb.isSelected(); }
public boolean getRandPortSelected(){ return randPortCb.isSelected(); }
public boolean getNotServeSelected(){ return dontServeCb.isSelected(); }
public boolean isNsIpValidate(){ return validateNSHostNameCb.isSelected(); }
public String getHostIp(){ return pcIpTextField.getText(); }
public String getHostPort(){ return pcPortTextField.getText(); }
public String getHostExtra(){ return pcExtraTextField.getText(); }
public boolean getAutoCheckForUpdates(){ return autoCheckUpdCb.isSelected(); }
public boolean getTfXciNszXczSupport(){ return tfXciSpprtCb.isSelected(); } // Used also for NSZ/XCZ
public void registerHostServices(HostServices hostServices){this.hostServices = hostServices;}
@ -270,21 +160,16 @@ public class SettingsController implements Initializable {
public String getGlVer() {
return glVersionChoiceBox.getValue();
}
public SettingsBlockTinfoilController getTinfoilSettings(){ return settingsBlockTinfoilController; }
public void updatePreferencesOnExit(){
AppPreferences preferences = AppPreferences.getInstance();
preferences.setNsIpValidationNeeded(isNsIpValidate());
preferences.setExpertMode(getExpertModeSelected());
preferences.setAutoDetectIp(getAutoIpSelected());
preferences.setRandPort(getRandPortSelected());
preferences.setNotServeRequests(getNotServeSelected());
preferences.setHostIp(getHostIp());
preferences.setHostPort(getHostPort());
preferences.setHostExtra(getHostExtra());
preferences.setAutoCheckUpdates(getAutoCheckForUpdates());
preferences.setTfXCI(getTfXciNszXczSupport());
preferences.setNspFileFilterGL(getNSPFileFilterForGL());
preferences.setGlVersion(getGlVer());
settingsBlockTinfoilController.updatePreferencesOnExit();
}
}

View File

@ -71,7 +71,7 @@ Steps to roll NXDT functionality back:
<SVGPath content="M9,22A1,1 0 0,1 8,21V18H4A2,2 0 0,1 2,16V4C2,2.89 2.9,2 4,2H20A2,2 0 0,1 22,4V16A2,2 0 0,1 20,18H13.9L10.2,21.71C10,21.9 9.75,22 9.5,22V22H9M10,16V19.08L13.08,16H20V4H4V16H10M17,11H15V9H17V11M13,11H11V9H13V11M9,11H7V9H9V11Z" />
</graphic>
</Tab>
<Tab closable="false" disable="true">
<Tab closable="false" >
<content>
<fx:include fx:id="NXDTab" source="NXDTab.fxml" VBox.vgrow="ALWAYS" />
</content>

View File

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<VBox spacing="5.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="nsusbloader.Controllers.SettingsBlockTinfoilController">
<children>
<Label text="Tinfoil" />
<CheckBox mnemonicParsing="false" text="%tab2_Cb_AllowXciNszXcz" fx:id="xciNszXczSupportCB">
<VBox.margin>
<Insets left="5.0" />
</VBox.margin></CheckBox>
<Label disable="true" text="%tab2_Lbl_AllowXciNszXczDesc" wrapText="true">
<VBox.margin>
<Insets left="5.0" />
</VBox.margin></Label>
<CheckBox fx:id="validateNSHostNameCB" mnemonicParsing="false" text="%tab2_Cb_ValidateNSHostName">
<VBox.margin>
<Insets left="5.0" />
</VBox.margin>
</CheckBox>
<CheckBox fx:id="networkExpertModeCB" mnemonicParsing="false" text="%tab2_Cb_ExpertMode">
<VBox.margin>
<Insets left="5.0" />
</VBox.margin></CheckBox>
<VBox fx:id="networkExpertSettingsVBox" spacing="5.0">
<children>
<CheckBox fx:id="autoDetectIpCB" mnemonicParsing="false" text="%tab2_Cb_AutoDetectIp">
<VBox.margin>
<Insets />
</VBox.margin>
</CheckBox>
<CheckBox fx:id="randomlySelectPortCB" mnemonicParsing="false" text="%tab2_Cb_RandSelectPort">
<VBox.margin>
<Insets />
</VBox.margin>
</CheckBox>
<HBox>
<children>
<Label text="%tab2_Lbl_HostIP" />
<Label text=":" />
<Label text="%tab2_Lbl_HostPort" />
<Label text="/" />
<Label text="%tab2_Lbl_HostExtra" />
</children>
</HBox>
<HBox>
<children>
<TextField fx:id="pcIpTF" promptText="XXX.XXX.XXX.XXX" />
<Label text=":" />
<TextField fx:id="pcPortTF" promptText="0-65535" />
<Label text="/" />
<TextField fx:id="pcExtraTF" HBox.hgrow="ALWAYS">
<HBox.margin>
<Insets />
</HBox.margin>
</TextField>
</children>
</HBox>
<CheckBox fx:id="noRequestsServeCB" mnemonicParsing="false" text="%tab2_Cb_DontServeRequests">
<VBox.margin>
<Insets />
</VBox.margin>
</CheckBox>
<Label disable="true" text="%tab2_Lbl_DontServeRequestsDesc" wrapText="true">
<VBox.margin>
<Insets />
</VBox.margin>
</Label>
</children>
<padding>
<Insets left="15.0" />
</padding>
</VBox>
</children>
</VBox>

View File

@ -63,73 +63,7 @@
</VBox.margin>
</HBox>
<Separator prefWidth="200.0" />
<Label text="Tinfoil" />
<CheckBox fx:id="tfXciSpprtCb" mnemonicParsing="false" text="%tab2_Cb_AllowXciNszXcz">
<VBox.margin>
<Insets left="5.0" />
</VBox.margin></CheckBox>
<Label disable="true" text="%tab2_Lbl_AllowXciNszXczDesc" wrapText="true">
<VBox.margin>
<Insets left="5.0" />
</VBox.margin></Label>
<CheckBox fx:id="validateNSHostNameCb" mnemonicParsing="false" text="%tab2_Cb_ValidateNSHostName">
<VBox.margin>
<Insets left="5.0" />
</VBox.margin>
</CheckBox>
<CheckBox fx:id="expertModeCb" mnemonicParsing="false" text="%tab2_Cb_ExpertMode">
<VBox.margin>
<Insets left="5.0" />
</VBox.margin></CheckBox>
<VBox fx:id="expertSettingsVBox" spacing="5.0">
<children>
<CheckBox fx:id="autoDetectIpCb" mnemonicParsing="false" text="%tab2_Cb_AutoDetectIp">
<VBox.margin>
<Insets />
</VBox.margin>
</CheckBox>
<CheckBox fx:id="randPortCb" mnemonicParsing="false" text="%tab2_Cb_RandSelectPort">
<VBox.margin>
<Insets />
</VBox.margin>
</CheckBox>
<HBox>
<children>
<Label text="%tab2_Lbl_HostIP" />
<Label text=":" />
<Label text="%tab2_Lbl_HostPort" />
<Label text="/" />
<Label text="%tab2_Lbl_HostExtra" />
</children>
</HBox>
<HBox>
<children>
<TextField fx:id="pcIpTextField" promptText="XXX.XXX.XXX.XXX" />
<Label text=":" />
<TextField fx:id="pcPortTextField" promptText="0-65535" />
<Label text="/" />
<TextField fx:id="pcExtraTextField" HBox.hgrow="ALWAYS">
<HBox.margin>
<Insets />
</HBox.margin>
</TextField>
</children>
</HBox>
<CheckBox fx:id="dontServeCb" mnemonicParsing="false" text="%tab2_Cb_DontServeRequests">
<VBox.margin>
<Insets />
</VBox.margin>
</CheckBox>
<Label disable="true" text="%tab2_Lbl_DontServeRequestsDesc" wrapText="true">
<VBox.margin>
<Insets />
</VBox.margin>
</Label>
</children>
<padding>
<Insets left="15.0" />
</padding>
</VBox>
<fx:include fx:id="settingsBlockTinfoil" source="SettingsBlockTinfoil.fxml"/>
</children>
<padding>
<Insets bottom="5.0" left="15.0" right="15.0" top="5.0" />