|
|
|
// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
|
|
|
|
|
|
|
|
import UIKit
|
|
|
|
import SessionUIKit
|
|
|
|
|
|
|
|
// MARK: - Main Types
|
|
|
|
|
|
|
|
public extension SessionCell {
|
|
|
|
struct TextInfo: Hashable, Equatable {
|
|
|
|
public enum Interaction: Hashable, Equatable {
|
|
|
|
case none
|
|
|
|
case editable
|
|
|
|
case copy
|
|
|
|
case alwaysEditing
|
|
|
|
}
|
|
|
|
|
|
|
|
let text: String?
|
|
|
|
let textAlignment: NSTextAlignment
|
|
|
|
let editingPlaceholder: String?
|
|
|
|
let interaction: Interaction
|
|
|
|
let extraViewGenerator: (() -> UIView)?
|
|
|
|
|
|
|
|
private let fontStyle: FontStyle
|
|
|
|
var font: UIFont { fontStyle.font }
|
|
|
|
|
|
|
|
init(
|
|
|
|
_ text: String?,
|
|
|
|
font: FontStyle,
|
|
|
|
alignment: NSTextAlignment = .left,
|
|
|
|
editingPlaceholder: String? = nil,
|
|
|
|
interaction: Interaction = .none,
|
|
|
|
extraViewGenerator: (() -> UIView)? = nil
|
|
|
|
) {
|
|
|
|
self.text = text
|
|
|
|
self.fontStyle = font
|
|
|
|
self.textAlignment = alignment
|
|
|
|
self.editingPlaceholder = editingPlaceholder
|
|
|
|
self.interaction = interaction
|
|
|
|
self.extraViewGenerator = extraViewGenerator
|
|
|
|
}
|
|
|
|
|
|
|
|
// MARK: - Conformance
|
|
|
|
|
|
|
|
public func hash(into hasher: inout Hasher) {
|
|
|
|
text.hash(into: &hasher)
|
|
|
|
fontStyle.hash(into: &hasher)
|
|
|
|
textAlignment.hash(into: &hasher)
|
|
|
|
interaction.hash(into: &hasher)
|
|
|
|
editingPlaceholder.hash(into: &hasher)
|
|
|
|
}
|
|
|
|
|
|
|
|
public static func == (lhs: TextInfo, rhs: TextInfo) -> Bool {
|
|
|
|
return (
|
|
|
|
lhs.text == rhs.text &&
|
|
|
|
lhs.fontStyle == rhs.fontStyle &&
|
|
|
|
lhs.textAlignment == rhs.textAlignment &&
|
|
|
|
lhs.interaction == rhs.interaction &&
|
|
|
|
lhs.editingPlaceholder == rhs.editingPlaceholder
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct StyleInfo: Equatable, Hashable {
|
|
|
|
let tintColor: ThemeValue
|
|
|
|
let alignment: SessionCell.Alignment
|
|
|
|
let allowedSeparators: Separators
|
|
|
|
let customPadding: Padding?
|
|
|
|
let backgroundStyle: SessionCell.BackgroundStyle
|
|
|
|
|
|
|
|
public init(
|
|
|
|
tintColor: ThemeValue = .textPrimary,
|
|
|
|
alignment: SessionCell.Alignment = .leading,
|
|
|
|
allowedSeparators: Separators = [.top, .bottom],
|
|
|
|
customPadding: Padding? = nil,
|
|
|
|
backgroundStyle: SessionCell.BackgroundStyle = .rounded
|
|
|
|
) {
|
|
|
|
self.tintColor = tintColor
|
|
|
|
self.alignment = alignment
|
|
|
|
self.allowedSeparators = allowedSeparators
|
|
|
|
self.customPadding = customPadding
|
|
|
|
self.backgroundStyle = backgroundStyle
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// MARK: - Child Types
|
|
|
|
|
|
|
|
public extension SessionCell {
|
|
|
|
enum FontStyle: Hashable, Equatable {
|
|
|
|
case title
|
|
|
|
case titleLarge
|
|
|
|
|
|
|
|
case subtitle
|
|
|
|
case subtitleBold
|
|
|
|
|
|
|
|
case monoSmall
|
|
|
|
case monoLarge
|
|
|
|
|
|
|
|
var font: UIFont {
|
|
|
|
switch self {
|
|
|
|
case .title: return .boldSystemFont(ofSize: 16)
|
|
|
|
case .titleLarge: return .systemFont(ofSize: Values.veryLargeFontSize, weight: .medium)
|
|
|
|
|
|
|
|
case .subtitle: return .systemFont(ofSize: 14)
|
|
|
|
case .subtitleBold: return .boldSystemFont(ofSize: 14)
|
|
|
|
|
|
|
|
case .monoSmall: return Fonts.spaceMono(ofSize: Values.smallFontSize)
|
|
|
|
case .monoLarge: return Fonts.spaceMono(
|
|
|
|
ofSize: (isIPhone5OrSmaller ? Values.mediumFontSize : Values.largeFontSize)
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
enum Alignment: Equatable, Hashable {
|
|
|
|
case leading
|
|
|
|
case centerHugging
|
|
|
|
}
|
|
|
|
|
|
|
|
enum BackgroundStyle: Equatable, Hashable {
|
|
|
|
case rounded
|
|
|
|
case edgeToEdge
|
|
|
|
case noBackground
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Separators: OptionSet, Equatable, Hashable {
|
|
|
|
public let rawValue: Int8
|
|
|
|
|
|
|
|
public init(rawValue: Int8) {
|
|
|
|
self.rawValue = rawValue
|
|
|
|
}
|
|
|
|
|
|
|
|
public static let top: Separators = Separators(rawValue: 1 << 0)
|
|
|
|
public static let bottom: Separators = Separators(rawValue: 1 << 1)
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Padding: Equatable, Hashable {
|
|
|
|
let top: CGFloat?
|
|
|
|
let leading: CGFloat?
|
|
|
|
let trailing: CGFloat?
|
|
|
|
let bottom: CGFloat?
|
|
|
|
let interItem: CGFloat?
|
|
|
|
|
|
|
|
init(
|
|
|
|
top: CGFloat? = nil,
|
|
|
|
leading: CGFloat? = nil,
|
|
|
|
trailing: CGFloat? = nil,
|
|
|
|
bottom: CGFloat? = nil,
|
|
|
|
interItem: CGFloat? = nil
|
|
|
|
) {
|
|
|
|
self.top = top
|
|
|
|
self.leading = leading
|
|
|
|
self.trailing = trailing
|
|
|
|
self.bottom = bottom
|
|
|
|
self.interItem = interItem
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// MARK: - ExpressibleByStringLiteral
|
|
|
|
|
|
|
|
extension SessionCell.TextInfo: ExpressibleByStringLiteral, ExpressibleByExtendedGraphemeClusterLiteral, ExpressibleByUnicodeScalarLiteral {
|
|
|
|
public init(stringLiteral value: String) {
|
|
|
|
self = SessionCell.TextInfo(value, font: .title)
|
|
|
|
}
|
|
|
|
|
|
|
|
public init(unicodeScalarLiteral value: Character) {
|
|
|
|
self = SessionCell.TextInfo(String(value), font: .title)
|
|
|
|
}
|
|
|
|
}
|