macOS: Edit view: Update public key as you edit

Signed-off-by: Roopesh Chander <roop@roopc.net>
This commit is contained in:
Roopesh Chander 2019-01-09 00:41:36 +05:30
parent bbeb732ef3
commit 80977b95de
3 changed files with 25 additions and 2 deletions

View File

@ -27,6 +27,7 @@ class ConfTextStorage: NSTextStorage {
private let backingStore: NSMutableAttributedString
private(set) var hasError = false
private(set) var privateKeyString: String?
override init() {
backingStore = NSMutableAttributedString(string: "")
@ -129,6 +130,7 @@ class ConfTextStorage: NSTextStorage {
func highlightSyntax() {
hasError = false
privateKeyString = nil
backingStore.beginEditing()
var spans = highlight_config(backingStore.string.cString(using: String.Encoding.utf8))!
@ -143,6 +145,10 @@ class ConfTextStorage: NSTextStorage {
hasError = true
}
if span.type == HighlightPrivateKey {
privateKeyString = backingStore.attributedSubstring(from: NSRange(location: span.start, length: span.len)).string
}
spans = spans.successor()
}
backingStore.endEditing()

View File

@ -8,6 +8,7 @@ class ConfTextView: NSTextView {
private let confTextStorage = ConfTextStorage()
var hasError: Bool { return confTextStorage.hasError }
@objc dynamic var privateKeyString: String?
override var string: String {
didSet {
@ -51,6 +52,9 @@ extension ConfTextView: NSTextViewDelegate {
func textDidChange(_ notification: Notification) {
confTextStorage.highlightSyntax()
if privateKeyString != confTextStorage.privateKeyString {
privateKeyString = confTextStorage.privateKeyString
}
needsDisplay = true
}

View File

@ -17,7 +17,7 @@ class TunnelEditViewController: NSViewController {
return publicKeyRow
}()
let textView: NSTextView = {
let textView: ConfTextView = {
let textView = ConfTextView()
let minWidth: CGFloat = 120
let minHeight: CGFloat = 60
@ -62,6 +62,8 @@ class TunnelEditViewController: NSViewController {
let tunnelsManager: TunnelsManager
let tunnel: TunnelContainer?
var textViewObservationToken: AnyObject?
init(tunnelsManager: TunnelsManager, tunnel: TunnelContainer?) {
self.tunnelsManager = tunnelsManager
self.tunnel = tunnel
@ -75,8 +77,19 @@ class TunnelEditViewController: NSViewController {
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()
publicKeyRow.value = tunnelConfiguration.interface.publicKey.base64EncodedString()
textView.privateKeyString = tunnelConfiguration.interface.privateKey.base64EncodedString()
textViewObservationToken = textView.observe(\.privateKeyString) { [weak publicKeyRow] textView, _ in
if let privateKeyString = textView.privateKeyString,
let privateKey = Data(base64Encoded: privateKeyString),
privateKey.count == TunnelConfiguration.keyLength {
let publicKey = Curve25519.generatePublicKey(fromPrivateKey: privateKey)
publicKeyRow?.value = publicKey.base64EncodedString()
} else {
publicKeyRow?.value = ""
}
}
}
scrollView.documentView = textView