diff --git a/WireGuard/WireGuard/UI/macOS/View/ConfTextStorage.swift b/WireGuard/WireGuard/UI/macOS/View/ConfTextStorage.swift index 2219759..6da5c98 100644 --- a/WireGuard/WireGuard/UI/macOS/View/ConfTextStorage.swift +++ b/WireGuard/WireGuard/UI/macOS/View/ConfTextStorage.swift @@ -19,6 +19,7 @@ class ConfTextStorage: NSTextStorage { private(set) var hasOnePeer: Bool = false private(set) var lastOnePeerAllowedIPs = [String]() private(set) var lastOnePeerDNSServers = [String]() + private(set) var lastOnePeerHasPublicKey = false override init() { backingStore = NSMutableAttributedString(string: "") @@ -88,6 +89,7 @@ class ConfTextStorage: NSTextStorage { hasOnePeer = false lastOnePeerAllowedIPs = [] lastOnePeerDNSServers = [] + lastOnePeerHasPublicKey = false } func evaluateExcludePrivateIPs(highlightSpans: UnsafePointer) { @@ -125,6 +127,8 @@ class ConfTextStorage: NSTextStorage { backingStore.attributedSubstring(from: NSRange(location: nextnext.pointee.start, length: nextnext.pointee.len)).string } lastOnePeerAllowedIPs.append(substring) + } else if span.type == HighlightPublicKey { + lastOnePeerHasPublicKey = true } spans = spans.successor() } diff --git a/WireGuard/WireGuard/UI/macOS/View/ConfTextView.swift b/WireGuard/WireGuard/UI/macOS/View/ConfTextView.swift index 2ea8f84..6016e08 100644 --- a/WireGuard/WireGuard/UI/macOS/View/ConfTextView.swift +++ b/WireGuard/WireGuard/UI/macOS/View/ConfTextView.swift @@ -14,6 +14,7 @@ class ConfTextView: NSTextView { override var string: String { didSet { confTextStorage.highlightSyntax() + updateConfigData() } } @@ -53,6 +54,21 @@ class ConfTextView: NSTextView { } } + private func updateConfigData() { + if hasError != confTextStorage.hasError { + hasError = confTextStorage.hasError + } + if privateKeyString != confTextStorage.privateKeyString { + privateKeyString = confTextStorage.privateKeyString + } + let hasSyntaxError = confTextStorage.hasError + let hasSemanticError = confTextStorage.privateKeyString == nil || !confTextStorage.lastOnePeerHasPublicKey + let updatedSinglePeerAllowedIPs = confTextStorage.hasOnePeer && !hasSyntaxError && !hasSemanticError ? confTextStorage.lastOnePeerAllowedIPs : nil + if singlePeerAllowedIPs != updatedSinglePeerAllowedIPs { + singlePeerAllowedIPs = updatedSinglePeerAllowedIPs + } + } + func setConfText(_ text: String) { let fullTextRange = NSRange(location: 0, length: (string as NSString).length) if shouldChangeText(in: fullTextRange, replacementString: text) { @@ -66,16 +82,7 @@ extension ConfTextView: NSTextViewDelegate { func textDidChange(_ notification: Notification) { confTextStorage.highlightSyntax() - if hasError != confTextStorage.hasError { - hasError = confTextStorage.hasError - } - if privateKeyString != confTextStorage.privateKeyString { - privateKeyString = confTextStorage.privateKeyString - } - let updatedSinglePeerAllowedIPs = confTextStorage.hasOnePeer && !confTextStorage.hasError ? confTextStorage.lastOnePeerAllowedIPs : nil - if singlePeerAllowedIPs != updatedSinglePeerAllowedIPs { - singlePeerAllowedIPs = updatedSinglePeerAllowedIPs - } + updateConfigData() needsDisplay = true }