diff options
Diffstat (limited to '')
3 files changed, 148 insertions, 7 deletions
diff --git a/WireGuard/WireGuard/UI/macOS/View/KeyValueRow.swift b/WireGuard/WireGuard/UI/macOS/View/KeyValueRow.swift index 4e9fa7d..cdf682c 100644 --- a/WireGuard/WireGuard/UI/macOS/View/KeyValueRow.swift +++ b/WireGuard/WireGuard/UI/macOS/View/KeyValueRow.swift @@ -3,7 +3,7 @@ import Cocoa -class KeyValueRow: NSView { +class EditableKeyValueRow: NSView { let keyLabel: NSTextField = { let keyLabel = NSTextField() keyLabel.isEditable = false @@ -18,12 +18,9 @@ class KeyValueRow: NSView { let valueLabel: NSTextField = { let valueLabel = NSTextField() - valueLabel.isEditable = false valueLabel.isSelectable = true - valueLabel.isBordered = false valueLabel.maximumNumberOfLines = 1 valueLabel.lineBreakMode = .byTruncatingTail - valueLabel.backgroundColor = .clear return valueLabel }() @@ -46,6 +43,11 @@ class KeyValueRow: NSView { } } + override var intrinsicContentSize: NSSize { + let height = max(keyLabel.intrinsicContentSize.height, valueLabel.intrinsicContentSize.height) + return NSSize(width: NSView.noIntrinsicMetric, height: height) + } + init() { super.init(frame: CGRect.zero) @@ -74,3 +76,16 @@ class KeyValueRow: NSView { isKeyInBold = false } } + +class KeyValueRow: EditableKeyValueRow { + override init() { + super.init() + valueLabel.isEditable = false + valueLabel.isBordered = false + valueLabel.backgroundColor = .clear + } + + required init?(coder decoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/WireGuard/WireGuard/UI/macOS/ViewController/TunnelDetailTableViewController.swift b/WireGuard/WireGuard/UI/macOS/ViewController/TunnelDetailTableViewController.swift index 8e7db43..9e84e12 100644 --- a/WireGuard/WireGuard/UI/macOS/ViewController/TunnelDetailTableViewController.swift +++ b/WireGuard/WireGuard/UI/macOS/ViewController/TunnelDetailTableViewController.swift @@ -191,7 +191,8 @@ class TunnelDetailTableViewController: NSViewController { } @objc func editButtonClicked() { - print("editButtonClicked") + let tunnelEditVC = TunnelEditViewController(tunnelsManager: tunnelsManager, tunnel: tunnel) + presentAsSheet(tunnelEditVC) } @objc func statusCheckboxToggled(sender: AnyObject?) { @@ -217,14 +218,14 @@ extension TunnelDetailTableViewController: NSTableViewDelegate { case .interfaceFieldRow(let field): let cell: KeyValueRow = tableView.dequeueReusableCell() let localizedKeyString = modelRow.isTitleRow() ? modelRow.localizedSectionKeyString() : field.localizedUIString - cell.key = tr(format: "macDetailFieldKey (%@)", localizedKeyString) + cell.key = tr(format: "macFieldKey (%@)", localizedKeyString) cell.value = tunnelViewModel.interfaceData[field] cell.isKeyInBold = modelRow.isTitleRow() return cell case .peerFieldRow(let peerData, let field): let cell: KeyValueRow = tableView.dequeueReusableCell() let localizedKeyString = modelRow.isTitleRow() ? modelRow.localizedSectionKeyString() : field.localizedUIString - cell.key = tr(format: "macDetailFieldKey (%@)", localizedKeyString) + cell.key = tr(format: "macFieldKey (%@)", localizedKeyString) cell.value = peerData[field] cell.isKeyInBold = modelRow.isTitleRow() return cell diff --git a/WireGuard/WireGuard/UI/macOS/ViewController/TunnelEditViewController.swift b/WireGuard/WireGuard/UI/macOS/ViewController/TunnelEditViewController.swift new file mode 100644 index 0000000..52b80f6 --- /dev/null +++ b/WireGuard/WireGuard/UI/macOS/ViewController/TunnelEditViewController.swift @@ -0,0 +1,125 @@ +// SPDX-License-Identifier: MIT +// Copyright © 2018 WireGuard LLC. All Rights Reserved. + +import Cocoa + +class TunnelEditViewController: NSViewController { + + let nameRow: EditableKeyValueRow = { + let nameRow = EditableKeyValueRow() + nameRow.key = tr(format: "macFieldKey (%@)", TunnelViewModel.InterfaceField.name.localizedUIString) + return nameRow + }() + + let publicKeyRow: KeyValueRow = { + let publicKeyRow = KeyValueRow() + publicKeyRow.key = tr(format: "macFieldKey (%@)", TunnelViewModel.InterfaceField.publicKey.localizedUIString) + return publicKeyRow + }() + + let textView: NSTextView = { + let textView = NSTextView() + let minWidth: CGFloat = 120 + let minHeight: CGFloat = 60 + textView.minSize = NSSize(width: 0, height: minHeight) + textView.maxSize = NSSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude) + textView.autoresizingMask = .width + textView.isHorizontallyResizable = true + if let textContainer = textView.textContainer { + textContainer.size = NSSize(width: minWidth, height: CGFloat.greatestFiniteMagnitude) + textContainer.widthTracksTextView = true + } + NSLayoutConstraint.activate([ + textView.widthAnchor.constraint(greaterThanOrEqualToConstant: minWidth), + textView.heightAnchor.constraint(greaterThanOrEqualToConstant: minHeight) + ]) + return textView + }() + + let scrollView: NSScrollView = { + let scrollView = NSScrollView() + scrollView.hasVerticalScroller = true + scrollView.borderType = .bezelBorder + return scrollView + }() + + let discardButton: NSButton = { + let button = NSButton() + button.title = tr("macEditDiscard") + button.setButtonType(.momentaryPushIn) + button.bezelStyle = .rounded + return button + }() + + let saveButton: NSButton = { + let button = NSButton() + button.title = tr("macEditSave") + button.setButtonType(.momentaryPushIn) + button.bezelStyle = .rounded + return button + }() + + let tunnelsManager: TunnelsManager + let tunnel: TunnelContainer? + + init(tunnelsManager: TunnelsManager, tunnel: TunnelContainer?) { + self.tunnelsManager = tunnelsManager + self.tunnel = tunnel + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func loadView() { + if let tunnel = tunnel, let tunnelConfiguration = tunnel.tunnelConfiguration { + nameRow.value = tunnel.name + publicKeyRow.value = tunnelConfiguration.interface.publicKey.base64EncodedString() + textView.string = tunnelConfiguration.asWgQuickConfig() + } + + scrollView.documentView = textView + + saveButton.target = self + saveButton.action = #selector(saveButtonClicked) + + discardButton.target = self + discardButton.action = #selector(discardButtonClicked) + + let margin: CGFloat = 20 + let internalSpacing: CGFloat = 10 + + let editorStackView = NSStackView(views: [nameRow, publicKeyRow, scrollView]) + editorStackView.orientation = .vertical + editorStackView.setHuggingPriority(.defaultHigh, for: .horizontal) + editorStackView.spacing = internalSpacing + + let buttonRowStackView = NSStackView() + buttonRowStackView.setViews([discardButton, saveButton], in: .trailing) + buttonRowStackView.orientation = .horizontal + buttonRowStackView.spacing = internalSpacing + + let containerView = NSStackView(views: [editorStackView, buttonRowStackView]) + containerView.orientation = .vertical + containerView.edgeInsets = NSEdgeInsets(top: margin, left: margin, bottom: margin, right: margin) + containerView.setHuggingPriority(.defaultHigh, for: .horizontal) + containerView.spacing = internalSpacing + + NSLayoutConstraint.activate([ + containerView.widthAnchor.constraint(greaterThanOrEqualToConstant: 180), + containerView.heightAnchor.constraint(greaterThanOrEqualToConstant: 240) + ]) + containerView.frame = NSRect(x: 0, y: 0, width: 480, height: 320) + + self.view = containerView + } + + @objc func saveButtonClicked() { + print("saveButtonClicked") + } + + @objc func discardButtonClicked() { + dismiss(self) + } +} |