From b6831c1aca50f02be5de623e0e4dc6a3d2800d88 Mon Sep 17 00:00:00 2001 From: Roopesh Chander Date: Fri, 30 Jul 2021 13:26:56 +0530 Subject: UI: macOS: Incorporate on-demand-ness in status menu Signed-off-by: Roopesh Chander --- Sources/WireGuardApp/UI/macOS/StatusMenu.swift | 35 +++++++++++++++++++++----- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/Sources/WireGuardApp/UI/macOS/StatusMenu.swift b/Sources/WireGuardApp/UI/macOS/StatusMenu.swift index 7076330..79d0cbc 100644 --- a/Sources/WireGuardApp/UI/macOS/StatusMenu.swift +++ b/Sources/WireGuardApp/UI/macOS/StatusMenu.swift @@ -144,10 +144,20 @@ class StatusMenu: NSMenu { @objc func tunnelClicked(sender: AnyObject) { guard let tunnelMenuItem = sender as? TunnelMenuItem else { return } - if tunnelMenuItem.state == .off { - tunnelsManager.startActivation(of: tunnelMenuItem.tunnel) + let tunnel = tunnelMenuItem.tunnel + if tunnel.hasOnDemandRules { + let turnOn = !tunnel.isActivateOnDemandEnabled + tunnelsManager.setOnDemandEnabled(turnOn, on: tunnel) { error in + if error == nil && !turnOn { + self.tunnelsManager.startDeactivation(of: tunnel) + } + } } else { - tunnelsManager.startDeactivation(of: tunnelMenuItem.tunnel) + if tunnel.status == .inactive { + tunnelsManager.startActivation(of: tunnel) + } else if tunnel.status == .active { + tunnelsManager.startDeactivation(of: tunnel) + } } } @@ -291,6 +301,7 @@ class TunnelMenuItem: NSMenuItem { private var statusObservationToken: AnyObject? private var nameObservationToken: AnyObject? + private var isOnDemandEnabledObservationToken: AnyObject? init(tunnel: TunnelContainer, action selector: Selector?) { self.tunnel = tunnel @@ -303,7 +314,12 @@ class TunnelMenuItem: NSMenuItem { let nameObservationToken = tunnel.observe(\TunnelContainer.name) { [weak self] _, _ in self?.updateTitle() } + let isOnDemandEnabledObservationToken = tunnel.observe(\.isActivateOnDemandEnabled) { [weak self] _, _ in + self?.updateTitle() + self?.updateStatus() + } self.statusObservationToken = statusObservationToken + self.isOnDemandEnabledObservationToken = isOnDemandEnabledObservationToken self.nameObservationToken = nameObservationToken } @@ -312,12 +328,19 @@ class TunnelMenuItem: NSMenuItem { } func updateTitle() { - title = tunnel.name + if tunnel.isActivateOnDemandEnabled { + title = tunnel.name + " (On-Demand)" + } else { + title = tunnel.name + } } func updateStatus() { - let shouldShowCheckmark = (tunnel.status != .inactive && tunnel.status != .deactivating) - state = shouldShowCheckmark ? .on : .off + if tunnel.isActivateOnDemandEnabled { + state = (tunnel.status == .inactive || tunnel.status == .deactivating) ? .mixed : .on + } else { + state = (tunnel.status == .inactive || tunnel.status == .deactivating) ? .off : .on + } } } -- cgit v1.2.3-59-g8ed1b