mirror of
https://github.com/xpipe-io/xpipe.git
synced 2024-06-30 20:10:57 +12:00
Fix browser shell locks
This commit is contained in:
parent
46de09ccd3
commit
1ddc58d254
|
@ -8,6 +8,7 @@ import io.xpipe.app.util.InputHelper;
|
||||||
import io.xpipe.app.util.ThreadHelper;
|
import io.xpipe.app.util.ThreadHelper;
|
||||||
import io.xpipe.core.store.FileKind;
|
import io.xpipe.core.store.FileKind;
|
||||||
|
|
||||||
|
import io.xpipe.core.store.FileSystem;
|
||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
import javafx.beans.property.SimpleBooleanProperty;
|
import javafx.beans.property.SimpleBooleanProperty;
|
||||||
import javafx.geometry.Side;
|
import javafx.geometry.Side;
|
||||||
|
@ -84,38 +85,39 @@ public class BrowserQuickAccessContextMenu extends ContextMenu {
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<MenuItem> updateMenuItems(Menu m, BrowserEntry entry, boolean updateInstantly) throws Exception {
|
private List<MenuItem> updateMenuItems(Menu m, BrowserEntry entry, boolean updateInstantly) throws Exception {
|
||||||
var newFiles = model.getFileSystem()
|
List<FileSystem.FileEntry> list = new ArrayList<>();
|
||||||
.listFiles(entry.getRawFileEntry().resolved().getPath());
|
model.withFiles(entry.getRawFileEntry().resolved().getPath(), newFiles -> {
|
||||||
try (var s = 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
|
// 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>();
|
var newItems = new ArrayList<MenuItem>();
|
||||||
if (list.isEmpty()) {
|
if (list.isEmpty()) {
|
||||||
var empty = new Menu("<empty>");
|
var empty = new Menu("<empty>");
|
||||||
empty.getStyleClass().add("leaf");
|
empty.getStyleClass().add("leaf");
|
||||||
newItems.add(empty);
|
newItems.add(empty);
|
||||||
} else {
|
} else {
|
||||||
var browserEntries = list.stream()
|
var browserEntries = list.stream()
|
||||||
.map(fileEntry -> new BrowserEntry(fileEntry, model.getFileList(), false))
|
.map(fileEntry -> new BrowserEntry(fileEntry, model.getFileList(), false))
|
||||||
.toList();
|
.toList();
|
||||||
var menus = browserEntries.stream()
|
var menus = browserEntries.stream()
|
||||||
.sorted(model.getFileList().order())
|
.sorted(model.getFileList().order())
|
||||||
.collect(Collectors.toMap(e -> e, e -> createItem(e), (v1, v2) -> v2, LinkedHashMap::new));
|
.collect(Collectors.toMap(e -> e, e -> createItem(e), (v1, v2) -> v2, LinkedHashMap::new));
|
||||||
var dirs = browserEntries.stream()
|
var dirs = browserEntries.stream()
|
||||||
.filter(e -> e.getRawFileEntry().getKind() == FileKind.DIRECTORY)
|
.filter(e -> e.getRawFileEntry().getKind() == FileKind.DIRECTORY)
|
||||||
.toList();
|
.toList();
|
||||||
if (dirs.size() == 1) {
|
if (dirs.size() == 1) {
|
||||||
updateMenuItems((Menu) menus.get(dirs.getFirst()), dirs.getFirst(), true);
|
updateMenuItems((Menu) menus.get(dirs.getFirst()), dirs.getFirst(), true);
|
||||||
}
|
|
||||||
newItems.addAll(menus.values());
|
|
||||||
}
|
}
|
||||||
if (updateInstantly) {
|
newItems.addAll(menus.values());
|
||||||
m.getItems().setAll(newItems);
|
|
||||||
}
|
|
||||||
return newItems;
|
|
||||||
}
|
}
|
||||||
|
if (updateInstantly) {
|
||||||
|
m.getItems().setAll(newItems);
|
||||||
|
}
|
||||||
|
return newItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
|
|
|
@ -22,10 +22,8 @@ import io.xpipe.core.process.ShellDialects;
|
||||||
import io.xpipe.core.process.ShellOpenFunction;
|
import io.xpipe.core.process.ShellOpenFunction;
|
||||||
import io.xpipe.core.store.*;
|
import io.xpipe.core.store.*;
|
||||||
import io.xpipe.core.util.FailableConsumer;
|
import io.xpipe.core.util.FailableConsumer;
|
||||||
|
|
||||||
import javafx.beans.binding.Bindings;
|
import javafx.beans.binding.Bindings;
|
||||||
import javafx.beans.property.*;
|
import javafx.beans.property.*;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
|
|
||||||
|
@ -299,6 +297,18 @@ public final class OpenFileSystemModel extends BrowserSessionTab<FileSystemStore
|
||||||
loadFilesSync(path);
|
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) {
|
private boolean loadFilesSync(String dir) {
|
||||||
try {
|
try {
|
||||||
if (dir != null) {
|
if (dir != null) {
|
||||||
|
|
Loading…
Reference in a new issue