aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoopesh Chander <roop@roopc.net>2021-07-30 11:04:38 +0530
committerRoopesh Chander <roop@roopc.net>2021-07-30 13:29:33 +0530
commit2ac17da7cb1441ffb72d231bdfd44b8fc49df035 (patch)
tree495d065f5f515b677ceafeb27f7cbffbe5c1c085
parentUI: macOS: Tunnel detail: Incorporate on-demand-ness in the status row (diff)
downloadwireguard-apple-2ac17da7cb1441ffb72d231bdfd44b8fc49df035.tar.xz
wireguard-apple-2ac17da7cb1441ffb72d231bdfd44b8fc49df035.zip
UI: macOS: Tunnel detail: Incorporate on-demand-ness in toggle button
Signed-off-by: Roopesh Chander <roop@roopc.net>
-rw-r--r--Sources/WireGuardApp/Base.lproj/Localizable.strings3
-rw-r--r--Sources/WireGuardApp/UI/macOS/View/ButtonRow.swift8
-rw-r--r--Sources/WireGuardApp/UI/macOS/ViewController/TunnelDetailTableViewController.swift75
3 files changed, 59 insertions, 27 deletions
diff --git a/Sources/WireGuardApp/Base.lproj/Localizable.strings b/Sources/WireGuardApp/Base.lproj/Localizable.strings
index f40c275..3c52266 100644
--- a/Sources/WireGuardApp/Base.lproj/Localizable.strings
+++ b/Sources/WireGuardApp/Base.lproj/Localizable.strings
@@ -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";
diff --git a/Sources/WireGuardApp/UI/macOS/View/ButtonRow.swift b/Sources/WireGuardApp/UI/macOS/View/ButtonRow.swift
index 1c04767..2165f1f 100644
--- a/Sources/WireGuardApp/UI/macOS/View/ButtonRow.swift
+++ b/Sources/WireGuardApp/UI/macOS/View/ButtonRow.swift
@@ -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
}
}
diff --git a/Sources/WireGuardApp/UI/macOS/ViewController/TunnelDetailTableViewController.swift b/Sources/WireGuardApp/UI/macOS/ViewController/TunnelDetailTableViewController.swift
index e55cf8b..03cecf7 100644
--- a/Sources/WireGuardApp/UI/macOS/ViewController/TunnelDetailTableViewController.swift
+++ b/Sources/WireGuardApp/UI/macOS/ViewController/TunnelDetailTableViewController.swift
@@ -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")
+ }
}
}
}