mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-11-25 01:22:41 +00:00
Bot keyboard improvements
This commit is contained in:
parent
f382b0a2c4
commit
6e18ef51a1
@ -663,10 +663,11 @@ public func makeDefaultDarkPresentationTheme(extendingThemeReference: Presentati
|
|||||||
)
|
)
|
||||||
|
|
||||||
let inputButtonPanel = PresentationThemeInputButtonPanel(
|
let inputButtonPanel = PresentationThemeInputButtonPanel(
|
||||||
panelSeparatorColor: UIColor(rgb: 0x545458, alpha: 0.55),
|
panelSeparatorColor: UIColor(rgb: 0x545458, alpha: 0.3),
|
||||||
panelBackgroundColor: UIColor(rgb: 0x141414),
|
panelBackgroundColor: UIColor(rgb: 0x141414, alpha: 0.6),
|
||||||
buttonFillColor: UIColor(rgb: 0x5a5a5a),
|
buttonFillColor: UIColor(rgb: 0xe9e9e9, alpha: 0.85),
|
||||||
buttonStrokeColor: UIColor(rgb: 0x0c0c0c),
|
buttonHighlightColor: UIColor(rgb: 0xffffff, alpha: 0.1),
|
||||||
|
buttonStrokeColor: UIColor(rgb: 0x000000, alpha: 0.85),
|
||||||
buttonHighlightedFillColor: UIColor(rgb: 0x5a5a5a, alpha: 0.7),
|
buttonHighlightedFillColor: UIColor(rgb: 0x5a5a5a, alpha: 0.7),
|
||||||
buttonHighlightedStrokeColor: UIColor(rgb: 0x0c0c0c),
|
buttonHighlightedStrokeColor: UIColor(rgb: 0x0c0c0c),
|
||||||
buttonTextColor: UIColor(rgb: 0xffffff)
|
buttonTextColor: UIColor(rgb: 0xffffff)
|
||||||
|
|||||||
@ -880,6 +880,7 @@ public func makeDefaultDarkTintedPresentationTheme(extendingThemeReference: Pres
|
|||||||
panelSeparatorColor: mainBackgroundColor,
|
panelSeparatorColor: mainBackgroundColor,
|
||||||
panelBackgroundColor: accentColor.withMultiplied(hue: 1.048, saturation: 0.378, brightness: 0.13),
|
panelBackgroundColor: accentColor.withMultiplied(hue: 1.048, saturation: 0.378, brightness: 0.13),
|
||||||
buttonFillColor: accentColor.withMultiplied(hue: 1.0, saturation: 0.085, brightness: 0.38),
|
buttonFillColor: accentColor.withMultiplied(hue: 1.0, saturation: 0.085, brightness: 0.38),
|
||||||
|
buttonHighlightColor: UIColor(rgb: 0xffffff, alpha: 0.2),
|
||||||
buttonStrokeColor: accentColor.withMultiplied(hue: 1.019, saturation: 0.39, brightness: 0.07),
|
buttonStrokeColor: accentColor.withMultiplied(hue: 1.019, saturation: 0.39, brightness: 0.07),
|
||||||
buttonHighlightedFillColor: accentColor.withMultiplied(hue: 1.0, saturation: 0.085, brightness: 0.38).withAlphaComponent(0.7),
|
buttonHighlightedFillColor: accentColor.withMultiplied(hue: 1.0, saturation: 0.085, brightness: 0.38).withAlphaComponent(0.7),
|
||||||
buttonHighlightedStrokeColor: accentColor.withMultiplied(hue: 1.019, saturation: 0.39, brightness: 0.07),
|
buttonHighlightedStrokeColor: accentColor.withMultiplied(hue: 1.019, saturation: 0.39, brightness: 0.07),
|
||||||
|
|||||||
@ -912,10 +912,11 @@ public func makeDefaultDayPresentationTheme(extendingThemeReference: Presentatio
|
|||||||
)
|
)
|
||||||
|
|
||||||
let inputButtonPanel = PresentationThemeInputButtonPanel(
|
let inputButtonPanel = PresentationThemeInputButtonPanel(
|
||||||
panelSeparatorColor: UIColor(rgb: 0xbec2c6),
|
panelSeparatorColor: UIColor(rgb: 0xb2b2b2),
|
||||||
panelBackgroundColor: UIColor(rgb: 0xdee2e6),
|
panelBackgroundColor: UIColor(rgb: 0xdddfd7, alpha: 0.8),
|
||||||
buttonFillColor: UIColor(rgb: 0xffffff),
|
buttonFillColor: UIColor(rgb: 0xffffff),
|
||||||
buttonStrokeColor: UIColor(rgb: 0xc3c7c9),
|
buttonHighlightColor: UIColor(rgb: 0xffffff, alpha: 0.2),
|
||||||
|
buttonStrokeColor: UIColor(rgb: 0x353535, alpha: 0.2),
|
||||||
buttonHighlightedFillColor: UIColor(rgb: 0xa8b3c0),
|
buttonHighlightedFillColor: UIColor(rgb: 0xa8b3c0),
|
||||||
buttonHighlightedStrokeColor: UIColor(rgb: 0xc3c7c9),
|
buttonHighlightedStrokeColor: UIColor(rgb: 0xc3c7c9),
|
||||||
buttonTextColor: UIColor(rgb: 0x000000)
|
buttonTextColor: UIColor(rgb: 0x000000)
|
||||||
|
|||||||
@ -1254,23 +1254,25 @@ public final class PresentationThemeInputButtonPanel {
|
|||||||
public let panelSeparatorColor: UIColor
|
public let panelSeparatorColor: UIColor
|
||||||
public let panelBackgroundColor: UIColor
|
public let panelBackgroundColor: UIColor
|
||||||
public let buttonFillColor: UIColor
|
public let buttonFillColor: UIColor
|
||||||
|
public let buttonHighlightColor: UIColor
|
||||||
public let buttonStrokeColor: UIColor
|
public let buttonStrokeColor: UIColor
|
||||||
public let buttonHighlightedFillColor: UIColor
|
public let buttonHighlightedFillColor: UIColor
|
||||||
public let buttonHighlightedStrokeColor: UIColor
|
public let buttonHighlightedStrokeColor: UIColor
|
||||||
public let buttonTextColor: UIColor
|
public let buttonTextColor: UIColor
|
||||||
|
|
||||||
public init(panelSeparatorColor: UIColor, panelBackgroundColor: UIColor, buttonFillColor: UIColor, buttonStrokeColor: UIColor, buttonHighlightedFillColor: UIColor, buttonHighlightedStrokeColor: UIColor, buttonTextColor: UIColor) {
|
public init(panelSeparatorColor: UIColor, panelBackgroundColor: UIColor, buttonFillColor: UIColor, buttonHighlightColor: UIColor, buttonStrokeColor: UIColor, buttonHighlightedFillColor: UIColor, buttonHighlightedStrokeColor: UIColor, buttonTextColor: UIColor) {
|
||||||
self.panelSeparatorColor = panelSeparatorColor
|
self.panelSeparatorColor = panelSeparatorColor
|
||||||
self.panelBackgroundColor = panelBackgroundColor
|
self.panelBackgroundColor = panelBackgroundColor
|
||||||
self.buttonFillColor = buttonFillColor
|
self.buttonFillColor = buttonFillColor
|
||||||
|
self.buttonHighlightColor = buttonHighlightColor
|
||||||
self.buttonStrokeColor = buttonStrokeColor
|
self.buttonStrokeColor = buttonStrokeColor
|
||||||
self.buttonHighlightedFillColor = buttonHighlightedFillColor
|
self.buttonHighlightedFillColor = buttonHighlightedFillColor
|
||||||
self.buttonHighlightedStrokeColor = buttonHighlightedStrokeColor
|
self.buttonHighlightedStrokeColor = buttonHighlightedStrokeColor
|
||||||
self.buttonTextColor = buttonTextColor
|
self.buttonTextColor = buttonTextColor
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdated(panelSeparatorColor: UIColor? = nil, panelBackgroundColor: UIColor? = nil, buttonFillColor: UIColor? = nil, buttonStrokeColor: UIColor? = nil, buttonHighlightedFillColor: UIColor? = nil, buttonHighlightedStrokeColor: UIColor? = nil, buttonTextColor: UIColor? = nil) -> PresentationThemeInputButtonPanel {
|
public func withUpdated(panelSeparatorColor: UIColor? = nil, panelBackgroundColor: UIColor? = nil, buttonFillColor: UIColor? = nil, buttonHighlightColor: UIColor? = nil, buttonStrokeColor: UIColor? = nil, buttonHighlightedFillColor: UIColor? = nil, buttonHighlightedStrokeColor: UIColor? = nil, buttonTextColor: UIColor? = nil) -> PresentationThemeInputButtonPanel {
|
||||||
return PresentationThemeInputButtonPanel(panelSeparatorColor: panelSeparatorColor ?? self.panelSeparatorColor, panelBackgroundColor: panelBackgroundColor ?? self.panelBackgroundColor, buttonFillColor: buttonFillColor ?? self.buttonFillColor, buttonStrokeColor: buttonStrokeColor ?? self.buttonStrokeColor, buttonHighlightedFillColor: buttonHighlightedFillColor ?? self.buttonHighlightedFillColor, buttonHighlightedStrokeColor: buttonHighlightedStrokeColor ?? self.buttonHighlightedStrokeColor, buttonTextColor: buttonTextColor ?? self.buttonTextColor)
|
return PresentationThemeInputButtonPanel(panelSeparatorColor: panelSeparatorColor ?? self.panelSeparatorColor, panelBackgroundColor: panelBackgroundColor ?? self.panelBackgroundColor, buttonFillColor: buttonFillColor ?? self.buttonFillColor, buttonHighlightColor: buttonHighlightColor ?? self.buttonHighlightColor, buttonStrokeColor: buttonStrokeColor ?? self.buttonStrokeColor, buttonHighlightedFillColor: buttonHighlightedFillColor ?? self.buttonHighlightedFillColor, buttonHighlightedStrokeColor: buttonHighlightedStrokeColor ?? self.buttonHighlightedStrokeColor, buttonTextColor: buttonTextColor ?? self.buttonTextColor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1711,6 +1711,7 @@ extension PresentationThemeInputButtonPanel: Codable {
|
|||||||
case panelBg
|
case panelBg
|
||||||
case panelSeparator
|
case panelSeparator
|
||||||
case buttonBg
|
case buttonBg
|
||||||
|
case buttonHighlight
|
||||||
case buttonStroke
|
case buttonStroke
|
||||||
case buttonHighlightedBg
|
case buttonHighlightedBg
|
||||||
case buttonHighlightedStroke
|
case buttonHighlightedStroke
|
||||||
@ -1722,6 +1723,7 @@ extension PresentationThemeInputButtonPanel: Codable {
|
|||||||
self.init(panelSeparatorColor: try decodeColor(values, .panelSeparator),
|
self.init(panelSeparatorColor: try decodeColor(values, .panelSeparator),
|
||||||
panelBackgroundColor: try decodeColor(values, .panelBg),
|
panelBackgroundColor: try decodeColor(values, .panelBg),
|
||||||
buttonFillColor: try decodeColor(values, .buttonBg),
|
buttonFillColor: try decodeColor(values, .buttonBg),
|
||||||
|
buttonHighlightColor: try decodeColor(values, .buttonHighlight),
|
||||||
buttonStrokeColor: try decodeColor(values, .buttonStroke),
|
buttonStrokeColor: try decodeColor(values, .buttonStroke),
|
||||||
buttonHighlightedFillColor: try decodeColor(values, .buttonHighlightedBg),
|
buttonHighlightedFillColor: try decodeColor(values, .buttonHighlightedBg),
|
||||||
buttonHighlightedStrokeColor: try decodeColor(values, .buttonHighlightedStroke),
|
buttonHighlightedStrokeColor: try decodeColor(values, .buttonHighlightedStroke),
|
||||||
@ -1733,6 +1735,7 @@ extension PresentationThemeInputButtonPanel: Codable {
|
|||||||
try encodeColor(&values, self.panelBackgroundColor, .panelBg)
|
try encodeColor(&values, self.panelBackgroundColor, .panelBg)
|
||||||
try encodeColor(&values, self.panelSeparatorColor, .panelSeparator)
|
try encodeColor(&values, self.panelSeparatorColor, .panelSeparator)
|
||||||
try encodeColor(&values, self.buttonFillColor, .buttonBg)
|
try encodeColor(&values, self.buttonFillColor, .buttonBg)
|
||||||
|
try encodeColor(&values, self.buttonHighlightColor, .buttonHighlight)
|
||||||
try encodeColor(&values, self.buttonStrokeColor, .buttonStroke)
|
try encodeColor(&values, self.buttonStrokeColor, .buttonStroke)
|
||||||
try encodeColor(&values, self.buttonHighlightedFillColor, .buttonHighlightedBg)
|
try encodeColor(&values, self.buttonHighlightedFillColor, .buttonHighlightedBg)
|
||||||
try encodeColor(&values, self.buttonHighlightedStrokeColor, .buttonHighlightedStroke)
|
try encodeColor(&values, self.buttonHighlightedStrokeColor, .buttonHighlightedStroke)
|
||||||
|
|||||||
@ -176,8 +176,8 @@ public enum PresentationResourceKey: Int32 {
|
|||||||
case chatInputMediaPanelStickersModeIcon
|
case chatInputMediaPanelStickersModeIcon
|
||||||
case chatInputMediaPanelPremiumIcon
|
case chatInputMediaPanelPremiumIcon
|
||||||
|
|
||||||
case chatInputButtonPanelButtonImage
|
case chatInputButtonPanelButtonHighlightImage
|
||||||
case chatInputButtonPanelButtonHighlightedImage
|
case chatInputButtonPanelButtonShadowImage
|
||||||
|
|
||||||
case chatInputTextFieldBackgroundImage
|
case chatInputTextFieldBackgroundImage
|
||||||
case chatInputTextFieldClearImage
|
case chatInputTextFieldClearImage
|
||||||
|
|||||||
@ -45,15 +45,19 @@ private func generateActionPhotoBackground(fillColor: UIColor, strokeColor: UICo
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private func generateInputPanelButtonBackgroundImage(fillColor: UIColor, strokeColor: UIColor) -> UIImage? {
|
private func generateInputPanelButtonStrokeImage(color: UIColor, offset: CGFloat) -> UIImage? {
|
||||||
let radius: CGFloat = 5.0
|
let radius: CGFloat = 4.0
|
||||||
let shadowSize: CGFloat = 1.0
|
return generateImage(CGSize(width: radius * 2.0 + 1.0, height: radius * 2.0 + 1.0), contextGenerator: { size, context in
|
||||||
return generateImage(CGSize(width: radius * 2.0, height: radius * 2.0 + shadowSize), contextGenerator: { size, context in
|
|
||||||
context.clear(CGRect(origin: CGPoint(), size: size))
|
context.clear(CGRect(origin: CGPoint(), size: size))
|
||||||
context.setFillColor(strokeColor.cgColor)
|
|
||||||
context.fillEllipse(in: CGRect(x: 0.0, y: 0.0, width: radius * 2.0, height: radius * 2.0))
|
var path = UIBezierPath(roundedRect: CGRect(origin: .zero, size: CGSize(width: size.width, height: size.height)), cornerRadius: radius)
|
||||||
context.setFillColor(fillColor.cgColor)
|
context.addPath(path.cgPath)
|
||||||
context.fillEllipse(in: CGRect(x: 0.0, y: shadowSize, width: radius * 2.0, height: radius * 2.0))
|
context.setFillColor(color.cgColor)
|
||||||
|
context.fillPath()
|
||||||
|
path = UIBezierPath(roundedRect: CGRect(origin: CGPoint(x: 0.0, y: offset), size: CGSize(width: size.width, height: size.height)), cornerRadius: radius)
|
||||||
|
context.setBlendMode(.clear)
|
||||||
|
context.addPath(path.cgPath)
|
||||||
|
context.fillPath()
|
||||||
})?.stretchableImage(withLeftCapWidth: Int(radius), topCapHeight: Int(radius))
|
})?.stretchableImage(withLeftCapWidth: Int(radius), topCapHeight: Int(radius))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -405,18 +409,18 @@ public struct PresentationResourcesChat {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
public static func chatInputButtonPanelButtonImage(_ theme: PresentationTheme) -> UIImage? {
|
public static func chatInputButtonPanelButtonHighlightImage(_ theme: PresentationTheme) -> UIImage? {
|
||||||
return theme.image(PresentationResourceKey.chatInputButtonPanelButtonImage.rawValue, { theme in
|
return theme.image(PresentationResourceKey.chatInputButtonPanelButtonHighlightImage.rawValue, { theme in
|
||||||
return generateInputPanelButtonBackgroundImage(fillColor: theme.chat.inputButtonPanel.buttonFillColor, strokeColor: theme.chat.inputButtonPanel.buttonStrokeColor)
|
return generateInputPanelButtonStrokeImage(color: theme.chat.inputButtonPanel.buttonHighlightColor, offset: -1.0)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
public static func chatInputButtonPanelButtonHighlightedImage(_ theme: PresentationTheme) -> UIImage? {
|
public static func chatInputButtonPanelButtonShadowImage(_ theme: PresentationTheme) -> UIImage? {
|
||||||
return theme.image(PresentationResourceKey.chatInputButtonPanelButtonHighlightedImage.rawValue, { theme in
|
return theme.image(PresentationResourceKey.chatInputButtonPanelButtonShadowImage.rawValue, { theme in
|
||||||
return generateInputPanelButtonBackgroundImage(fillColor: theme.chat.inputButtonPanel.buttonHighlightedFillColor, strokeColor: theme.chat.inputButtonPanel.buttonHighlightedStrokeColor)
|
return generateInputPanelButtonStrokeImage(color: theme.chat.inputButtonPanel.buttonStrokeColor, offset: 1.0)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
public static func chatInputTextFieldBackgroundImage(_ theme: PresentationTheme) -> UIImage? {
|
public static func chatInputTextFieldBackgroundImage(_ theme: PresentationTheme) -> UIImage? {
|
||||||
return theme.image(PresentationResourceKey.chatInputTextFieldBackgroundImage.rawValue, { theme in
|
return theme.image(PresentationResourceKey.chatInputTextFieldBackgroundImage.rawValue, { theme in
|
||||||
let diameter: CGFloat = 35.0
|
let diameter: CGFloat = 35.0
|
||||||
|
|||||||
@ -8,21 +8,103 @@ import SwiftSignalKit
|
|||||||
import TelegramPresentationData
|
import TelegramPresentationData
|
||||||
import AccountContext
|
import AccountContext
|
||||||
import ChatPresentationInterfaceState
|
import ChatPresentationInterfaceState
|
||||||
|
import WallpaperBackgroundNode
|
||||||
|
|
||||||
private final class ChatButtonKeyboardInputButtonNode: ASButtonNode {
|
private final class ChatButtonKeyboardInputButtonNode: HighlightTrackingButtonNode {
|
||||||
var button: ReplyMarkupButton? {
|
var button: ReplyMarkupButton? {
|
||||||
didSet {
|
didSet {
|
||||||
self.updateIcon()
|
self.updateIcon()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var iconNode: ASImageNode?
|
|
||||||
|
private let backgroundContainerNode: ASDisplayNode
|
||||||
|
private var backgroundNode: WallpaperBubbleBackgroundNode?
|
||||||
|
private let backgroundColorNode: ASDisplayNode
|
||||||
|
private let backgroundAdditionalColorNode: ASDisplayNode
|
||||||
|
|
||||||
|
private let shadowNode: ASImageNode
|
||||||
|
private let highlightNode: ASImageNode
|
||||||
|
|
||||||
|
private let textNode: ImmediateTextNode
|
||||||
|
private var iconNode: ASImageNode?
|
||||||
|
|
||||||
private var theme: PresentationTheme?
|
private var theme: PresentationTheme?
|
||||||
|
|
||||||
init(theme: PresentationTheme) {
|
init() {
|
||||||
|
self.backgroundContainerNode = ASDisplayNode()
|
||||||
|
self.backgroundContainerNode.clipsToBounds = true
|
||||||
|
self.backgroundContainerNode.allowsGroupOpacity = true
|
||||||
|
self.backgroundContainerNode.isUserInteractionEnabled = false
|
||||||
|
self.backgroundContainerNode.cornerRadius = 5.0
|
||||||
|
if #available(iOS 13.0, *) {
|
||||||
|
self.backgroundContainerNode.layer.cornerCurve = .continuous
|
||||||
|
}
|
||||||
|
|
||||||
|
self.backgroundColorNode = ASDisplayNode()
|
||||||
|
self.backgroundColorNode.cornerRadius = 5.0
|
||||||
|
if #available(iOS 13.0, *) {
|
||||||
|
self.backgroundColorNode.layer.cornerCurve = .continuous
|
||||||
|
}
|
||||||
|
|
||||||
|
self.backgroundAdditionalColorNode = ASDisplayNode()
|
||||||
|
self.backgroundAdditionalColorNode.backgroundColor = UIColor(rgb: 0xffffff, alpha: 0.1)
|
||||||
|
self.backgroundAdditionalColorNode.isHidden = true
|
||||||
|
|
||||||
|
self.shadowNode = ASImageNode()
|
||||||
|
self.shadowNode.isUserInteractionEnabled = false
|
||||||
|
|
||||||
|
self.highlightNode = ASImageNode()
|
||||||
|
self.highlightNode.isUserInteractionEnabled = false
|
||||||
|
|
||||||
|
self.textNode = ImmediateTextNode()
|
||||||
|
self.textNode.isUserInteractionEnabled = false
|
||||||
|
self.textNode.textAlignment = .center
|
||||||
|
self.textNode.maximumNumberOfLines = 2
|
||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
self.updateTheme(theme: theme)
|
self.addSubnode(self.backgroundContainerNode)
|
||||||
|
|
||||||
|
self.backgroundContainerNode.addSubnode(self.backgroundColorNode)
|
||||||
|
self.backgroundContainerNode.addSubnode(self.backgroundAdditionalColorNode)
|
||||||
|
self.addSubnode(self.textNode)
|
||||||
|
|
||||||
|
self.backgroundContainerNode.addSubnode(self.shadowNode)
|
||||||
|
self.backgroundContainerNode.addSubnode(self.highlightNode)
|
||||||
|
|
||||||
|
self.highligthedChanged = { [weak self] highlighted in
|
||||||
|
if let strongSelf = self {
|
||||||
|
if highlighted, !strongSelf.bounds.width.isZero {
|
||||||
|
let scale = (strongSelf.bounds.width - 10.0) / strongSelf.bounds.width
|
||||||
|
|
||||||
|
strongSelf.layer.animateScale(from: 1.0, to: scale, duration: 0.15, removeOnCompletion: false)
|
||||||
|
|
||||||
|
strongSelf.backgroundContainerNode.layer.removeAnimation(forKey: "opacity")
|
||||||
|
strongSelf.backgroundContainerNode.alpha = 0.6
|
||||||
|
} else if let presentationLayer = strongSelf.layer.presentation() {
|
||||||
|
strongSelf.layer.animateScale(from: CGFloat((presentationLayer.value(forKeyPath: "transform.scale.y") as? NSNumber)?.floatValue ?? 1.0), to: 1.0, duration: 0.25, removeOnCompletion: false)
|
||||||
|
|
||||||
|
strongSelf.backgroundContainerNode.alpha = 1.0
|
||||||
|
strongSelf.backgroundContainerNode.layer.animateAlpha(from: 0.6, to: 1.0, duration: 0.2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override func setAttributedTitle(_ title: NSAttributedString, for state: UIControl.State) {
|
||||||
|
self.textNode.attributedText = title
|
||||||
|
}
|
||||||
|
|
||||||
|
private var absoluteRect: (CGRect, CGSize)?
|
||||||
|
func update(rect: CGRect, within containerSize: CGSize, transition: ContainedViewLayoutTransition) {
|
||||||
|
self.absoluteRect = (rect, containerSize)
|
||||||
|
|
||||||
|
if let backgroundNode = self.backgroundNode {
|
||||||
|
var backgroundFrame = backgroundNode.frame
|
||||||
|
backgroundFrame.origin.x += rect.minX
|
||||||
|
backgroundFrame.origin.y += rect.minY
|
||||||
|
backgroundNode.update(rect: backgroundFrame, within: containerSize, transition: transition)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func updateIcon() {
|
private func updateIcon() {
|
||||||
@ -55,32 +137,71 @@ private final class ChatButtonKeyboardInputButtonNode: ASButtonNode {
|
|||||||
self.setNeedsLayout()
|
self.setNeedsLayout()
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateTheme(theme: PresentationTheme) {
|
func updateTheme(theme: PresentationTheme, wallpaperBackgroundNode: WallpaperBackgroundNode?) {
|
||||||
if theme !== self.theme {
|
if theme !== self.theme {
|
||||||
self.theme = theme
|
self.theme = theme
|
||||||
|
|
||||||
self.setBackgroundImage(PresentationResourcesChat.chatInputButtonPanelButtonImage(theme), for: [])
|
self.highlightNode.image = PresentationResourcesChat.chatInputButtonPanelButtonHighlightImage(theme)
|
||||||
self.setBackgroundImage(PresentationResourcesChat.chatInputButtonPanelButtonHighlightedImage(theme), for: [.highlighted])
|
self.shadowNode.image = PresentationResourcesChat.chatInputButtonPanelButtonShadowImage(theme)
|
||||||
|
|
||||||
self.updateIcon()
|
self.updateIcon()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.backgroundColorNode.backgroundColor = theme.chat.inputButtonPanel.buttonFillColor
|
||||||
|
if let alpha = self.backgroundColorNode.backgroundColor?.alpha, alpha < 1.0 {
|
||||||
|
self.backgroundColorNode.layer.compositingFilter = "softLightBlendMode"
|
||||||
|
self.backgroundAdditionalColorNode.isHidden = false
|
||||||
|
} else {
|
||||||
|
self.backgroundColorNode.layer.compositingFilter = nil
|
||||||
|
self.backgroundAdditionalColorNode.isHidden = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if wallpaperBackgroundNode?.hasExtraBubbleBackground() == true {
|
||||||
|
if self.backgroundNode == nil, let backgroundContent = wallpaperBackgroundNode?.makeBubbleBackground(for: .free) {
|
||||||
|
self.backgroundNode = backgroundContent
|
||||||
|
self.backgroundContainerNode.insertSubnode(backgroundContent, at: 0)
|
||||||
|
|
||||||
|
self.setNeedsLayout()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.backgroundNode?.removeFromSupernode()
|
||||||
|
self.backgroundNode = nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override func layout() {
|
override func layout() {
|
||||||
super.layout()
|
super.layout()
|
||||||
|
|
||||||
|
self.backgroundContainerNode.frame = self.bounds
|
||||||
|
self.backgroundColorNode.frame = CGRect(origin: .zero, size: CGSize(width: self.bounds.width, height: self.bounds.height - 1.0))
|
||||||
|
self.backgroundAdditionalColorNode.frame = self.backgroundColorNode.frame
|
||||||
|
self.backgroundNode?.frame = self.backgroundColorNode.frame
|
||||||
|
|
||||||
|
self.highlightNode.frame = self.bounds
|
||||||
|
self.shadowNode.frame = self.bounds
|
||||||
|
|
||||||
|
if let (rect, containerSize) = self.absoluteRect {
|
||||||
|
self.update(rect: rect, within: containerSize, transition: .immediate)
|
||||||
|
}
|
||||||
|
|
||||||
if let iconNode = self.iconNode {
|
if let iconNode = self.iconNode {
|
||||||
iconNode.frame = CGRect(x: self.frame.width - 16.0, y: 4.0, width: 12.0, height: 12.0)
|
iconNode.frame = CGRect(x: self.frame.width - 16.0, y: 4.0, width: 12.0, height: 12.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let textSize = self.textNode.updateLayout(CGSize(width: self.bounds.width - 16.0, height: self.bounds.height))
|
||||||
|
self.textNode.frame = CGRect(origin: CGPoint(x: floorToScreenPixels((self.bounds.width - textSize.width) / 2.0), y: floorToScreenPixels((self.bounds.height - textSize.height) / 2.0)), size: textSize)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class ChatButtonKeyboardInputNode: ChatInputNode {
|
final class ChatButtonKeyboardInputNode: ChatInputNode {
|
||||||
private let context: AccountContext
|
private let context: AccountContext
|
||||||
private let controllerInteraction: ChatControllerInteraction
|
private let controllerInteraction: ChatControllerInteraction
|
||||||
|
|
||||||
private let separatorNode: ASDisplayNode
|
private let separatorNode: ASDisplayNode
|
||||||
private let scrollNode: ASScrollNode
|
private let scrollNode: ASScrollNode
|
||||||
|
|
||||||
|
private var backgroundNode: WallpaperBubbleBackgroundNode?
|
||||||
|
private let backgroundColorNode: ASDisplayNode
|
||||||
|
|
||||||
private var buttonNodes: [ChatButtonKeyboardInputButtonNode] = []
|
private var buttonNodes: [ChatButtonKeyboardInputButtonNode] = []
|
||||||
private var message: Message?
|
private var message: Message?
|
||||||
@ -93,11 +214,15 @@ final class ChatButtonKeyboardInputNode: ChatInputNode {
|
|||||||
|
|
||||||
self.scrollNode = ASScrollNode()
|
self.scrollNode = ASScrollNode()
|
||||||
|
|
||||||
|
self.backgroundColorNode = ASDisplayNode()
|
||||||
|
|
||||||
self.separatorNode = ASDisplayNode()
|
self.separatorNode = ASDisplayNode()
|
||||||
self.separatorNode.isLayerBacked = true
|
self.separatorNode.isLayerBacked = true
|
||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
|
self.addSubnode(self.backgroundColorNode)
|
||||||
|
|
||||||
self.addSubnode(self.scrollNode)
|
self.addSubnode(self.scrollNode)
|
||||||
self.scrollNode.view.delaysContentTouches = false
|
self.scrollNode.view.delaysContentTouches = false
|
||||||
self.scrollNode.view.canCancelContentTouches = true
|
self.scrollNode.view.canCancelContentTouches = true
|
||||||
@ -115,15 +240,41 @@ final class ChatButtonKeyboardInputNode: ChatInputNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var absoluteRect: (CGRect, CGSize)?
|
||||||
|
override func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize, transition: ContainedViewLayoutTransition) {
|
||||||
|
self.absoluteRect = (rect, containerSize)
|
||||||
|
|
||||||
|
if let backgroundNode = self.backgroundNode {
|
||||||
|
var backgroundFrame = backgroundNode.frame
|
||||||
|
backgroundFrame.origin.x += rect.minX
|
||||||
|
backgroundFrame.origin.y += rect.minY
|
||||||
|
backgroundNode.update(rect: backgroundFrame, within: containerSize, transition: transition)
|
||||||
|
}
|
||||||
|
|
||||||
|
for buttonNode in self.buttonNodes {
|
||||||
|
var buttonFrame = buttonNode.frame
|
||||||
|
buttonFrame.origin.x += rect.minX
|
||||||
|
buttonFrame.origin.y += rect.minY
|
||||||
|
buttonNode.update(rect: buttonFrame, within: containerSize, transition: transition)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, standardInputHeight: CGFloat, inputHeight: CGFloat, maximumHeight: CGFloat, inputPanelHeight: CGFloat, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, deviceMetrics: DeviceMetrics, isVisible: Bool, isExpanded: Bool) -> (CGFloat, CGFloat) {
|
override func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, standardInputHeight: CGFloat, inputHeight: CGFloat, maximumHeight: CGFloat, inputPanelHeight: CGFloat, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, deviceMetrics: DeviceMetrics, isVisible: Bool, isExpanded: Bool) -> (CGFloat, CGFloat) {
|
||||||
transition.updateFrame(node: self.separatorNode, frame: CGRect(origin: CGPoint(), size: CGSize(width: width, height: UIScreenPixel)))
|
transition.updateFrame(node: self.separatorNode, frame: CGRect(origin: CGPoint(), size: CGSize(width: width, height: UIScreenPixel)))
|
||||||
|
|
||||||
|
if self.backgroundNode == nil {
|
||||||
|
if let backgroundNode = self.controllerInteraction.presentationContext.backgroundNode?.makeBubbleBackground(for: .free) {
|
||||||
|
self.backgroundNode = backgroundNode
|
||||||
|
self.insertSubnode(backgroundNode, at: 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let updatedTheme = self.theme !== interfaceState.theme
|
let updatedTheme = self.theme !== interfaceState.theme
|
||||||
if updatedTheme {
|
if updatedTheme {
|
||||||
self.theme = interfaceState.theme
|
self.theme = interfaceState.theme
|
||||||
|
|
||||||
self.separatorNode.backgroundColor = interfaceState.theme.chat.inputButtonPanel.panelSeparatorColor
|
self.separatorNode.backgroundColor = interfaceState.theme.chat.inputButtonPanel.panelSeparatorColor
|
||||||
self.backgroundColor = interfaceState.theme.chat.inputButtonPanel.panelBackgroundColor
|
self.backgroundColorNode.backgroundColor = interfaceState.theme.chat.inputButtonPanel.panelBackgroundColor
|
||||||
}
|
}
|
||||||
|
|
||||||
var validatedMarkup: ReplyMarkupMessageAttribute?
|
var validatedMarkup: ReplyMarkupMessageAttribute?
|
||||||
@ -165,14 +316,14 @@ final class ChatButtonKeyboardInputNode: ChatInputNode {
|
|||||||
let buttonNode: ChatButtonKeyboardInputButtonNode
|
let buttonNode: ChatButtonKeyboardInputButtonNode
|
||||||
if buttonIndex < self.buttonNodes.count {
|
if buttonIndex < self.buttonNodes.count {
|
||||||
buttonNode = self.buttonNodes[buttonIndex]
|
buttonNode = self.buttonNodes[buttonIndex]
|
||||||
buttonNode.updateTheme(theme: interfaceState.theme)
|
|
||||||
} else {
|
} else {
|
||||||
buttonNode = ChatButtonKeyboardInputButtonNode(theme: interfaceState.theme)
|
buttonNode = ChatButtonKeyboardInputButtonNode()
|
||||||
buttonNode.titleNode.maximumNumberOfLines = 2
|
buttonNode.titleNode.maximumNumberOfLines = 2
|
||||||
buttonNode.addTarget(self, action: #selector(self.buttonPressed(_:)), forControlEvents: [.touchUpInside])
|
buttonNode.addTarget(self, action: #selector(self.buttonPressed(_:)), forControlEvents: [.touchUpInside])
|
||||||
self.scrollNode.addSubnode(buttonNode)
|
self.scrollNode.addSubnode(buttonNode)
|
||||||
self.buttonNodes.append(buttonNode)
|
self.buttonNodes.append(buttonNode)
|
||||||
}
|
}
|
||||||
|
buttonNode.updateTheme(theme: interfaceState.theme, wallpaperBackgroundNode: self.controllerInteraction.presentationContext.backgroundNode)
|
||||||
buttonIndex += 1
|
buttonIndex += 1
|
||||||
if buttonNode.button != button || updatedTheme {
|
if buttonNode.button != button || updatedTheme {
|
||||||
buttonNode.button = button
|
buttonNode.button = button
|
||||||
@ -200,6 +351,15 @@ final class ChatButtonKeyboardInputNode: ChatInputNode {
|
|||||||
self.scrollNode.view.setContentOffset(CGPoint(), animated: false)
|
self.scrollNode.view.setContentOffset(CGPoint(), animated: false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let backgroundNode = self.backgroundNode {
|
||||||
|
backgroundNode.frame = CGRect(origin: .zero, size: CGSize(width: width, height: panelHeight))
|
||||||
|
}
|
||||||
|
self.backgroundColorNode.frame = CGRect(origin: .zero, size: CGSize(width: width, height: panelHeight))
|
||||||
|
|
||||||
|
if let (rect, containerSize) = self.absoluteRect {
|
||||||
|
self.updateAbsoluteRect(rect, within: containerSize, transition: transition)
|
||||||
|
}
|
||||||
|
|
||||||
return (panelHeight, 0.0)
|
return (panelHeight, 0.0)
|
||||||
} else {
|
} else {
|
||||||
return (0.0, 0.0)
|
return (0.0, 0.0)
|
||||||
|
|||||||
@ -1862,6 +1862,8 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate {
|
|||||||
inputNode.frame = adjustedForPreviousInputHeightFrame
|
inputNode.frame = adjustedForPreviousInputHeightFrame
|
||||||
transition.updateFrame(node: inputNode, frame: inputNodeFrame)
|
transition.updateFrame(node: inputNode, frame: inputNodeFrame)
|
||||||
|
|
||||||
|
inputNode.updateAbsoluteRect(inputNodeFrame, within: layout.size, transition: transition)
|
||||||
|
|
||||||
if let externalTopPanelContainer = inputNode.externalTopPanelContainer {
|
if let externalTopPanelContainer = inputNode.externalTopPanelContainer {
|
||||||
externalTopPanelContainer.frame = CGRect(origin: adjustedForPreviousInputHeightFrame.offsetBy(dx: 0.0, dy: externalTopPanelContainerOffset).origin, size: CGSize(width: adjustedForPreviousInputHeightFrame.width, height: 0.0))
|
externalTopPanelContainer.frame = CGRect(origin: adjustedForPreviousInputHeightFrame.offsetBy(dx: 0.0, dy: externalTopPanelContainerOffset).origin, size: CGSize(width: adjustedForPreviousInputHeightFrame.width, height: 0.0))
|
||||||
transition.updateFrame(view: externalTopPanelContainer, frame: CGRect(origin: inputNodeFrame.origin, size: CGSize(width: inputNodeFrame.width, height: 0.0)))
|
transition.updateFrame(view: externalTopPanelContainer, frame: CGRect(origin: inputNodeFrame.origin, size: CGSize(width: inputNodeFrame.width, height: 0.0)))
|
||||||
|
|||||||
@ -24,6 +24,10 @@ class ChatInputNode: ASDisplayNode {
|
|||||||
|
|
||||||
var followsDefaultHeight: Bool = false
|
var followsDefaultHeight: Bool = false
|
||||||
|
|
||||||
|
func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize, transition: ContainedViewLayoutTransition) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, standardInputHeight: CGFloat, inputHeight: CGFloat, maximumHeight: CGFloat, inputPanelHeight: CGFloat, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, deviceMetrics: DeviceMetrics, isVisible: Bool, isExpanded: Bool) -> (CGFloat, CGFloat) {
|
func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, standardInputHeight: CGFloat, inputHeight: CGFloat, maximumHeight: CGFloat, inputPanelHeight: CGFloat, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, deviceMetrics: DeviceMetrics, isVisible: Bool, isExpanded: Bool) -> (CGFloat, CGFloat) {
|
||||||
return (0.0, 0.0)
|
return (0.0, 0.0)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4400,7 +4400,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
|
|||||||
private var backgroundMaskMode: Bool {
|
private var backgroundMaskMode: Bool {
|
||||||
let hasWallpaper = self.item?.presentationData.theme.wallpaper.hasWallpaper ?? false
|
let hasWallpaper = self.item?.presentationData.theme.wallpaper.hasWallpaper ?? false
|
||||||
let isPreview = self.item?.presentationData.isPreview ?? false
|
let isPreview = self.item?.presentationData.isPreview ?? false
|
||||||
return self.mainContextSourceNode.isExtractedToContextPreview || hasWallpaper || isPreview
|
return self.mainContextSourceNode.isExtractedToContextPreview || hasWallpaper || isPreview || !self.disablesComments
|
||||||
}
|
}
|
||||||
|
|
||||||
override func openMessageContextMenu() {
|
override func openMessageContextMenu() {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user