session-ios/Session/Calls/UserInterface/CallButton.swift

154 lines
5.2 KiB
Swift

//
// Copyright (c) 2021 Open Whisper Systems. All rights reserved.
//
import Foundation
class CallButton: UIButton {
var iconName: String { didSet { updateAppearance() } }
var selectedIconName: String? { didSet { updateAppearance() } }
var currentIconName: String {
if isSelected, let selectedImageName = selectedIconName {
return selectedImageName
}
return iconName
}
var iconColor: UIColor = .ows_white { didSet { updateAppearance() } }
var selectedIconColor: UIColor = .ows_gray75 { didSet { updateAppearance() } }
var currentIconColor: UIColor { isSelected ? selectedIconColor : iconColor }
var unselectedBackgroundColor = UIColor.white.withAlphaComponent(0.4) { didSet { updateAppearance() } }
var selectedBackgroundColor = UIColor.white { didSet { updateAppearance() } }
var currentBackgroundColor: UIColor {
return isSelected ? selectedBackgroundColor : unselectedBackgroundColor
}
var text: String? { didSet { updateAppearance() } }
override var isSelected: Bool { didSet { updateAppearance() } }
override var isHighlighted: Bool { didSet { updateAppearance() } }
var showDropdownArrow = false { didSet { updateDropdownArrow() } }
var isSmall = false { didSet { updateSizing() } }
private var currentConstraints = [NSLayoutConstraint]()
private var currentIconSize: CGFloat { isSmall ? 48 : 56 }
private var currentIconInsets: UIEdgeInsets {
var insets: UIEdgeInsets
if isSmall {
insets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
} else {
insets = UIEdgeInsets(top: 14, left: 14, bottom: 14, right: 14)
}
if showDropdownArrow {
if CurrentAppContext().isRTL {
insets.left += 3
insets.right -= 3
} else {
insets.left -= 3
insets.right += 3
}
}
return insets
}
private lazy var iconView = UIImageView()
private var dropdownIconView: UIImageView?
private lazy var circleView = CircleView()
private lazy var label = UILabel()
init(iconName: String) {
self.iconName = iconName
super.init(frame: .zero)
let circleViewContainer = UIView.container()
circleViewContainer.addSubview(circleView)
circleView.autoPinHeightToSuperview()
circleView.autoPinEdge(toSuperviewEdge: .leading, withInset: 0, relation: .greaterThanOrEqual)
circleView.autoPinEdge(toSuperviewEdge: .trailing, withInset: 0, relation: .greaterThanOrEqual)
circleView.autoHCenterInSuperview()
circleView.layer.shadowOffset = .zero
circleView.layer.shadowOpacity = 0.25
circleView.layer.shadowRadius = 4
let stackView = UIStackView(arrangedSubviews: [circleViewContainer, label])
stackView.axis = .vertical
stackView.spacing = 8
stackView.isUserInteractionEnabled = false
addSubview(stackView)
stackView.autoPinEdgesToSuperviewEdges()
label.font = .ows_dynamicTypeSubheadline
label.textColor = Theme.darkThemePrimaryColor
label.textAlignment = .center
label.layer.shadowOffset = .zero
label.layer.shadowOpacity = 0.25
label.layer.shadowRadius = 4
circleView.addSubview(iconView)
updateAppearance()
updateSizing()
}
private func updateAppearance() {
circleView.backgroundColor = currentBackgroundColor
iconView.setTemplateImageName(currentIconName, tintColor: currentIconColor)
dropdownIconView?.setTemplateImageName("arrow-down-12", tintColor: currentIconColor)
if let text = text {
label.isHidden = false
label.text = text
} else {
label.isHidden = true
}
alpha = isHighlighted ? 0.6 : 1
}
private func updateSizing() {
NSLayoutConstraint.deactivate(currentConstraints)
currentConstraints.removeAll()
currentConstraints += circleView.autoSetDimensions(to: CGSize(width: currentIconSize, height: currentIconSize))
circleView.layer.shadowPath = UIBezierPath(
ovalIn: CGRect(origin: .zero, size: CGSize(width: currentIconSize, height: currentIconSize))
).cgPath
currentConstraints += iconView.autoPinEdgesToSuperviewEdges(with: currentIconInsets)
if let dropdownIconView = dropdownIconView {
currentConstraints.append(dropdownIconView.autoPinEdge(.leading, to: .trailing, of: iconView, withOffset: isSmall ? 0 : 2))
}
}
private func updateDropdownArrow() {
if showDropdownArrow {
if dropdownIconView?.superview != nil { return }
let dropdownIconView = UIImageView()
self.dropdownIconView = dropdownIconView
circleView.addSubview(dropdownIconView)
dropdownIconView.autoSetDimensions(to: CGSize(width: 12, height: 12))
dropdownIconView.autoVCenterInSuperview()
updateSizing()
updateAppearance()
} else {
dropdownIconView?.removeFromSuperview()
dropdownIconView = nil
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}