diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java b/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java index 3ff0d0fa5..259926384 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java @@ -4,7 +4,6 @@ import io.xpipe.app.browser.file.BrowserConnectionListComp; import io.xpipe.app.browser.file.BrowserConnectionListFilterComp; import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.browser.file.BrowserFileSystemTabComp; -import io.xpipe.app.browser.file.BrowserFileSystemTabModel; import io.xpipe.app.comp.Comp; import io.xpipe.app.comp.base.*; import io.xpipe.app.core.AppFontSizes; @@ -50,13 +49,14 @@ public class BrowserFileChooserSessionComp extends ModalOverlayContentComp { this.filter = filter; } - public static void openSingleFile( + public static void open( Supplier> store, Supplier initialPath, Consumer file, boolean save, + boolean directory, Predicate filter) { - var model = new BrowserFileChooserSessionModel(BrowserFileSystemTabModel.SelectionMode.SINGLE_FILE); + var model = new BrowserFileChooserSessionModel(directory); model.setOnFinish(fileStores -> { file.accept(fileStores.size() > 0 ? fileStores.getFirst() : null); }); diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionModel.java b/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionModel.java index cdc8bd742..35bfc52d2 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionModel.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionModel.java @@ -27,14 +27,14 @@ import java.util.function.Consumer; @Getter public class BrowserFileChooserSessionModel extends BrowserAbstractSessionModel { - private final BrowserFileSystemTabModel.SelectionMode selectionMode; private final ObservableList fileSelection = FXCollections.observableArrayList(); + private final boolean directory; @Setter private Consumer> onFinish; - public BrowserFileChooserSessionModel(BrowserFileSystemTabModel.SelectionMode selectionMode) { - this.selectionMode = selectionMode; + public BrowserFileChooserSessionModel(boolean directory) { + this.directory = directory; selectedEntry.addListener((observable, oldValue, newValue) -> { if (newValue == null) { fileSelection.clear(); @@ -96,7 +96,6 @@ public class BrowserFileChooserSessionModel extends BrowserAbstractSessionModel< model = new BrowserFileSystemTabModel( this, store, - selectionMode, customFileSystemFactory != null ? customFileSystemFactory : ref -> ref.getStore().createFileSystem()); diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserFullSessionModel.java b/app/src/main/java/io/xpipe/app/browser/BrowserFullSessionModel.java index 00b051c6d..db8b28c36 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserFullSessionModel.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserFullSessionModel.java @@ -65,7 +65,6 @@ public class BrowserFullSessionModel extends BrowserAbstractSessionModel ref.getStore().createFileSystem()); try { DEFAULT.openSync(tab, null); @@ -233,7 +232,6 @@ public class BrowserFullSessionModel extends BrowserAbstractSessionModel ref.getStore().createFileSystem()); diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java index f28274d38..2e8af308c 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java @@ -336,11 +336,7 @@ public final class BrowserFileListComp extends SimpleComp { } private void prepareTableSelectionModel(TableView table) { - if (!fileList.getSelectionMode().isMultiple()) { - table.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); - } else { - table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); - } + table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); table.getSelectionModel().setCellSelectionEnabled(false); var updateFromModel = new BooleanScope(new SimpleBooleanProperty()); diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListModel.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListModel.java index e0a7260c1..8e303e5c7 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListModel.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListModel.java @@ -24,8 +24,6 @@ public final class BrowserFileListModel { static final Comparator FILE_TYPE_COMPARATOR = Comparator.comparing(path -> path.getRawFileEntry().resolved().getKind() != FileKind.DIRECTORY); - private final BrowserFileSystemTabModel.SelectionMode selectionMode; - private final BrowserFileSystemTabModel fileSystemModel; private final Property> comparatorProperty = new SimpleObjectProperty<>(FILE_TYPE_COMPARATOR); @@ -37,9 +35,7 @@ public final class BrowserFileListModel { private final Property draggedOverEmpty = new SimpleBooleanProperty(); private final Property editing = new SimpleObjectProperty<>(); - public BrowserFileListModel( - BrowserFileSystemTabModel.SelectionMode selectionMode, BrowserFileSystemTabModel fileSystemModel) { - this.selectionMode = selectionMode; + public BrowserFileListModel(BrowserFileSystemTabModel fileSystemModel) { this.fileSystemModel = fileSystemModel; fileSystemModel.getFilter().addListener((observable, oldValue, newValue) -> { diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java index ad82a3981..c096fa4af 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java @@ -30,6 +30,7 @@ import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.collections.ObservableList; +import javafx.scene.control.SelectionMode; import lombok.Getter; import lombok.NonNull; @@ -68,10 +69,9 @@ public final class BrowserFileSystemTabModel extends BrowserStoreSessionTab model, DataStoreEntryRef entry, - SelectionMode selectionMode, FailableFunction, FileSystem, Exception> fileSystemFactory) { super(model, entry); - this.fileList = new BrowserFileListModel(selectionMode, this); + this.fileList = new BrowserFileListModel(this); this.fileSystemFactory = fileSystemFactory; } @@ -608,24 +608,4 @@ public final class BrowserFileSystemTabModel extends BrowserStoreSessionTab> private final ContextualFileReferenceSync sync; private final List previousFileReferences; private final Predicate filter; + private final boolean directory; @Setter private ObservableValue prompt; @@ -55,10 +56,12 @@ public class ContextualFileReferenceChoiceComp extends Comp> Property filePath, ContextualFileReferenceSync sync, List previousFileReferences, - Predicate filter) { + Predicate filter, boolean directory + ) { this.sync = sync; this.previousFileReferences = previousFileReferences; this.filter = filter; + this.directory = directory; this.fileSystem = new SimpleObjectProperty<>(); fileSystem.subscribe(val -> { this.fileSystem.setValue(val); @@ -74,7 +77,7 @@ public class ContextualFileReferenceChoiceComp extends Comp> var path = previousFileReferences.isEmpty() ? createTextField() : createComboBox(); var fileBrowseButton = new ButtonComp(null, new FontIcon("mdi2f-folder-open-outline"), () -> { var replacement = ProcessControlProvider.get().replace(fileSystem.getValue()); - BrowserFileChooserSessionComp.openSingleFile( + BrowserFileChooserSessionComp.open( () -> replacement, () -> filePath.getValue() != null ? filePath.getValue().getParent() @@ -86,6 +89,7 @@ public class ContextualFileReferenceChoiceComp extends Comp> } }, false, + directory, filter); }) .styleClass(sync != null ? Styles.CENTER_PILL : Styles.RIGHT_PILL) diff --git a/app/src/main/java/io/xpipe/app/prefs/FileBrowserCategory.java b/app/src/main/java/io/xpipe/app/prefs/FileBrowserCategory.java index 1b52c40ae..20faddf7e 100644 --- a/app/src/main/java/io/xpipe/app/prefs/FileBrowserCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/FileBrowserCategory.java @@ -41,7 +41,8 @@ public class FileBrowserCategory extends AppPrefsCategory { prefs.downloadsDirectory, null, List.of(), - e -> e.equals(DataStorage.get().local())) + e -> e.equals(DataStorage.get().local()), + true) .maxWidth(getCompWidth()), prefs.downloadsDirectory) .pref(prefs.pinLocalMachineOnStartup) diff --git a/app/src/main/java/io/xpipe/app/prefs/IconsCategory.java b/app/src/main/java/io/xpipe/app/prefs/IconsCategory.java index 07f56aa0a..e902e8f18 100644 --- a/app/src/main/java/io/xpipe/app/prefs/IconsCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/IconsCategory.java @@ -148,7 +148,8 @@ public class IconsCategory extends AppPrefsCategory { dir, null, List.of(), - en -> en.equals(DataStorage.get().local())) + en -> en.equals(DataStorage.get().local()), + true) .prefWidth(350)); modal.withDefaultButtons(() -> { if (dir.get() == null) { diff --git a/app/src/main/java/io/xpipe/app/prefs/SshCategory.java b/app/src/main/java/io/xpipe/app/prefs/SshCategory.java index 9ad4a1a93..98c0b6268 100644 --- a/app/src/main/java/io/xpipe/app/prefs/SshCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/SshCategory.java @@ -36,7 +36,8 @@ public class SshCategory extends AppPrefsCategory { prefs.sshAgentSocket, null, List.of(), - e -> e.equals(DataStorage.get().local())); + e -> e.equals(DataStorage.get().local()), + false); choice.setPrompt(prefs.defaultSshAgentSocket); choice.maxWidth(600); options.sub( diff --git a/app/src/main/java/io/xpipe/app/pwman/EnpassPasswordManager.java b/app/src/main/java/io/xpipe/app/pwman/EnpassPasswordManager.java index ea16adb7d..8ca5e32c7 100644 --- a/app/src/main/java/io/xpipe/app/pwman/EnpassPasswordManager.java +++ b/app/src/main/java/io/xpipe/app/pwman/EnpassPasswordManager.java @@ -60,7 +60,8 @@ public class EnpassPasswordManager implements PasswordManager { prop, null, List.of(), - e -> e.equals(DataStorage.get().local())); + e -> e.equals(DataStorage.get().local()), + true); comp.apply(struc -> { var text = (TextField) struc.get().getChildren().getFirst(); text.requestFocus(); diff --git a/app/src/main/java/io/xpipe/app/storage/DataStorageGroupStrategy.java b/app/src/main/java/io/xpipe/app/storage/DataStorageGroupStrategy.java index fd27f4f23..6135ff3b4 100644 --- a/app/src/main/java/io/xpipe/app/storage/DataStorageGroupStrategy.java +++ b/app/src/main/java/io/xpipe/app/storage/DataStorageGroupStrategy.java @@ -135,7 +135,7 @@ public interface DataStorageGroupStrategy { .nameAndDescription("fileSecretChoice") .addComp(new ContextualFileReferenceChoiceComp( new ReadOnlyObjectWrapper<>(DataStorage.get().local().ref()), - file, null, List.of(), e -> e.equals(DataStorage.get().local())), file) + file, null, List.of(), e -> e.equals(DataStorage.get().local()), false), file) .nonNull() .bind( () -> { diff --git a/ext/base/src/main/java/io/xpipe/ext/base/identity/ssh/CustomPkcs11LibraryStrategy.java b/ext/base/src/main/java/io/xpipe/ext/base/identity/ssh/CustomPkcs11LibraryStrategy.java index fd65d1c03..d0d9e27cc 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/identity/ssh/CustomPkcs11LibraryStrategy.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/identity/ssh/CustomPkcs11LibraryStrategy.java @@ -51,7 +51,8 @@ public class CustomPkcs11LibraryStrategy implements SshIdentityStrategy { file, null, List.of(), - e -> e.equals(DataStorage.get().local())), + e -> e.equals(DataStorage.get().local()), + false), file) .nonNull() .bind( diff --git a/ext/base/src/main/java/io/xpipe/ext/base/identity/ssh/KeyFileStrategy.java b/ext/base/src/main/java/io/xpipe/ext/base/identity/ssh/KeyFileStrategy.java index 884fb9419..c96cd7337 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/identity/ssh/KeyFileStrategy.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/identity/ssh/KeyFileStrategy.java @@ -137,7 +137,8 @@ public class KeyFileStrategy implements SshIdentityStrategy { keyPath, config.isAllowKeyFileSync() ? sync : null, List.of(), - e -> e.equals(DataStorage.get().local())), + e -> e.equals(DataStorage.get().local()), + false), keyPath) .nonNull() .name("keyPassword")