Minor corrections to wolfposd's implementation

master
Dmitry Isaenko 2020-11-29 02:18:35 +03:00
parent dcabf76522
commit 0a8440ef34
1 changed files with 50 additions and 30 deletions

View File

@ -1,5 +1,5 @@
/*
Copyright 2019-2020 Dmitry Isaenko
Copyright 2019-2020 Dmitry Isaenko, wolfposd
This file is part of NS-USBloader.
@ -52,6 +52,7 @@ public class GamesController implements Initializable {
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 = ".*";
@FXML
private AnchorPane usbNetPane;
@ -204,8 +205,8 @@ public class GamesController implements Initializable {
return getSelectedProtocol().equals("TinFoil");
}
private boolean isNSPFileFilterForGL() {
return MediatorControl.getInstance().getContoller().getSettingsCtrlr().getGoldleafSettings().getNSPFileFilterForGL();
private boolean isAllFiletypesAllowedForGL() {
return ! MediatorControl.getInstance().getContoller().getSettingsCtrlr().getGoldleafSettings().getNSPFileFilterForGL();
}
private boolean isXciNszXczSupport() {
@ -222,13 +223,18 @@ public class GamesController implements Initializable {
private String getRegexForFiles() {
if (isTinfoil() && isXciNszXczSupport())
return REGEX_ALLFILES_TINFOIL;
else if (isGoldLeaf() && isAllFiletypesAllowedForGL())
return REGEX_ALLFILES;
else
return REGEX_ONLY_NSP;
// currently only tinfoil supports all filetypes
// everything else only supports nsp
// else if (isGoldLeaf())
// return REGEX_ONLY_NSP;
// else
}
private String getRegexForFolders() {
final String regexForFiles = getRegexForFiles();
if (regexForFiles.equals(REGEX_ALLFILES))
return REGEX_ALLFILES_TINFOIL;
else
return regexForFiles;
}
/**
@ -242,10 +248,12 @@ public class GamesController implements Initializable {
if (isTinfoil() && isXciNszXczSupport()) {
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("NSP/XCI/NSZ/XCZ", "*.nsp", "*.xci", "*.nsz", "*.xcz"));
} else if (isGoldLeaf() && !isNSPFileFilterForGL()) {
}
else if (isGoldLeaf() && isAllFiletypesAllowedForGL()) {
fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("Any file", "*.*"),
new FileChooser.ExtensionFilter("NSP ROM", "*.nsp"));
} else {
}
else {
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("NSP ROM", "*.nsp"));
}
@ -270,7 +278,7 @@ public class GamesController implements Initializable {
performInBackgroundAndUpdate(() -> {
final List<File> allFiles = new ArrayList<>();
collectFiles(allFiles, startFolder, getRegexForFiles());
collectFiles(allFiles, startFolder, getRegexForFiles(), getRegexForFolders());
return allFiles;
}, (files) -> {
if (!files.isEmpty()) {
@ -285,20 +293,34 @@ public class GamesController implements Initializable {
* used to recursively walk all directories, every file will be added to the storage list
* @param storage used to hold files
* @param startFolder where to start
* @param regex for filenames
* @param filesRegex for filenames
*/
private void collectFiles(List<File> storage, File startFolder, final String regex) {
if (startFolder.isDirectory()) {
File[] files = startFolder.listFiles();
if(files != null)
for (File f : files) {
if (f.isDirectory()) {
collectFiles(storage, f, regex);
} else if (f.getName().toLowerCase().matches(regex)) {
storage.add(f);
}
}
// TODO: Too sophisticated. Should be moved to simple class to keep things simplier
private void collectFiles(List<File> storage,
File startFolder,
final String filesRegex,
final String foldersRegex)
{
final String startFolderNameInLowercase = startFolder.getName().toLowerCase();
if (startFolder.isFile()) {
if (startFolderNameInLowercase.matches(filesRegex)) {
storage.add(startFolder);
}
return;
}
if (startFolderNameInLowercase.matches(foldersRegex)) {
storage.add(startFolder);
return;
}
File[] files = startFolder.listFiles();
if (files == null)
return;
for (File file : files)
collectFiles(storage, file, filesRegex, foldersRegex);
}
/**
@ -414,15 +436,15 @@ public class GamesController implements Initializable {
* */
@FXML
private void handleDrop(DragEvent event) {
final String regex = getRegexForFiles();
final String regexForFiles = getRegexForFiles();
final String regexForFolders = getRegexForFolders();
List<File> files = event.getDragboard().getFiles();
performInBackgroundAndUpdate(() -> {
List<File> allFiles = new ArrayList<>();
if (files != null && files.size() != 0) {
files.stream().filter(File::isDirectory).forEach(f -> collectFiles(allFiles, f, regex));
files.stream().filter(f -> f.getName().toLowerCase().matches(regex)).forEach(allFiles::add);
files.forEach(f -> collectFiles(allFiles, f, regexForFiles, regexForFolders));
}
return allFiles;
}, allFiles -> {
@ -484,9 +506,7 @@ public class GamesController implements Initializable {
private <T> void performInBackgroundAndUpdate(Supplier<T> background, Consumer<T> update) {
new Thread(() -> {
final T result = background.get();
Platform.runLater(() -> {
update.accept(result);
});
Platform.runLater(() -> update.accept(result));
}).start();
}
@ -505,4 +525,4 @@ public class GamesController implements Initializable {
preferences.setNetUsb(getSelectedNetUsb());
preferences.setNsIp(getNsIp());
}
}
}