From 5886c6225b9f602577d695a712c9f249c73e9372 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Thu, 13 Feb 2020 02:54:02 +0100 Subject: [PATCH] Build --- Wallet/BUILD | 2 +- .../Display/Source/Nodes/ASButtonNode.swift | 29 -- .../Display/Source/Nodes/ASImageNode.swift | 13 +- .../Display/Source/Nodes/ButtonNode.swift | 282 ++++++++++++++++++ submodules/WalletUI/BUILD | 16 + .../Sources/WalletInfoTransactionItem.swift | 8 +- 6 files changed, 308 insertions(+), 42 deletions(-) delete mode 100644 submodules/Display/Source/Nodes/ASButtonNode.swift create mode 100644 submodules/Display/Source/Nodes/ButtonNode.swift diff --git a/Wallet/BUILD b/Wallet/BUILD index e80c0c5046..2d99970a18 100644 --- a/Wallet/BUILD +++ b/Wallet/BUILD @@ -32,7 +32,7 @@ objc_library( swift_library( name = "Lib", srcs = glob([ - "SupportFiles/**/*.swift", + "Sources/**/*.swift", ]), deps = [ "//submodules/GZip:GZip", diff --git a/submodules/Display/Source/Nodes/ASButtonNode.swift b/submodules/Display/Source/Nodes/ASButtonNode.swift deleted file mode 100644 index 900d6295ea..0000000000 --- a/submodules/Display/Source/Nodes/ASButtonNode.swift +++ /dev/null @@ -1,29 +0,0 @@ -import Foundation -import UIKit -import AsyncDisplayKit - -open class ASButtonNode: ASControlNode { - public let titleNode: ImmediateTextNode - - override public init() { - self.titleNode = ImmediateTextNode() - - super.init() - - self.addSubnode(self.titleNode) - } - - open func setAttributedTitle(_ attributedTitle: NSAttributedString, for states: [Any]) { - self.titleNode.attributedText = attributedTitle - self.setNeedsLayout() - } - - override open func layout() { - super.layout() - - let size = self.bounds.size - - let titleSize = self.titleNode.updateLayout(CGSize(width: size.width, height: size.height)) - self.titleNode.frame = CGRect(origin: CGPoint(x: floor((size.width - titleSize.width) / 2.0), y: floor((size.height - titleSize.height) / 2.0)), size: titleSize) - } -} diff --git a/submodules/Display/Source/Nodes/ASImageNode.swift b/submodules/Display/Source/Nodes/ASImageNode.swift index 69899f3c28..b7c2d02d44 100644 --- a/submodules/Display/Source/Nodes/ASImageNode.swift +++ b/submodules/Display/Source/Nodes/ASImageNode.swift @@ -2,15 +2,12 @@ import Foundation import UIKit import AsyncDisplayKit -private final class ASImageNodeView: UIImageView { - -} - open class ASImageNode: ASDisplayNode { public var image: UIImage? { didSet { if self.isNodeLoaded { - (self.view as? ASImageNodeView)?.image = self.image + self.contents = self.image?.cgImage + //(self.view as? ASImageNodeView)?.image = self.image } } } @@ -20,14 +17,14 @@ open class ASImageNode: ASDisplayNode { override public init() { super.init() - self.setViewBlock({ + /*self.setViewBlock({ return ASImageNodeView(frame: CGRect()) - }) + })*/ } override open func didLoad() { super.didLoad() - (self.view as? ASImageNodeView)?.image = self.image + //(self.view as? ASImageNodeView)?.image = self.image } } diff --git a/submodules/Display/Source/Nodes/ButtonNode.swift b/submodules/Display/Source/Nodes/ButtonNode.swift new file mode 100644 index 0000000000..1e3958489e --- /dev/null +++ b/submodules/Display/Source/Nodes/ButtonNode.swift @@ -0,0 +1,282 @@ +import Foundation +import UIKit +import AsyncDisplayKit + +open class ASButtonNode: ASControlNode { + public let titleNode: ImmediateTextNode + public let highlightedTitleNode: ImmediateTextNode + public let imageNode: ASImageNode + public let backgroundImageNode: ASImageNode + public let highlightedBackgroundImageNode: ASImageNode + + public var contentEdgeInsets: UIEdgeInsets = UIEdgeInsets() { + didSet { + if self.contentEdgeInsets != oldValue { + self.invalidateCalculatedLayout() + self.setNeedsLayout() + } + } + } + + public var contentHorizontalAlignment: ASHorizontalAlignment = .middle { + didSet { + if self.contentHorizontalAlignment != oldValue { + self.invalidateCalculatedLayout() + self.setNeedsLayout() + } + } + } + + public var laysOutHorizontally: Bool = true { + didSet { + if self.laysOutHorizontally != oldValue { + self.invalidateCalculatedLayout() + self.setNeedsLayout() + } + } + } + + public var contentSpacing: CGFloat = 0.0 { + didSet { + if self.contentSpacing != oldValue { + self.invalidateCalculatedLayout() + self.setNeedsLayout() + } + } + } + + private var calculatedTitleSize: CGSize = CGSize() + private var calculatedHighlightedTitleSize: CGSize = CGSize() + + override public init() { + self.titleNode = ImmediateTextNode() + self.titleNode.isUserInteractionEnabled = false + self.titleNode.displaysAsynchronously = false + + self.highlightedTitleNode = ImmediateTextNode() + self.highlightedTitleNode.isUserInteractionEnabled = false + self.highlightedTitleNode.displaysAsynchronously = false + + self.imageNode = ASImageNode() + self.imageNode.isUserInteractionEnabled = false + self.imageNode.displaysAsynchronously = false + self.imageNode.displayWithoutProcessing = true + + self.backgroundImageNode = ASImageNode() + self.backgroundImageNode.isUserInteractionEnabled = false + self.backgroundImageNode.displaysAsynchronously = false + self.backgroundImageNode.displayWithoutProcessing = true + + self.highlightedBackgroundImageNode = ASImageNode() + self.highlightedBackgroundImageNode.isUserInteractionEnabled = false + self.highlightedBackgroundImageNode.displaysAsynchronously = false + self.highlightedBackgroundImageNode.displayWithoutProcessing = true + + super.init() + + self.addSubnode(self.backgroundImageNode) + self.addSubnode(self.highlightedBackgroundImageNode) + self.highlightedBackgroundImageNode.isHidden = true + self.addSubnode(self.titleNode) + self.addSubnode(self.highlightedTitleNode) + self.highlightedTitleNode.isHidden = true + self.addSubnode(self.imageNode) + } + + override open func calculateSizeThatFits(_ constrainedSize: CGSize) -> CGSize { + let horizontalInsets = self.contentEdgeInsets.left + self.contentEdgeInsets.right + let verticalInsets = self.contentEdgeInsets.top + self.contentEdgeInsets.bottom + + let imageSize = self.imageNode.image?.size ?? CGSize() + + let widthForTitle: CGFloat + if self.laysOutHorizontally { + widthForTitle = max(1.0, constrainedSize.width - horizontalInsets - imageSize.width - (imageSize.width.isZero ? 0.0 : self.contentSpacing)) + } else { + widthForTitle = max(1.0, constrainedSize.width - horizontalInsets) + } + + let normalTitleSize = self.titleNode.updateLayout(CGSize(width: widthForTitle, height: max(1.0, constrainedSize.height - verticalInsets))) + self.calculatedTitleSize = normalTitleSize + let highlightedTitleSize = self.highlightedTitleNode.updateLayout(CGSize(width: widthForTitle, height: max(1.0, constrainedSize.height - verticalInsets))) + self.calculatedHighlightedTitleSize = highlightedTitleSize + + let titleSize = CGSize(width: max(normalTitleSize.width, highlightedTitleSize.width), height: max(normalTitleSize.height, highlightedTitleSize.height)) + + var contentSize: CGSize + if self.laysOutHorizontally { + contentSize = CGSize(width: titleSize.width + imageSize.width, height: max(titleSize.height, imageSize.height)) + if !titleSize.width.isZero && !imageSize.width.isZero { + contentSize.width += self.contentSpacing + } + } else { + contentSize = CGSize(width: max(titleSize.width, imageSize.width), height: titleSize.height + imageSize.height) + if !titleSize.width.isZero && !imageSize.width.isZero { + contentSize.height += self.contentSpacing + } + } + + return CGSize(width: min(constrainedSize.width, contentSize.width + self.contentEdgeInsets.left + self.contentEdgeInsets.right), height: min(constrainedSize.height, contentSize.height + self.contentEdgeInsets.top + self.contentEdgeInsets.bottom)) + } + + open func setAttributedTitle(_ title: NSAttributedString, for state: UIControl.State) { + if state == [] { + if let attributedText = self.titleNode.attributedText { + if !attributedText.isEqual(to: title) { + self.invalidateCalculatedLayout() + self.setNeedsLayout() + } + } else { + self.invalidateCalculatedLayout() + self.setNeedsLayout() + } + self.titleNode.attributedText = title + + if let attributedText = self.highlightedTitleNode.attributedText { + if !attributedText.isEqual(to: title) { + self.invalidateCalculatedLayout() + self.setNeedsLayout() + } + } else { + self.invalidateCalculatedLayout() + self.setNeedsLayout() + } + self.highlightedTitleNode.attributedText = title + } else if state == .highlighted || state == .selected { + if let attributedText = self.highlightedTitleNode.attributedText { + if !attributedText.isEqual(to: title) { + self.invalidateCalculatedLayout() + self.setNeedsLayout() + } + } else { + self.invalidateCalculatedLayout() + self.setNeedsLayout() + } + self.highlightedTitleNode.attributedText = title + } else { + if let attributedText = self.titleNode.attributedText { + if !attributedText.isEqual(to: title) { + self.invalidateCalculatedLayout() + self.setNeedsLayout() + } + } else { + self.invalidateCalculatedLayout() + self.setNeedsLayout() + } + self.titleNode.attributedText = title + } + } + + open func attributedTitle(for state: UIControl.State) -> NSAttributedString? { + if state == .highlighted || state == .selected { + return self.highlightedTitleNode.attributedText + } else { + return self.titleNode.attributedText + } + } + + open func setTitle(_ title: String, with font: UIFont, with color: UIColor, for state: UIControl.State) { + self.setAttributedTitle(NSAttributedString(string: title, font: font, textColor: color), for: state) + } + + open func setImage(_ image: UIImage?, for state: UIControl.State) { + if image?.size != self.imageNode.image?.size { + self.invalidateCalculatedLayout() + self.setNeedsLayout() + } + self.imageNode.image = image + } + + open func setBackgroundImage(_ image: UIImage?, for state: UIControl.State) { + if state == [] { + self.backgroundImageNode.image = image + self.highlightedBackgroundImageNode.image = image + } else if state == .highlighted || state == .selected { + self.highlightedBackgroundImageNode.image = image + } else { + self.backgroundImageNode.image = image + } + } + + open func image(for state: UIControl.State) -> UIImage? { + return self.imageNode.image + } + + open func backgroundImage(for state: UIControl.State) -> UIImage? { + return self.backgroundImageNode.image + } + + override open var isHighlighted: Bool { + didSet { + if self.isHighlighted != oldValue { + if self.isHighlighted { + if self.highlightedTitleNode.attributedText != nil { + self.highlightedTitleNode.isHidden = false + self.titleNode.isHidden = true + } else { + self.highlightedTitleNode.isHidden = true + self.titleNode.isHidden = false + } + if self.highlightedBackgroundImageNode.image != nil { + self.highlightedBackgroundImageNode.isHidden = false + self.backgroundImageNode.isHidden = true + } else { + self.highlightedBackgroundImageNode.isHidden = true + self.backgroundImageNode.isHidden = false + } + } else { + self.highlightedTitleNode.isHidden = true + self.titleNode.isHidden = false + + self.highlightedBackgroundImageNode.isHidden = true + self.backgroundImageNode.isHidden = false + } + } + } + } + + override open func layout() { + let size = self.bounds.size + + let contentRect = CGRect(origin: CGPoint(x: self.contentEdgeInsets.left, y: self.contentEdgeInsets.top), size: CGSize(width: size.width - self.contentEdgeInsets.left - self.contentEdgeInsets.right, height: size.height - self.contentEdgeInsets.top - self.contentEdgeInsets.bottom)) + + let imageSize = self.imageNode.image?.size ?? CGSize() + + let titleOrigin: CGPoint + let highlightedTitleOrigin: CGPoint + let imageOrigin: CGPoint + + if self.laysOutHorizontally { + switch self.contentHorizontalAlignment { + case .left: + titleOrigin = CGPoint(x: contentRect.minX, y: contentRect.minY + floor((contentRect.height - self.calculatedTitleSize.height) / 2.0)) + highlightedTitleOrigin = CGPoint(x: contentRect.minX, y: contentRect.minY + floor((contentRect.height - self.calculatedHighlightedTitleSize.height) / 2.0)) + imageOrigin = CGPoint(x: titleOrigin.x + self.calculatedTitleSize.width + self.contentSpacing, y: contentRect.minY + floor((contentRect.height - imageSize.height) / 2.0)) + case .right: + titleOrigin = CGPoint(x: contentRect.maxX - self.calculatedTitleSize.width, y: contentRect.minY + floor((contentRect.height - self.calculatedTitleSize.height) / 2.0)) + highlightedTitleOrigin = CGPoint(x: contentRect.maxX - self.calculatedHighlightedTitleSize.width, y: contentRect.minY + floor((contentRect.height - self.calculatedHighlightedTitleSize.height) / 2.0)) + imageOrigin = CGPoint(x: titleOrigin.x - self.contentSpacing - imageSize.width, y: contentRect.minY + floor((contentRect.height - imageSize.height) / 2.0)) + default: + titleOrigin = CGPoint(x: contentRect.minY + floor((contentRect.width - self.calculatedTitleSize.width) / 2.0), y: contentRect.minY + floor((contentRect.height - self.calculatedTitleSize.height) / 2.0)) + highlightedTitleOrigin = CGPoint(x: floor((contentRect.width - self.calculatedHighlightedTitleSize.width) / 2.0), y: contentRect.minY + floor((contentRect.height - self.calculatedHighlightedTitleSize.height) / 2.0)) + imageOrigin = CGPoint(x: floor((contentRect.width - imageSize.width) / 2.0), y: contentRect.minY + floor((contentRect.height - imageSize.height) / 2.0)) + } + } else { + var contentHeight: CGFloat = self.calculatedTitleSize.height + if !imageSize.height.isZero { + contentHeight += self.contentSpacing + imageSize.height + } + let contentY = contentRect.minY + floor((contentRect.height - contentHeight) / 2.0) + titleOrigin = CGPoint(x: contentRect.minX + floor((contentRect.width - self.calculatedTitleSize.width) / 2.0), y: contentY + contentHeight - self.calculatedTitleSize.height) + highlightedTitleOrigin = CGPoint(x: contentRect.minX + floor((contentRect.width - self.calculatedHighlightedTitleSize.width) / 2.0), y: contentY + contentHeight - self.calculatedHighlightedTitleSize.height) + imageOrigin = CGPoint(x: floor((contentRect.width - imageSize.width) / 2.0), y: contentY) + } + + self.titleNode.frame = CGRect(origin: titleOrigin, size: self.calculatedTitleSize) + self.highlightedTitleNode.frame = CGRect(origin: highlightedTitleOrigin, size: self.calculatedHighlightedTitleSize) + self.imageNode.frame = CGRect(origin: imageOrigin, size: imageSize) + + self.backgroundImageNode.frame = CGRect(origin: CGPoint(), size: size) + self.highlightedBackgroundImageNode.frame = CGRect(origin: CGPoint(), size: size) + } +} diff --git a/submodules/WalletUI/BUILD b/submodules/WalletUI/BUILD index 81f0975dd4..0f92b151d7 100644 --- a/submodules/WalletUI/BUILD +++ b/submodules/WalletUI/BUILD @@ -16,12 +16,28 @@ load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") visibility = ["PUBLIC"], )''' +filegroup( + name = "WalletUIResources", + srcs = glob([ + "Resources/**/*", + ], exclude = ["Resources/**/.*"]), +) + +filegroup( + name = "WalletUIAssets", + srcs = glob(["WalletImages.xcassets/**"]), +) + swift_library( name = "WalletUI", module_name = "WalletUI", srcs = glob([ "Sources/**/*.swift", ]), + data = [ + ":WalletUIResources", + ":WalletUIAssets", + ], deps = [ "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit", "//submodules/AsyncDisplayKit:AsyncDisplayKit", diff --git a/submodules/WalletUI/Sources/WalletInfoTransactionItem.swift b/submodules/WalletUI/Sources/WalletInfoTransactionItem.swift index d09715ee29..ec2ee91826 100644 --- a/submodules/WalletUI/Sources/WalletInfoTransactionItem.swift +++ b/submodules/WalletUI/Sources/WalletInfoTransactionItem.swift @@ -558,7 +558,7 @@ private func monthAtIndex(_ index: Int, strings: WalletStrings) -> String { final class WalletInfoTransactionDateHeaderNode: ListViewItemHeaderNode { var theme: WalletTheme var strings: WalletStrings - let titleNode: ASTextNode + let titleNode: ImmediateTextNode let backgroundNode: ASDisplayNode let separatorNode: ASDisplayNode @@ -574,7 +574,7 @@ final class WalletInfoTransactionDateHeaderNode: ListViewItemHeaderNode { self.separatorNode.isLayerBacked = true self.separatorNode.backgroundColor = theme.list.itemBlocksSeparatorColor - self.titleNode = ASTextNode() + self.titleNode = ImmediateTextNode() self.titleNode.isUserInteractionEnabled = false super.init() @@ -609,7 +609,7 @@ final class WalletInfoTransactionDateHeaderNode: ListViewItemHeaderNode { self.addSubnode(self.titleNode) self.titleNode.attributedText = NSAttributedString(string: text, font: sectionTitleFont, textColor: theme.list.itemPrimaryTextColor) self.titleNode.maximumNumberOfLines = 1 - self.titleNode.truncationMode = .byTruncatingTail + self.titleNode.truncationType = .end } func updateThemeAndStrings(theme: WalletTheme, strings: WalletStrings) { @@ -626,7 +626,7 @@ final class WalletInfoTransactionDateHeaderNode: ListViewItemHeaderNode { } override func updateLayout(size: CGSize, leftInset: CGFloat, rightInset: CGFloat) { - let titleSize = self.titleNode.measure(CGSize(width: size.width - leftInset - rightInset - 24.0, height: CGFloat.greatestFiniteMagnitude)) + let titleSize = self.titleNode.updateLayout(CGSize(width: size.width - leftInset - rightInset - 24.0, height: CGFloat.greatestFiniteMagnitude)) self.titleNode.frame = CGRect(origin: CGPoint(x: leftInset + 16.0, y: floor((size.height - titleSize.height) / 2.0)), size: titleSize) self.backgroundNode.frame = CGRect(origin: CGPoint(), size: size) self.separatorNode.frame = CGRect(origin: CGPoint(x: 0.0, y: size.height - UIScreenPixel), size: CGSize(width: size.width, height: UIScreenPixel))