2020-11-10 00:39:42 +00:00
|
|
|
//
|
|
|
|
// FastSwitchingAccountView.swift
|
|
|
|
// Tusker
|
|
|
|
//
|
|
|
|
// Created by Shadowfacts on 11/4/20.
|
|
|
|
// Copyright © 2020 Shadowfacts. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
import UIKit
|
2023-03-05 19:35:25 +00:00
|
|
|
import UserAccounts
|
2020-11-10 00:39:42 +00:00
|
|
|
|
|
|
|
class FastSwitchingAccountView: UIView {
|
|
|
|
|
2023-01-16 16:24:42 +00:00
|
|
|
private lazy var selectedColor = UIColor { [unowned self] (traits) in
|
|
|
|
var hue: CGFloat = 0
|
|
|
|
var saturation: CGFloat = 0
|
|
|
|
var brightness: CGFloat = 0
|
|
|
|
var alpha: CGFloat = 0
|
|
|
|
self.tintColor.resolvedColor(with: traits).getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
|
|
|
|
brightness = min(1, brightness + 0.4)
|
|
|
|
saturation = max(0, saturation - 0.3)
|
|
|
|
return UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: alpha)
|
2020-11-10 00:39:42 +00:00
|
|
|
}
|
2023-01-16 16:24:42 +00:00
|
|
|
private lazy var currentColor = UIColor { [unowned self] (traits) in
|
|
|
|
var hue: CGFloat = 0
|
|
|
|
var saturation: CGFloat = 0
|
|
|
|
var brightness: CGFloat = 0
|
|
|
|
var alpha: CGFloat = 0
|
|
|
|
self.tintColor.resolvedColor(with: traits).getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
|
|
|
|
brightness = min(1, brightness + 0.3)
|
|
|
|
saturation = max(0, saturation - 0.2)
|
|
|
|
return UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: alpha)
|
2020-11-10 00:39:42 +00:00
|
|
|
}
|
|
|
|
var isSelected = false {
|
|
|
|
didSet {
|
|
|
|
updateLabelColors()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var isCurrent = false {
|
|
|
|
didSet {
|
|
|
|
updateLabelColors()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-01 15:53:12 +00:00
|
|
|
private let orientation: FastAccountSwitcherViewController.ItemOrientation
|
|
|
|
|
2020-11-10 00:39:42 +00:00
|
|
|
private let usernameLabel = UILabel()
|
|
|
|
private let instanceLabel = UILabel()
|
2022-04-30 15:46:14 +00:00
|
|
|
private let avatarImageView = UIImageView()
|
2020-11-10 00:39:42 +00:00
|
|
|
|
|
|
|
private var avatarRequest: ImageCache.Request?
|
|
|
|
|
2023-03-05 19:35:25 +00:00
|
|
|
init(account: UserAccountInfo, orientation: FastAccountSwitcherViewController.ItemOrientation) {
|
2022-05-01 15:53:12 +00:00
|
|
|
self.orientation = orientation
|
2020-11-10 00:39:42 +00:00
|
|
|
super.init(frame: .zero)
|
2022-04-30 15:46:14 +00:00
|
|
|
commonInit()
|
|
|
|
setupAccount(account: account)
|
|
|
|
}
|
|
|
|
|
2022-05-01 15:53:12 +00:00
|
|
|
init(orientation: FastAccountSwitcherViewController.ItemOrientation) {
|
|
|
|
self.orientation = orientation
|
2022-04-30 15:46:14 +00:00
|
|
|
super.init(frame: .zero)
|
|
|
|
commonInit()
|
|
|
|
setupPlaceholder()
|
|
|
|
}
|
|
|
|
|
|
|
|
required init?(coder: NSCoder) {
|
|
|
|
fatalError("init(coder:) has not been implemented")
|
|
|
|
}
|
|
|
|
|
|
|
|
private func commonInit() {
|
2020-11-10 00:39:42 +00:00
|
|
|
usernameLabel.textColor = .white
|
|
|
|
usernameLabel.font = UIFont(descriptor: .preferredFontDescriptor(withTextStyle: .headline), size: 0)
|
|
|
|
|
|
|
|
instanceLabel.textColor = .white
|
|
|
|
instanceLabel.font = UIFont(descriptor: .preferredFontDescriptor(withTextStyle: .subheadline), size: 0)
|
|
|
|
|
|
|
|
let stackView = UIStackView(arrangedSubviews: [
|
|
|
|
usernameLabel,
|
|
|
|
instanceLabel
|
|
|
|
])
|
|
|
|
stackView.translatesAutoresizingMaskIntoConstraints = false
|
|
|
|
stackView.axis = .vertical
|
|
|
|
addSubview(stackView)
|
|
|
|
|
|
|
|
avatarImageView.translatesAutoresizingMaskIntoConstraints = false
|
|
|
|
avatarImageView.layer.masksToBounds = true
|
|
|
|
avatarImageView.layer.cornerRadius = Preferences.shared.avatarStyle.cornerRadiusFraction * 40
|
|
|
|
avatarImageView.image = UIImage(systemName: Preferences.shared.avatarStyle == .circle ? "person.crop.circle" : "person.crop.square")
|
2022-04-30 15:46:14 +00:00
|
|
|
avatarImageView.contentMode = .scaleAspectFill
|
2020-11-10 00:39:42 +00:00
|
|
|
addSubview(avatarImageView)
|
|
|
|
|
|
|
|
NSLayoutConstraint.activate([
|
|
|
|
avatarImageView.topAnchor.constraint(equalTo: topAnchor, constant: 8),
|
|
|
|
avatarImageView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -8),
|
|
|
|
avatarImageView.widthAnchor.constraint(equalToConstant: 40),
|
|
|
|
avatarImageView.heightAnchor.constraint(equalTo: avatarImageView.widthAnchor),
|
|
|
|
|
|
|
|
stackView.centerYAnchor.constraint(equalTo: avatarImageView.centerYAnchor),
|
|
|
|
])
|
|
|
|
|
2022-05-01 15:53:12 +00:00
|
|
|
switch orientation {
|
|
|
|
case .iconsLeading:
|
|
|
|
stackView.alignment = .leading
|
|
|
|
NSLayoutConstraint.activate([
|
|
|
|
avatarImageView.leadingAnchor.constraint(equalTo: leadingAnchor),
|
|
|
|
stackView.leadingAnchor.constraint(equalTo: avatarImageView.trailingAnchor, constant: 8),
|
|
|
|
stackView.trailingAnchor.constraint(equalTo: trailingAnchor),
|
|
|
|
])
|
|
|
|
|
|
|
|
case .iconsTrailing:
|
|
|
|
stackView.alignment = .trailing
|
|
|
|
NSLayoutConstraint.activate([
|
|
|
|
avatarImageView.trailingAnchor.constraint(equalTo: trailingAnchor),
|
|
|
|
stackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 8),
|
|
|
|
stackView.trailingAnchor.constraint(equalTo: avatarImageView.leadingAnchor, constant: -8),
|
|
|
|
])
|
|
|
|
}
|
|
|
|
|
2022-04-30 15:46:14 +00:00
|
|
|
updateLabelColors()
|
2023-02-05 18:33:42 +00:00
|
|
|
|
|
|
|
isAccessibilityElement = true
|
2022-04-30 15:46:14 +00:00
|
|
|
}
|
|
|
|
|
2023-03-05 19:35:25 +00:00
|
|
|
private func setupAccount(account: UserAccountInfo) {
|
2022-04-30 15:46:14 +00:00
|
|
|
usernameLabel.text = account.username
|
|
|
|
instanceLabel.text = account.instanceURL.host!
|
2020-11-10 00:39:42 +00:00
|
|
|
let controller = MastodonController.getForAccount(account)
|
|
|
|
controller.getOwnAccount { [weak self] (result) in
|
2022-02-17 03:12:47 +00:00
|
|
|
guard let self = self,
|
|
|
|
case let .success(account) = result,
|
|
|
|
let avatar = account.avatar else { return }
|
2022-04-30 15:46:14 +00:00
|
|
|
self.avatarRequest = ImageCache.avatars.get(avatar) { [weak self] (_, image) in
|
|
|
|
guard let self = self, let image = image else { return }
|
2020-11-10 00:39:42 +00:00
|
|
|
DispatchQueue.main.async {
|
2022-04-30 15:46:14 +00:00
|
|
|
self.avatarImageView.image = image
|
2020-11-10 00:39:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-02-05 18:33:42 +00:00
|
|
|
|
|
|
|
accessibilityLabel = "\(account.username!)@\(account.instanceURL.host!)"
|
2020-11-10 00:39:42 +00:00
|
|
|
}
|
|
|
|
|
2022-04-30 15:46:14 +00:00
|
|
|
private func setupPlaceholder() {
|
|
|
|
usernameLabel.text = "Add Account"
|
|
|
|
instanceLabel.isHidden = true
|
|
|
|
avatarImageView.image = UIImage(systemName: "plus")
|
2023-02-05 18:33:42 +00:00
|
|
|
|
|
|
|
accessibilityLabel = "Add Account"
|
2020-11-10 00:39:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private func updateLabelColors() {
|
|
|
|
let color: UIColor
|
|
|
|
if isSelected {
|
2023-01-16 16:24:42 +00:00
|
|
|
color = selectedColor
|
2020-11-10 00:39:42 +00:00
|
|
|
} else if isCurrent {
|
2023-01-16 16:24:42 +00:00
|
|
|
color = currentColor
|
2020-11-10 00:39:42 +00:00
|
|
|
} else {
|
|
|
|
color = .white
|
|
|
|
}
|
|
|
|
usernameLabel.textColor = color
|
|
|
|
instanceLabel.textColor = color
|
2022-04-30 15:46:14 +00:00
|
|
|
avatarImageView.tintColor = color
|
2020-11-10 00:39:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|