]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
UI: macOS: Tunnel detail: Incorporate on-demand-ness in toggle button
authorRoopesh Chander <roop@roopc.net>
Fri, 30 Jul 2021 05:34:38 +0000 (11:04 +0530)
committerRoopesh Chander <roop@roopc.net>
Fri, 30 Jul 2021 07:59:33 +0000 (13:29 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
Sources/WireGuardApp/Base.lproj/Localizable.strings
Sources/WireGuardApp/UI/macOS/View/ButtonRow.swift
Sources/WireGuardApp/UI/macOS/ViewController/TunnelDetailTableViewController.swift

index f40c275b901caf2a5d9859327c7d9a109c2dc511..3c52266ddf9df4d128ac5bf3826fdc37021d11b6 100644 (file)
@@ -68,6 +68,9 @@
 "macToggleStatusButtonReasserting" = "Reactivating…";
 "macToggleStatusButtonRestarting" = "Restarting…";
 "macToggleStatusButtonWaiting" = "Waiting…";
+"macToggleStatusButtonEnableOnDemand" = "Enable On-Demand";
+"macToggleStatusButtonDisableOnDemand" = "Disable On-Demand";
+"macToggleStatusButtonDisableOnDemandDeactivate" = "Disable On-Demand and Deactivate";
 
 "tunnelSectionTitleInterface" = "Interface";
 
index 1c04767ed5bd121c8d161e24386b886d011b4d59..2165f1fd78f316802072e0b3d4e6f58d54c8b1e2 100644 (file)
@@ -28,7 +28,9 @@ class ButtonRow: NSView {
     }
 
     var onButtonClicked: (() -> Void)?
-    var observationToken: AnyObject?
+    var statusObservationToken: AnyObject?
+    var isOnDemandEnabledObservationToken: AnyObject?
+    var hasOnDemandRulesObservationToken: AnyObject?
 
     override var intrinsicContentSize: NSSize {
         return NSSize(width: NSView.noIntrinsicMetric, height: button.intrinsicContentSize.height)
@@ -62,6 +64,8 @@ class ButtonRow: NSView {
         buttonTitle = ""
         buttonToolTip = ""
         onButtonClicked = nil
-        observationToken = nil
+        statusObservationToken = nil
+        isOnDemandEnabledObservationToken = nil
+        hasOnDemandRulesObservationToken = nil
     }
 }
index e55cf8bbc197cac43495b6ff5d5ba5b56c24ca17..03cecf7b4b0980215d60456e41d500bd9d85e030 100644 (file)
@@ -216,10 +216,19 @@ class TunnelDetailTableViewController: NSViewController {
     }
 
     @objc func handleToggleActiveStatusAction() {
-        if tunnel.status == .inactive {
-            tunnelsManager.startActivation(of: tunnel)
-        } else if tunnel.status == .active {
-            tunnelsManager.startDeactivation(of: tunnel)
+        if self.tunnel.hasOnDemandRules {
+            let turnOn = !self.tunnel.isActivateOnDemandEnabled
+            self.tunnelsManager.setOnDemandEnabled(turnOn, on: self.tunnel) { error in
+                if error == nil && !turnOn {
+                    self.tunnelsManager.startDeactivation(of: self.tunnel)
+                }
+            }
+        } else {
+            if tunnel.status == .inactive {
+                tunnelsManager.startActivation(of: tunnel)
+            } else if tunnel.status == .active {
+                tunnelsManager.startDeactivation(of: tunnel)
+            }
         }
     }
 
@@ -437,17 +446,20 @@ extension TunnelDetailTableViewController: NSTableViewDelegate {
 
     func toggleStatusCell() -> NSView {
         let cell: ButtonRow = tableView.dequeueReusableCell()
-        cell.buttonTitle = TunnelDetailTableViewController.localizedToggleStatusActionText(forStatus: tunnel.status)
-        cell.isButtonEnabled = (tunnel.status == .active || tunnel.status == .inactive)
+        cell.buttonTitle = TunnelDetailTableViewController.localizedToggleStatusActionText(for: tunnel)
+        cell.isButtonEnabled = (tunnel.hasOnDemandRules || tunnel.status == .active || tunnel.status == .inactive)
         cell.buttonToolTip = tr("macToolTipToggleStatus")
         cell.onButtonClicked = { [weak self] in
             self?.handleToggleActiveStatusAction()
         }
-        cell.observationToken = tunnel.observe(\.status) { [weak cell] tunnel, _ in
+        let changeHandler: (TunnelContainer, Any) -> Void = { [weak cell] tunnel, _ in
             guard let cell = cell else { return }
-            cell.buttonTitle = TunnelDetailTableViewController.localizedToggleStatusActionText(forStatus: tunnel.status)
-            cell.isButtonEnabled = (tunnel.status == .active || tunnel.status == .inactive)
+            cell.buttonTitle = TunnelDetailTableViewController.localizedToggleStatusActionText(for: tunnel)
+            cell.isButtonEnabled = (tunnel.hasOnDemandRules || tunnel.status == .active || tunnel.status == .inactive)
         }
+        cell.statusObservationToken = tunnel.observe(\.status, changeHandler: changeHandler)
+        cell.isOnDemandEnabledObservationToken = tunnel.observe(\.isActivateOnDemandEnabled, changeHandler: changeHandler)
+        cell.hasOnDemandRulesObservationToken = tunnel.observe(\.hasOnDemandRules, changeHandler: changeHandler)
         return cell
     }
 
@@ -497,22 +509,35 @@ extension TunnelDetailTableViewController: NSTableViewDelegate {
         }
     }
 
-    private static func localizedToggleStatusActionText(forStatus status: TunnelStatus) -> String {
-        switch status {
-        case .waiting:
-            return tr("macToggleStatusButtonWaiting")
-        case .inactive:
-            return tr("macToggleStatusButtonActivate")
-        case .activating:
-            return tr("macToggleStatusButtonActivating")
-        case .active:
-            return tr("macToggleStatusButtonDeactivate")
-        case .deactivating:
-            return tr("macToggleStatusButtonDeactivating")
-        case .reasserting:
-            return tr("macToggleStatusButtonReasserting")
-        case .restarting:
-            return tr("macToggleStatusButtonRestarting")
+    private static func localizedToggleStatusActionText(for tunnel: TunnelContainer) -> String {
+        if tunnel.hasOnDemandRules {
+            let turnOn = !tunnel.isActivateOnDemandEnabled
+            if turnOn {
+                return tr("macToggleStatusButtonEnableOnDemand")
+            } else {
+                if tunnel.status == .active {
+                    return tr("macToggleStatusButtonDisableOnDemandDeactivate")
+                } else {
+                    return tr("macToggleStatusButtonDisableOnDemand")
+                }
+            }
+        } else {
+            switch tunnel.status {
+            case .waiting:
+                return tr("macToggleStatusButtonWaiting")
+            case .inactive:
+                return tr("macToggleStatusButtonActivate")
+            case .activating:
+                return tr("macToggleStatusButtonActivating")
+            case .active:
+                return tr("macToggleStatusButtonDeactivate")
+            case .deactivating:
+                return tr("macToggleStatusButtonDeactivating")
+            case .reasserting:
+                return tr("macToggleStatusButtonReasserting")
+            case .restarting:
+                return tr("macToggleStatusButtonRestarting")
+            }
         }
     }
 }