TM-SGNL-iOS/Signal/ConversationView/ConversationScrollButton.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

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()
}
}