More quick access fixes

This commit is contained in:
crschnick 2024-03-26 22:58:03 +00:00
parent b1a3caad46
commit 92faa26bbc
3 changed files with 67 additions and 55 deletions

View file

@ -74,7 +74,7 @@ final class BrowserContextMenu extends ContextMenu {
for (BrowserAction a : all) { for (BrowserAction a : all) {
var used = resolveIfNeeded(a, selected); var used = resolveIfNeeded(a, selected);
if (a instanceof LeafAction la) { if (a instanceof LeafAction la) {
getItems().add(la.toItem(model, used, s -> s)); getItems().add(la.toMenuItem(model, used, s -> s));
} }
if (a instanceof BranchAction la) { if (a instanceof BranchAction la) {
@ -84,7 +84,7 @@ final class BrowserContextMenu extends ContextMenu {
if (!sub.isApplicable(model, subUsed)) { if (!sub.isApplicable(model, subUsed)) {
continue; continue;
} }
m.getItems().add(sub.toItem(model, subUsed, s -> s)); m.getItems().add(sub.toMenuItem(model, subUsed, s -> s));
} }
var graphic = a.getIcon(model, used); var graphic = a.getIcon(model, used);
if (graphic != null) { if (graphic != null) {

View file

@ -45,39 +45,43 @@ public class BrowserQuickAccessButtonComp extends SimpleComp {
} }
private void showMenu(Node anchor) { private void showMenu(Node anchor) {
var cm = new ContextMenu(); var cm = new ContextMenu();
cm.addEventHandler(Menu.ON_SHOWING, e -> { cm.addEventHandler(Menu.ON_SHOWING, e -> {
Node content = cm.getSkin().getNode(); Node content = cm.getSkin().getNode();
if (content instanceof Region r) { if (content instanceof Region r) {
r.setMaxWidth(500); r.setMaxWidth(500);
r.setMaxHeight(600); r.setMaxHeight(600);
} }
}); });
cm.setAutoHide(true); cm.setAutoHide(true);
cm.getStyleClass().add("condensed"); cm.getStyleClass().add("condensed");
ThreadHelper.runFailableAsync(() -> { ThreadHelper.runFailableAsync(() -> {
var fileEntry = base.get().getRawFileEntry(); var fileEntry = base.get().getRawFileEntry();
if (fileEntry.getKind() != FileKind.DIRECTORY) { if (fileEntry.getKind() != FileKind.DIRECTORY) {
return; return;
} }
var r = new Menu(); var r = new Menu();
var newItems = updateMenuItems(cm, r, fileEntry, true); var newItems = updateMenuItems(cm, r, fileEntry, true);
Platform.runLater(() -> { Platform.runLater(() -> {
cm.getItems().addAll(r.getItems()); cm.getItems().addAll(r.getItems());
cm.show(anchor, Side.RIGHT, 0, 0); cm.show(anchor, Side.RIGHT, 0, 0);
}); });
}); });
} }
private MenuItem createItem(ContextMenu contextMenu, FileSystem.FileEntry fileEntry) { private MenuItem createItem(ContextMenu contextMenu, FileSystem.FileEntry fileEntry) {
var browserCm = new BrowserContextMenu(model, new BrowserEntry(fileEntry,model.getFileList(), false)); var browserCm = new BrowserContextMenu(model, new BrowserEntry(fileEntry, model.getFileList(), false));
browserCm.setOnAction(e -> {
contextMenu.hide();
});
if (fileEntry.getKind() != FileKind.DIRECTORY) { if (fileEntry.getKind() != FileKind.DIRECTORY) {
var m = new Menu( var m = new Menu(
fileEntry.getName(), fileEntry.getName(),
PrettyImageHelper.ofFixedSizeSquare(FileIconManager.getFileIcon(fileEntry,false), 24).createRegion()); PrettyImageHelper.ofFixedSizeSquare(FileIconManager.getFileIcon(fileEntry, false), 24)
.createRegion());
m.setMnemonicParsing(false); m.setMnemonicParsing(false);
m.setOnAction(event -> { m.setOnAction(event -> {
if (event.getTarget() != m) { if (event.getTarget() != m) {
@ -91,7 +95,8 @@ public class BrowserQuickAccessButtonComp extends SimpleComp {
var m = new Menu( var m = new Menu(
fileEntry.getName(), fileEntry.getName(),
PrettyImageHelper.ofFixedSizeSquare(FileIconManager.getFileIcon(fileEntry,false), 24).createRegion()); PrettyImageHelper.ofFixedSizeSquare(FileIconManager.getFileIcon(fileEntry, false), 24)
.createRegion());
m.setMnemonicParsing(false); m.setMnemonicParsing(false);
var empty = new MenuItem("..."); var empty = new MenuItem("...");
m.getItems().add(empty); m.getItems().add(empty);
@ -107,23 +112,24 @@ public class BrowserQuickAccessButtonComp extends SimpleComp {
hover.set(false); hover.set(false);
event.consume(); event.consume();
}); });
new BooleanTimer(hover,500, () -> { new BooleanTimer(hover, 500, () -> {
if (m.isShowing() && !m.getItems().getFirst().equals(empty)) { if (m.isShowing() && !m.getItems().getFirst().equals(empty)) {
return; return;
} }
List<MenuItem> newItems = null; List<MenuItem> newItems = null;
try { try {
newItems = updateMenuItems(contextMenu, m, fileEntry, false); newItems = updateMenuItems(contextMenu, m, fileEntry, false);
m.getItems().setAll(newItems); m.getItems().setAll(newItems);
if (!browserCm.isShowing()) { if (!browserCm.isShowing()) {
m.hide(); m.hide();
m.show(); m.show();
} }
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
}).start(); })
.start();
m.setOnAction(event -> { m.setOnAction(event -> {
if (event.getTarget() != m) { if (event.getTarget() != m) {
return; return;
@ -142,7 +148,8 @@ public class BrowserQuickAccessButtonComp extends SimpleComp {
return m; return m;
} }
private List<MenuItem> updateMenuItems(ContextMenu contextMenu, Menu m, FileSystem.FileEntry fileEntry, boolean updateInstantly) throws Exception { private List<MenuItem> updateMenuItems(
ContextMenu contextMenu, Menu m, FileSystem.FileEntry fileEntry, boolean updateInstantly) throws Exception {
var newFiles = model.getFileSystem().listFiles(fileEntry.getPath()); var newFiles = model.getFileSystem().listFiles(fileEntry.getPath());
try (var s = newFiles) { try (var s = newFiles) {
var list = s.toList(); var list = s.toList();
@ -151,16 +158,21 @@ public class BrowserQuickAccessButtonComp extends SimpleComp {
if (list.isEmpty()) { if (list.isEmpty()) {
newItems.add(new MenuItem("<empty>")); newItems.add(new MenuItem("<empty>"));
} else { } else {
var menus = list.stream().sorted((o1, o2) -> { var menus = list.stream()
if (o1.getKind() == FileKind.DIRECTORY && o2.getKind() != FileKind.DIRECTORY) { .sorted((o1, o2) -> {
return -1; if (o1.getKind() == FileKind.DIRECTORY && o2.getKind() != FileKind.DIRECTORY) {
} return -1;
if (o2.getKind() == FileKind.DIRECTORY && o1.getKind() != FileKind.DIRECTORY) { }
return 1; if (o2.getKind() == FileKind.DIRECTORY && o1.getKind() != FileKind.DIRECTORY) {
} return 1;
return o1.getName().compareToIgnoreCase(o2.getName()); }
}).collect(Collectors.toMap(e -> e, e -> createItem(contextMenu, e), (v1, v2) -> v2, LinkedHashMap::new)); return o1.getName().compareToIgnoreCase(o2.getName());
var dirs = list.stream().filter(e -> e.getKind() == FileKind.DIRECTORY).toList(); })
.collect(Collectors.toMap(
e -> e, e -> createItem(contextMenu, e), (v1, v2) -> v2, LinkedHashMap::new));
var dirs = list.stream()
.filter(e -> e.getKind() == FileKind.DIRECTORY)
.toList();
if (dirs.size() == 1) { if (dirs.size() == 1) {
updateMenuItems(contextMenu, (Menu) menus.get(dirs.getFirst()), list.getFirst(), updateInstantly); updateMenuItems(contextMenu, (Menu) menus.get(dirs.getFirst()), list.getFirst(), updateInstantly);
} }

View file

@ -61,7 +61,7 @@ public interface LeafAction extends BrowserAction {
return b; return b;
} }
default MenuItem toItem(OpenFileSystemModel model, List<BrowserEntry> selected, UnaryOperator<String> nameFunc) { default MenuItem toMenuItem(OpenFileSystemModel model, List<BrowserEntry> selected, UnaryOperator<String> nameFunc) {
var name = nameFunc.apply(getName(model, selected)); var name = nameFunc.apply(getName(model, selected));
var mi = new MenuItem(name); var mi = new MenuItem(name);
mi.setOnAction(event -> { mi.setOnAction(event -> {