]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
macOS: Ability to remove multiple tunnels at a time
authorRoopesh Chander <roop@roopc.net>
Sun, 10 Mar 2019 14:32:19 +0000 (20:02 +0530)
committerRoopesh Chander <roop@roopc.net>
Sun, 10 Mar 2019 14:32:19 +0000 (20:02 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard/Base.lproj/Localizable.strings
WireGuard/WireGuard/UI/macOS/ViewController/ManageTunnelsRootViewController.swift
WireGuard/WireGuard/UI/macOS/ViewController/TunnelsListTableViewController.swift

index 00f4d583690a74c0ec7570f1907dbb740e0871b0..7652b34717fcc9f2957349281eab8e1e8fe4fe21 100644 (file)
 "macWindowTitleManageTunnels" = "Manage WireGuard Tunnels";
 
 "macDeleteTunnelConfirmationAlertMessage (%@)" = "Are you sure you want to delete ‘%@’?";
+"macDeleteMultipleTunnelsConfirmationAlertMessage (%d)" = "Are you sure you want to delete %d tunnels?";
 "macDeleteTunnelConfirmationAlertInfo" = "You cannot undo this action.";
 "macDeleteTunnelConfirmationAlertButtonTitleDelete" = "Delete";
 "macDeleteTunnelConfirmationAlertButtonTitleCancel" = "Cancel";
 "macNameFieldExportZip" = "Export tunnels to";
 "macSheetButtonExportZip" = "Save";
 
+"macButtonDeleteTunnels (%d)" = "Delete %d tunnels";
+
 // Mac detail/edit view fields
 
 "macFieldKey (%@)" = "%@:";
index 58065475c715005fb41094c4597a308fde81f4ab..18b8fcb71c6929ee5b883291a250b560cf5c9ce5 100644 (file)
@@ -77,10 +77,27 @@ class ManageTunnelsRootViewController: NSViewController {
 }
 
 extension ManageTunnelsRootViewController: TunnelsListTableViewControllerDelegate {
-    func tunnelSelected(tunnel: TunnelContainer) {
-        let tunnelDetailVC = TunnelDetailTableViewController(tunnelsManager: tunnelsManager, tunnel: tunnel)
-        setTunnelDetailContentVC(tunnelDetailVC)
-        self.tunnelDetailVC = tunnelDetailVC
+    func tunnelsSelected(tunnelIndices: [Int]) {
+        assert(!tunnelIndices.isEmpty)
+        if tunnelIndices.count == 1 {
+            let tunnel = tunnelsManager.tunnel(at: tunnelIndices.first!)
+            let tunnelDetailVC = TunnelDetailTableViewController(tunnelsManager: tunnelsManager, tunnel: tunnel)
+            setTunnelDetailContentVC(tunnelDetailVC)
+            self.tunnelDetailVC = tunnelDetailVC
+        } else if tunnelIndices.count > 1 {
+            let multiSelectionVC: ButtonedDetailViewController
+            if let buttonedDetailVC = tunnelDetailContentVC as? ButtonedDetailViewController {
+                multiSelectionVC = buttonedDetailVC
+            } else {
+                multiSelectionVC = ButtonedDetailViewController()
+            }
+            multiSelectionVC.setButtonTitle(tr(format: "macButtonDeleteTunnels (%d)", tunnelIndices.count))
+            multiSelectionVC.onButtonClicked = { [weak tunnelsListVC] in
+                tunnelsListVC?.handleRemoveTunnelAction()
+            }
+            setTunnelDetailContentVC(multiSelectionVC)
+            self.tunnelDetailVC = nil
+        }
     }
 
     func tunnelsListEmpty() {
index 3a29840008622ee9be089393658b1a2ee1dffcdc..7f2dbc8b7925d526de99711666f1f711194c42ef 100644 (file)
@@ -4,7 +4,7 @@
 import Cocoa
 
 protocol TunnelsListTableViewControllerDelegate: class {
-    func tunnelSelected(tunnel: TunnelContainer)
+    func tunnelsSelected(tunnelIndices: [Int])
     func tunnelsListEmpty()
 }
 
@@ -18,6 +18,7 @@ class TunnelsListTableViewController: NSViewController {
         tableView.addTableColumn(NSTableColumn(identifier: NSUserInterfaceItemIdentifier("TunnelsList")))
         tableView.headerView = nil
         tableView.rowSizeStyle = .medium
+        tableView.allowsMultipleSelection = true
         return tableView
     }()
 
@@ -158,18 +159,24 @@ class TunnelsListTableViewController: NSViewController {
 
     @objc func handleRemoveTunnelAction() {
         guard let window = view.window else { return }
-        let selectedTunnelIndex = tableView.selectedRow
-        guard selectedTunnelIndex >= 0 && selectedTunnelIndex < tunnelsManager.numberOfTunnels() else { return }
-        let selectedTunnel = tunnelsManager.tunnel(at: selectedTunnelIndex)
+        let selectedTunnelIndices = tableView.selectedRowIndexes.sorted()
+        let selectedTunnels = selectedTunnelIndices.compactMap { tunnelIndex in
+            tunnelIndex >= 0 && tunnelIndex < tunnelsManager.numberOfTunnels() ? tunnelsManager.tunnel(at: tunnelIndex) : nil
+        }
+        guard !selectedTunnels.isEmpty else { return }
         let alert = NSAlert()
-        alert.messageText = tr(format: "macDeleteTunnelConfirmationAlertMessage (%@)", selectedTunnel.name)
+        if selectedTunnels.count == 1 {
+            alert.messageText = tr(format: "macDeleteTunnelConfirmationAlertMessage (%@)", selectedTunnels.first!.name)
+        } else {
+            alert.messageText = tr(format: "macDeleteMultipleTunnelsConfirmationAlertMessage (%d)", selectedTunnels.count)
+        }
         alert.informativeText = tr("macDeleteTunnelConfirmationAlertInfo")
         alert.addButton(withTitle: tr("macDeleteTunnelConfirmationAlertButtonTitleDelete"))
         alert.addButton(withTitle: tr("macDeleteTunnelConfirmationAlertButtonTitleCancel"))
         alert.beginSheetModal(for: window) { [weak self] response in
             guard response == .alertFirstButtonReturn else { return }
             self?.removeButton.isEnabled = false
-            self?.tunnelsManager.remove(tunnel: selectedTunnel) { [weak self] error in
+            self?.tunnelsManager.removeMultiple(tunnels: selectedTunnels) { [weak self] error in
                 guard let self = self else { return }
                 defer { self.removeButton.isEnabled = true }
                 if let error = error {
@@ -309,9 +316,10 @@ extension TunnelsListTableViewController: NSTableViewDelegate {
     }
 
     func tableViewSelectionDidChange(_ notification: Notification) {
-        guard tableView.selectedRow >= 0 else { return }
-        let selectedTunnel = tunnelsManager.tunnel(at: tableView.selectedRow)
-        delegate?.tunnelSelected(tunnel: selectedTunnel)
+        let selectedTunnelIndices = tableView.selectedRowIndexes.sorted()
+        if !selectedTunnelIndices.isEmpty {
+            delegate?.tunnelsSelected(tunnelIndices: tableView.selectedRowIndexes.sorted())
+        }
     }
 }