115 lines
3.9 KiB
Swift
115 lines
3.9 KiB
Swift
//
|
|
// Copyright 2022 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import SignalUI
|
|
public import UIKit
|
|
|
|
public class ConversationScrollButton: UIButton {
|
|
|
|
let iconName: String
|
|
|
|
var unreadCount: UInt = 0 {
|
|
didSet {
|
|
unreadCountLabel.text = String.localizedStringWithFormat("%u", unreadCount)
|
|
unreadBadge.isHidden = unreadCount == 0
|
|
}
|
|
}
|
|
|
|
init(iconName: String) {
|
|
self.iconName = iconName
|
|
super.init(frame: .zero)
|
|
createContents()
|
|
NotificationCenter.default.addObserver(
|
|
self,
|
|
selector: #selector(themeDidChange(notification:)),
|
|
name: .themeDidChange,
|
|
object: nil)
|
|
}
|
|
|
|
required init?(coder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
private class var circleSize: CGFloat { .scaleFromIPhone5To7Plus(35, 40) }
|
|
|
|
class var buttonSize: CGFloat { circleSize + 2 * 15 }
|
|
|
|
private lazy var iconView = UIImageView()
|
|
|
|
private lazy var unreadCountLabel: UILabel = {
|
|
let label = UILabel()
|
|
label.font = .systemFont(ofSize: 12)
|
|
label.textColor = .white
|
|
label.textAlignment = .center
|
|
return label
|
|
}()
|
|
|
|
private lazy var unreadBadge: UIView = {
|
|
let view = UIView()
|
|
view.isUserInteractionEnabled = false
|
|
view.layer.cornerRadius = 8
|
|
view.clipsToBounds = true
|
|
return view
|
|
}()
|
|
|
|
private lazy var shadowView: UIView = {
|
|
let circleSize = ConversationScrollButton.circleSize
|
|
let view = CircleView(diameter: circleSize)
|
|
view.isUserInteractionEnabled = false
|
|
view.layer.shadowOffset = .zero
|
|
view.layer.shadowRadius = 4
|
|
view.layer.shadowOpacity = 0.05
|
|
view.layer.shadowColor = UIColor.black.cgColor
|
|
view.layer.shadowPath = UIBezierPath(ovalIn: CGRect(origin: .zero, size: CGSize(square: circleSize))).cgPath
|
|
return view
|
|
}()
|
|
|
|
private lazy var circleView: UIView = {
|
|
let circleSize = ConversationScrollButton.circleSize
|
|
let view = CircleView(diameter: circleSize)
|
|
view.isUserInteractionEnabled = false
|
|
view.layer.shadowOffset = CGSize(width: 0, height: 4)
|
|
view.layer.shadowRadius = 12
|
|
view.layer.shadowOpacity = 0.3
|
|
view.layer.shadowColor = UIColor.black.cgColor
|
|
view.layer.shadowPath = UIBezierPath(ovalIn: CGRect(origin: .zero, size: CGSize(square: circleSize))).cgPath
|
|
return view
|
|
}()
|
|
|
|
private func createContents() {
|
|
circleView.addSubview(iconView)
|
|
iconView.autoCenterInSuperview()
|
|
iconView.autoSetDimensions(to: CGSize(square: 20))
|
|
addSubview(shadowView)
|
|
addSubview(circleView)
|
|
circleView.autoHCenterInSuperview()
|
|
circleView.autoPinEdge(toSuperviewEdge: .bottom)
|
|
shadowView.autoPinEdges(toEdgesOf: circleView)
|
|
|
|
unreadBadge.addSubview(unreadCountLabel)
|
|
unreadCountLabel.autoPinHeightToSuperview()
|
|
unreadCountLabel.autoPinWidthToSuperview(withMargin: 3)
|
|
addSubview(unreadBadge)
|
|
unreadBadge.autoPinEdge(.bottom, to: .top, of: circleView, withOffset: 8)
|
|
unreadBadge.autoHCenterInSuperview()
|
|
unreadBadge.autoSetDimension(.height, toSize: 16)
|
|
unreadBadge.autoSetDimension(.width, toSize: 16, relation: .greaterThanOrEqual)
|
|
unreadBadge.autoMatch(.width, to: .width, of: self, withOffset: 0, relation: .lessThanOrEqual)
|
|
unreadBadge.autoPinEdge(toSuperviewEdge: .top)
|
|
|
|
updateColors()
|
|
}
|
|
|
|
private func updateColors() {
|
|
unreadBadge.backgroundColor = .ows_accentBlue
|
|
circleView.backgroundColor = Theme.isDarkThemeEnabled ? .ows_gray65 : .ows_gray02
|
|
iconView.setTemplateImageName(iconName, tintColor: Theme.isDarkThemeEnabled ? .ows_gray15 : .ows_gray75)
|
|
}
|
|
|
|
@objc
|
|
private func themeDidChange(notification: Notification) {
|
|
updateColors()
|
|
}
|
|
}
|