mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
5.2 KiB
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")
|
|
}
|
|
}
|