mirror of
https://github.com/developersu/ns-usbloader.git
synced 2025-05-19 01:35:23 -04:00
Compare commits
16 commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
6d243a2be1 | ||
![]() |
ff31494f50 | ||
![]() |
e3c22390a9 | ||
![]() |
0ca162be1e | ||
![]() |
6cac53df7c | ||
![]() |
17134e235c | ||
![]() |
2ef3ccd442 | ||
![]() |
fd8bad836c | ||
![]() |
0b3ac95130 | ||
![]() |
0429b4dc45 | ||
![]() |
7bf48c6e51 | ||
![]() |
d382181700 | ||
![]() |
5ee9f6aacd | ||
![]() |
7f9b3a7598 | ||
![]() |
cd9e3ddf30 | ||
![]() |
d1ac1f5403 |
33 changed files with 772 additions and 394 deletions
.woodpecker
README.mdmisc/windows/NSIS
pom.xmlsrc
main
java/nsusbloader
Controllers
FilesDropHandle.javaFilesDropHandleTask.javaFontSettingsController.javaGamesController.javaISubscriber.javaNSLMainController.javaNSTableViewController.javaNxdtController.javaPatchesController.javaPayload.javaRcmController.javaSettingsBlockGenericController.javaSplitMergeController.java
MediatorControl.javaModelControllers
NSLMain.javaTransfersPublisher.javacom/usb
resources
test/java/integration
82
.woodpecker/woodpecker.yml
Normal file
82
.woodpecker/woodpecker.yml
Normal file
|
@ -0,0 +1,82 @@
|
|||
steps:
|
||||
- name: test-standard
|
||||
when:
|
||||
event: [tag, push]
|
||||
image: maven:3-openjdk-17
|
||||
commands:
|
||||
- mvn -B -DskipTests clean package
|
||||
- mvn test -B
|
||||
- echo target/ns-usbloader-*jar
|
||||
- mkdir artifacts
|
||||
- cp target/ns-usbloader-*jar artifacts
|
||||
volumes:
|
||||
- /home/docker/woodpecker/files/m2:/root/.m2
|
||||
|
||||
- name: make-windows-installer
|
||||
when:
|
||||
event: [tag, push]
|
||||
image: wheatstalk/makensis:3
|
||||
commands:
|
||||
- cp target/NS-USBloader.exe misc/windows/NSIS/
|
||||
- misc/windows/update_version.sh
|
||||
- cd misc/windows/NSIS
|
||||
- makensis -V4 ./installer.nsi
|
||||
- echo Installer-*.exe
|
||||
- cp Installer-*.exe "../../../artifacts"
|
||||
- rm ./NS-USBloader.exe
|
||||
- rm ./Installer-*.exe
|
||||
- cd ../../../
|
||||
volumes:
|
||||
- /home/docker/woodpecker/files/assembly/openjdk-19.0.2:/assembly/jdk
|
||||
- /home/docker/woodpecker/files/assembly/Drivers_set.exe:/assembly/Drivers_set.exe
|
||||
|
||||
- name: emerge-legacy-artifact
|
||||
when:
|
||||
event: [tag, push]
|
||||
image: maven:3-openjdk-17
|
||||
commands:
|
||||
- . ./.make_legacy
|
||||
- mvn -B -DskipTests clean package
|
||||
- echo target/ns-usbloader-*jar
|
||||
- cp target/ns-usbloader-*jar artifacts
|
||||
volumes:
|
||||
- /home/docker/woodpecker/files/m2:/root/.m2
|
||||
|
||||
- name: make-legacy-windows-installer
|
||||
when:
|
||||
event: [tag, push]
|
||||
image: wheatstalk/makensis:3
|
||||
commands:
|
||||
- cp target/NS-USBloader.exe misc/windows/NSIS/
|
||||
- misc/windows/update_version.sh legacy
|
||||
- cd misc/windows/NSIS
|
||||
- makensis -V4 ./installer.nsi
|
||||
- echo Installer-*.exe
|
||||
- cp Installer-*.exe "../../../artifacts"
|
||||
- cd ../../../
|
||||
volumes:
|
||||
- /home/docker/woodpecker/files/assembly/openjdk-19.0.2:/assembly/jdk
|
||||
- /home/docker/woodpecker/files/assembly/Drivers_set.exe:/assembly/Drivers_set.exe
|
||||
|
||||
- name: emerge-mac-m1-artifact
|
||||
when:
|
||||
event: [tag, push]
|
||||
image: maven:3-openjdk-17
|
||||
commands:
|
||||
- . ./.make_m1
|
||||
- mvn -B -DskipTests clean package
|
||||
- echo target/ns-usbloader-*jar
|
||||
- cp target/ns-usbloader-*jar artifacts
|
||||
volumes:
|
||||
- /home/docker/woodpecker/files/m2:/root/.m2
|
||||
|
||||
- name: save-artifacts
|
||||
when:
|
||||
event: [tag, push]
|
||||
image: alpine:latest
|
||||
commands:
|
||||
- export ARTIFACTS_DIR="$(date -d @$CI_PIPELINE_CREATED +'%Y-%m-%d %H:%m %Z')"
|
||||
- mkdir -p /builds/ns-usbloader/
|
||||
- mv artifacts "/builds/ns-usbloader/$ARTIFACTS_DIR"
|
||||
volumes:
|
||||
- /home/www/builds:/builds
|
22
README.md
22
README.md
|
@ -1,6 +1,6 @@
|
|||
<h1 align="center"><img src="screenshots/ApplicationLogo.svg" alt="NS-USBloader" width="450px"/></h1>
|
||||
|
||||
   [](https://ci.redrise.ru/desu/ns-usbloader)
|
||||
   [](https://ci.redrise.ru/repos/12)
|
||||
|
||||
NS-USBloader is:
|
||||
* A PC-side installer for **[Huntereb/Awoo-Installer](https://github.com/Huntereb/Awoo-Installer)** / other compatible installers (USB and Network supported) and **[XorTroll/Goldleaf](https://github.com/XorTroll/Goldleaf)** (USB) NSP installer.
|
||||
|
@ -59,13 +59,16 @@ Sometimes I add new posts about this project [on my blog page](https://developer
|
|||
* Swedish by [Daniel Nylander](https://github.com/yeager)
|
||||
* Japanese by [kuragehime](https://github.com/kuragehimekurara1)
|
||||
* Ryukyuan languages by [kuragehime](https://github.com/kuragehimekurara1)
|
||||
* Turkish language by [Erimsaholut](https://github.com/Erimsaholut)
|
||||
* Serbian (Latin) translation [BlytheScythe](https://github.com/BlytheScythe)
|
||||
|
||||
* Angelo Elias Dalzotto makes packages in AUR
|
||||
* Phoenix[Msc] provides his shiny Mac M1 for debug
|
||||
|
||||
### System requirements
|
||||
|
||||
JDK 11 for macOS and Linux
|
||||
- JDK 11 for macOS and Linux
|
||||
- libusb, if you have a Mac with Apple Silicon (install via `brew install libusb`)
|
||||
|
||||
### Supported Goldleaf versions
|
||||
| Goldleaf version | NS-USBloader version |
|
||||
|
@ -127,6 +130,8 @@ Set 'Security & Privacy' settings if needed.
|
|||
|
||||
Download application with `-m1.jar` postfix.
|
||||
|
||||
Manually install libusb with Homebrew by running `brew install libusb` in your Terminal.
|
||||
|
||||
##### Windows:
|
||||
|
||||
* Once application opens click on 'Gear' icon.
|
||||
|
@ -243,7 +248,7 @@ We have this situation because of weird behaviour inside usb4java library used i
|
|||
|
||||
If you want to see this app translated to your language, go grab [this file](https://github.com/developersu/ns-usbloader/blob/master/src/main/resources/locale.properties) and translate it.
|
||||
|
||||
Upload somewhere (create PR, use pastebin/google drive/whatever else). [Create new issue](https://github.com/developersu/ns-usbloader/issues) and post a link. I'll grab it and add.
|
||||
If you're familiar with pull request, go ahead and create it! No worries it you are not. Just upload somewhere (like pastebin/google drive/whatever else). [Create new issue](https://github.com/developersu/ns-usbloader/issues) and post a link. I'll grab it and add.
|
||||
|
||||
To convert files of any locale to readable format (and vise-versa) you can use this site [https://itpro.cz/juniconv/](https://itpro.cz/juniconv/)
|
||||
|
||||
|
@ -253,17 +258,6 @@ If you like this app, just give a star (@ GitHub).
|
|||
|
||||
This is non-commercial project.
|
||||
|
||||
Nevertheless, I'll be more than happy if you find a chance to make a donation for charity to people I trust:
|
||||
|
||||
* BTC → 1BnErE3n6LEdEjvvFrt4FMdXd1UGa5L7Ge
|
||||
* ETH → 0x9c29418129553bE171181bb6245151aa0576A3b7
|
||||
* DOT → 15BWSwmA4xEHZdq3gGftWg7dctMQk9vXwqA92Pg22gsxDweF
|
||||
* LTC → ltc1qfjvzxm04tax077ra9rvmxdnsum8alws2n20fag
|
||||
* ETC → 0xe9064De288C8454942533a005AB72515e689226E
|
||||
* USDT (TRC20) → TKgp5SvJGiqYNFtvJfEDGLFbezFEHq1tBy
|
||||
* USDT (ERC20) → 0x9c29418129553bE171181bb6245151aa0576A3b7
|
||||
* XRP → rGmGaLsKmSUbxWfyi4mujtVamTzj3Nqxbw.
|
||||
|
||||
Thanks!
|
||||
|
||||
Appreciate assistance and support of both [Vitaliy](https://github.com/SebastianUA) and [Konstantin](https://github.com/konstantin-kelemen). Without you all this magic would not have happened.
|
||||
|
|
|
@ -91,8 +91,8 @@
|
|||
Section "NS-USBloader" Install
|
||||
|
||||
SetOutPath "$INSTDIR"
|
||||
file /r jdk
|
||||
file Drivers_set.exe
|
||||
file /r \assembly\jdk
|
||||
file \assembly\Drivers_set.exe
|
||||
file NS-USBloader.exe
|
||||
file logo.ico
|
||||
|
||||
|
|
2
pom.xml
2
pom.xml
|
@ -8,7 +8,7 @@
|
|||
<name>NS-USBloader</name>
|
||||
|
||||
<artifactId>ns-usbloader</artifactId>
|
||||
<version>7.1</version> <!-- linked via script to NSIS system. Should have format of 2 blocks of numbers -->
|
||||
<version>7.3</version> <!-- linked via script to NSIS system. Should have format of 2 blocks of numbers -->
|
||||
|
||||
<url>https://redrise.ru</url>
|
||||
<description>NS multi-tool</description>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2019-2020 Dmitry Isaenko
|
||||
Copyright 2019-2024 Dmitry Isaenko
|
||||
|
||||
This file is part of NS-USBloader.
|
||||
|
||||
|
@ -39,10 +39,13 @@ import java.util.ResourceBundle;
|
|||
|
||||
public class FilesDropHandle {
|
||||
|
||||
public FilesDropHandle(List<File> files, String filesRegex, String foldersRegex){
|
||||
public FilesDropHandle(List<File> files,
|
||||
String filesRegex,
|
||||
String foldersRegex,
|
||||
NSTableViewController tableController){
|
||||
FilesDropHandleTask filesDropHandleTask = new FilesDropHandleTask(files, filesRegex, foldersRegex);
|
||||
|
||||
ResourceBundle resourceBundle = MediatorControl.getInstance().getResourceBundle();
|
||||
ResourceBundle resourceBundle = MediatorControl.INSTANCE.getResourceBundle();
|
||||
Button cancelButton = new Button(resourceBundle.getString("btn_Cancel"));
|
||||
|
||||
ProgressIndicator progressIndicator = new ProgressIndicator();
|
||||
|
@ -101,7 +104,7 @@ public class FilesDropHandle {
|
|||
List<File> allFiles = filesDropHandleTask.getValue();
|
||||
|
||||
if (! allFiles.isEmpty()) {
|
||||
MediatorControl.getInstance().getGamesController().tableFilesListController.setFiles(allFiles);
|
||||
tableController.setFiles(allFiles);
|
||||
}
|
||||
stage.close();
|
||||
});
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2019-2020 Dmitry Isaenko
|
||||
Copyright 2019-2024 Dmitry Isaenko
|
||||
|
||||
This file is part of NS-USBloader.
|
||||
|
||||
|
@ -32,7 +32,7 @@ public class FilesDropHandleTask extends Task<List<File>> {
|
|||
private final List<File> filesDropped;
|
||||
private final List<File> allFiles;
|
||||
|
||||
private String messageTemplate;
|
||||
private final String messageTemplate;
|
||||
private long filesScanned = 0;
|
||||
private long filesAdded = 0;
|
||||
|
||||
|
@ -43,12 +43,12 @@ public class FilesDropHandleTask extends Task<List<File>> {
|
|||
this.filesRegex = filesRegex;
|
||||
this.foldersRegex = foldersRegex;
|
||||
this.allFiles = new ArrayList<>();
|
||||
this.messageTemplate = MediatorControl.getInstance().getResourceBundle().getString("windowBodyFilesScanned");
|
||||
this.messageTemplate = MediatorControl.INSTANCE.getResourceBundle().getString("windowBodyFilesScanned");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<File> call() {
|
||||
if (filesDropped == null || filesDropped.size() == 0)
|
||||
if (filesDropped == null || filesDropped.isEmpty())
|
||||
return allFiles;
|
||||
|
||||
for (File file : filesDropped){
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2019-2023 Dmitry Isaenko
|
||||
Copyright 2019-2024 Dmitry Isaenko
|
||||
|
||||
This file is part of NS-USBloader.
|
||||
|
||||
|
@ -142,7 +142,9 @@ public class FontSettingsController implements Initializable {
|
|||
final double fontSize = fontSizeSpinner.getValue().intValue();
|
||||
|
||||
preferences.setFontStyle(fontFamily, fontSize);
|
||||
MediatorControl.getInstance().updateApplicationFont(fontFamily, fontSize);
|
||||
|
||||
MediatorControl.INSTANCE.getLogArea().getScene().getRoot().setStyle(
|
||||
String.format("-fx-font-family: \"%s\"; -fx-font-size: %.0f;", fontFamily, fontSize));
|
||||
|
||||
closeWindow();
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2019-2020 Dmitry Isaenko, wolfposd
|
||||
Copyright 2019-2024 Dmitry Isaenko, wolfposd
|
||||
|
||||
This file is part of NS-USBloader.
|
||||
|
||||
|
@ -31,6 +31,7 @@ import javafx.scene.layout.Region;
|
|||
import javafx.stage.DirectoryChooser;
|
||||
import javafx.stage.FileChooser;
|
||||
import nsusbloader.AppPreferences;
|
||||
import nsusbloader.NSLDataTypes.EFileStatus;
|
||||
import nsusbloader.com.net.NETCommunications;
|
||||
import nsusbloader.com.usb.UsbCommunications;
|
||||
import nsusbloader.FilesHelper;
|
||||
|
@ -45,12 +46,14 @@ import java.util.*;
|
|||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class GamesController implements Initializable {
|
||||
public class GamesController implements Initializable, ISubscriber {
|
||||
|
||||
private static final String REGEX_ONLY_NSP = ".*\\.nsp$";
|
||||
private static final String REGEX_ALLFILES_TINFOIL = ".*\\.(nsp$|xci$|nsz$|xcz$)";
|
||||
private static final String REGEX_ALLFILES = ".*";
|
||||
|
||||
private static final MediatorControl mediator = MediatorControl.INSTANCE;
|
||||
|
||||
@FXML
|
||||
private AnchorPane usbNetPane;
|
||||
|
||||
|
@ -63,7 +66,7 @@ public class GamesController implements Initializable {
|
|||
@FXML
|
||||
private Button switchThemeBtn;
|
||||
@FXML
|
||||
public NSTableViewController tableFilesListController; // Accessible from Mediator (for drag-n-drop support)
|
||||
private NSTableViewController tableFilesListController;
|
||||
|
||||
@FXML
|
||||
private Button selectNspBtn, selectSplitBtn, uploadStopBtn;
|
||||
|
@ -101,6 +104,7 @@ public class GamesController implements Initializable {
|
|||
disableUploadStopBtn(tableFilesListController.isFilesForUploadListEmpty());
|
||||
}); // Add listener to notify tableView controller
|
||||
tableFilesListController.setNewProtocol(getSelectedProtocolByName()); // Notify tableView controller
|
||||
tableFilesListController.setGamesController(this);
|
||||
|
||||
ObservableList<String> choiceNetUsbList = FXCollections.observableArrayList("USB", "NET");
|
||||
choiceNetUsb.setItems(choiceNetUsbList);
|
||||
|
@ -204,11 +208,11 @@ public class GamesController implements Initializable {
|
|||
}
|
||||
|
||||
private boolean isAllFiletypesAllowedForGL() {
|
||||
return ! MediatorControl.getInstance().getSettingsController().getGoldleafSettings().getNSPFileFilterForGL();
|
||||
return ! mediator.getSettingsController().getGoldleafSettings().getNSPFileFilterForGL();
|
||||
}
|
||||
|
||||
private boolean isXciNszXczSupport() {
|
||||
return MediatorControl.getInstance().getSettingsController().getTinfoilSettings().isXciNszXczSupport();
|
||||
return mediator.getSettingsController().getTinfoilSettings().isXciNszXczSupport();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -216,7 +220,7 @@ public class GamesController implements Initializable {
|
|||
* tinfoil + xcinszxcz </br>
|
||||
* tinfoil + nsponly </br>
|
||||
* goldleaf </br>
|
||||
* etc..
|
||||
* etc...
|
||||
*/
|
||||
private String getRegexForFiles() {
|
||||
if (isTinfoil() && isXciNszXczSupport())
|
||||
|
@ -368,56 +372,58 @@ public class GamesController implements Initializable {
|
|||
if (workThread != null && workThread.isAlive())
|
||||
return;
|
||||
|
||||
// Collect files
|
||||
List<File> nspToUpload;
|
||||
|
||||
TextArea logArea = MediatorControl.getInstance().getContoller().logArea;
|
||||
|
||||
if (isTinfoil() && tableFilesListController.getFilesForUpload() == null) {
|
||||
logArea.setText(resourceBundle.getString("tab3_Txt_NoFolderOrFileSelected"));
|
||||
ServiceWindow.getInfoNotification("(o_o\")", resourceBundle.getString("tab3_Txt_NoFolderOrFileSelected"));
|
||||
return;
|
||||
}
|
||||
|
||||
if ((nspToUpload = tableFilesListController.getFilesForUpload()) != null){
|
||||
// Collect files
|
||||
List<File> nspToUpload = tableFilesListController.getFilesForUpload();
|
||||
|
||||
if (nspToUpload == null)
|
||||
nspToUpload = new ArrayList<>();
|
||||
//todo: add to make it visible
|
||||
/*
|
||||
else {
|
||||
TextArea logArea = mediator.getLogArea();
|
||||
logArea.setText(resourceBundle.getString("tab3_Txt_FilesToUploadTitle")+"\n");
|
||||
nspToUpload.forEach(item -> logArea.appendText(" "+item.getAbsolutePath()+"\n"));
|
||||
}
|
||||
else {
|
||||
logArea.clear();
|
||||
nspToUpload = new LinkedList<>();
|
||||
}
|
||||
*/
|
||||
|
||||
SettingsController settings = MediatorControl.getInstance().getSettingsController();
|
||||
SettingsController settings = mediator.getSettingsController();
|
||||
// If USB selected
|
||||
if (isGoldLeaf()){
|
||||
final SettingsBlockGoldleafController goldleafSettings = settings.getGoldleafSettings();
|
||||
usbNetCommunications = new UsbCommunications(nspToUpload, "GoldLeaf" + goldleafSettings.getGlVer(), goldleafSettings.getNSPFileFilterForGL());
|
||||
}
|
||||
else if (( isTinfoil() && getSelectedNetUsb().equals("USB") )){
|
||||
usbNetCommunications = new UsbCommunications(nspToUpload, "TinFoil", false);
|
||||
}
|
||||
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 (tinfoilSettings.isValidateNSHostName() && ! getNsIp().matches(ipValidationPattern)) {
|
||||
if (!ServiceWindow.getConfirmationWindow(resourceBundle.getString("windowTitleBadIp"), resourceBundle.getString("windowBodyBadIp")))
|
||||
return;
|
||||
else {
|
||||
if (getSelectedNetUsb().equals("USB")){
|
||||
usbNetCommunications = new UsbCommunications(nspToUpload, "TinFoil", false);
|
||||
}
|
||||
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();
|
||||
|
||||
String nsIP = getNsIp();
|
||||
if (tinfoilSettings.isValidateNSHostName() && ! getNsIp().matches(ipValidationPattern)) {
|
||||
if (!ServiceWindow.getConfirmationWindow(resourceBundle.getString("windowTitleBadIp"), resourceBundle.getString("windowBodyBadIp")))
|
||||
return;
|
||||
}
|
||||
|
||||
if (! tinfoilSettings.isExpertModeSelected())
|
||||
usbNetCommunications = new NETCommunications(nspToUpload, nsIP, false, "", "", "");
|
||||
else {
|
||||
usbNetCommunications = new NETCommunications(
|
||||
nspToUpload,
|
||||
nsIP,
|
||||
tinfoilSettings.isNoRequestsServe(),
|
||||
tinfoilSettings.isAutoDetectIp()?"":tinfoilSettings.getHostIp(),
|
||||
tinfoilSettings.isRandomlySelectPort()?"":tinfoilSettings.getHostPort(),
|
||||
tinfoilSettings.isNoRequestsServe()?tinfoilSettings.getHostExtra():""
|
||||
);
|
||||
String nsIP = getNsIp();
|
||||
|
||||
if (! tinfoilSettings.isExpertModeSelected())
|
||||
usbNetCommunications = new NETCommunications(nspToUpload, nsIP, false, "", "", "");
|
||||
else {
|
||||
usbNetCommunications = new NETCommunications(
|
||||
nspToUpload,
|
||||
nsIP,
|
||||
tinfoilSettings.isNoRequestsServe(),
|
||||
tinfoilSettings.isAutoDetectIp()?"":tinfoilSettings.getHostIp(),
|
||||
tinfoilSettings.isRandomlySelectPort()?"":tinfoilSettings.getHostPort(),
|
||||
tinfoilSettings.isNoRequestsServe()?tinfoilSettings.getHostExtra():""
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
workThread = new Thread(usbNetCommunications);
|
||||
|
@ -446,7 +452,7 @@ public class GamesController implements Initializable {
|
|||
* */
|
||||
@FXML
|
||||
private void handleDragOver(DragEvent event){
|
||||
if (event.getDragboard().hasFiles() && ! MediatorControl.getInstance().getTransferActive())
|
||||
if (event.getDragboard().hasFiles() && ! mediator.getTransferActive())
|
||||
event.acceptTransferModes(TransferMode.ANY);
|
||||
event.consume();
|
||||
}
|
||||
|
@ -456,47 +462,15 @@ public class GamesController implements Initializable {
|
|||
@FXML
|
||||
private void handleDrop(DragEvent event) {
|
||||
List<File> files = event.getDragboard().getFiles();
|
||||
new FilesDropHandle(files, getRegexForFiles(), getRegexForFolders());
|
||||
new FilesDropHandle(files, getRegexForFiles(), getRegexForFolders(), tableFilesListController);
|
||||
event.setDropCompleted(true);
|
||||
event.consume();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This thing modify UI for reusing 'Upload to NS' button and make functionality set for "Stop transmission"
|
||||
* Called from mediator
|
||||
* TODO: remove shitcoding practices
|
||||
* This function called from NSTableViewController
|
||||
* */
|
||||
public void notifyThreadStarted(boolean isActive, EModule type){
|
||||
if (! type.equals(EModule.USB_NET_TRANSFERS)){
|
||||
usbNetPane.setDisable(isActive);
|
||||
return;
|
||||
}
|
||||
|
||||
selectNspBtn.setDisable(isActive);
|
||||
selectSplitBtn.setDisable(isActive);
|
||||
btnUpStopImage.getStyleClass().clear();
|
||||
|
||||
if (isActive) {
|
||||
btnUpStopImage.getStyleClass().add("regionStop");
|
||||
|
||||
uploadStopBtn.setOnAction(e-> stopBtnAction());
|
||||
uploadStopBtn.setText(resourceBundle.getString("btn_Stop"));
|
||||
uploadStopBtn.getStyleClass().remove("buttonUp");
|
||||
uploadStopBtn.getStyleClass().add("buttonStop");
|
||||
}
|
||||
else {
|
||||
btnUpStopImage.getStyleClass().add("regionUpload");
|
||||
|
||||
uploadStopBtn.setOnAction(e-> uploadBtnAction());
|
||||
uploadStopBtn.setText(resourceBundle.getString("btn_Upload"));
|
||||
uploadStopBtn.getStyleClass().remove("buttonStop");
|
||||
uploadStopBtn.getStyleClass().add("buttonUp");
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Crunch. This function called from NSTableViewController
|
||||
* */
|
||||
public void disableUploadStopBtn(boolean disable){
|
||||
void disableUploadStopBtn(boolean disable){
|
||||
if (isTinfoil())
|
||||
uploadStopBtn.setDisable(disable);
|
||||
else
|
||||
|
@ -515,11 +489,8 @@ public class GamesController implements Initializable {
|
|||
}).start();
|
||||
}
|
||||
|
||||
public void updateFilesSelectorButtonBehaviour(boolean isDirectoryChooser){
|
||||
void setFilesSelectorButtonBehaviour(boolean isDirectoryChooser){
|
||||
btnSelectImage.getStyleClass().clear();
|
||||
setFilesSelectorButtonBehaviour(isDirectoryChooser);
|
||||
}
|
||||
private void setFilesSelectorButtonBehaviour(boolean isDirectoryChooser){
|
||||
if (isDirectoryChooser){
|
||||
selectNspBtn.setOnAction(e -> selectFoldersBtnAction());
|
||||
btnSelectImage.getStyleClass().add("regionScanFolders");
|
||||
|
@ -535,7 +506,7 @@ public class GamesController implements Initializable {
|
|||
/**
|
||||
* Get 'Recent' path
|
||||
*/
|
||||
public String getRecentPath(){
|
||||
private String getRecentPath(){
|
||||
return previouslyOpenedPath;
|
||||
}
|
||||
|
||||
|
@ -547,4 +518,42 @@ public class GamesController implements Initializable {
|
|||
preferences.setNetUsb(getSelectedNetUsb());
|
||||
preferences.setNsIp(getNsIp());
|
||||
}
|
||||
|
||||
/**
|
||||
* This thing modifies UI for reusing 'Upload to NS' button and make functionality set for "Stop transmission"
|
||||
* */
|
||||
@Override
|
||||
public void notify(EModule type, boolean isActive, Payload payload) {
|
||||
if (! type.equals(EModule.USB_NET_TRANSFERS)){
|
||||
usbNetPane.setDisable(isActive);
|
||||
return;
|
||||
}
|
||||
|
||||
selectNspBtn.setDisable(isActive);
|
||||
selectSplitBtn.setDisable(isActive);
|
||||
btnUpStopImage.getStyleClass().clear();
|
||||
|
||||
if (isActive) {
|
||||
btnUpStopImage.getStyleClass().add("regionStop");
|
||||
|
||||
uploadStopBtn.setOnAction(e-> stopBtnAction());
|
||||
uploadStopBtn.setText(resourceBundle.getString("btn_Stop"));
|
||||
uploadStopBtn.getStyleClass().remove("buttonUp");
|
||||
uploadStopBtn.getStyleClass().add("buttonStop");
|
||||
return;
|
||||
}
|
||||
btnUpStopImage.getStyleClass().add("regionUpload");
|
||||
|
||||
uploadStopBtn.setOnAction(e-> uploadBtnAction());
|
||||
uploadStopBtn.setText(resourceBundle.getString("btn_Upload"));
|
||||
uploadStopBtn.getStyleClass().remove("buttonStop");
|
||||
uploadStopBtn.getStyleClass().add("buttonUp");
|
||||
|
||||
Map<String, EFileStatus> statusMap = payload.getStatusMap();
|
||||
|
||||
if (! statusMap.isEmpty()) {
|
||||
for (String key : statusMap.keySet())
|
||||
tableFilesListController.setFileStatus(key, statusMap.get(key));
|
||||
}
|
||||
}
|
||||
}
|
25
src/main/java/nsusbloader/Controllers/ISubscriber.java
Normal file
25
src/main/java/nsusbloader/Controllers/ISubscriber.java
Normal file
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
Copyright 2019-2024 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 nsusbloader.NSLDataTypes.EModule;
|
||||
|
||||
public interface ISubscriber {
|
||||
void notify(EModule type, boolean status, Payload payload);
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2019-2020 Dmitry Isaenko
|
||||
Copyright 2019-2024 Dmitry Isaenko
|
||||
|
||||
This file is part of NS-USBloader.
|
||||
|
||||
|
@ -18,7 +18,6 @@
|
|||
*/
|
||||
package nsusbloader.Controllers;
|
||||
|
||||
import javafx.application.HostServices;
|
||||
import javafx.concurrent.Task;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.fxml.Initializable;
|
||||
|
@ -35,10 +34,10 @@ public class NSLMainController implements Initializable {
|
|||
private ResourceBundle resourceBundle;
|
||||
|
||||
@FXML
|
||||
public TextArea logArea; // Accessible from Mediator
|
||||
private TextArea logArea;
|
||||
|
||||
@FXML
|
||||
public ProgressBar progressBar; // Accessible from Mediator
|
||||
private ProgressBar progressBar;
|
||||
|
||||
@FXML
|
||||
private TabPane mainTabPane;
|
||||
|
@ -68,8 +67,6 @@ public class NSLMainController implements Initializable {
|
|||
|
||||
logArea.appendText(rb.getString("tab3_Txt_GreetingsMessage2")+"\n");
|
||||
|
||||
MediatorControl.getInstance().setController(this);
|
||||
|
||||
AppPreferences preferences = AppPreferences.getInstance();
|
||||
|
||||
if (preferences.getAutoCheckUpdates())
|
||||
|
@ -79,6 +76,22 @@ public class NSLMainController implements Initializable {
|
|||
mainTabPane.getTabs().remove(3);
|
||||
|
||||
openLastOpenedTab();
|
||||
|
||||
TransfersPublisher transfersPublisher = new TransfersPublisher(
|
||||
GamesTabController,
|
||||
SplitMergeTabController,
|
||||
RcmTabController,
|
||||
NXDTabController,
|
||||
PatchesTabController);
|
||||
|
||||
MediatorControl.INSTANCE.configure(
|
||||
resourceBundle,
|
||||
SettingsTabController,
|
||||
logArea,
|
||||
progressBar,
|
||||
GamesTabController,
|
||||
transfersPublisher);
|
||||
|
||||
}
|
||||
private void checkForUpdates(){
|
||||
Task<List<String>> updTask = new UpdatesChecker();
|
||||
|
@ -101,40 +114,7 @@ public class NSLMainController implements Initializable {
|
|||
updates.setDaemon(true);
|
||||
updates.start();
|
||||
}
|
||||
/**
|
||||
* Get resources
|
||||
* TODO: Find better solution; used in UsbCommunications() -> GL -> SelectFile command
|
||||
* @return ResourceBundle
|
||||
*/
|
||||
public ResourceBundle getResourceBundle() {
|
||||
return resourceBundle;
|
||||
}
|
||||
/**
|
||||
* Provide hostServices to Settings tab
|
||||
* */
|
||||
public void setHostServices(HostServices hs ){ SettingsTabController.getGenericSettings().registerHostServices(hs);}
|
||||
|
||||
/**
|
||||
* Get 'Settings' controller
|
||||
* Used by FrontController
|
||||
* */
|
||||
public SettingsController getSettingsCtrlr(){
|
||||
return SettingsTabController;
|
||||
}
|
||||
|
||||
public GamesController getGamesCtrlr(){
|
||||
return GamesTabController;
|
||||
}
|
||||
|
||||
public SplitMergeController getSmCtrlr(){
|
||||
return SplitMergeTabController;
|
||||
}
|
||||
|
||||
public RcmController getRcmCtrlr(){ return RcmTabController; }
|
||||
|
||||
public NxdtController getNXDTabController(){ return NXDTabController; }
|
||||
|
||||
public PatchesController getPatchesTabController(){ return PatchesTabController; }
|
||||
/**
|
||||
* Save preferences before exit
|
||||
* */
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2019-2020 Dmitry Isaenko, wolfposd
|
||||
Copyright 2019-2024 Dmitry Isaenko, wolfposd
|
||||
|
||||
This file is part of NS-USBloader.
|
||||
|
||||
|
@ -42,6 +42,8 @@ public class NSTableViewController implements Initializable {
|
|||
private TableView<NSLRowModel> table;
|
||||
private ObservableList<NSLRowModel> rowsObsLst;
|
||||
|
||||
private GamesController gamesController;
|
||||
|
||||
@Override
|
||||
public void initialize(URL url, ResourceBundle resourceBundle) {
|
||||
rowsObsLst = FXCollections.observableArrayList();
|
||||
|
@ -52,10 +54,10 @@ public class NSTableViewController implements Initializable {
|
|||
table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
|
||||
table.setOnKeyPressed(keyEvent -> {
|
||||
if (!rowsObsLst.isEmpty()) {
|
||||
if (keyEvent.getCode() == KeyCode.DELETE && !MediatorControl.getInstance().getTransferActive()) {
|
||||
if (keyEvent.getCode() == KeyCode.DELETE && !MediatorControl.INSTANCE.getTransferActive()) {
|
||||
rowsObsLst.removeAll(table.getSelectionModel().getSelectedItems());
|
||||
if (rowsObsLst.isEmpty())
|
||||
MediatorControl.getInstance().getGamesController().disableUploadStopBtn(true); // TODO: change to something better
|
||||
gamesController.disableUploadStopBtn(true);
|
||||
table.refresh();
|
||||
} else if (keyEvent.getCode() == KeyCode.SPACE) {
|
||||
for (NSLRowModel item : table.getSelectionModel().getSelectedItems()) {
|
||||
|
@ -173,13 +175,13 @@ public class NSTableViewController implements Initializable {
|
|||
deleteMenuItem.setOnAction(actionEvent -> {
|
||||
rowsObsLst.remove(row.getItem());
|
||||
if (rowsObsLst.isEmpty())
|
||||
MediatorControl.getInstance().getGamesController().disableUploadStopBtn(true); // TODO: change to something better
|
||||
gamesController.disableUploadStopBtn(true);
|
||||
table.refresh();
|
||||
});
|
||||
MenuItem deleteAllMenuItem = new MenuItem(resourceBundle.getString("tab1_table_contextMenu_Btn_DeleteAll"));
|
||||
deleteAllMenuItem.setOnAction(actionEvent -> {
|
||||
rowsObsLst.clear();
|
||||
MediatorControl.getInstance().getGamesController().disableUploadStopBtn(true); // TODO: change to something better
|
||||
gamesController.disableUploadStopBtn(true);
|
||||
table.refresh();
|
||||
});
|
||||
contextMenu.getItems().addAll(deleteMenuItem, deleteAllMenuItem);
|
||||
|
@ -189,7 +191,7 @@ public class NSTableViewController implements Initializable {
|
|||
Bindings.when(
|
||||
Bindings.isNotNull(
|
||||
row.itemProperty()))
|
||||
.then(MediatorControl.getInstance().getTransferActive()?null:contextMenu)
|
||||
.then(MediatorControl.INSTANCE.getTransferActive()?null:contextMenu)
|
||||
.otherwise((ContextMenu) null)
|
||||
);
|
||||
// Just.. don't ask..
|
||||
|
@ -210,6 +212,11 @@ public class NSTableViewController implements Initializable {
|
|||
table.getColumns().add(fileSizeColumn);
|
||||
table.getColumns().add(uploadColumn);
|
||||
}
|
||||
|
||||
public void setGamesController(GamesController gamesController) {
|
||||
this.gamesController = gamesController;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add single file when user selected it (Split file usually)
|
||||
* */
|
||||
|
@ -224,7 +231,7 @@ public class NSTableViewController implements Initializable {
|
|||
}
|
||||
else {
|
||||
rowsObsLst.add(new NSLRowModel(file, true));
|
||||
MediatorControl.getInstance().getGamesController().disableUploadStopBtn(false); // TODO: change to something better
|
||||
gamesController.disableUploadStopBtn(false);
|
||||
}
|
||||
table.refresh();
|
||||
}
|
||||
|
@ -244,7 +251,7 @@ public class NSTableViewController implements Initializable {
|
|||
else {
|
||||
for (File file: newFiles)
|
||||
rowsObsLst.add(new NSLRowModel(file, true));
|
||||
MediatorControl.getInstance().getGamesController().disableUploadStopBtn(false); // TODO: change to something better
|
||||
gamesController.disableUploadStopBtn(false);
|
||||
}
|
||||
//rowsObsLst.get(0).setMarkForUpload(true);
|
||||
table.refresh();
|
||||
|
|
|
@ -25,8 +25,6 @@ import javafx.scene.control.Label;
|
|||
import javafx.scene.layout.Region;
|
||||
import javafx.stage.DirectoryChooser;
|
||||
import nsusbloader.AppPreferences;
|
||||
import nsusbloader.FilesHelper;
|
||||
import nsusbloader.MediatorControl;
|
||||
import nsusbloader.ModelControllers.CancellableRunnable;
|
||||
import nsusbloader.NSLDataTypes.EModule;
|
||||
import nsusbloader.Utilities.nxdumptool.NxdtTask;
|
||||
|
@ -35,7 +33,7 @@ import java.io.File;
|
|||
import java.net.URL;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
public class NxdtController implements Initializable {
|
||||
public class NxdtController implements Initializable, ISubscriber {
|
||||
@FXML
|
||||
private Label saveToLocationLbl, statusLbl;
|
||||
|
||||
|
@ -79,7 +77,6 @@ public class NxdtController implements Initializable {
|
|||
* */
|
||||
private void startDumpProcess(){
|
||||
if ((workThread == null || ! workThread.isAlive())){
|
||||
MediatorControl.getInstance().getContoller().logArea.clear();
|
||||
|
||||
nxdtTask = new NxdtTask(saveToLocationLbl.getText());
|
||||
workThread = new Thread(nxdtTask);
|
||||
|
@ -97,12 +94,22 @@ public class NxdtController implements Initializable {
|
|||
}
|
||||
}
|
||||
|
||||
public void notifyThreadStarted(boolean isActive, EModule type){
|
||||
/**
|
||||
* Save application settings on exit
|
||||
* */
|
||||
public void updatePreferencesOnExit(){
|
||||
AppPreferences.getInstance().setNXDTSaveToLocation(saveToLocationLbl.getText());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notify(EModule type, boolean isActive, Payload payload) {
|
||||
if (! type.equals(EModule.NXDT)){
|
||||
injectPldBtn.setDisable(isActive);
|
||||
return;
|
||||
}
|
||||
|
||||
statusLbl.setText(payload.getMessage());
|
||||
|
||||
if (isActive) {
|
||||
btnDumpStopImage.getStyleClass().clear();
|
||||
btnDumpStopImage.getStyleClass().add("regionStop");
|
||||
|
@ -121,16 +128,4 @@ public class NxdtController implements Initializable {
|
|||
injectPldBtn.getStyleClass().remove("buttonStop");
|
||||
injectPldBtn.getStyleClass().add("buttonUp");
|
||||
}
|
||||
public void setOneLineStatus(boolean status){
|
||||
if (status)
|
||||
statusLbl.setText(rb.getString("done_txt"));
|
||||
else
|
||||
statusLbl.setText(rb.getString("failure_txt"));
|
||||
}
|
||||
/**
|
||||
* Save application settings on exit
|
||||
* */
|
||||
public void updatePreferencesOnExit(){
|
||||
AppPreferences.getInstance().setNXDTSaveToLocation(saveToLocationLbl.getText());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2018-2022 Dmitry Isaenko
|
||||
Copyright 2018-2024 Dmitry Isaenko
|
||||
|
||||
This file is part of NS-USBloader.
|
||||
|
||||
|
@ -46,7 +46,7 @@ import nsusbloader.Utilities.patches.fs.FsPatchMaker;
|
|||
import nsusbloader.Utilities.patches.loader.LoaderPatchMaker;
|
||||
|
||||
// TODO: CLI SUPPORT
|
||||
public class PatchesController implements Initializable {
|
||||
public class PatchesController implements Initializable, ISubscriber {
|
||||
@FXML
|
||||
private VBox patchesToolPane;
|
||||
@FXML
|
||||
|
@ -237,9 +237,8 @@ public class PatchesController implements Initializable {
|
|||
|
||||
if (workThread != null && workThread.isAlive())
|
||||
return;
|
||||
statusLbl.setText("");
|
||||
|
||||
if (MediatorControl.getInstance().getTransferActive()) {
|
||||
if (MediatorControl.INSTANCE.getTransferActive()) {
|
||||
ServiceWindow.getErrorNotification(resourceBundle.getString("windowTitleError"),
|
||||
resourceBundle.getString("windowBodyPleaseStopOtherProcessFirst"));
|
||||
return;
|
||||
|
@ -261,9 +260,8 @@ public class PatchesController implements Initializable {
|
|||
|
||||
if (workThread != null && workThread.isAlive())
|
||||
return;
|
||||
statusLbl.setText("");
|
||||
|
||||
if (MediatorControl.getInstance().getTransferActive()) {
|
||||
if (MediatorControl.INSTANCE.getTransferActive()) {
|
||||
ServiceWindow.getErrorNotification(resourceBundle.getString("windowTitleError"),
|
||||
resourceBundle.getString("windowBodyPleaseStopOtherProcessFirst"));
|
||||
return;
|
||||
|
@ -285,9 +283,8 @@ public class PatchesController implements Initializable {
|
|||
|
||||
if (workThread != null && workThread.isAlive())
|
||||
return;
|
||||
statusLbl.setText("");
|
||||
|
||||
if (MediatorControl.getInstance().getTransferActive()) {
|
||||
if (MediatorControl.INSTANCE.getTransferActive()) {
|
||||
ServiceWindow.getErrorNotification(resourceBundle.getString("windowTitleError"),
|
||||
resourceBundle.getString("windowBodyPleaseStopOtherProcessFirst"));
|
||||
return;
|
||||
|
@ -306,18 +303,20 @@ public class PatchesController implements Initializable {
|
|||
workThread.interrupt();
|
||||
}
|
||||
|
||||
public void notifyThreadStarted(boolean isActive, EModule type) {
|
||||
@Override
|
||||
public void notify(EModule type, boolean isActive, Payload payload) {
|
||||
if (! type.equals(EModule.PATCHES)) {
|
||||
patchesToolPane.setDisable(isActive);
|
||||
return;
|
||||
}
|
||||
|
||||
statusLbl.setText(payload.getMessage());
|
||||
|
||||
convertRegionEs.getStyleClass().clear();
|
||||
makeFsBtn.setVisible(! isActive);
|
||||
makeLoaderBtn.setVisible(! isActive);
|
||||
|
||||
if (isActive) {
|
||||
MediatorControl.getInstance().getContoller().logArea.clear();
|
||||
convertRegionEs.getStyleClass().add("regionStop");
|
||||
|
||||
makeEsBtn.setOnAction(e-> interruptProcessOfPatchMaking());
|
||||
|
@ -334,13 +333,6 @@ public class PatchesController implements Initializable {
|
|||
makeEsBtn.getStyleClass().add("buttonUp");
|
||||
}
|
||||
|
||||
public void setOneLineStatus(boolean statusSuccess){
|
||||
if (statusSuccess)
|
||||
statusLbl.setText(resourceBundle.getString("done_txt"));
|
||||
else
|
||||
statusLbl.setText(resourceBundle.getString("failure_txt"));
|
||||
}
|
||||
|
||||
void updatePreferencesOnExit(){
|
||||
AppPreferences.getInstance().setPatchesSaveToLocation(saveToLbl.getText());
|
||||
if (locationKeysLbl.getText().isEmpty())
|
||||
|
|
48
src/main/java/nsusbloader/Controllers/Payload.java
Normal file
48
src/main/java/nsusbloader/Controllers/Payload.java
Normal file
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
Copyright 2019-2024 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 nsusbloader.NSLDataTypes.EFileStatus;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
|
||||
public class Payload {
|
||||
private final String message;
|
||||
private final Map<String, EFileStatus> statusMap;
|
||||
|
||||
public Payload(){
|
||||
this("");
|
||||
}
|
||||
public Payload(String message){
|
||||
this(message, Collections.emptyMap());
|
||||
}
|
||||
public Payload(String message, Map<String, EFileStatus> statusMap){
|
||||
this.message = message;
|
||||
this.statusMap = statusMap;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public Map<String, EFileStatus> getStatusMap() {
|
||||
return statusMap;
|
||||
}
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2019-2020 Dmitry Isaenko
|
||||
Copyright 2019-2024 Dmitry Isaenko
|
||||
|
||||
This file is part of NS-USBloader.
|
||||
|
||||
|
@ -41,7 +41,7 @@ import java.io.File;
|
|||
import java.net.URL;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
public class RcmController implements Initializable {
|
||||
public class RcmController implements Initializable, ISubscriber {
|
||||
@FXML
|
||||
private ToggleGroup rcmToggleGrp;
|
||||
|
||||
|
@ -68,12 +68,14 @@ public class RcmController implements Initializable {
|
|||
@FXML
|
||||
private Label statusLbl;
|
||||
|
||||
private AppPreferences preferences;
|
||||
private ResourceBundle rb;
|
||||
private String myRegexp;
|
||||
|
||||
@Override
|
||||
public void initialize(URL url, ResourceBundle resourceBundle) {
|
||||
this.rb = resourceBundle;
|
||||
final AppPreferences preferences = AppPreferences.getInstance();
|
||||
this.preferences = AppPreferences.getInstance();
|
||||
|
||||
rcmToggleGrp.selectToggle(pldrRadio1);
|
||||
pldrRadio1.setOnAction(e -> statusLbl.setText(""));
|
||||
|
@ -193,8 +195,7 @@ public class RcmController implements Initializable {
|
|||
}
|
||||
|
||||
private void smash(){
|
||||
statusLbl.setText("");
|
||||
if (MediatorControl.getInstance().getTransferActive()) {
|
||||
if (MediatorControl.INSTANCE.getTransferActive()) {
|
||||
ServiceWindow.getErrorNotification(rb.getString("windowTitleError"),
|
||||
rb.getString("windowBodyPleaseStopOtherProcessFirst"));
|
||||
return;
|
||||
|
@ -273,31 +274,28 @@ public class RcmController implements Initializable {
|
|||
private void bntResetPayloader(ActionEvent event){
|
||||
final Node btn = (Node)event.getSource();
|
||||
|
||||
statusLbl.setText("");
|
||||
|
||||
switch (btn.getId()){
|
||||
case "resPldBtn1":
|
||||
payloadFNameLbl1.setText("");
|
||||
payloadFPathLbl1.setText("");
|
||||
statusLbl.setText("");
|
||||
break;
|
||||
case "resPldBtn2":
|
||||
payloadFNameLbl2.setText("");
|
||||
payloadFPathLbl2.setText("");
|
||||
statusLbl.setText("");
|
||||
break;
|
||||
case "resPldBtn3":
|
||||
payloadFNameLbl3.setText("");
|
||||
payloadFPathLbl3.setText("");
|
||||
statusLbl.setText("");
|
||||
break;
|
||||
case "resPldBtn4":
|
||||
payloadFNameLbl4.setText("");
|
||||
payloadFPathLbl4.setText("");
|
||||
statusLbl.setText("");
|
||||
break;
|
||||
case "resPldBtn5":
|
||||
payloadFNameLbl5.setText("");
|
||||
payloadFPathLbl5.setText("");
|
||||
statusLbl.setText("");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -324,27 +322,20 @@ public class RcmController implements Initializable {
|
|||
}
|
||||
}
|
||||
|
||||
public void setOneLineStatus(boolean statusSuccess){
|
||||
if (statusSuccess)
|
||||
statusLbl.setText(rb.getString("done_txt"));
|
||||
else
|
||||
statusLbl.setText(rb.getString("failure_txt"));
|
||||
}
|
||||
|
||||
public void notifyThreadStarted(boolean isStart, EModule type){
|
||||
rcmToolPane.setDisable(isStart);
|
||||
if (type.equals(EModule.RCM) && isStart){
|
||||
MediatorControl.getInstance().getContoller().logArea.clear();
|
||||
}
|
||||
@Override
|
||||
public void notify(EModule type, boolean isActive, Payload payload) {
|
||||
rcmToolPane.setDisable(isActive);
|
||||
if (type.equals(EModule.RCM))
|
||||
statusLbl.setText(payload.getMessage());
|
||||
}
|
||||
/**
|
||||
* Save application settings on exit
|
||||
* */
|
||||
public void updatePreferencesOnExit(){
|
||||
AppPreferences.getInstance().setRecentRcm(1, payloadFPathLbl1.getText());
|
||||
AppPreferences.getInstance().setRecentRcm(2, payloadFPathLbl2.getText());
|
||||
AppPreferences.getInstance().setRecentRcm(3, payloadFPathLbl3.getText());
|
||||
AppPreferences.getInstance().setRecentRcm(4, payloadFPathLbl4.getText());
|
||||
AppPreferences.getInstance().setRecentRcm(5, payloadFPathLbl5.getText());
|
||||
preferences.setRecentRcm(1, payloadFPathLbl1.getText());
|
||||
preferences.setRecentRcm(2, payloadFPathLbl2.getText());
|
||||
preferences.setRecentRcm(3, payloadFPathLbl3.getText());
|
||||
preferences.setRecentRcm(4, payloadFPathLbl4.getText());
|
||||
preferences.setRecentRcm(5, payloadFPathLbl5.getText());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2019-2020 Dmitry Isaenko
|
||||
Copyright 2019-2024 Dmitry Isaenko
|
||||
|
||||
This file is part of NS-USBloader.
|
||||
|
||||
|
@ -55,9 +55,7 @@ public class SettingsBlockGenericController implements Initializable {
|
|||
direcroriesChooserForRomsCB;
|
||||
@FXML
|
||||
private Hyperlink newVersionHyperlink;
|
||||
|
||||
private ResourceBundle resourceBundle;
|
||||
|
||||
private HostServices hostServices;
|
||||
|
||||
@Override
|
||||
|
@ -68,8 +66,8 @@ public class SettingsBlockGenericController implements Initializable {
|
|||
autoCheckForUpdatesCB.setSelected(preferences.getAutoCheckUpdates());
|
||||
direcroriesChooserForRomsCB.setSelected(preferences.getDirectoriesChooserForRoms());
|
||||
direcroriesChooserForRomsCB.setOnAction(actionEvent ->
|
||||
MediatorControl.getInstance().getGamesController().updateFilesSelectorButtonBehaviour(direcroriesChooserForRomsCB.isSelected())
|
||||
);
|
||||
MediatorControl.INSTANCE.getGamesController().setFilesSelectorButtonBehaviour(direcroriesChooserForRomsCB.isSelected())
|
||||
);
|
||||
|
||||
Region btnSwitchImage = new Region();
|
||||
btnSwitchImage.getStyleClass().add("regionUpdatesCheck");
|
||||
|
@ -81,6 +79,7 @@ public class SettingsBlockGenericController implements Initializable {
|
|||
languagesChB.setItems(settingsLanguagesSetup.getLanguages());
|
||||
languagesChB.getSelectionModel().select(settingsLanguagesSetup.getRecentLanguage());
|
||||
|
||||
hostServices = MediatorControl.INSTANCE.getHostServices();
|
||||
newVersionHyperlink.setOnAction(e-> hostServices.showDocument(newVersionHyperlink.getText()));
|
||||
checkForUpdBtn.setOnAction(e->checkForUpdatesAction());
|
||||
submitLanguageBtn.setOnAction(e->languageButtonAction());
|
||||
|
@ -149,8 +148,6 @@ public class SettingsBlockGenericController implements Initializable {
|
|||
return direcroriesChooserForRomsCB.isSelected();
|
||||
}
|
||||
|
||||
protected void registerHostServices(HostServices hostServices){ this.hostServices = hostServices;}
|
||||
|
||||
void setNewVersionLink(String newVer){
|
||||
newVersionHyperlink.setVisible(true);
|
||||
newVersionHyperlink.setText("https://github.com/developersu/ns-usbloader/releases/tag/"+newVer);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2019-2020 Dmitry Isaenko
|
||||
Copyright 2019-2024 Dmitry Isaenko
|
||||
|
||||
This file is part of NS-USBloader.
|
||||
|
||||
|
@ -31,7 +31,6 @@ import javafx.stage.FileChooser;
|
|||
import nsusbloader.AppPreferences;
|
||||
import nsusbloader.FilesHelper;
|
||||
import nsusbloader.MediatorControl;
|
||||
import nsusbloader.ModelControllers.CancellableRunnable;
|
||||
import nsusbloader.NSLDataTypes.EModule;
|
||||
import nsusbloader.ServiceWindow;
|
||||
import nsusbloader.Utilities.splitmerge.SplitMergeTaskExecutor;
|
||||
|
@ -41,7 +40,7 @@ import java.net.URL;
|
|||
import java.util.List;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
public class SplitMergeController implements Initializable {
|
||||
public class SplitMergeController implements Initializable, ISubscriber {
|
||||
@FXML
|
||||
private ToggleGroup splitMergeTogGrp;
|
||||
@FXML
|
||||
|
@ -147,13 +146,87 @@ public class SplitMergeController implements Initializable {
|
|||
convertBtn.setOnAction(actionEvent -> setConvertBtnAction());
|
||||
}
|
||||
|
||||
public void notifyThreadStarted(boolean isStart, EModule type){ // todo: refactor: remove everything, place to separate container and just disable.
|
||||
if (! type.equals(EModule.SPLIT_MERGE_TOOL)){
|
||||
smToolPane.setDisable(isStart);
|
||||
/**
|
||||
* It's button listener when convert-process in progress
|
||||
* */
|
||||
private void stopBtnAction(){
|
||||
if (smThread != null && smThread.isAlive()) {
|
||||
smThread.interrupt();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* It's button listener when convert-process NOT in progress
|
||||
* */
|
||||
private void setConvertBtnAction(){
|
||||
if (MediatorControl.INSTANCE.getTransferActive()) {
|
||||
ServiceWindow.getErrorNotification(
|
||||
resourceBundle.getString("windowTitleError"),
|
||||
resourceBundle.getString("windowBodyPleaseFinishTransfersFirst")
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (isStart){
|
||||
MediatorControl.getInstance().getContoller().logArea.clear();
|
||||
|
||||
if (splitRad.isSelected())
|
||||
smTask = new SplitMergeTaskExecutor(true, BlockListViewController.getItems(), saveToPathLbl.getText());
|
||||
else
|
||||
smTask = new SplitMergeTaskExecutor(false, BlockListViewController.getItems(), saveToPathLbl.getText());
|
||||
smThread = new Thread(smTask);
|
||||
smThread.setDaemon(true);
|
||||
smThread.start();
|
||||
}
|
||||
/**
|
||||
* Drag-n-drop support (dragOver consumer)
|
||||
* */
|
||||
@FXML
|
||||
private void handleDragOver(DragEvent event){
|
||||
if (event.getDragboard().hasFiles() && ! MediatorControl.INSTANCE.getTransferActive())
|
||||
event.acceptTransferModes(TransferMode.ANY);
|
||||
event.consume();
|
||||
}
|
||||
/**
|
||||
* Drag-n-drop support (drop consumer)
|
||||
* */
|
||||
@FXML
|
||||
private void handleDrop(DragEvent event) {
|
||||
List<File> files = event.getDragboard().getFiles();
|
||||
File firstFile = files.get(0);
|
||||
|
||||
if (firstFile.isDirectory())
|
||||
mergeRad.fire();
|
||||
else
|
||||
splitRad.fire();
|
||||
|
||||
this.BlockListViewController.addAll(files);
|
||||
|
||||
event.setDropCompleted(true);
|
||||
event.consume();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Save application settings on exit
|
||||
* */
|
||||
public void updatePreferencesOnExit(){
|
||||
if (splitRad.isSelected())
|
||||
AppPreferences.getInstance().setSplitMergeType(0);
|
||||
else
|
||||
AppPreferences.getInstance().setSplitMergeType(1);
|
||||
|
||||
AppPreferences.getInstance().setSplitMergeRecent(saveToPathLbl.getText());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notify(EModule type, boolean isActive, Payload payload) {
|
||||
// todo: refactor: remove everything, place to separate container and just disable.
|
||||
|
||||
if (! type.equals(EModule.SPLIT_MERGE_TOOL)){
|
||||
smToolPane.setDisable(isActive);
|
||||
return;
|
||||
}
|
||||
|
||||
statusLbl.setText(payload.getMessage());
|
||||
|
||||
if (isActive){
|
||||
splitRad.setDisable(true);
|
||||
mergeRad.setDisable(true);
|
||||
selectFileFolderBtn.setDisable(true);
|
||||
|
@ -182,79 +255,4 @@ public class SplitMergeController implements Initializable {
|
|||
else
|
||||
convertRegion.getStyleClass().add("regionOneToSplit");
|
||||
}
|
||||
|
||||
/**
|
||||
* It's button listener when convert-process in progress
|
||||
* */
|
||||
private void stopBtnAction(){
|
||||
if (smThread != null && smThread.isAlive()) {
|
||||
smThread.interrupt();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* It's button listener when convert-process NOT in progress
|
||||
* */
|
||||
private void setConvertBtnAction(){
|
||||
statusLbl.setText("");
|
||||
if (MediatorControl.getInstance().getTransferActive()) {
|
||||
ServiceWindow.getErrorNotification(
|
||||
resourceBundle.getString("windowTitleError"),
|
||||
resourceBundle.getString("windowBodyPleaseFinishTransfersFirst")
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (splitRad.isSelected())
|
||||
smTask = new SplitMergeTaskExecutor(true, BlockListViewController.getItems(), saveToPathLbl.getText());
|
||||
else
|
||||
smTask = new SplitMergeTaskExecutor(false, BlockListViewController.getItems(), saveToPathLbl.getText());
|
||||
smThread = new Thread(smTask);
|
||||
smThread.setDaemon(true);
|
||||
smThread.start();
|
||||
}
|
||||
/**
|
||||
* Drag-n-drop support (dragOver consumer)
|
||||
* */
|
||||
@FXML
|
||||
private void handleDragOver(DragEvent event){
|
||||
if (event.getDragboard().hasFiles() && ! MediatorControl.getInstance().getTransferActive())
|
||||
event.acceptTransferModes(TransferMode.ANY);
|
||||
event.consume();
|
||||
}
|
||||
/**
|
||||
* Drag-n-drop support (drop consumer)
|
||||
* */
|
||||
@FXML
|
||||
private void handleDrop(DragEvent event) {
|
||||
List<File> files = event.getDragboard().getFiles();
|
||||
File firstFile = files.get(0);
|
||||
|
||||
if (firstFile.isDirectory())
|
||||
mergeRad.fire();
|
||||
else
|
||||
splitRad.fire();
|
||||
|
||||
this.BlockListViewController.addAll(files);
|
||||
|
||||
event.setDropCompleted(true);
|
||||
event.consume();
|
||||
}
|
||||
|
||||
public void setOneLineStatus(boolean status){
|
||||
if (status)
|
||||
statusLbl.setText(resourceBundle.getString("done_txt"));
|
||||
else
|
||||
statusLbl.setText(resourceBundle.getString("failure_txt"));
|
||||
}
|
||||
/**
|
||||
* Save application settings on exit
|
||||
* */
|
||||
public void updatePreferencesOnExit(){
|
||||
if (splitRad.isSelected())
|
||||
AppPreferences.getInstance().setSplitMergeType(0);
|
||||
else
|
||||
AppPreferences.getInstance().setSplitMergeType(1);
|
||||
|
||||
AppPreferences.getInstance().setSplitMergeRecent(saveToPathLbl.getText());
|
||||
}
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2019-2020 Dmitry Isaenko
|
||||
Copyright 2019-2024 Dmitry Isaenko
|
||||
|
||||
This file is part of NS-USBloader.
|
||||
|
||||
|
@ -18,50 +18,57 @@
|
|||
*/
|
||||
package nsusbloader;
|
||||
|
||||
import javafx.application.HostServices;
|
||||
import javafx.scene.control.ProgressBar;
|
||||
import javafx.scene.control.TextArea;
|
||||
import nsusbloader.Controllers.*;
|
||||
import nsusbloader.NSLDataTypes.EModule;
|
||||
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
public class MediatorControl {
|
||||
private final AtomicBoolean isTransferActive = new AtomicBoolean(false); // Overcoded just for sure
|
||||
private NSLMainController mainController;
|
||||
public static final MediatorControl INSTANCE = new MediatorControl();
|
||||
|
||||
public static MediatorControl getInstance(){
|
||||
return MediatorControlHold.INSTANCE;
|
||||
private ResourceBundle resourceBundle;
|
||||
private TransfersPublisher transfersPublisher;
|
||||
private HostServices hostServices;
|
||||
private GamesController gamesController;
|
||||
private SettingsController settingsController;
|
||||
|
||||
private TextArea logArea;
|
||||
private ProgressBar progressBar;
|
||||
|
||||
private MediatorControl(){}
|
||||
|
||||
public void configure(ResourceBundle resourceBundle,
|
||||
SettingsController settingsController,
|
||||
TextArea logArea,
|
||||
ProgressBar progressBar,
|
||||
GamesController gamesController,
|
||||
TransfersPublisher transfersPublisher) {
|
||||
this.resourceBundle = resourceBundle;
|
||||
this.settingsController = settingsController;
|
||||
this.gamesController = gamesController;
|
||||
this.logArea = logArea;
|
||||
this.progressBar = progressBar;
|
||||
this.transfersPublisher = transfersPublisher;
|
||||
}
|
||||
public void setHostServices(HostServices hostServices) {
|
||||
this.hostServices = hostServices;
|
||||
}
|
||||
|
||||
private static class MediatorControlHold {
|
||||
private static final MediatorControl INSTANCE = new MediatorControl();
|
||||
}
|
||||
public void setController(NSLMainController controller){
|
||||
this.mainController = controller;
|
||||
public HostServices getHostServices() { return hostServices; }
|
||||
public ResourceBundle getResourceBundle(){ return resourceBundle; }
|
||||
public SettingsController getSettingsController() { return settingsController; }
|
||||
public GamesController getGamesController() { return gamesController; }
|
||||
public TextArea getLogArea() { return logArea; }
|
||||
public ProgressBar getProgressBar() { return progressBar; }
|
||||
|
||||
public synchronized void setTransferActive(EModule appModuleType, boolean isActive, Payload payload) {
|
||||
transfersPublisher.setTransferActive(appModuleType, isActive, payload);
|
||||
}
|
||||
|
||||
public NSLMainController getContoller(){ return mainController; }
|
||||
public GamesController getGamesController(){ return mainController.getGamesCtrlr(); }
|
||||
public SettingsController getSettingsController(){ return mainController.getSettingsCtrlr(); }
|
||||
public SplitMergeController getSplitMergeController(){ return mainController.getSmCtrlr(); }
|
||||
public RcmController getRcmController(){ return mainController.getRcmCtrlr(); }
|
||||
public NxdtController getNxdtController(){ return mainController.getNXDTabController(); }
|
||||
public PatchesController getPatchesController(){ return mainController.getPatchesTabController(); }
|
||||
|
||||
public ResourceBundle getResourceBundle(){
|
||||
return mainController.getResourceBundle();
|
||||
}
|
||||
|
||||
public synchronized void setBgThreadActive(boolean isActive, EModule appModuleType) {
|
||||
isTransferActive.set(isActive);
|
||||
getGamesController().notifyThreadStarted(isActive, appModuleType);
|
||||
getSplitMergeController().notifyThreadStarted(isActive, appModuleType);
|
||||
getRcmController().notifyThreadStarted(isActive, appModuleType);
|
||||
getNxdtController().notifyThreadStarted(isActive, appModuleType);
|
||||
getPatchesController().notifyThreadStarted(isActive, appModuleType);
|
||||
}
|
||||
public synchronized boolean getTransferActive() { return this.isTransferActive.get(); }
|
||||
public void updateApplicationFont(String fontFamily, double fontSize){
|
||||
mainController.logArea.getScene().getRoot().setStyle(
|
||||
String.format("-fx-font-family: \"%s\"; -fx-font-size: %.0f;", fontFamily, fontSize));
|
||||
public synchronized boolean getTransferActive() {
|
||||
return transfersPublisher.getTransferActive();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2019-2020 Dmitry Isaenko
|
||||
Copyright 2019-2024 Dmitry Isaenko
|
||||
|
||||
This file is part of NS-USBloader.
|
||||
|
||||
|
@ -40,9 +40,13 @@ public class LogPrinterGui implements ILogPrinter {
|
|||
LogPrinterGui(EModule whoIsAsking){
|
||||
this.msgQueue = new LinkedBlockingQueue<>();
|
||||
this.progressQueue = new LinkedBlockingQueue<>();
|
||||
this.statusMap = new HashMap<>();
|
||||
this.statusMap = new HashMap<>();
|
||||
this.oneLinerStatus = new AtomicBoolean();
|
||||
this.msgConsumer = new MessagesConsumer(whoIsAsking, this.msgQueue, this.progressQueue, this.statusMap, this.oneLinerStatus);
|
||||
this.msgConsumer = new MessagesConsumer(whoIsAsking,
|
||||
this.msgQueue,
|
||||
this.progressQueue,
|
||||
this.statusMap,
|
||||
this.oneLinerStatus);
|
||||
this.msgConsumer.start();
|
||||
}
|
||||
/**
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2019-2020 Dmitry Isaenko
|
||||
Copyright 2019-2024 Dmitry Isaenko
|
||||
|
||||
This file is part of NS-USBloader.
|
||||
|
||||
|
@ -22,24 +22,26 @@ import javafx.animation.AnimationTimer;
|
|||
import javafx.scene.control.ProgressBar;
|
||||
import javafx.scene.control.ProgressIndicator;
|
||||
import javafx.scene.control.TextArea;
|
||||
import nsusbloader.Controllers.NSTableViewController;
|
||||
import nsusbloader.Controllers.Payload;
|
||||
import nsusbloader.MediatorControl;
|
||||
import nsusbloader.NSLDataTypes.EFileStatus;
|
||||
import nsusbloader.NSLDataTypes.EModule;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
public class MessagesConsumer extends AnimationTimer {
|
||||
private final BlockingQueue<String> msgQueue;
|
||||
private final TextArea logsArea;
|
||||
private static final MediatorControl mediator = MediatorControl.INSTANCE;
|
||||
private static final TextArea logsArea = mediator.getLogArea();
|
||||
private static final ProgressBar progressBar = mediator.getProgressBar();;
|
||||
private static final ResourceBundle resourceBundle = mediator.getResourceBundle();
|
||||
|
||||
private final BlockingQueue<String> msgQueue;
|
||||
private final BlockingQueue<Double> progressQueue;
|
||||
private final ProgressBar progressBar;
|
||||
private final HashMap<String, EFileStatus> statusMap;
|
||||
private final NSTableViewController tableViewController;
|
||||
private final EModule appModuleType;
|
||||
|
||||
private final AtomicBoolean oneLinerStatus;
|
||||
|
@ -53,22 +55,16 @@ public class MessagesConsumer extends AnimationTimer {
|
|||
AtomicBoolean oneLinerStatus){
|
||||
this.appModuleType = appModuleType;
|
||||
this.isInterrupted = false;
|
||||
|
||||
this.msgQueue = msgQueue;
|
||||
this.logsArea = MediatorControl.getInstance().getContoller().logArea;
|
||||
|
||||
this.progressQueue = progressQueue;
|
||||
this.progressBar = MediatorControl.getInstance().getContoller().progressBar;
|
||||
|
||||
this.statusMap = statusMap;
|
||||
this.tableViewController = MediatorControl.getInstance().getGamesController().tableFilesListController;
|
||||
|
||||
this.oneLinerStatus = oneLinerStatus;
|
||||
|
||||
progressBar.setProgress(0.0);
|
||||
|
||||
progressBar.setProgress(ProgressIndicator.INDETERMINATE_PROGRESS);
|
||||
MediatorControl.getInstance().setBgThreadActive(true, appModuleType);
|
||||
|
||||
logsArea.clear();
|
||||
mediator.setTransferActive(appModuleType, true, new Payload());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -89,32 +85,18 @@ public class MessagesConsumer extends AnimationTimer {
|
|||
});
|
||||
}
|
||||
|
||||
if (isInterrupted) // It's safe 'cuz it's could't be interrupted while HashMap populating
|
||||
if (isInterrupted) // safe, could not be interrupted while HashMap populating
|
||||
updateElementsAndStop();
|
||||
}
|
||||
|
||||
private void updateElementsAndStop(){
|
||||
MediatorControl.getInstance().setBgThreadActive(false, appModuleType);
|
||||
Payload payload = new Payload(
|
||||
resourceBundle.getString(oneLinerStatus.get() ? "done_txt" : "failure_txt"),
|
||||
statusMap);
|
||||
|
||||
mediator.setTransferActive(appModuleType, false, payload);
|
||||
progressBar.setProgress(0.0);
|
||||
|
||||
if (statusMap.size() > 0){
|
||||
for (String key : statusMap.keySet())
|
||||
tableViewController.setFileStatus(key, statusMap.get(key));
|
||||
}
|
||||
|
||||
switch (appModuleType){
|
||||
case RCM:
|
||||
MediatorControl.getInstance().getRcmController().setOneLineStatus(oneLinerStatus.get());
|
||||
break;
|
||||
case NXDT:
|
||||
MediatorControl.getInstance().getNxdtController().setOneLineStatus(oneLinerStatus.get());
|
||||
break;
|
||||
case SPLIT_MERGE_TOOL:
|
||||
MediatorControl.getInstance().getSplitMergeController().setOneLineStatus(oneLinerStatus.get());
|
||||
break;
|
||||
case PATCHES:
|
||||
MediatorControl.getInstance().getPatchesController().setOneLineStatus(oneLinerStatus.get());
|
||||
}
|
||||
this.stop();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2019-2020 Dmitry Isaenko
|
||||
Copyright 2019-2024 Dmitry Isaenko
|
||||
|
||||
This file is part of NS-USBloader.
|
||||
|
||||
|
@ -68,14 +68,15 @@ public class NSLMain extends Application {
|
|||
primaryStage.show();
|
||||
|
||||
primaryStage.setOnCloseRequest(e->{
|
||||
if (MediatorControl.getInstance().getTransferActive())
|
||||
if (MediatorControl.INSTANCE.getTransferActive())
|
||||
if(! ServiceWindow.getConfirmationWindow(rb.getString("windowTitleConfirmExit"),
|
||||
rb.getString("windowBodyConfirmExit")))
|
||||
e.consume();
|
||||
});
|
||||
|
||||
NSLMainController controller = loader.getController();
|
||||
controller.setHostServices(getHostServices());
|
||||
MediatorControl.INSTANCE.setHostServices(getHostServices());
|
||||
|
||||
primaryStage.setOnHidden(e-> {
|
||||
AppPreferences.getInstance().setSceneHeight(mainScene.getHeight());
|
||||
AppPreferences.getInstance().setSceneWidth(mainScene.getWidth());
|
||||
|
|
47
src/main/java/nsusbloader/TransfersPublisher.java
Normal file
47
src/main/java/nsusbloader/TransfersPublisher.java
Normal file
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
Copyright 2019-2024 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;
|
||||
|
||||
import nsusbloader.Controllers.ISubscriber;
|
||||
import nsusbloader.Controllers.Payload;
|
||||
import nsusbloader.NSLDataTypes.EModule;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
public class TransfersPublisher {
|
||||
private final AtomicBoolean isTransferActive = new AtomicBoolean(false);
|
||||
|
||||
private final List<ISubscriber> subscribers = new ArrayList<>();
|
||||
|
||||
public TransfersPublisher(ISubscriber... subscriber){
|
||||
subscribers.addAll(Arrays.asList(subscriber));
|
||||
}
|
||||
|
||||
public void setTransferActive(EModule appModuleType, boolean isActive, Payload payload) {
|
||||
isTransferActive.set(isActive);
|
||||
subscribers.forEach(s->s.notify(appModuleType, isActive, payload));
|
||||
}
|
||||
|
||||
public boolean getTransferActive() {
|
||||
return isTransferActive.get();
|
||||
}
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2019-2022 Dmitry Isaenko
|
||||
Copyright 2019-2024 Dmitry Isaenko
|
||||
|
||||
This file is part of NS-USBloader.
|
||||
|
||||
|
@ -933,7 +933,7 @@ class GoldLeaf_010 extends TransferModule {
|
|||
private boolean selectFile(){
|
||||
File selectedFile = CompletableFuture.supplyAsync(() -> {
|
||||
FileChooser fChooser = new FileChooser();
|
||||
fChooser.setTitle(MediatorControl.getInstance().getResourceBundle().getString("btn_OpenFile")); // TODO: FIX BAD IMPLEMENTATION
|
||||
fChooser.setTitle(MediatorControl.INSTANCE.getResourceBundle().getString("btn_OpenFile")); // TODO: FIX BAD IMPLEMENTATION
|
||||
fChooser.setInitialDirectory(new File(System.getProperty("user.home")));// TODO: Consider fixing; not a priority.
|
||||
fChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("*", "*"));
|
||||
return fChooser.showOpenDialog(null); // Leave as is for now.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2019-2020 Dmitry Isaenko
|
||||
Copyright 2019-2024 Dmitry Isaenko
|
||||
|
||||
This file is part of NS-USBloader.
|
||||
|
||||
|
@ -918,7 +918,7 @@ class GoldLeaf_07 extends TransferModule {
|
|||
private boolean selectFile(){
|
||||
File selectedFile = CompletableFuture.supplyAsync(() -> {
|
||||
FileChooser fChooser = new FileChooser();
|
||||
fChooser.setTitle(MediatorControl.getInstance().getResourceBundle().getString("btn_OpenFile")); // TODO: FIX BAD IMPLEMENTATION
|
||||
fChooser.setTitle(MediatorControl.INSTANCE.getResourceBundle().getString("btn_OpenFile")); // TODO: FIX BAD IMPLEMENTATION
|
||||
fChooser.setInitialDirectory(new File(System.getProperty("user.home"))); // TODO: Consider fixing; not a prio.
|
||||
fChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("*", "*"));
|
||||
return fChooser.showOpenDialog(null); // Leave as is for now.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright 2019-2020 Dmitry Isaenko
|
||||
Copyright 2019-2024 Dmitry Isaenko
|
||||
|
||||
This file is part of NS-USBloader.
|
||||
|
||||
|
@ -941,7 +941,7 @@ class GoldLeaf_08 extends TransferModule {
|
|||
private boolean selectFile(){
|
||||
File selectedFile = CompletableFuture.supplyAsync(() -> {
|
||||
FileChooser fChooser = new FileChooser();
|
||||
fChooser.setTitle(MediatorControl.getInstance().getResourceBundle().getString("btn_OpenFile")); // TODO: FIX BAD IMPLEMENTATION
|
||||
fChooser.setTitle(MediatorControl.INSTANCE.getResourceBundle().getString("btn_OpenFile")); // TODO: FIX BAD IMPLEMENTATION
|
||||
fChooser.setInitialDirectory(new File(System.getProperty("user.home")));// TODO: Consider fixing; not a prio.
|
||||
fChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("*", "*"));
|
||||
return fChooser.showOpenDialog(null); // Leave as is for now.
|
||||
|
|
|
@ -169,7 +169,7 @@ public class UsbConnect {
|
|||
"Double check that you have administrator privileges (you're 'root') or check 'udev' rules set for this user (linux only)!\n\n" +
|
||||
"Steps to set 'udev' rules:\n" +
|
||||
"root # vim /etc/udev/rules.d/99-NS" + ((RCM_VID == VENDOR_ID) ? "RCM" : "") + ".rules\n" +
|
||||
"SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", GROUP=\"plugdev\"\n" +
|
||||
"SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", MODE=\"0666\"\n" +
|
||||
"root # udevadm control --reload-rules && udevadm trigger\n", UsbErrorCodes.getErrCode(returningValue), VENDOR_ID, PRODUCT_ID));
|
||||
}
|
||||
else
|
||||
|
|
|
@ -15,8 +15,8 @@
|
|||
<Label text="%tab2_Lbl_ApplicationSettings" />
|
||||
<HBox alignment="CENTER_LEFT" spacing="5.0">
|
||||
<children>
|
||||
<Label text="%tab2_Lbl_Language" />
|
||||
<ChoiceBox fx:id="languagesChB" prefWidth="180.0" />
|
||||
<Label minWidth="35.0" text="%tab2_Lbl_Language" />
|
||||
<ChoiceBox fx:id="languagesChB" prefWidth="240.0" />
|
||||
<Button fx:id="submitLanguageBtn" mnemonicParsing="false" text="OK" />
|
||||
<VBox alignment="CENTER_RIGHT" HBox.hgrow="ALWAYS">
|
||||
<children>
|
||||
|
|
|
@ -91,3 +91,7 @@ tabPatches_Btn_MakeAtmo=\uB85C\uB354 \uB9CC\uB4E4\uAE30 (Atmosphere)
|
|||
tabPatches_Btn_MakeAll=\uBAA8\uB450 \uB9CC\uB4E4\uAE30
|
||||
tabPatches_ServiceWindowMessageEsFs=\uD38C\uC6E8\uC5B4\uC640 \uD0A4 \uBAA8\uB450 \uD328\uCE58\uB97C \uC0DD\uC131\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4. \uADF8\uB807\uC9C0 \uC54A\uC73C\uBA74 \uBB34\uC5C7\uC744 \uD328\uCE58\uD560\uC9C0 \uBA85\uD655\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
|
||||
tabPatches_ServiceWindowMessageLoader='\uB85C\uB354' \uD328\uCE58\uB97C \uC0DD\uC131\uD558\uB824\uBA74 Atmosphere \uD3F4\uB354\uB97C \uC815\uC758\uD574\uC57C \uD569\uB2C8\uB2E4.
|
||||
tab2_Btn_ApplicationFont=\uC751\uC6A9 \uD504\uB85C\uADF8\uB7A8 \uAE00\uAF34 \uBCC0\uACBD
|
||||
btn_ResetToDefaults=\uC7AC\uC124\uC815
|
||||
fontPreviewText=\uD14D\uC2A4\uD2B8 \uBBF8\uB9AC\uBCF4\uAE30
|
||||
fontSize=\uAE00\uAF34 \uC0AC\uC774\uC988:
|
||||
|
|
97
src/main/resources/locale_sr_RS_#LATN.properties
Normal file
97
src/main/resources/locale_sr_RS_#LATN.properties
Normal file
|
@ -0,0 +1,97 @@
|
|||
btn_OpenFile=Izaberite datoteke
|
||||
btn_OpenFolders=Izaberite fasciklu
|
||||
btn_Upload=Otpremi na NS
|
||||
btn_OpenFolders_tooltip=Izaberite fasciklu koju \u017Eelite da se skenira.\nIzabrana fascikla i sve podfascikle \u0107e biti skenirane.\nSve odgovaraju\u0107e datoteke \u0107e biti dodane na listu.
|
||||
tab3_Txt_EnteredAsMsg1=Upisani ste kao:
|
||||
tab3_Txt_EnteredAsMsg2=Potrebno je imati root privilegije ili podesiti "udev" pravila za ovog korisnika kako bi se izbegli bilo kakvi problemi.
|
||||
tab3_Txt_FilesToUploadTitle=Datoteke za otpremanje:
|
||||
tab3_Txt_GreetingsMessage=Dobrodo\u0161li u NS-USBloader
|
||||
tab3_Txt_NoFolderOrFileSelected=Nije izabrana nijedna datoteka: Nema ni\u0161ta za otpremanje.
|
||||
windowBodyConfirmExit=Prenos podataka je u toku i zatvaranje ove aplikacije \u0107e je prekinuti.\nTo je najgore \u0161to mo\u017Eete u\u010Diniti u ovom trenutku.\Da li \u017Eelite da prekinete proces i iza\u0111ete?
|
||||
windowTitleConfirmExit=Ne, nemoj to uraditi!
|
||||
btn_Stop=Prekini
|
||||
tab3_Txt_GreetingsMessage2=--\n\
|
||||
Source: https://git.redrise.ru/desu/ns-usbloader\n\
|
||||
Mirror: https://github.com/developersu/ns-usbloader/\n\
|
||||
Site: https://redrise.ru\n\
|
||||
Dmitry Isaenko [developer.su]
|
||||
tab1_table_Lbl_Status=Status
|
||||
tab1_table_Lbl_FileName=Naziv datoteke
|
||||
tab1_table_Lbl_Size=Veli\u010Dina
|
||||
tab1_table_Lbl_Upload=Otpremi?
|
||||
tab1_table_contextMenu_Btn_BtnDelete=Ukloni
|
||||
tab1_table_contextMenu_Btn_DeleteAll=Ukloni sve
|
||||
tab2_Lbl_HostIP=Host IP
|
||||
tab1_Lbl_NSIP=NS IP:
|
||||
tab2_Cb_ValidateNSHostName=Uvijek proverite uneseni NS IP.
|
||||
windowBodyBadIp=Da li ste sigurni da ste ispravno uneli NS IP adresu?
|
||||
windowTitleBadIp=NS IP adresa je verovatno neta\u010Dna.
|
||||
tab2_Cb_ExpertMode=Napredni re\u017Eim (NET pode\u0161avanje)
|
||||
tab2_Lbl_HostPort=port
|
||||
tab2_Cb_AutoDetectIp=Automatski prona\u0111i IP
|
||||
tab2_Cb_RandSelectPort=Nasumi\u010Dno dodeli port
|
||||
tab2_Cb_DontServeRequests=Ne uslu\u017Euj zahteve
|
||||
tab2_Lbl_DontServeRequestsDesc=Ako je opcija izabrana, ovaj ra\u010Dunar nec\u0301e odgovarati na zahteve NSP datoteka koje dolaze od NS-a (preko mre\u017Ee) i koristiti definisana pode\u0161avanja host-a da ka\u017Ee Awoo Installer-u (ili kompatibilnim aplikacijama) gde treba da tra\u017Ei datoteke.
|
||||
tab2_Lbl_HostExtra=dodatno
|
||||
windowTitleErrorPort=Port je pogre\u0161no pode\u0161en!
|
||||
windowBodyErrorPort=Port ne mo\u017Ee biti 0 ili vec\u0301i od 65535.
|
||||
tab2_Cb_AutoCheckForUpdates=Automatski proveri a\u017Euriranja
|
||||
windowTitleNewVersionAval=Nova verzija dostupna
|
||||
windowTitleNewVersionNOTAval=Nema dostupnih novih verzija
|
||||
windowTitleNewVersionUnknown=Nije moguc\u0301e proveriti da li postoje nove verzije
|
||||
windowBodyNewVersionUnknown=Ne\u0161to nije u redu\nMo\u017Eda Internet konekcija nije dostupna ili GitHub ne radi
|
||||
windowBodyNewVersionNOTAval=Koristite najnoviju verziju
|
||||
tab2_Cb_AllowXciNszXcz=Dozvolite izbor XCI / NSZ / XCZ datoteka za Awoo
|
||||
tab2_Lbl_AllowXciNszXczDesc=Kori\u0161teno od strane aplikacija koje podr\u017Eavaju XCI/NSZ/XCZ i koriste Awoo (poznatiji kao Adubbz/TinFoil) protokol za prenos. Ne menjajte ako niste sigurni. Omoguc\u0301i za Awoo Installer.
|
||||
tab2_Lbl_Language=Jezik
|
||||
windowBodyRestartToApplyLang=Ponovo pokrenite aplikaciju da biste primenili promene.
|
||||
btn_OpenSplitFile=Izaberite razdvojene
|
||||
tab2_Lbl_ApplicationSettings=Glavna pode\u0161avanja
|
||||
tabSplMrg_Lbl_SplitNMergeTitle=Alat za razdvajanje i spajanje datoteka
|
||||
tabSplMrg_RadioBtn_Split=Razdvoji
|
||||
tabSplMrg_RadioBtn_Merge=Spoji
|
||||
tabSplMrg_Txt_File=Datoteka:
|
||||
tabSplMrg_Txt_Folder=Razdvoji datoteku (fasciklu):
|
||||
tabSplMrg_Btn_SelectFile=Izaberite datoteku
|
||||
tabSplMrg_Btn_SelectFolder=Izaberite fasciklu
|
||||
tabSplMrg_Lbl_SaveToLocation=Sa\u010Duvaj na:
|
||||
tabSplMrg_Btn_ChangeSaveToLocation=Promeni
|
||||
tabSplMrg_Btn_Convert=Pretvori
|
||||
windowTitleError=Gre\u0161ka
|
||||
windowBodyPleaseFinishTransfersFirst=Nije moguc\u0301e razdvojiti/spojiti datoteke kada je aktivan USB/mre\u017Eni proces aplikacije. Najpre prekinite aktivne transfere.
|
||||
done_txt=Gotovo!
|
||||
failure_txt=Nije uspelo
|
||||
btn_Select=Izaberi
|
||||
btn_InjectPayloader=Po\u0161alji payloadbtn_OpenSplitFile
|
||||
tabNXDT_Btn_Start=Po\u010Dni!
|
||||
tab2_Btn_InstallDrivers=Preuzmi i instaliraj drajvere
|
||||
windowTitleDownloadDrivers=Preuzmi i instaliraj drajvere
|
||||
windowBodyDownloadDrivers=Preuzimanje drajvera (libusbK v3.0.7.0)...
|
||||
btn_Cancel=Otka\u017Ei
|
||||
btn_Close=Zatvori
|
||||
tab2_Cb_GlVersion=GoldLeaf verzija
|
||||
tab2_Cb_GLshowNspOnly=Prika\u017Ei samo *.nsp u GoldLeaf-u.
|
||||
windowBodyPleaseStopOtherProcessFirst=Zaustavite druge aktivne procese pre nego \u0161to nastavite.
|
||||
tab2_Cb_foldersSelectorForRoms=Izaberite fasciklu sa ROM datotekama umesto da birate ROM datoteke pojedina\u010Dno.
|
||||
tab2_Cb_foldersSelectorForRomsDesc=Menja pona\u0161anje dugmeta "Izaberi datoteke" na kartici "Igre": umesto da birate ROM datoteke jednu po jednu, mo\u017Eete izabrati fasciklu da biste dodali sve podr\u017Eane datoteke odjednom.
|
||||
windowTitleAddingFiles=Tra\u017Eenje datoteka...
|
||||
windowBodyFilesScanned=Skenirano datoteka: %d\nBi\u0107e dodano: %d
|
||||
tab2_Lbl_AwooBlockTitle=Awoo Installer i kompatibilni
|
||||
tabRcm_Lbl_Payload=Payload:
|
||||
tabRcm_Lbl_FuseeGelee=Fus\u00E9e Gel\u00E9e RCM
|
||||
tabPatches_Lbl_Firmware=Firmware:
|
||||
tabPatches_Lbl_Atmo=Atmosphere:
|
||||
tabPatches_Btn_fromFolder=Iz fascikle
|
||||
tabPatches_Btn_asZipFile=kao ZIP datoteka
|
||||
tabPatches_Lbl_Title=Zakrpe
|
||||
tabPatches_Lbl_Keys=Klju\u010Devi:
|
||||
tabPatches_Btn_MakeEs=Napravi ES
|
||||
tabPatches_Btn_MakeFs=Napravi FS
|
||||
tabPatches_Btn_MakeAtmo=Napravi Loader (Atmosphere)
|
||||
tabPatches_Btn_MakeAll=Napravi sve
|
||||
tabPatches_ServiceWindowMessageEsFs=I firmware i klju\u010Devi treba da budu pode\u0161eni da bi se generisale zakrpe. U suprotnom, nije jasno \u0161ta treba zakrpiti.
|
||||
tabPatches_ServiceWindowMessageLoader=Fascikla Atmosphere treba da bude definisana da bi se generisala "Loader" zakrpa.
|
||||
tab2_Btn_ApplicationFont=Promenite font aplikacije
|
||||
btn_ResetToDefaults=Resetuj
|
||||
fontPreviewText=Pregled teksta
|
||||
fontSize=Veli\u010Dina fonta:
|
97
src/main/resources/locale_tr_TR.properties
Normal file
97
src/main/resources/locale_tr_TR.properties
Normal file
|
@ -0,0 +1,97 @@
|
|||
btn_OpenFile=Dosya secimi
|
||||
btn_OpenFolders=Klasor secimi
|
||||
btn_Upload=NS'e yukle
|
||||
btn_OpenFolders_tooltip=Taranmasi icin bir klasor secin.\nBu klasor ve butun alt klasorleri taranacaktir.\nButun uyusan dosyalar listeye eklenecektir.
|
||||
tab3_Txt_EnteredAsMsg1=Olarak giris yaptiniz:
|
||||
tab3_Txt_EnteredAsMsg2=Bir cok hatadan kacinmak icin root olmaniz ya da bu kullanici icin 'udev' kurallarini ayarlamaniz gerekmektedir.
|
||||
tab3_Txt_FilesToUploadTitle=Yuklenecek dosyalar:
|
||||
tab3_Txt_GreetingsMessage= NS-USBloader'a Hos Geldiniz
|
||||
tab3_Txt_NoFolderOrFileSelected=Hicbir dosya secilmedi: hicbir sey yuklenmedi.
|
||||
windowBodyConfirmExit=Data transferi devam ediyor ve uygulamayi kapatmak bunu yarida kesecek.\nBu su an yapabileceginiz en kotu sey.\nIslemi yardida kes ve cik ?
|
||||
windowTitleConfirmExit=Hayir,Bunu yapma!
|
||||
btn_Stop=Hata
|
||||
tab3_Txt_GreetingsMessage2=--\n\
|
||||
Source: https://git.redrise.ru/desu/ns-usbloader\n\
|
||||
Mirror: https://github.com/developersu/ns-usbloader/\n\
|
||||
Site: https://redrise.ru\n\
|
||||
Dmitry Isaenko [developer.su]
|
||||
tab1_table_Lbl_Status=Durum
|
||||
tab1_table_Lbl_FileName=Dosya Ismi
|
||||
tab1_table_Lbl_Size=Boyut
|
||||
tab1_table_Lbl_Upload=Yukle?
|
||||
tab1_table_contextMenu_Btn_BtnDelete=Kaldir
|
||||
tab1_table_contextMenu_Btn_DeleteAll=Hepsini kaldir
|
||||
tab2_Lbl_HostIP=Host IP
|
||||
tab1_Lbl_NSIP=NS IP:
|
||||
tab2_Cb_ValidateNSHostName= NS IP girislerinizi her zaman dogrulayin.
|
||||
windowBodyBadIp=Girilen NS IP adresinin dogru olduguna emin misiniz?
|
||||
windowTitleBadIp=NS'in IP adressi buyuk ihtimalle yanlis
|
||||
tab2_Cb_ExpertMode=Uzman modu (NET setup)
|
||||
tab2_Lbl_HostPort=Port
|
||||
tab2_Cb_AutoDetectIp=Oto-Tespit IP
|
||||
tab2_Cb_RandSelectPort=Portu rastgele al
|
||||
tab2_Cb_DontServeRequests=Istekleri yerine getirme
|
||||
tab2_Lbl_DontServeRequestsDesc=Eger secili ise, bu bilgisayar NS'den (ag uzerinden) gelen NSP dosyalarinin isteklerine yanit vermez ve Awoo Installer'a (veya uyumlu uygulamalara) dosyalari nerede aramasi gerektigini soylemek icin tanimlanmis ana bilgisayar ayarlarini kullanir.
|
||||
tab2_Lbl_HostExtra=Ekstra
|
||||
windowTitleErrorPort=Port seti hatali!
|
||||
windowBodyErrorPort=Port 0 olamaz ve 65535'den buyuk olamaz.
|
||||
tab2_Cb_AutoCheckForUpdates=Guncellemeleri otomatik kontrol et
|
||||
windowTitleNewVersionAval=Yeni versiyon mevcut
|
||||
windowTitleNewVersionNOTAval=Yeni versiyon mevcut degil
|
||||
windowTitleNewVersionUnknown=Yeni versiyon kontrolu yapilamiyor
|
||||
windowBodyNewVersionUnknown=Bir sey ters gitti\nBelki internet yoktur ya da GitHub cokmustur
|
||||
windowBodyNewVersionNOTAval=En son versiyonu kullaniyorsunuz
|
||||
tab2_Cb_AllowXciNszXcz=XCI / NSZ / XCZ dosyalaninin Awoo icin seciminine izin ver.
|
||||
tab2_Lbl_AllowXciNszXczDesc=XCI/NSZ/XCZ'yi destekleyen uygulamalar tarafindan kullanilir ve Awoo (Adubbz/TinFoil olarak da bilinir) transfer protokolunu uygular. Emin degilseniz degistirmeyin. Installer icin AWOO'yu etkinlestirin.
|
||||
tab2_Lbl_Language=Dil
|
||||
windowBodyRestartToApplyLang=Lutfen degisikliklerin uygulanabilmesi icin uygulamayi yendiden baslatin.
|
||||
btn_OpenSplitFile=Bolme sec
|
||||
tab2_Lbl_ApplicationSettings=Ana ayarlar
|
||||
tabSplMrg_Lbl_SplitNMergeTitle=Dosyalari bolme & birlestirme araci
|
||||
tabSplMrg_RadioBtn_Split=Ayir
|
||||
tabSplMrg_RadioBtn_Merge=Birlestir
|
||||
tabSplMrg_Txt_File=Dosya:
|
||||
tabSplMrg_Txt_Folder=Dosyayi ayir (klasor):
|
||||
tabSplMrg_Btn_SelectFile=Dosya sec
|
||||
tabSplMrg_Btn_SelectFolder=Klasor Sec
|
||||
tabSplMrg_Lbl_SaveToLocation=Buraya kaydet:
|
||||
tabSplMrg_Btn_ChangeSaveToLocation=Degistir
|
||||
tabSplMrg_Btn_Convert=Cevir
|
||||
windowTitleError=Hata
|
||||
windowBodyPleaseFinishTransfersFirst=Bolme/Birlestirme islemleri USB/Network transfer sureci aktifken yapilamaz. Lutfen once aktif transfer isleminizi bitiriniz.
|
||||
done_txt=Hazir!
|
||||
failure_txt=Basarisiz
|
||||
btn_Select=Secim yap
|
||||
btn_InjectPayloader=payload yukle (enject)
|
||||
tabNXDT_Btn_Start=Basla!
|
||||
tab2_Btn_InstallDrivers=Suruculeri indir ve yukle
|
||||
windowTitleDownloadDrivers=Suruculeri indir ve yukle
|
||||
windowBodyDownloadDrivers=Suruculer indiriliyor (libusbK v3.0.7.0)...
|
||||
btn_Cancel=Iptal
|
||||
btn_Close=Kapat
|
||||
tab2_Cb_GlVersion=GoldLeaf versiyonu
|
||||
tab2_Cb_GLshowNspOnly=Goldleaf'ta sadece *.nsp goster.
|
||||
windowBodyPleaseStopOtherProcessFirst=Lutfen devam etmeden once butun diger aktif islemleri durdurun.
|
||||
tab2_Cb_foldersSelectorForRoms=Direkt ROM dosyalini secmek yerine ROM klasorunu sec
|
||||
tab2_Cb_foldersSelectorForRomsDesc=Oyunlar' sekmesinde 'Dosyalari Sec' dugmesi davranisini degistirir: Tek tek ROM dosyalarini secmek yerine, desteklenen her dosyayi bir klasor secerek ekleyebilirsiniz.
|
||||
windowTitleAddingFiles=Dosyalar araniyor...
|
||||
windowBodyFilesScanned=Dosyalar tarandi: %d\nEklenecek: %d
|
||||
tab2_Lbl_AwooBlockTitle=Awoo Yukleyicisi ve Uyumu
|
||||
tabRcm_Lbl_Payload=Payload:
|
||||
tabRcm_Lbl_FuseeGelee=Fus\u00E9e Gel\u00E9e RCM
|
||||
tabPatches_Lbl_Firmware=Firmware:
|
||||
tabPatches_Lbl_Atmo=Atmosphere:
|
||||
tabPatches_Btn_fromFolder=Klasorden
|
||||
tabPatches_Btn_asZipFile=ZIP dosyasi olarak
|
||||
tabPatches_Lbl_Title=Yamalar
|
||||
tabPatches_Lbl_Keys=Anahtarlar:
|
||||
tabPatches_Btn_MakeEs=ES yap
|
||||
tabPatches_Btn_MakeFs=FS yap
|
||||
tabPatches_Btn_MakeAtmo=Loader yap (Atmosphere)
|
||||
tabPatches_Btn_MakeAll=Hepsini yap
|
||||
tabPatches_ServiceWindowMessageEsFs=Firmware ve anahtarlar, yamalari olusturmak icin ayarlanmalidir. Aksi takdirde, neyi duzeltecegi belirsiz olacaktir.
|
||||
tabPatches_ServiceWindowMessageLoader='Loader' yamasi olusturmak icin Atmosphere klasoru tanimlanmalidir.
|
||||
tab2_Btn_ApplicationFont=Uygulama yazi tipini degistir
|
||||
btn_ResetToDefaults=Reset
|
||||
fontPreviewText=Yazi Onizlemesi
|
||||
fontSize=Yazi boyutu:
|
|
@ -79,4 +79,20 @@ windowBodyFilesScanned=\u626B\u63CF\u6587\u4EF6: %25d\n\u88AB\u6DFB\u52A0: %25d
|
|||
tab2_Lbl_AwooBlockTitle=awoo installer \u5B8C\u6210
|
||||
tabRcm_Lbl_Payload=Payload:
|
||||
tabRcm_Lbl_FuseeGelee=Fus\u00E9e Gel\u00E9e RCM
|
||||
tabPatches_Lbl_Firmware=Firmware:
|
||||
tabPatches_Lbl_Atmo=Atmosphere:
|
||||
tabPatches_Btn_fromFolder=From folder
|
||||
tabPatches_Btn_asZipFile=as ZIP file
|
||||
tabPatches_Lbl_Title=Patches
|
||||
tabPatches_Lbl_Keys=Keys:
|
||||
tabPatches_Btn_MakeEs=Make ES
|
||||
tabPatches_Btn_MakeFs=Make FS
|
||||
tabPatches_Btn_MakeAtmo=Make Loader (Atmosphere)
|
||||
tabPatches_Btn_MakeAll=Make all
|
||||
tabPatches_ServiceWindowMessageEsFs=Both firmware and keys should be set to generate patches. Otherwise, it's not clear what to patch.
|
||||
tabPatches_ServiceWindowMessageLoader=Atmosphere folder should be defined to generate 'Loader' patch.
|
||||
tab2_Btn_ApplicationFont=\u4fee\u6539\u7a0b\u5e8f\u5b57\u4f53
|
||||
btn_ResetToDefaults=\u91cd\u7f6e
|
||||
fontPreviewText=\u6587\u5b57\u9884\u89c8
|
||||
fontSize=\u5b57\u53f7:
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ public class EsIntegrationTest {
|
|||
pathToKeysFile = environment.getProdkeysLocation();
|
||||
saveTo = environment.getSaveToLocation() + File.separator + "ES_LPR";
|
||||
pathToFirmwares = environment.getFirmwaresLocation();
|
||||
pathToFirmware = pathToFirmware + File.separator + "Firmware 14.1.0";
|
||||
pathToFirmware = environment.getFirmwaresLocation() + File.separator + "Firmware 17.0.0";
|
||||
}
|
||||
|
||||
@DisplayName("ES Integration validation - everything")
|
||||
|
|
|
@ -25,7 +25,7 @@ public class FsIntegrationTest {
|
|||
pathToKeysFile = environment.getProdkeysLocation();
|
||||
saveTo = environment.getSaveToLocation() + File.separator + "FS_LPR";
|
||||
pathToFirmwares = environment.getFirmwaresLocation();
|
||||
pathToFirmware = pathToFirmware + File.separator + "Firmware 13.0.0";
|
||||
pathToFirmware = environment.getFirmwaresLocation() + File.separator + "Firmware 17.0.0";
|
||||
}
|
||||
|
||||
@DisplayName("FS Integration validation - everything")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue