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 6f2fe5ded..77ddacaff 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java @@ -13,6 +13,7 @@ import io.xpipe.app.ext.FileSystemStore; import io.xpipe.app.ext.ShellStore; import io.xpipe.app.hub.comp.StoreEntryWrapper; import io.xpipe.app.hub.comp.StoreViewState; +import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.BindingsHelper; import io.xpipe.app.util.FileReference; @@ -37,22 +38,25 @@ import java.util.function.Supplier; public class BrowserFileChooserSessionComp extends ModalOverlayContentComp { private final BrowserFileChooserSessionModel model; + private final Predicate filter; - public BrowserFileChooserSessionComp(BrowserFileChooserSessionModel model) { + public BrowserFileChooserSessionComp(BrowserFileChooserSessionModel model, Predicate filter) { this.model = model; + this.filter = filter; } public static void openSingleFile( Supplier> store, Supplier initialPath, Consumer file, - boolean save) { + boolean save, + Predicate filter) { var model = new BrowserFileChooserSessionModel(BrowserFileSystemTabModel.SelectionMode.SINGLE_FILE); model.setOnFinish(fileStores -> { file.accept(fileStores.size() > 0 ? fileStores.getFirst() : null); }); var comp = - new BrowserFileChooserSessionComp(model).styleClass("browser").styleClass("chooser"); + new BrowserFileChooserSessionComp(model, filter).styleClass("browser").styleClass("chooser"); var selection = new SimpleStringProperty(); model.getFileSelection().addListener((ListChangeListener) c -> { selection.set( @@ -86,7 +90,7 @@ public class BrowserFileChooserSessionComp extends ModalOverlayContentComp { protected Region createSimple() { Predicate applicable = storeEntryWrapper -> { return (storeEntryWrapper.getEntry().getStore() instanceof ShellStore) - && storeEntryWrapper.getEntry().getValidity().isUsable(); + && storeEntryWrapper.getEntry().getValidity().isUsable() && filter.test(storeEntryWrapper.getEntry()); }; BiConsumer action = (w, busy) -> { ThreadHelper.runFailableAsync(() -> { diff --git a/app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceChoiceComp.java b/app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceChoiceComp.java index b817ce52d..a4facd8f7 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceChoiceComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceChoiceComp.java @@ -8,10 +8,12 @@ import io.xpipe.app.core.AppLayoutModel; import io.xpipe.app.core.window.AppDialog; import io.xpipe.app.ext.FileSystemStore; import io.xpipe.app.ext.ProcessControlProvider; +import io.xpipe.app.hub.comp.StoreEntryWrapper; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.storage.ContextualFileReference; import io.xpipe.app.storage.DataStorageSyncHandler; +import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.PlatformThread; import io.xpipe.core.FilePath; @@ -36,6 +38,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import java.util.function.Predicate; public class ContextualFileReferenceChoiceComp extends Comp> { @@ -43,6 +46,7 @@ public class ContextualFileReferenceChoiceComp extends Comp> private final Property filePath; private final ContextualFileReferenceSync sync; private final List previousFileReferences; + private final Predicate filter; @Setter private ObservableValue prompt; @@ -51,9 +55,11 @@ public class ContextualFileReferenceChoiceComp extends Comp> Property> fileSystem, Property filePath, ContextualFileReferenceSync sync, - List previousFileReferences) { + List previousFileReferences, Predicate filter + ) { this.sync = sync; this.previousFileReferences = previousFileReferences; + this.filter = filter; this.fileSystem = new SimpleObjectProperty<>(); fileSystem.subscribe(val -> { this.fileSystem.setValue(val); @@ -80,7 +86,8 @@ public class ContextualFileReferenceChoiceComp extends Comp> fileSystem.setValue(fileStore.getFileSystem()); } }, - false); + false, + filter); }) .styleClass(sync != null ? Styles.CENTER_PILL : Styles.RIGHT_PILL) .grow(false, true); 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 3d05247ad..61606eeb5 100644 --- a/app/src/main/java/io/xpipe/app/prefs/FileBrowserCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/FileBrowserCategory.java @@ -3,6 +3,7 @@ package io.xpipe.app.prefs; import io.xpipe.app.comp.Comp; import io.xpipe.app.comp.base.ContextualFileReferenceChoiceComp; import io.xpipe.app.storage.DataStorage; +import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.util.LabelGraphic; import io.xpipe.app.util.OptionsBuilder; @@ -40,7 +41,8 @@ public class FileBrowserCategory extends AppPrefsCategory { .ref()), prefs.downloadsDirectory, null, - List.of()) + List.of(), + e -> e.equals(DataStorage.get().local())) .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 8bf2fb70a..ba5534c5a 100644 --- a/app/src/main/java/io/xpipe/app/prefs/IconsCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/IconsCategory.java @@ -121,7 +121,8 @@ public class IconsCategory extends AppPrefsCategory { DataStorage.get().local().ref()), dir, null, - List.of()) + List.of(), + en -> en.equals(DataStorage.get().local())) .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 418c5b3e8..726561dd9 100644 --- a/app/src/main/java/io/xpipe/app/prefs/SshCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/SshCategory.java @@ -35,7 +35,8 @@ public class SshCategory extends AppPrefsCategory { new ReadOnlyObjectWrapper<>(DataStorage.get().local().ref()), prefs.sshAgentSocket, null, - List.of()); + List.of(), + e -> e.equals(DataStorage.get().local())); 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 7caf31202..b056f1517 100644 --- a/app/src/main/java/io/xpipe/app/pwman/EnpassPasswordManager.java +++ b/app/src/main/java/io/xpipe/app/pwman/EnpassPasswordManager.java @@ -52,7 +52,8 @@ public class EnpassPasswordManager implements PasswordManager { public static OptionsBuilder createOptions(Property p) { var prop = new SimpleObjectProperty<>(p.getValue().getVaultPath()); var comp = new ContextualFileReferenceChoiceComp( - new SimpleObjectProperty<>(DataStorage.get().local().ref()), prop, null, List.of()); + new SimpleObjectProperty<>(DataStorage.get().local().ref()), prop, null, List.of(), + e -> e.equals(DataStorage.get().local())); comp.apply(struc -> { var text = (TextField) struc.get().getChildren().getFirst(); text.requestFocus(); 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 67d27b0f6..7cfc8db6b 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 @@ -50,7 +50,8 @@ public class CustomPkcs11LibraryStrategy implements SshIdentityStrategy { DataStorage.get().local().ref()), file, null, - List.of()), + List.of(), + e -> e.equals(DataStorage.get().local())), 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 dfb823cb2..3d53c0834 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 @@ -71,7 +71,8 @@ public class KeyFileStrategy implements SshIdentityStrategy { .description("locationDescription") .addComp( new ContextualFileReferenceChoiceComp( - config.getProxy(), keyPath, config.isAllowKeyFileSync() ? sync : null, List.of()), + config.getProxy(), keyPath, config.isAllowKeyFileSync() ? sync : null, List.of(), + e -> e.equals(DataStorage.get().local())), keyPath) .nonNull() .name("keyPassword")