Swiftgram/TelegramUI/ChatMessageBackground.swift
2017-01-05 01:15:08 +04:00

98 lines
3.4 KiB
Swift

import Foundation
import AsyncDisplayKit
enum ChatMessageBackgroundMergeType {
case None, Top, Bottom, Both
init(top: Bool, bottom: Bool) {
if top && bottom {
self = .Both
} else if top {
self = .Top
} else if bottom {
self = .Bottom
} else {
self = .None
}
}
}
enum ChatMessageBackgroundType: Equatable {
case Incoming(ChatMessageBackgroundMergeType), Outgoing(ChatMessageBackgroundMergeType)
static func ==(lhs: ChatMessageBackgroundType, rhs: ChatMessageBackgroundType) -> Bool {
switch lhs {
case let .Incoming(lhsMergeType):
switch rhs {
case let .Incoming(rhsMergeType):
return lhsMergeType == rhsMergeType
case .Outgoing:
return false
}
case let .Outgoing(lhsMergeType):
switch rhs {
case .Incoming:
return false
case let .Outgoing(rhsMergeType):
return lhsMergeType == rhsMergeType
}
}
}
}
private let chatMessageBackgroundIncomingImage = messageBubbleImage(incoming: true, neighbors: .none)
private let chatMessageBackgroundIncomingMergedTopImage = messageBubbleImage(incoming: true, neighbors: .top)
private let chatMessageBackgroundIncomingMergedBottomImage = messageBubbleImage(incoming: true, neighbors: .bottom)
private let chatMessageBackgroundIncomingMergedBothImage = messageBubbleImage(incoming: true, neighbors: .both)
private let chatMessageBackgroundOutgoingImage = messageBubbleImage(incoming: false, neighbors: .none)
private let chatMessageBackgroundOutgoingMergedTopImage = messageBubbleImage(incoming: false, neighbors: .top)
private let chatMessageBackgroundOutgoingMergedBottomImage = messageBubbleImage(incoming: false, neighbors: .bottom)
private let chatMessageBackgroundOutgoingMergedBothImage = messageBubbleImage(incoming: false, neighbors: .both)
class ChatMessageBackground: ASImageNode {
private var type: ChatMessageBackgroundType?
override init() {
super.init()
self.isLayerBacked = true
self.displaysAsynchronously = false
self.displayWithoutProcessing = true
}
func setType(type: ChatMessageBackgroundType) {
if let currentType = self.type, currentType == type {
return
}
self.type = type
let image: UIImage?
switch type {
case let .Incoming(mergeType):
switch mergeType {
case .None:
image = chatMessageBackgroundIncomingImage
case .Top:
image = chatMessageBackgroundIncomingMergedTopImage
case .Bottom:
image = chatMessageBackgroundIncomingMergedBottomImage
case .Both:
image = chatMessageBackgroundIncomingMergedBothImage
}
case let .Outgoing(mergeType):
switch mergeType {
case .None:
image = chatMessageBackgroundOutgoingImage
case .Top:
image = chatMessageBackgroundOutgoingMergedTopImage
case .Bottom:
image = chatMessageBackgroundOutgoingMergedBottomImage
case .Both:
image = chatMessageBackgroundOutgoingMergedBothImage
}
}
self.image = image
}
}