From 0e10d2508adfcae0f487597f0001ce9ad83a9060 Mon Sep 17 00:00:00 2001 From: crschnick Date: Mon, 6 May 2024 04:01:29 +0000 Subject: [PATCH] Rework file transfer modes --- .../xpipe/app/browser/BrowserClipboard.java | 10 +++++---- .../app/browser/BrowserTransferComp.java | 3 ++- .../app/browser/BrowserTransferModel.java | 5 +++-- .../file/BrowserFileListCompEntry.java | 6 ++---- .../browser/file/BrowserFileTransferMode.java | 8 +++++++ .../file/BrowserFileTransferOperation.java | 21 +++++++++++-------- .../app/browser/fs/OpenFileSystemModel.java | 8 ++++--- .../xpipe/ext/base/browser/PasteAction.java | 3 ++- 8 files changed, 40 insertions(+), 24 deletions(-) create mode 100644 app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferMode.java diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserClipboard.java b/app/src/main/java/io/xpipe/app/browser/BrowserClipboard.java index 21b9f7b37..ba9761b48 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserClipboard.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserClipboard.java @@ -1,6 +1,7 @@ package io.xpipe.app.browser; import io.xpipe.app.browser.file.BrowserEntry; +import io.xpipe.app.browser.file.BrowserFileTransferMode; import io.xpipe.app.browser.file.LocalFileSystem; import io.xpipe.app.issue.ErrorEvent; import io.xpipe.app.util.ThreadHelper; @@ -54,7 +55,7 @@ public class BrowserClipboard { entries.add(LocalFileSystem.getLocalBrowserEntry(file)); } - currentCopyClipboard.setValue(new Instance(UUID.randomUUID(), null, entries)); + currentCopyClipboard.setValue(new Instance(UUID.randomUUID(), null, entries, BrowserFileTransferMode.COPY)); } catch (Exception e) { ErrorEvent.fromThrowable(e).expected().omit().handle(); } @@ -63,14 +64,14 @@ public class BrowserClipboard { } @SneakyThrows - public static ClipboardContent startDrag(FileSystem.FileEntry base, List selected) { + public static ClipboardContent startDrag(FileSystem.FileEntry base, List selected, BrowserFileTransferMode mode) { if (selected.isEmpty()) { return null; } var content = new ClipboardContent(); var id = UUID.randomUUID(); - currentDragClipboard = new Instance(id, base, new ArrayList<>(selected)); + currentDragClipboard = new Instance(id, base, new ArrayList<>(selected), mode); content.putString(currentDragClipboard.toClipboardString()); return content; } @@ -83,7 +84,7 @@ public class BrowserClipboard { } var id = UUID.randomUUID(); - currentCopyClipboard.setValue(new Instance(id, base, new ArrayList<>(selected))); + currentCopyClipboard.setValue(new Instance(id, base, new ArrayList<>(selected), BrowserFileTransferMode.COPY)); } public static Instance retrieveCopy() { @@ -118,6 +119,7 @@ public class BrowserClipboard { UUID uuid; FileSystem.FileEntry baseDirectory; List entries; + BrowserFileTransferMode mode; public String toClipboardString() { return entries.stream() diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserTransferComp.java b/app/src/main/java/io/xpipe/app/browser/BrowserTransferComp.java index fd304422a..2d5112720 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserTransferComp.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserTransferComp.java @@ -1,5 +1,6 @@ package io.xpipe.app.browser; +import io.xpipe.app.browser.file.BrowserFileTransferMode; import io.xpipe.app.browser.fs.OpenFileSystemModel; import io.xpipe.app.comp.base.LoadingOverlayComp; import io.xpipe.app.core.AppI18n; @@ -150,7 +151,7 @@ public class BrowserTransferComp extends SimpleComp { .toList(); Dragboard db = struc.get().startDragAndDrop(TransferMode.COPY); - var cc = BrowserClipboard.startDrag(null, selected); + var cc = BrowserClipboard.startDrag(null, selected, BrowserFileTransferMode.NORMAL); if (cc == null) { return; } diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserTransferModel.java b/app/src/main/java/io/xpipe/app/browser/BrowserTransferModel.java index e769a317a..a7b174170 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserTransferModel.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserTransferModel.java @@ -1,6 +1,7 @@ package io.xpipe.app.browser; import io.xpipe.app.browser.file.BrowserEntry; +import io.xpipe.app.browser.file.BrowserFileTransferMode; import io.xpipe.app.browser.file.BrowserFileTransferOperation; import io.xpipe.app.browser.file.LocalFileSystem; import io.xpipe.app.browser.fs.OpenFileSystemModel; @@ -125,11 +126,11 @@ public class BrowserTransferModel { } try { - try (var b = new BooleanScope(downloading).start()) { + try (var ignored = new BooleanScope(downloading).start()) { var op = new BrowserFileTransferOperation( LocalFileSystem.getLocalFileEntry(TEMP), List.of(item.getBrowserEntry().getRawFileEntry()), - true, + BrowserFileTransferMode.COPY, false, progress -> { item.getProgress().setValue(progress); diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListCompEntry.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListCompEntry.java index 44f016775..6e3682b9f 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListCompEntry.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListCompEntry.java @@ -3,13 +3,11 @@ package io.xpipe.app.browser.file; import io.xpipe.app.browser.BrowserClipboard; import io.xpipe.app.browser.BrowserSelectionListComp; import io.xpipe.core.store.FileKind; - import javafx.geometry.Point2D; import javafx.scene.Node; import javafx.scene.control.TableView; import javafx.scene.image.Image; import javafx.scene.input.*; - import lombok.Getter; import java.io.File; @@ -157,7 +155,7 @@ public class BrowserFileListCompEntry { var target = item != null && item.getRawFileEntry().getKind() == FileKind.DIRECTORY ? item.getRawFileEntry() : model.getFileSystemModel().getCurrentDirectory(); - model.getFileSystemModel().dropFilesIntoAsync(target, files.stream().map(browserEntry -> browserEntry.getRawFileEntry()).toList(), false); + model.getFileSystemModel().dropFilesIntoAsync(target, files.stream().map(browserEntry -> browserEntry.getRawFileEntry()).toList(), db.getMode()); event.setDropCompleted(true); event.consume(); } @@ -184,7 +182,7 @@ public class BrowserFileListCompEntry { var selected = model.getSelection(); Dragboard db = row.startDragAndDrop(TransferMode.COPY); - db.setContent(BrowserClipboard.startDrag(model.getFileSystemModel().getCurrentDirectory(), selected)); + db.setContent(BrowserClipboard.startDrag(model.getFileSystemModel().getCurrentDirectory(), selected, event.isAltDown() ? BrowserFileTransferMode.MOVE : BrowserFileTransferMode.NORMAL)); Image image = BrowserSelectionListComp.snapshot(selected); db.setDragView(image, -20, 15); diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferMode.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferMode.java new file mode 100644 index 000000000..a01cd5b4f --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferMode.java @@ -0,0 +1,8 @@ +package io.xpipe.app.browser.file; + +public enum BrowserFileTransferMode { + + NORMAL, + COPY, + MOVE +} diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferOperation.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferOperation.java index 5c093b789..077f81707 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferOperation.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferOperation.java @@ -21,23 +21,23 @@ public class BrowserFileTransferOperation { private final FileSystem.FileEntry target; private final List files; - private final boolean explicitCopy; + private final BrowserFileTransferMode transferMode; private final boolean checkConflicts; private final Consumer progress; BrowserAlerts.FileConflictChoice lastConflictChoice; - public BrowserFileTransferOperation(FileSystem.FileEntry target, List files, boolean explicitCopy, boolean checkConflicts, + public BrowserFileTransferOperation(FileSystem.FileEntry target, List files, BrowserFileTransferMode transferMode, boolean checkConflicts, Consumer progress ) { this.target = target; this.files = files; - this.explicitCopy = explicitCopy; + this.transferMode = transferMode; this.checkConflicts = checkConflicts; this.progress = progress; } - public static BrowserFileTransferOperation ofLocal(FileSystem.FileEntry target, List files, boolean explicitCopy, boolean checkConflicts, Consumer progress) { + public static BrowserFileTransferOperation ofLocal(FileSystem.FileEntry target, List files, BrowserFileTransferMode transferMode, boolean checkConflicts, Consumer progress) { var entries = files.stream() .map(path -> { try { @@ -47,7 +47,7 @@ public class BrowserFileTransferOperation { } }) .toList(); - return new BrowserFileTransferOperation(target, entries, explicitCopy, checkConflicts, progress); + return new BrowserFileTransferOperation(target, entries, transferMode, checkConflicts, progress); } private void updateProgress(BrowserTransferProgress progress) { @@ -103,7 +103,8 @@ public class BrowserFileTransferOperation { } var same = files.getFirst().getFileSystem().equals(target.getFileSystem()); - if (same && !explicitCopy) { + var doesMove = transferMode == BrowserFileTransferMode.MOVE || (same && transferMode == BrowserFileTransferMode.NORMAL); + if (doesMove) { if (!BrowserAlerts.showMoveAlert(files, target)) { return; } @@ -142,10 +143,12 @@ public class BrowserFileTransferOperation { return; } - if (explicitCopy) { - target.getFileSystem().copy(sourceFile, targetFile); - } else { + var same = files.getFirst().getFileSystem().equals(target.getFileSystem()); + var doesMove = transferMode == BrowserFileTransferMode.MOVE || (same && transferMode == BrowserFileTransferMode.NORMAL); + if (doesMove) { target.getFileSystem().move(sourceFile, targetFile); + } else { + target.getFileSystem().copy(sourceFile, targetFile); } } 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 cd0b87715..4c45c7d98 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 @@ -4,6 +4,7 @@ import io.xpipe.app.browser.BrowserSavedState; import io.xpipe.app.browser.BrowserTransferProgress; import io.xpipe.app.browser.action.BrowserAction; import io.xpipe.app.browser.file.BrowserFileListModel; +import io.xpipe.app.browser.file.BrowserFileTransferMode; import io.xpipe.app.browser.file.BrowserFileTransferOperation; import io.xpipe.app.browser.file.FileSystemHelper; import io.xpipe.app.browser.session.BrowserAbstractSessionModel; @@ -342,7 +343,7 @@ public final class OpenFileSystemModel extends BrowserSessionTab files, boolean explicitCopy) { + FileSystem.FileEntry target, List files, BrowserFileTransferMode mode + ) { // We don't have to do anything in this case if (files.isEmpty()) { return; @@ -363,7 +365,7 @@ public final class OpenFileSystemModel extends BrowserSessionTab browserEntry.getRawFileEntry()).toList(), true); + model.dropFilesIntoAsync(target, files.stream().map(browserEntry -> browserEntry.getRawFileEntry()).toList(), BrowserFileTransferMode.COPY); } @Override