diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessContextMenu.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessContextMenu.java index a20a0e8e..a93e9f96 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessContextMenu.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessContextMenu.java @@ -8,6 +8,7 @@ import io.xpipe.app.util.InputHelper; import io.xpipe.app.util.ThreadHelper; import io.xpipe.core.store.FileKind; +import io.xpipe.core.store.FileSystem; import javafx.application.Platform; import javafx.beans.property.SimpleBooleanProperty; import javafx.geometry.Side; @@ -84,38 +85,39 @@ public class BrowserQuickAccessContextMenu extends ContextMenu { } private List updateMenuItems(Menu m, BrowserEntry entry, boolean updateInstantly) throws Exception { - var newFiles = model.getFileSystem() - .listFiles(entry.getRawFileEntry().resolved().getPath()); - try (var s = newFiles) { - var list = s.map(fileEntry -> fileEntry.resolved()).toList(); - // Wait until all files are listed, i.e. do not skip the stream elements - list = list.subList(0, Math.min(list.size(), 150)); + List list = new ArrayList<>(); + model.withFiles(entry.getRawFileEntry().resolved().getPath(), newFiles -> { + try (var s = newFiles) { + var l = s.map(fileEntry -> fileEntry.resolved()).toList(); + // Wait until all files are listed, i.e. do not skip the stream elements + list.addAll(l.subList(0, Math.min(l.size(), 150))); + } + }); - var newItems = new ArrayList(); - if (list.isEmpty()) { - var empty = new Menu(""); - empty.getStyleClass().add("leaf"); - newItems.add(empty); - } else { - var browserEntries = list.stream() - .map(fileEntry -> new BrowserEntry(fileEntry, model.getFileList(), false)) - .toList(); - var menus = browserEntries.stream() - .sorted(model.getFileList().order()) - .collect(Collectors.toMap(e -> e, e -> createItem(e), (v1, v2) -> v2, LinkedHashMap::new)); - var dirs = browserEntries.stream() - .filter(e -> e.getRawFileEntry().getKind() == FileKind.DIRECTORY) - .toList(); - if (dirs.size() == 1) { - updateMenuItems((Menu) menus.get(dirs.getFirst()), dirs.getFirst(), true); - } - newItems.addAll(menus.values()); + var newItems = new ArrayList(); + if (list.isEmpty()) { + var empty = new Menu(""); + empty.getStyleClass().add("leaf"); + newItems.add(empty); + } else { + var browserEntries = list.stream() + .map(fileEntry -> new BrowserEntry(fileEntry, model.getFileList(), false)) + .toList(); + var menus = browserEntries.stream() + .sorted(model.getFileList().order()) + .collect(Collectors.toMap(e -> e, e -> createItem(e), (v1, v2) -> v2, LinkedHashMap::new)); + var dirs = browserEntries.stream() + .filter(e -> e.getRawFileEntry().getKind() == FileKind.DIRECTORY) + .toList(); + if (dirs.size() == 1) { + updateMenuItems((Menu) menus.get(dirs.getFirst()), dirs.getFirst(), true); } - if (updateInstantly) { - m.getItems().setAll(newItems); - } - return newItems; + newItems.addAll(menus.values()); } + if (updateInstantly) { + m.getItems().setAll(newItems); + } + return newItems; } @Getter diff --git a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemModel.java b/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemModel.java index 00928786..2a5fdcf2 100644 --- a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemModel.java +++ b/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemModel.java @@ -22,10 +22,8 @@ import io.xpipe.core.process.ShellDialects; import io.xpipe.core.process.ShellOpenFunction; import io.xpipe.core.store.*; import io.xpipe.core.util.FailableConsumer; - import javafx.beans.binding.Bindings; import javafx.beans.property.*; - import lombok.Getter; import lombok.SneakyThrows; @@ -299,6 +297,18 @@ public final class OpenFileSystemModel extends BrowserSessionTab, Exception> consumer) throws Exception { + BooleanScope.executeExclusive(busy, () -> { + if (dir != null) { + startIfNeeded(); + var stream = getFileSystem().listFiles(dir); + consumer.accept(stream); + } else { + consumer.accept(Stream.of()); + } + }); + } + private boolean loadFilesSync(String dir) { try { if (dir != null) {