diff options
author | Roopesh Chander <roop@roopc.net> | 2019-04-06 15:22:05 +0530 |
---|---|---|
committer | Roopesh Chander <roop@roopc.net> | 2019-04-06 17:53:41 +0530 |
commit | 11063d0f887101aec84db07f6bd2ec111f0141ce (patch) | |
tree | dfd2f6e1738daff46fc0de56ed8cf5dd27734199 /WireGuard/WireGuard | |
parent | TunnelsManager: When setting a config, also set isAvailable cache (diff) | |
download | wireguard-apple-11063d0f887101aec84db07f6bd2ec111f0141ce.tar.xz wireguard-apple-11063d0f887101aec84db07f6bd2ec111f0141ce.zip |
macOS: Tunnels list: Suppress alert buttons when removing tunnels is in progress
Also refactor the deletion alert into a separate helper class
Signed-off-by: Roopesh Chander <roop@roopc.net>
Diffstat (limited to 'WireGuard/WireGuard')
3 files changed, 56 insertions, 34 deletions
diff --git a/WireGuard/WireGuard/Base.lproj/Localizable.strings b/WireGuard/WireGuard/Base.lproj/Localizable.strings index 5e9b6d5..cd11045 100644 --- a/WireGuard/WireGuard/Base.lproj/Localizable.strings +++ b/WireGuard/WireGuard/Base.lproj/Localizable.strings @@ -314,6 +314,7 @@ "macDeleteTunnelConfirmationAlertInfo" = "You cannot undo this action."; "macDeleteTunnelConfirmationAlertButtonTitleDelete" = "Delete"; "macDeleteTunnelConfirmationAlertButtonTitleCancel" = "Cancel"; +"macDeleteTunnelConfirmationAlertButtonTitleDeleting" = "Deleting…"; "macButtonImportTunnels" = "Import tunnel(s) from file"; "macSheetButtonImport" = "Import"; diff --git a/WireGuard/WireGuard/UI/macOS/View/DeleteTunnelsConfirmationAlert.swift b/WireGuard/WireGuard/UI/macOS/View/DeleteTunnelsConfirmationAlert.swift new file mode 100644 index 0000000..e52ed89 --- /dev/null +++ b/WireGuard/WireGuard/UI/macOS/View/DeleteTunnelsConfirmationAlert.swift @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved. + +import Cocoa + +class DeleteTunnelsConfirmationAlert: NSAlert { + var alertDeleteButton: NSButton? + var alertCancelButton: NSButton? + + var onDeleteClicked: ((_ completionHandler: @escaping () -> Void) -> Void)? + + override init() { + super.init() + let alertDeleteButton = addButton(withTitle: tr("macDeleteTunnelConfirmationAlertButtonTitleDelete")) + alertDeleteButton.target = self + alertDeleteButton.action = #selector(removeTunnelAlertDeleteClicked) + self.alertDeleteButton = alertDeleteButton + self.alertCancelButton = addButton(withTitle: tr("macDeleteTunnelConfirmationAlertButtonTitleCancel")) + } + + @objc func removeTunnelAlertDeleteClicked() { + alertDeleteButton?.title = tr("macDeleteTunnelConfirmationAlertButtonTitleDeleting") + alertDeleteButton?.isEnabled = false + alertCancelButton?.isEnabled = false + if let onDeleteClicked = onDeleteClicked { + onDeleteClicked { [weak self] in + guard let self = self else { return } + self.window.sheetParent?.endSheet(self.window) + } + } + } + + func beginSheetModal(for sheetWindow: NSWindow) { + beginSheetModal(for: sheetWindow) { _ in } + } +} diff --git a/WireGuard/WireGuard/UI/macOS/ViewController/TunnelsListTableViewController.swift b/WireGuard/WireGuard/UI/macOS/ViewController/TunnelsListTableViewController.swift index 8918f79..40a2b9e 100644 --- a/WireGuard/WireGuard/UI/macOS/ViewController/TunnelsListTableViewController.swift +++ b/WireGuard/WireGuard/UI/macOS/ViewController/TunnelsListTableViewController.swift @@ -163,9 +163,15 @@ class TunnelsListTableViewController: NSViewController { @objc func handleRemoveTunnelAction() { guard let window = view.window else { return } + let selectedTunnelIndices = tableView.selectedRowIndexes.sorted().filter { $0 >= 0 && $0 < tunnelsManager.numberOfTunnels() } guard !selectedTunnelIndices.isEmpty else { return } - let alert = NSAlert() + var nextSelection = selectedTunnelIndices.last! + 1 + if nextSelection >= tunnelsManager.numberOfTunnels() { + nextSelection = max(selectedTunnelIndices.first! - 1, 0) + } + + let alert = DeleteTunnelsConfirmationAlert() if selectedTunnelIndices.count == 1 { let firstSelectedTunnel = tunnelsManager.tunnel(at: selectedTunnelIndices.first!) alert.messageText = tr(format: "macDeleteTunnelConfirmationAlertMessage (%@)", firstSelectedTunnel.name) @@ -173,41 +179,20 @@ class TunnelsListTableViewController: NSViewController { alert.messageText = tr(format: "macDeleteMultipleTunnelsConfirmationAlertMessage (%d)", selectedTunnelIndices.count) } alert.informativeText = tr("macDeleteTunnelConfirmationAlertInfo") - let alertDeleteButton = alert.addButton(withTitle: tr("macDeleteTunnelConfirmationAlertButtonTitleDelete")) - alertDeleteButton.target = self - alertDeleteButton.action = #selector(removeTunnelAlertDeleteClicked) - let alertCancelButton = alert.addButton(withTitle: tr("macDeleteTunnelConfirmationAlertButtonTitleCancel")) - alertCancelButton.target = self - alertCancelButton.action = #selector(removeTunnelAlertCancelClicked) - alert.beginSheetModal(for: window) { _ in } - } - - @objc func removeTunnelAlertDeleteClicked(_ sender: AnyObject) { - guard let alertWindow = (sender as? NSView)?.window, alertWindow.isSheet else { return } - let selectedTunnelIndices = tableView.selectedRowIndexes.sorted().filter { $0 >= 0 && $0 < tunnelsManager.numberOfTunnels() } - precondition(!selectedTunnelIndices.isEmpty) - var nextSelection = selectedTunnelIndices.last! + 1 - if nextSelection >= tunnelsManager.numberOfTunnels() { - nextSelection = max(selectedTunnelIndices.first! - 1, 0) - } - let selectedTunnels = selectedTunnelIndices.map { tunnelsManager.tunnel(at: $0) } - alertWindow.ignoresMouseEvents = true - self.selectTunnel(at: nextSelection) - isRemovingTunnels = true - tunnelsManager.removeMultiple(tunnels: selectedTunnels) { [weak self] error in + alert.onDeleteClicked = { [weak self] completion in guard let self = self else { return } - self.view.window?.endSheet(alertWindow) - self.isRemovingTunnels = false - if let error = error { - ErrorPresenter.showErrorAlert(error: error, from: self) - return - } + self.selectTunnel(at: nextSelection) + let selectedTunnels = selectedTunnelIndices.map { self.tunnelsManager.tunnel(at: $0) } + self.tunnelsManager.removeMultiple(tunnels: selectedTunnels) { [weak self] error in + guard let self = self else { return } + defer { completion() } + if let error = error { + ErrorPresenter.showErrorAlert(error: error, from: self) + return + } + } } - } - - @objc func removeTunnelAlertCancelClicked(_ sender: AnyObject) { - guard let alertWindow = (sender as? NSView)?.window, alertWindow.isSheet else { return } - view.window?.endSheet(alertWindow) + alert.beginSheetModal(for: window) } @objc func handleViewLogAction() { |