diff --git a/WireGuard/WireGuard.xcodeproj/project.pbxproj b/WireGuard/WireGuard.xcodeproj/project.pbxproj index 65a4d89..a2e9730 100644 --- a/WireGuard/WireGuard.xcodeproj/project.pbxproj +++ b/WireGuard/WireGuard.xcodeproj/project.pbxproj @@ -141,7 +141,7 @@ 6FBA104021D6B7040051C35F /* ErrorPresenterProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FBA103A21D6B4280051C35F /* ErrorPresenterProtocol.swift */; }; 6FBA104321D6BC250051C35F /* ErrorPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FBA104121D6BC210051C35F /* ErrorPresenter.swift */; }; 6FBA104621D7EBFA0051C35F /* TunnelsListTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FBA104521D7EBFA0051C35F /* TunnelsListTableViewController.swift */; }; - 6FCD99AA21E0E14700BA4C82 /* NoTunnelsDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FCD99A821E0E0C700BA4C82 /* NoTunnelsDetailViewController.swift */; }; + 6FCD99AA21E0E14700BA4C82 /* ButtonedDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FCD99A821E0E0C700BA4C82 /* ButtonedDetailViewController.swift */; }; 6FCD99AF21E0EA1700BA4C82 /* ImportPanelPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FCD99AE21E0EA1700BA4C82 /* ImportPanelPresenter.swift */; }; 6FCD99B121E0EDA900BA4C82 /* TunnelEditViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FCD99B021E0EDA900BA4C82 /* TunnelEditViewController.swift */; }; 6FDB3C3B21DCF47400A0C0BF /* TunnelDetailTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FDB3C3A21DCF47400A0C0BF /* TunnelDetailTableViewController.swift */; }; @@ -314,7 +314,7 @@ 6FBA103D21D6B6D70051C35F /* TunnelImporter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TunnelImporter.swift; sourceTree = ""; }; 6FBA104121D6BC210051C35F /* ErrorPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorPresenter.swift; sourceTree = ""; }; 6FBA104521D7EBFA0051C35F /* TunnelsListTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelsListTableViewController.swift; sourceTree = ""; }; - 6FCD99A821E0E0C700BA4C82 /* NoTunnelsDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoTunnelsDetailViewController.swift; sourceTree = ""; }; + 6FCD99A821E0E0C700BA4C82 /* ButtonedDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonedDetailViewController.swift; sourceTree = ""; }; 6FCD99AE21E0EA1700BA4C82 /* ImportPanelPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImportPanelPresenter.swift; sourceTree = ""; }; 6FCD99B021E0EDA900BA4C82 /* TunnelEditViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelEditViewController.swift; sourceTree = ""; }; 6FDB3C3A21DCF47400A0C0BF /* TunnelDetailTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelDetailTableViewController.swift; sourceTree = ""; }; @@ -574,7 +574,7 @@ 6FBA104521D7EBFA0051C35F /* TunnelsListTableViewController.swift */, 6F4DD16D21DBEA0700690EAE /* ManageTunnelsRootViewController.swift */, 6FDB3C3A21DCF47400A0C0BF /* TunnelDetailTableViewController.swift */, - 6FCD99A821E0E0C700BA4C82 /* NoTunnelsDetailViewController.swift */, + 6FCD99A821E0E0C700BA4C82 /* ButtonedDetailViewController.swift */, 6FCD99B021E0EDA900BA4C82 /* TunnelEditViewController.swift */, ); path = ViewController; @@ -1177,7 +1177,7 @@ 6FB1BDC121D50F0200A991BF /* String+ArrayConversion.swift in Sources */, 5F52D0BB21E3781B00283CEA /* ConfTextView.swift in Sources */, 6FBA104021D6B7040051C35F /* ErrorPresenterProtocol.swift in Sources */, - 6FCD99AA21E0E14700BA4C82 /* NoTunnelsDetailViewController.swift in Sources */, + 6FCD99AA21E0E14700BA4C82 /* ButtonedDetailViewController.swift in Sources */, 6FB1BDC321D50F0300A991BF /* TunnelConfiguration.swift in Sources */, 6FB1BDC421D50F0300A991BF /* IPAddressRange.swift in Sources */, 6FBA104321D6BC250051C35F /* ErrorPresenter.swift in Sources */, diff --git a/WireGuard/WireGuard/UI/macOS/ViewController/ButtonedDetailViewController.swift b/WireGuard/WireGuard/UI/macOS/ViewController/ButtonedDetailViewController.swift new file mode 100644 index 0000000..defa09f --- /dev/null +++ b/WireGuard/WireGuard/UI/macOS/ViewController/ButtonedDetailViewController.swift @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved. + +import Cocoa + +class ButtonedDetailViewController: NSViewController { + + var onButtonClicked: (() -> Void)? + + let button: NSButton = { + let button = NSButton() + button.title = "" + button.setButtonType(.momentaryPushIn) + button.bezelStyle = .rounded + return button + }() + + init() { + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func loadView() { + let view = NSView() + + button.target = self + button.action = #selector(buttonClicked) + + view.addSubview(button) + button.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + button.centerXAnchor.constraint(equalTo: view.centerXAnchor), + button.centerYAnchor.constraint(equalTo: view.centerYAnchor) + ]) + self.view = view + } + + func setButtonTitle(_ title: String) { + button.title = title + } + + @objc func buttonClicked() { + onButtonClicked?() + } +} diff --git a/WireGuard/WireGuard/UI/macOS/ViewController/ManageTunnelsRootViewController.swift b/WireGuard/WireGuard/UI/macOS/ViewController/ManageTunnelsRootViewController.swift index 8d28157..5806547 100644 --- a/WireGuard/WireGuard/UI/macOS/ViewController/ManageTunnelsRootViewController.swift +++ b/WireGuard/WireGuard/UI/macOS/ViewController/ManageTunnelsRootViewController.swift @@ -84,7 +84,12 @@ extension ManageTunnelsRootViewController: TunnelsListTableViewControllerDelegat } func tunnelsListEmpty() { - let noTunnelsVC = NoTunnelsDetailViewController(tunnelsManager: tunnelsManager) + let noTunnelsVC = ButtonedDetailViewController() + noTunnelsVC.setButtonTitle(tr("macButtonImportTunnels")) + noTunnelsVC.onButtonClicked = { [weak self] in + guard let self = self else { return } + ImportPanelPresenter.presentImportPanel(tunnelsManager: self.tunnelsManager, sourceVC: self) + } setTunnelDetailContentVC(noTunnelsVC) self.tunnelDetailVC = nil } diff --git a/WireGuard/WireGuard/UI/macOS/ViewController/NoTunnelsDetailViewController.swift b/WireGuard/WireGuard/UI/macOS/ViewController/NoTunnelsDetailViewController.swift deleted file mode 100644 index 49f6197..0000000 --- a/WireGuard/WireGuard/UI/macOS/ViewController/NoTunnelsDetailViewController.swift +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved. - -import Cocoa - -class NoTunnelsDetailViewController: NSViewController { - - let tunnelsManager: TunnelsManager - - let importButton: NSButton = { - let button = NSButton() - button.title = tr("macButtonImportTunnels") - button.setButtonType(.momentaryPushIn) - button.bezelStyle = .rounded - return button - }() - - init(tunnelsManager: TunnelsManager) { - self.tunnelsManager = tunnelsManager - super.init(nibName: nil, bundle: nil) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func loadView() { - let view = NSView() - - importButton.target = self - importButton.action = #selector(importTunnelClicked) - - view.addSubview(importButton) - importButton.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - importButton.centerXAnchor.constraint(equalTo: view.centerXAnchor), - importButton.centerYAnchor.constraint(equalTo: view.centerYAnchor) - ]) - self.view = view - } - - @objc func importTunnelClicked() { - // We pass sourceVC as parent instead of self because this VC will not be visible when the import completes - ImportPanelPresenter.presentImportPanel(tunnelsManager: tunnelsManager, sourceVC: parent) - } -}