diff --git a/TFI/Features/SFTP/MobileSFTPBrowser.swift b/TFI/Features/SFTP/MobileSFTPBrowser.swift index 189459e4..901dcab6 100644 --- a/TFI/Features/SFTP/MobileSFTPBrowser.swift +++ b/TFI/Features/SFTP/MobileSFTPBrowser.swift @@ -152,6 +152,7 @@ struct MobileSFTPBrowser: View { Button("Paste", systemImage: "doc.on.clipboard") { paste() } Button("Rename", systemImage: "pencil") { rename(file) } Button("Edit Permissions", systemImage: "lock.shield") { editPermissions(file) } + Divider() Button("Delete", systemImage: "trash", role: .destructive) { delete(file) } } .accessibilityHint(file.isDirectory ? Text("Open") : Text("Download")) diff --git a/TFI/Features/Workspaces/MobileWorkspaceView.swift b/TFI/Features/Workspaces/MobileWorkspaceView.swift index 2ccd5fff..85cd6019 100644 --- a/TFI/Features/Workspaces/MobileWorkspaceView.swift +++ b/TFI/Features/Workspaces/MobileWorkspaceView.swift @@ -197,6 +197,7 @@ struct MobileWorkspaceView: View { } label: { MobileOverflowMenuLabel("More") } + .menuOrder(.fixed) } } } diff --git a/TFI/UI/Components/MobileNativeList.swift b/TFI/UI/Components/MobileNativeList.swift index 5d9d5dcc..03719a35 100644 --- a/TFI/UI/Components/MobileNativeList.swift +++ b/TFI/UI/Components/MobileNativeList.swift @@ -367,6 +367,8 @@ final class MobileHostingListRow: ListRowView, UIGestureRecognizerDelegate { private let contentContainer = UIView() private var hostedView: UIView? private var onSelect: (() -> Void)? + private weak var selectionTapRecognizer: UITapGestureRecognizer? + private weak var highlightPressRecognizer: UILongPressGestureRecognizer? private var pressOrigin: CGPoint? private var restingBackgroundColor = UIColor.clear @@ -389,12 +391,14 @@ final class MobileHostingListRow: ListRowView, UIGestureRecognizerDelegate { tap.cancelsTouchesInView = false tap.delegate = self contentContainer.addGestureRecognizer(tap) + selectionTapRecognizer = tap let press = UILongPressGestureRecognizer(target: self, action: #selector(rowPressed(_:))) press.minimumPressDuration = 0 press.cancelsTouchesInView = false press.delegate = self contentContainer.addGestureRecognizer(press) + highlightPressRecognizer = press } override func prepareForReuse() { @@ -441,10 +445,27 @@ final class MobileHostingListRow: ListRowView, UIGestureRecognizerDelegate { } func gestureRecognizer( - _: UIGestureRecognizer, - shouldRecognizeSimultaneouslyWith _: UIGestureRecognizer + _ gestureRecognizer: UIGestureRecognizer, + shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer ) -> Bool { - true + guard + gestureRecognizer === selectionTapRecognizer + || otherGestureRecognizer === selectionTapRecognizer + else { return true } + let counterpart = + gestureRecognizer === selectionTapRecognizer + ? otherGestureRecognizer : gestureRecognizer + if counterpart === highlightPressRecognizer { return true } + return !(counterpart is UILongPressGestureRecognizer) + } + + func gestureRecognizer( + _ gestureRecognizer: UIGestureRecognizer, + shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer + ) -> Bool { + gestureRecognizer === selectionTapRecognizer + && otherGestureRecognizer !== highlightPressRecognizer + && otherGestureRecognizer is UILongPressGestureRecognizer } @objc private func rowTapped() { onSelect?() }