diff options
author | Eric Kuck <eric@bluelinelabs.com> | 2018-12-14 17:27:11 -0600 |
---|---|---|
committer | Eric Kuck <eric@bluelinelabs.com> | 2018-12-14 17:27:11 -0600 |
commit | cb051f695db44e7a52e3f423fa27de00c493a9ac (patch) | |
tree | 64b583809b17825a0660211f7f381dfc892ccf61 /WireGuard/WireGuard/UI/iOS/TunnelList/TunnelListCell.swift | |
parent | Most similar views now shared between ViewControllers (diff) | |
download | wireguard-apple-cb051f695db44e7a52e3f423fa27de00c493a9ac.tar.xz wireguard-apple-cb051f695db44e7a52e3f423fa27de00c493a9ac.zip |
Reorganized project structure
Signed-off-by: Eric Kuck <eric@bluelinelabs.com>
Diffstat (limited to 'WireGuard/WireGuard/UI/iOS/TunnelList/TunnelListCell.swift')
-rw-r--r-- | WireGuard/WireGuard/UI/iOS/TunnelList/TunnelListCell.swift | 111 |
1 files changed, 0 insertions, 111 deletions
diff --git a/WireGuard/WireGuard/UI/iOS/TunnelList/TunnelListCell.swift b/WireGuard/WireGuard/UI/iOS/TunnelList/TunnelListCell.swift deleted file mode 100644 index 14a7194..0000000 --- a/WireGuard/WireGuard/UI/iOS/TunnelList/TunnelListCell.swift +++ /dev/null @@ -1,111 +0,0 @@ -// SPDX-License-Identifier: MIT -// Copyright © 2018 WireGuard LLC. All Rights Reserved. - -import UIKit - -class TunnelListCell: UITableViewCell { - var tunnel: TunnelContainer? { - didSet(value) { - // Bind to the tunnel's name - nameLabel.text = tunnel?.name ?? "" - nameObservervationToken = tunnel?.observe(\.name) { [weak self] tunnel, _ in - self?.nameLabel.text = tunnel.name - } - // Bind to the tunnel's status - update(from: tunnel?.status) - statusObservervationToken = tunnel?.observe(\.status) { [weak self] tunnel, _ in - self?.update(from: tunnel.status) - } - } - } - var onSwitchToggled: ((Bool) -> Void)? - - let nameLabel: UILabel = { - let nameLabel = UILabel() - nameLabel.font = UIFont.preferredFont(forTextStyle: .body) - nameLabel.adjustsFontForContentSizeCategory = true - nameLabel.numberOfLines = 0 - return nameLabel - }() - - let busyIndicator: UIActivityIndicatorView = { - let busyIndicator = UIActivityIndicatorView(style: .gray) - busyIndicator.hidesWhenStopped = true - return busyIndicator - }() - - let statusSwitch = UISwitch() - - private var statusObservervationToken: AnyObject? - private var nameObservervationToken: AnyObject? - - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - - contentView.addSubview(statusSwitch) - statusSwitch.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - statusSwitch.centerYAnchor.constraint(equalTo: contentView.centerYAnchor), - contentView.rightAnchor.constraint(equalTo: statusSwitch.rightAnchor) - ]) - - contentView.addSubview(busyIndicator) - busyIndicator.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - busyIndicator.centerYAnchor.constraint(equalTo: contentView.centerYAnchor), - statusSwitch.leftAnchor.constraint(equalToSystemSpacingAfter: busyIndicator.rightAnchor, multiplier: 1) - ]) - - contentView.addSubview(nameLabel) - nameLabel.translatesAutoresizingMaskIntoConstraints = false - nameLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) - let bottomAnchorConstraint = contentView.layoutMarginsGuide.bottomAnchor.constraint(equalToSystemSpacingBelow: nameLabel.bottomAnchor, multiplier: 1) - bottomAnchorConstraint.priority = .defaultLow - NSLayoutConstraint.activate([ - nameLabel.topAnchor.constraint(equalToSystemSpacingBelow: contentView.layoutMarginsGuide.topAnchor, multiplier: 1), - nameLabel.leftAnchor.constraint(equalToSystemSpacingAfter: contentView.layoutMarginsGuide.leftAnchor, multiplier: 1), - busyIndicator.leftAnchor.constraint(equalToSystemSpacingAfter: nameLabel.rightAnchor, multiplier: 1), - bottomAnchorConstraint - ]) - - accessoryType = .disclosureIndicator - - statusSwitch.addTarget(self, action: #selector(switchToggled), for: .valueChanged) - } - - @objc func switchToggled() { - onSwitchToggled?(statusSwitch.isOn) - } - - private func update(from status: TunnelStatus?) { - guard let status = status else { - reset() - return - } - DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(200)) { [weak statusSwitch, weak busyIndicator] in - guard let statusSwitch = statusSwitch, let busyIndicator = busyIndicator else { return } - statusSwitch.isOn = !(status == .deactivating || status == .inactive) - statusSwitch.isUserInteractionEnabled = (status == .inactive || status == .active) - if status == .inactive || status == .active { - busyIndicator.stopAnimating() - } else { - busyIndicator.startAnimating() - } - } - } - - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - private func reset() { - statusSwitch.isOn = false - statusSwitch.isUserInteractionEnabled = false - busyIndicator.stopAnimating() - } - - override func prepareForReuse() { - super.prepareForReuse() - reset() - } -} |