]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
UI: macOS: Incorporate on-demand-ness in status menu
authorRoopesh Chander <roop@roopc.net>
Fri, 30 Jul 2021 07:56:56 +0000 (13:26 +0530)
committerRoopesh Chander <roop@roopc.net>
Fri, 30 Jul 2021 07:59:38 +0000 (13:29 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
Sources/WireGuardApp/UI/macOS/StatusMenu.swift

index 7076330e67edacc4b0a3262c2796fa1fb3b63cc9..79d0cbc0fe10ca3b6216d7fa4debea173dee0706 100644 (file)
@@ -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
+        }
     }
 }