Fix button node selected/highlighted states

This commit is contained in:
Ilya Laktyushin 2020-10-23 20:35:57 +04:00
parent 561bee0f3b
commit 7c9ff342fa

View File

@ -8,6 +8,8 @@ open class ASButtonNode: ASControlNode {
public let disabledTitleNode: ImmediateTextNode public let disabledTitleNode: ImmediateTextNode
public let imageNode: ASImageNode public let imageNode: ASImageNode
public let highlightedImageNode: ASImageNode public let highlightedImageNode: ASImageNode
public let selectedImageNode: ASImageNode
public let highlightedSelectedImageNode: ASImageNode
public let disabledImageNode: ASImageNode public let disabledImageNode: ASImageNode
public let backgroundImageNode: ASImageNode public let backgroundImageNode: ASImageNode
public let highlightedBackgroundImageNode: ASImageNode public let highlightedBackgroundImageNode: ASImageNode
@ -70,11 +72,21 @@ open class ASButtonNode: ASControlNode {
self.imageNode.displaysAsynchronously = false self.imageNode.displaysAsynchronously = false
self.imageNode.displayWithoutProcessing = true self.imageNode.displayWithoutProcessing = true
self.selectedImageNode = ASImageNode()
self.selectedImageNode.isUserInteractionEnabled = false
self.selectedImageNode.displaysAsynchronously = false
self.selectedImageNode.displayWithoutProcessing = true
self.highlightedImageNode = ASImageNode() self.highlightedImageNode = ASImageNode()
self.highlightedImageNode.isUserInteractionEnabled = false self.highlightedImageNode.isUserInteractionEnabled = false
self.highlightedImageNode.displaysAsynchronously = false self.highlightedImageNode.displaysAsynchronously = false
self.highlightedImageNode.displayWithoutProcessing = true self.highlightedImageNode.displayWithoutProcessing = true
self.highlightedSelectedImageNode = ASImageNode()
self.highlightedSelectedImageNode.isUserInteractionEnabled = false
self.highlightedSelectedImageNode.displaysAsynchronously = false
self.highlightedSelectedImageNode.displayWithoutProcessing = true
self.disabledImageNode = ASImageNode() self.disabledImageNode = ASImageNode()
self.disabledImageNode.isUserInteractionEnabled = false self.disabledImageNode.isUserInteractionEnabled = false
self.disabledImageNode.displaysAsynchronously = false self.disabledImageNode.displaysAsynchronously = false
@ -101,8 +113,12 @@ open class ASButtonNode: ASControlNode {
self.addSubnode(self.disabledTitleNode) self.addSubnode(self.disabledTitleNode)
self.disabledTitleNode.isHidden = true self.disabledTitleNode.isHidden = true
self.addSubnode(self.imageNode) self.addSubnode(self.imageNode)
self.addSubnode(self.selectedImageNode)
self.selectedImageNode.isHidden = true
self.addSubnode(self.highlightedImageNode) self.addSubnode(self.highlightedImageNode)
self.highlightedImageNode.isHidden = true self.highlightedImageNode.isHidden = true
self.addSubnode(self.highlightedSelectedImageNode)
self.highlightedSelectedImageNode.isHidden = true
self.addSubnode(self.disabledImageNode) self.addSubnode(self.disabledImageNode)
self.disabledImageNode.isHidden = true self.disabledImageNode.isHidden = true
} }
@ -226,9 +242,12 @@ open class ASButtonNode: ASControlNode {
self.disabledImageNode.image = image self.disabledImageNode.image = image
} else if state == [] { } else if state == [] {
self.imageNode.image = image self.imageNode.image = image
} else if state == .highlighted {
self.highlightedImageNode.image = image self.highlightedImageNode.image = image
} else if state == .highlighted || state == .selected || state == [.selected, .highlighted] { } else if state == .selected {
self.highlightedImageNode.image = image self.selectedImageNode.image = image
} else if state == [.selected, .highlighted] {
self.highlightedSelectedImageNode.image = image
} else { } else {
self.imageNode.image = image self.imageNode.image = image
} }
@ -262,15 +281,15 @@ open class ASButtonNode: ASControlNode {
didSet { didSet {
if self.isSelected != oldValue { if self.isSelected != oldValue {
if self.isSelected { if self.isSelected {
if self.highlightedImageNode.image != nil { if self.selectedImageNode.image != nil {
self.highlightedImageNode.isHidden = false self.selectedImageNode.isHidden = false
self.imageNode.isHidden = true self.imageNode.isHidden = true
} else { } else {
self.highlightedImageNode.isHidden = true self.selectedImageNode.isHidden = true
self.imageNode.isHidden = false self.imageNode.isHidden = false
} }
} else { } else {
self.highlightedImageNode.isHidden = true self.selectedImageNode.isHidden = true
self.imageNode.isHidden = false self.imageNode.isHidden = false
} }
} }
@ -280,7 +299,7 @@ open class ASButtonNode: ASControlNode {
override open var isHighlighted: Bool { override open var isHighlighted: Bool {
didSet { didSet {
if self.isHighlighted != oldValue { if self.isHighlighted != oldValue {
if self.isHighlighted || self.isSelected { if self.isHighlighted {
if self.highlightedTitleNode.attributedText != nil { if self.highlightedTitleNode.attributedText != nil {
self.highlightedTitleNode.isHidden = false self.highlightedTitleNode.isHidden = false
self.titleNode.isHidden = true self.titleNode.isHidden = true
@ -295,10 +314,17 @@ open class ASButtonNode: ASControlNode {
self.highlightedBackgroundImageNode.isHidden = true self.highlightedBackgroundImageNode.isHidden = true
self.backgroundImageNode.isHidden = false self.backgroundImageNode.isHidden = false
} }
if self.highlightedImageNode.image != nil { if self.isSelected && self.highlightedSelectedImageNode.image != nil {
self.highlightedSelectedImageNode.isHidden = false
self.highlightedImageNode.isHidden = true
self.selectedImageNode.isHidden = true
self.imageNode.isHidden = true
} else if self.highlightedImageNode.image != nil {
self.highlightedSelectedImageNode.isHidden = true
self.highlightedImageNode.isHidden = false self.highlightedImageNode.isHidden = false
self.imageNode.isHidden = true self.imageNode.isHidden = true
} else { } else {
self.highlightedSelectedImageNode.isHidden = true
self.highlightedImageNode.isHidden = true self.highlightedImageNode.isHidden = true
self.imageNode.isHidden = false self.imageNode.isHidden = false
} }
@ -309,8 +335,15 @@ open class ASButtonNode: ASControlNode {
self.highlightedBackgroundImageNode.isHidden = true self.highlightedBackgroundImageNode.isHidden = true
self.backgroundImageNode.isHidden = false self.backgroundImageNode.isHidden = false
self.highlightedSelectedImageNode.isHidden = true
self.highlightedImageNode.isHidden = true self.highlightedImageNode.isHidden = true
self.imageNode.isHidden = false if self.isSelected && self.selectedImageNode.image != nil {
self.selectedImageNode.isHidden = false
self.imageNode.isHidden = true
} else {
self.selectedImageNode.isHidden = true
self.imageNode.isHidden = false
}
} }
} }
} }
@ -384,7 +417,9 @@ open class ASButtonNode: ASControlNode {
self.highlightedTitleNode.frame = CGRect(origin: highlightedTitleOrigin, size: self.calculatedHighlightedTitleSize) self.highlightedTitleNode.frame = CGRect(origin: highlightedTitleOrigin, size: self.calculatedHighlightedTitleSize)
self.disabledTitleNode.frame = CGRect(origin: disabledTitleOrigin, size: self.calculatedDisabledTitleSize) self.disabledTitleNode.frame = CGRect(origin: disabledTitleOrigin, size: self.calculatedDisabledTitleSize)
self.imageNode.frame = CGRect(origin: imageOrigin, size: imageSize) self.imageNode.frame = CGRect(origin: imageOrigin, size: imageSize)
self.selectedImageNode.frame = CGRect(origin: imageOrigin, size: imageSize)
self.highlightedImageNode.frame = CGRect(origin: imageOrigin, size: imageSize) self.highlightedImageNode.frame = CGRect(origin: imageOrigin, size: imageSize)
self.highlightedSelectedImageNode.frame = CGRect(origin: imageOrigin, size: imageSize)
self.disabledImageNode.frame = CGRect(origin: imageOrigin, size: imageSize) self.disabledImageNode.frame = CGRect(origin: imageOrigin, size: imageSize)
self.backgroundImageNode.frame = CGRect(origin: CGPoint(), size: size) self.backgroundImageNode.frame = CGRect(origin: CGPoint(), size: size)