]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
UI: macOS: Tunnel detail: Incorporate on-demand-ness in the status row
authorRoopesh Chander <roop@roopc.net>
Thu, 29 Jul 2021 10:27:04 +0000 (15:57 +0530)
committerRoopesh Chander <roop@roopc.net>
Fri, 30 Jul 2021 07:59:28 +0000 (13:29 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
Sources/WireGuardApp/Base.lproj/Localizable.strings
Sources/WireGuardApp/UI/macOS/View/KeyValueRow.swift
Sources/WireGuardApp/UI/macOS/ViewController/TunnelDetailTableViewController.swift

index 2974ba7b4a24af8b61dbe75b9efcad7c162631de..f40c275b901caf2a5d9859327c7d9a109c2dc511 100644 (file)
@@ -58,6 +58,8 @@
 
 "tunnelStatusAddendumOnDemand" = " (On Demand)";
 "tunnelStatusOnDemandDisabled" = "On Demand Disabled";
+"tunnelStatusAddendumOnDemandEnabled" = ", On Demand Enabled";
+"tunnelStatusAddendumOnDemandDisabled" = ", On Demand Disabled";
 
 "macToggleStatusButtonActivate" = "Activate";
 "macToggleStatusButtonActivating" = "Activating…";
index 68c3e82736e39c2f19dade9dfd3ac841859b685b..805ea890977083739097f943b43cc73ea809f481 100644 (file)
@@ -49,7 +49,9 @@ class EditableKeyValueRow: NSView {
         set(value) { valueImageView?.image = value }
     }
 
-    var observationToken: AnyObject?
+    var statusObservationToken: AnyObject?
+    var isOnDemandEnabledObservationToken: AnyObject?
+    var hasOnDemandRulesObservationToken: AnyObject?
 
     override var intrinsicContentSize: NSSize {
         let height = max(keyLabel.intrinsicContentSize.height, valueLabel.intrinsicContentSize.height)
@@ -108,7 +110,9 @@ class EditableKeyValueRow: NSView {
         key = ""
         value = ""
         isKeyInBold = false
-        observationToken = nil
+        statusObservationToken = nil
+        isOnDemandEnabledObservationToken = nil
+        hasOnDemandRulesObservationToken = nil
     }
 }
 
index 0c44086ca4a6bb9b476338fa8104858744e0377a..e55cf8bbc197cac43495b6ff5d5ba5b56c24ca17 100644 (file)
@@ -422,13 +422,16 @@ extension TunnelDetailTableViewController: NSTableViewDelegate {
     func statusCell() -> NSView {
         let cell: KeyValueImageRow = tableView.dequeueReusableCell()
         cell.key = tr(format: "macFieldKey (%@)", tr("tunnelInterfaceStatus"))
-        cell.value = TunnelDetailTableViewController.localizedStatusDescription(forStatus: tunnel.status)
-        cell.valueImage = TunnelDetailTableViewController.image(forStatus: tunnel.status)
-        cell.observationToken = tunnel.observe(\.status) { [weak cell] tunnel, _ in
+        cell.value = TunnelDetailTableViewController.localizedStatusDescription(for: tunnel)
+        cell.valueImage = TunnelDetailTableViewController.image(for: tunnel)
+        let changeHandler: (TunnelContainer, Any) -> Void = { [weak cell] tunnel, _ in
             guard let cell = cell else { return }
-            cell.value = TunnelDetailTableViewController.localizedStatusDescription(forStatus: tunnel.status)
-            cell.valueImage = TunnelDetailTableViewController.image(forStatus: tunnel.status)
+            cell.value = TunnelDetailTableViewController.localizedStatusDescription(for: tunnel)
+            cell.valueImage = TunnelDetailTableViewController.image(for: tunnel)
         }
+        cell.statusObservationToken = tunnel.observe(\.status, changeHandler: changeHandler)
+        cell.isOnDemandEnabledObservationToken = tunnel.observe(\.isActivateOnDemandEnabled, changeHandler: changeHandler)
+        cell.hasOnDemandRulesObservationToken = tunnel.observe(\.hasOnDemandRules, changeHandler: changeHandler)
         return cell
     }
 
@@ -448,34 +451,49 @@ extension TunnelDetailTableViewController: NSTableViewDelegate {
         return cell
     }
 
-    private static func localizedStatusDescription(forStatus status: TunnelStatus) -> String {
+    private static func localizedStatusDescription(for tunnel: TunnelContainer) -> String {
+        let status = tunnel.status
+        let isOnDemandEngaged = tunnel.isActivateOnDemandEnabled
+
+        var text: String
         switch status {
         case .inactive:
-            return tr("tunnelStatusInactive")
+            text = tr("tunnelStatusInactive")
         case .activating:
-            return tr("tunnelStatusActivating")
+            text = tr("tunnelStatusActivating")
         case .active:
-            return tr("tunnelStatusActive")
+            text = tr("tunnelStatusActive")
         case .deactivating:
-            return tr("tunnelStatusDeactivating")
+            text = tr("tunnelStatusDeactivating")
         case .reasserting:
-            return tr("tunnelStatusReasserting")
+            text = tr("tunnelStatusReasserting")
         case .restarting:
-            return tr("tunnelStatusRestarting")
+            text = tr("tunnelStatusRestarting")
         case .waiting:
-            return tr("tunnelStatusWaiting")
+            text = tr("tunnelStatusWaiting")
+        }
+
+        if tunnel.hasOnDemandRules {
+            text += isOnDemandEngaged ?
+                tr("tunnelStatusAddendumOnDemandEnabled") : tr("tunnelStatusAddendumOnDemandDisabled")
         }
+
+        return text
     }
 
-    private static func image(forStatus status: TunnelStatus?) -> NSImage? {
-        guard let status = status else { return nil }
-        switch status {
+    private static func image(for tunnel: TunnelContainer?) -> NSImage? {
+        guard let tunnel = tunnel else { return nil }
+        switch tunnel.status {
         case .active, .restarting, .reasserting:
             return NSImage(named: NSImage.statusAvailableName)
         case .activating, .waiting, .deactivating:
             return NSImage(named: NSImage.statusPartiallyAvailableName)
         case .inactive:
-            return NSImage(named: NSImage.statusNoneName)
+            if tunnel.isActivateOnDemandEnabled {
+                return NSImage(named: NSImage.Name.statusOnDemandEnabled)
+            } else {
+                return NSImage(named: NSImage.statusNoneName)
+            }
         }
     }