File picker cleanup

This commit is contained in:
Anuken
2026-02-06 01:30:16 -05:00
parent 52baac3fe9
commit 7d88eeee77
4 changed files with 30 additions and 92 deletions

View File

@@ -1,7 +1,6 @@
package mindustry.core;
import arc.*;
import arc.filedialogs.*;
import arc.files.*;
import arc.func.*;
import arc.math.*;
@@ -15,7 +14,6 @@ import mindustry.type.*;
import mindustry.ui.dialogs.*;
import rhino.*;
import java.io.*;
import java.net.*;
import static mindustry.Vars.*;
@@ -142,11 +140,20 @@ public interface Platform{
* @param title The title of the native dialog
*/
default void showFileChooser(boolean open, String title, String extension, Cons<Fi> cons){
if(OS.isWindows || OS.isMac || (OS.isLinux && !OS.isAndroid)){
showNativeFileChooser(open, title, cons, extension);
}else{
defaultFileDialog(open, title, extension, cons);
}
defaultFileDialog(open, title, extension, cons);
}
/**
* Show a file chooser for multiple file types.
* @param cons Selection listener
* @param extensions File extensions to filter
*/
default void showMultiFileChooser(Cons<Fi> cons, String... extensions){
defaultMultiFileChooser(cons, extensions);
}
default void showFileChooser(boolean open, String extension, Cons<Fi> cons){
showFileChooser(open, open ? "@open": "@save", extension, cons);
}
static void defaultFileDialog(boolean open, String title, String extension, Cons<Fi> cons){
@@ -159,91 +166,10 @@ public interface Platform{
}).show();
}
default void showFileChooser(boolean open, String extension, Cons<Fi> cons){
showFileChooser(open, open ? "@open": "@save", extension, cons);
}
/**
* Show a file chooser for multiple file types.
* @param cons Selection listener
* @param extensions File extensions to filter
*/
default void showMultiFileChooser(Cons<Fi> cons, String... extensions){
if(mobile){
showFileChooser(true, extensions[0], cons);
}else if(OS.isWindows || OS.isMac || (OS.isLinux && !OS.isAndroid)){
showNativeFileChooser(true, "@open", cons, extensions);
}else{
defaultMultiFileChooser(cons, extensions);
}
}
static void defaultMultiFileChooser(Cons<Fi> cons, String... extensions){
new FileChooser("@open", file -> Structs.contains(extensions, file.extension().toLowerCase()), true, cons).show();
}
default void showNativeFileChooser(boolean open, String title, Cons<Fi> cons, String... shownExtensions){
String formatted = (title.startsWith("@") ? Core.bundle.get(title.substring(1)) : title).replaceAll("\"", "'");
//this should never happen unless someone is being dumb with the parameters
String[] ext = shownExtensions == null || shownExtensions.length == 0 ? new String[]{""} : shownExtensions;
//native file dialog
Threads.daemon(() -> {
try{
FileDialogs.loadNatives();
String result;
String[] patterns = new String[ext.length];
for(int i = 0; i < ext.length; i++){
patterns[i] = "*." + ext[i];
}
//on MacOS, .msav is not properly recognized until I put garbage into the array?
if(patterns.length == 1 && OS.isMac && open){
patterns = new String[]{"", "*." + ext[0]};
}
if(open){
result = FileDialogs.openFileDialog(formatted, FileChooser.getLastDirectory().absolutePath(), patterns, "." + ext[0] + " files", false);
}else{
result = FileDialogs.saveFileDialog(formatted, FileChooser.getLastDirectory().child("file." + ext[0]).absolutePath(), patterns, "." + ext[0] + " files");
}
if(result == null) return;
if(result.length() > 1 && result.contains("\n")){
result = result.split("\n")[0];
}
//cancelled selection, ignore result
if(result.isEmpty() || result.equals("\n")) return;
if(result.endsWith("\n")) result = result.substring(0, result.length() - 1);
if(result.contains("\n")) throw new IOException("invalid input: \"" + result + "\"");
Fi file = Core.files.absolute(result);
Core.app.post(() -> {
FileChooser.setLastDirectory(file.isDirectory() ? file : file.parent());
if(!open){
cons.get(file.parent().child(file.nameWithoutExtension() + "." + ext[0]));
}else{
cons.get(file);
}
});
}catch(Throwable error){
Log.err("Failure to execute native file chooser", error);
Core.app.post(() -> {
if(ext.length > 1){
defaultMultiFileChooser(cons, ext);
}else{
defaultFileDialog(open, title, ext[0], cons);
}
});
}
});
}
/** Hide the app. Android only. */
default void hide(){
}