From 0426d83befb821b4be79846186fd3708a4ab7a12 Mon Sep 17 00:00:00 2001 From: crschnick Date: Thu, 25 Jul 2024 09:03:18 +0000 Subject: [PATCH] Input fixes --- .../app/browser/file/BrowserFileListComp.java | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java index f0d153916..091667fc7 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java @@ -136,7 +136,7 @@ public final class BrowserFileListComp extends SimpleComp { private void prepareTypedSelectionModel(TableView table) { AtomicReference lastFail = new AtomicReference<>(); table.addEventHandler(KeyEvent.KEY_PRESSED, event -> { - updateTypedSelection(table, lastFail, event); + updateTypedSelection(table, lastFail, event, false); }); table.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> { @@ -157,36 +157,38 @@ public final class BrowserFileListComp extends SimpleComp { }); } - private void updateTypedSelection(TableView table, AtomicReference lastType, KeyEvent event) { + private void updateTypedSelection(TableView table, AtomicReference lastType, KeyEvent event, boolean recursive) { var typed = event.getText(); if (typed.isEmpty()) { return; } - System.out.println(typedSelection.get() + " vs " + typed); var updated = typedSelection.get() + typed; var found = fileList.getShown().getValue().stream() .filter(browserEntry -> browserEntry.getFileName().toLowerCase().startsWith(updated.toLowerCase())) .findFirst(); if (found.isEmpty()) { + if (typedSelection.get().isEmpty()) { + return; + } + var inCooldown = lastType.get() != null && Duration.between(lastType.get(), Instant.now()).toMillis() < 1000; if (inCooldown) { - System.out.println("cool"); lastType.set(Instant.now()); event.consume(); return; } else { - System.out.println("cancel"); lastType.set(null); typedSelection.set(""); table.getSelectionModel().clearSelection(); - updateTypedSelection(table, lastType, event); + if (!recursive) { + updateTypedSelection(table, lastType, event, true); + } return; } } - System.out.println("norm"); lastType.set(Instant.now()); typedSelection.set(updated); table.scrollTo(found.get()); @@ -590,7 +592,18 @@ public final class BrowserFileListComp extends SimpleComp { event.consume(); } }); - InputHelper.onExactKeyCode(tableView, KeyCode.SPACE, false, event -> { + InputHelper.onExactKeyCode(tableView, KeyCode.SPACE, true, event -> { + var selection = typedSelection.get() + " "; + var found = fileList.getShown().getValue().stream() + .filter(browserEntry -> + browserEntry.getFileName().toLowerCase().startsWith(selection)) + .findFirst(); + // Ugly fix to prevent space from showing the menu when there is a file matching + // Due to the table view input map, these events always get sent and consumed, not allowing us to differentiate between these cases + if (found.isPresent()) { + return; + } + var selected = fileList.getSelection(); // Only show one menu across all selected entries if (selected.size() > 0 && selected.getLast() == getTableRow().getItem()) {