Fix browser shell locks

This commit is contained in:
crschnick 2024-04-21 09:17:58 +00:00
parent 46de09ccd3
commit 1ddc58d254
2 changed files with 43 additions and 31 deletions

View file

@ -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,12 +85,14 @@ public class BrowserQuickAccessContextMenu extends ContextMenu {
}
private List<MenuItem> updateMenuItems(Menu m, BrowserEntry entry, boolean updateInstantly) throws Exception {
var newFiles = model.getFileSystem()
.listFiles(entry.getRawFileEntry().resolved().getPath());
List<FileSystem.FileEntry> list = new ArrayList<>();
model.withFiles(entry.getRawFileEntry().resolved().getPath(), newFiles -> {
try (var s = newFiles) {
var list = s.map(fileEntry -> fileEntry.resolved()).toList();
var l = 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.addAll(l.subList(0, Math.min(l.size(), 150)));
}
});
var newItems = new ArrayList<MenuItem>();
if (list.isEmpty()) {
@ -116,7 +119,6 @@ public class BrowserQuickAccessContextMenu extends ContextMenu {
}
return newItems;
}
}
@Getter
class QuickAccessMenu {

View file

@ -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<FileSystemStore
loadFilesSync(path);
}
public void withFiles(String dir, FailableConsumer<Stream<FileSystem.FileEntry>, 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) {