import Foundation import UIKit import AsyncDisplayKit import Display import TelegramPresentationData private let titleFont = Font.regular(14.0) enum FormControllerTextItemColor { case standard case error } final class FormControllerTextItem: FormControllerItem { let text: String let color: FormControllerTextItemColor init(text: String, color: FormControllerTextItemColor = .standard) { self.text = text self.color = color } func node() -> ASDisplayNode & FormControllerItemNode { return FormControllerTextItemNode() } func update(node: ASDisplayNode & FormControllerItemNode, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, width: CGFloat, previousNeighbor: FormControllerItemNeighbor, nextNeighbor: FormControllerItemNeighbor, transition: ContainedViewLayoutTransition) -> (FormControllerItemPreLayout, (FormControllerItemLayoutParams) -> CGFloat) { return (FormControllerItemPreLayout(aligningInset: 0.0), { _ in guard let node = node as? FormControllerTextItemNode else { assertionFailure() return 0.0 } return node.update(item: self, width: width, theme: theme, transition: transition) }) } } final class FormControllerTextItemNode: ASDisplayNode, FormControllerItemNode { private let textNode: ImmediateTextNode override init() { self.textNode = ImmediateTextNode() self.textNode.maximumNumberOfLines = 0 super.init() self.addSubnode(self.textNode) } func update(item: FormControllerTextItem, width: CGFloat, theme: PresentationTheme, transition: ContainedViewLayoutTransition) -> CGFloat { let color: UIColor switch item.color { case .standard: color = theme.list.freeTextColor case .error: color = theme.list.freeTextErrorColor } self.textNode.attributedText = NSAttributedString(string: item.text, font: titleFont, textColor: color) let leftInset: CGFloat = 16.0 let textSize = self.textNode.updateLayout(CGSize(width: width - leftInset - 10.0, height: CGFloat.greatestFiniteMagnitude)) transition.updateFrame(node: self.textNode, frame: CGRect(origin: CGPoint(x: leftInset, y: 7.0), size: textSize)) return textSize.height + 14.0 } var preventsTouchesToOtherItems: Bool { return false } func touchesToOtherItemsPrevented() { } }