mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-15 21:45:19 +00:00
Chat wallpaper improvements
This commit is contained in:
parent
34062b0a06
commit
4fa1d5462d
@ -196,7 +196,7 @@ func uploadCustomWallpaper(context: AccountContext, wallpaper: WallpaperGalleryE
|
||||
}).start()
|
||||
}
|
||||
|
||||
public func uploadCustomPeerWallpaper(context: AccountContext, wallpaper: WallpaperGalleryEntry, mode: WallpaperPresentationOptions, cropRect: CGRect?, peerId: PeerId, completion: @escaping () -> Void) {
|
||||
public func uploadCustomPeerWallpaper(context: AccountContext, wallpaper: WallpaperGalleryEntry, mode: WallpaperPresentationOptions, cropRect: CGRect?, brightnessMultiplier: CGFloat?, peerId: PeerId, completion: @escaping () -> Void) {
|
||||
let imageSignal: Signal<UIImage, NoError>
|
||||
switch wallpaper {
|
||||
case let .wallpaper(wallpaper, _):
|
||||
|
@ -17,6 +17,39 @@ enum WallpaperGalleryToolbarDoneButtonType {
|
||||
case none
|
||||
}
|
||||
|
||||
final class WallpaperLightButtonBackgroundNode: ASDisplayNode {
|
||||
private let backgroundNode: NavigationBackgroundNode
|
||||
private let overlayNode: ASDisplayNode
|
||||
private let lightNode: ASDisplayNode
|
||||
|
||||
override init() {
|
||||
self.backgroundNode = NavigationBackgroundNode(color: UIColor(rgb: 0x000000, alpha: 0.01), enableBlur: true)
|
||||
self.overlayNode = ASDisplayNode()
|
||||
self.overlayNode.backgroundColor = UIColor(rgb: 0xffffff, alpha: 0.55)
|
||||
self.overlayNode.layer.compositingFilter = "overlayBlendMode"
|
||||
|
||||
self.lightNode = ASDisplayNode()
|
||||
self.lightNode.backgroundColor = UIColor(rgb: 0xf2f2f2, alpha: 0.3)
|
||||
|
||||
super.init()
|
||||
|
||||
self.clipsToBounds = true
|
||||
|
||||
self.addSubnode(self.backgroundNode)
|
||||
self.addSubnode(self.overlayNode)
|
||||
//self.addSubnode(self.lightNode)
|
||||
}
|
||||
|
||||
func updateLayout(size: CGSize) {
|
||||
let frame = CGRect(origin: .zero, size: size)
|
||||
self.backgroundNode.frame = frame
|
||||
self.overlayNode.frame = frame
|
||||
self.lightNode.frame = frame
|
||||
|
||||
self.backgroundNode.update(size: size, transition: .immediate)
|
||||
}
|
||||
}
|
||||
|
||||
final class WallpaperGalleryToolbarNode: ASDisplayNode {
|
||||
private var theme: PresentationTheme
|
||||
private let strings: PresentationStrings
|
||||
@ -33,11 +66,9 @@ final class WallpaperGalleryToolbarNode: ASDisplayNode {
|
||||
}
|
||||
|
||||
private let doneButton = HighlightTrackingButtonNode()
|
||||
private let doneButtonBackgroundNode: NavigationBackgroundNode
|
||||
private let doneButtonBackgroundNode: WallpaperLightButtonBackgroundNode
|
||||
|
||||
private let doneButtonTitleNode: ImmediateTextNode
|
||||
private let doneButtonVibrancyView: UIVisualEffectView
|
||||
private let doneButtonVibrancyTitleNode: ImmediateTextNode
|
||||
|
||||
private let doneButtonSolidBackgroundNode: ASDisplayNode
|
||||
private let doneButtonSolidTitleNode: ImmediateTextNode
|
||||
@ -51,25 +82,13 @@ final class WallpaperGalleryToolbarNode: ASDisplayNode {
|
||||
self.cancelButtonType = cancelButtonType
|
||||
self.doneButtonType = doneButtonType
|
||||
|
||||
self.doneButtonBackgroundNode = NavigationBackgroundNode(color: UIColor(rgb: 0xf2f2f2, alpha: 0.75))
|
||||
self.doneButtonBackgroundNode = WallpaperLightButtonBackgroundNode()
|
||||
self.doneButtonBackgroundNode.cornerRadius = 14.0
|
||||
|
||||
let blurEffect: UIBlurEffect
|
||||
if #available(iOS 13.0, *) {
|
||||
blurEffect = UIBlurEffect(style: .extraLight)
|
||||
} else {
|
||||
blurEffect = UIBlurEffect(style: .light)
|
||||
}
|
||||
self.doneButtonVibrancyView = UIVisualEffectView(effect: UIVibrancyEffect(blurEffect: blurEffect))
|
||||
|
||||
self.doneButtonTitleNode = ImmediateTextNode()
|
||||
self.doneButtonTitleNode.displaysAsynchronously = false
|
||||
self.doneButtonTitleNode.isUserInteractionEnabled = false
|
||||
|
||||
self.doneButtonVibrancyTitleNode = ImmediateTextNode()
|
||||
self.doneButtonVibrancyTitleNode.displaysAsynchronously = false
|
||||
self.doneButtonVibrancyTitleNode.isUserInteractionEnabled = false
|
||||
|
||||
self.doneButtonSolidBackgroundNode = ASDisplayNode()
|
||||
self.doneButtonSolidBackgroundNode.alpha = 0.0
|
||||
self.doneButtonSolidBackgroundNode.clipsToBounds = true
|
||||
@ -87,8 +106,6 @@ final class WallpaperGalleryToolbarNode: ASDisplayNode {
|
||||
super.init()
|
||||
|
||||
self.addSubnode(self.doneButtonBackgroundNode)
|
||||
self.doneButtonVibrancyView.contentView.addSubnode(self.doneButtonVibrancyTitleNode)
|
||||
self.doneButtonBackgroundNode.view.addSubview(self.doneButtonVibrancyView)
|
||||
self.doneButtonBackgroundNode.addSubnode(self.doneButtonTitleNode)
|
||||
|
||||
self.addSubnode(self.doneButtonSolidBackgroundNode)
|
||||
@ -109,8 +126,8 @@ final class WallpaperGalleryToolbarNode: ASDisplayNode {
|
||||
} else {
|
||||
strongSelf.doneButtonBackgroundNode.layer.removeAnimation(forKey: "opacity")
|
||||
strongSelf.doneButtonBackgroundNode.alpha = 0.55
|
||||
strongSelf.doneButtonVibrancyTitleNode.layer.removeAnimation(forKey: "opacity")
|
||||
strongSelf.doneButtonVibrancyTitleNode.alpha = 0.55
|
||||
strongSelf.doneButtonTitleNode.layer.removeAnimation(forKey: "opacity")
|
||||
strongSelf.doneButtonTitleNode.alpha = 0.55
|
||||
}
|
||||
} else {
|
||||
if strongSelf.isSolid {
|
||||
@ -121,8 +138,8 @@ final class WallpaperGalleryToolbarNode: ASDisplayNode {
|
||||
} else {
|
||||
strongSelf.doneButtonBackgroundNode.alpha = 1.0
|
||||
strongSelf.doneButtonBackgroundNode.layer.animateAlpha(from: 0.55, to: 1.0, duration: 0.2)
|
||||
strongSelf.doneButtonVibrancyTitleNode.alpha = 1.0
|
||||
strongSelf.doneButtonVibrancyTitleNode.layer.animateAlpha(from: 0.55, to: 1.0, duration: 0.2)
|
||||
strongSelf.doneButtonTitleNode.alpha = 1.0
|
||||
strongSelf.doneButtonTitleNode.layer.animateAlpha(from: 0.55, to: 1.0, duration: 0.2)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -146,7 +163,6 @@ final class WallpaperGalleryToolbarNode: ASDisplayNode {
|
||||
transition.updateAlpha(node: self.doneButtonBackgroundNode, alpha: isSolid ? 0.0 : 1.0)
|
||||
transition.updateAlpha(node: self.doneButtonSolidBackgroundNode, alpha: isSolid ? 1.0 : 0.0)
|
||||
transition.updateAlpha(node: self.doneButtonTitleNode, alpha: isSolid ? 0.0 : 1.0)
|
||||
transition.updateAlpha(node: self.doneButtonVibrancyTitleNode, alpha: isSolid ? 0.0 : 1.0)
|
||||
transition.updateAlpha(node: self.doneButtonSolidTitleNode, alpha: isSolid ? 1.0 : 0.0)
|
||||
}
|
||||
|
||||
@ -167,8 +183,7 @@ final class WallpaperGalleryToolbarNode: ASDisplayNode {
|
||||
doneTitle = ""
|
||||
self.doneButton.isUserInteractionEnabled = false
|
||||
}
|
||||
self.doneButtonTitleNode.attributedText = NSAttributedString(string: doneTitle, font: Font.semibold(17.0), textColor: UIColor(rgb: 0x000000, alpha: 0.25))
|
||||
self.doneButtonVibrancyTitleNode.attributedText = NSAttributedString(string: doneTitle, font: Font.semibold(17.0), textColor: .white)
|
||||
self.doneButtonTitleNode.attributedText = NSAttributedString(string: doneTitle, font: Font.semibold(17.0), textColor: .white)
|
||||
|
||||
self.doneButtonSolidBackgroundNode.backgroundColor = theme.list.itemCheckColors.fillColor
|
||||
self.doneButtonSolidTitleNode.attributedText = NSAttributedString(string: doneTitle, font: Font.semibold(17.0), textColor: theme.list.itemCheckColors.foregroundColor)
|
||||
@ -181,16 +196,12 @@ final class WallpaperGalleryToolbarNode: ASDisplayNode {
|
||||
let doneFrame = CGRect(origin: CGPoint(x: inset, y: 2.0), size: CGSize(width: size.width - inset * 2.0, height: buttonHeight))
|
||||
self.doneButton.frame = doneFrame
|
||||
self.doneButtonBackgroundNode.frame = doneFrame
|
||||
self.doneButtonBackgroundNode.update(size: doneFrame.size, cornerRadius: 14.0, transition: transition)
|
||||
self.doneButtonVibrancyView.frame = self.doneButtonBackgroundNode.bounds
|
||||
self.doneButtonBackgroundNode.updateLayout(size: doneFrame.size)
|
||||
self.doneButtonSolidBackgroundNode.frame = doneFrame
|
||||
|
||||
let doneTitleSize = self.doneButtonTitleNode.updateLayout(doneFrame.size)
|
||||
self.doneButtonTitleNode.frame = CGRect(origin: CGPoint(x: floorToScreenPixels((doneFrame.width - doneTitleSize.width) / 2.0), y: floorToScreenPixels((doneFrame.height - doneTitleSize.height) / 2.0)), size: doneTitleSize)
|
||||
|
||||
let _ = self.doneButtonVibrancyTitleNode.updateLayout(doneFrame.size)
|
||||
self.doneButtonVibrancyTitleNode.frame = self.doneButtonTitleNode.frame
|
||||
|
||||
let _ = self.doneButtonSolidTitleNode.updateLayout(doneFrame.size)
|
||||
self.doneButtonSolidTitleNode.frame = self.doneButtonTitleNode.frame.offsetBy(dx: doneFrame.minX, dy: doneFrame.minY)
|
||||
}
|
||||
|
@ -42,41 +42,25 @@ final class WallpaperNavigationButtonNode: HighlightTrackingButtonNode {
|
||||
|
||||
private let content: Content
|
||||
|
||||
private let backgroundNode: NavigationBackgroundNode
|
||||
private let vibrancyView: UIVisualEffectView
|
||||
|
||||
private let backgroundNode: WallpaperLightButtonBackgroundNode
|
||||
|
||||
private let iconNode: ASImageNode
|
||||
private let darkIconNode: ASImageNode
|
||||
|
||||
private let textNode: ImmediateTextNode
|
||||
private let darkTextNode: ImmediateTextNode
|
||||
|
||||
func setIcon(_ image: UIImage?) {
|
||||
self.iconNode.image = generateTintedImage(image: image, color: .white)
|
||||
self.darkIconNode.image = generateTintedImage(image: image, color: UIColor(rgb: 0x000000, alpha: 0.25))
|
||||
}
|
||||
|
||||
init(content: Content) {
|
||||
self.content = content
|
||||
|
||||
self.backgroundNode = NavigationBackgroundNode(color: UIColor(rgb: 0xf2f2f2, alpha: 0.75))
|
||||
|
||||
let blurEffect: UIBlurEffect
|
||||
if #available(iOS 13.0, *) {
|
||||
blurEffect = UIBlurEffect(style: .extraLight)
|
||||
} else {
|
||||
blurEffect = UIBlurEffect(style: .light)
|
||||
}
|
||||
self.vibrancyView = UIVisualEffectView(effect: UIVibrancyEffect(blurEffect: blurEffect))
|
||||
self.backgroundNode = WallpaperLightButtonBackgroundNode()
|
||||
|
||||
self.iconNode = ASImageNode()
|
||||
self.iconNode.displaysAsynchronously = false
|
||||
self.iconNode.contentMode = .center
|
||||
|
||||
self.darkIconNode = ASImageNode()
|
||||
self.darkIconNode.displaysAsynchronously = false
|
||||
self.darkIconNode.contentMode = .center
|
||||
|
||||
var title: String
|
||||
switch content {
|
||||
case let .text(text):
|
||||
@ -84,23 +68,16 @@ final class WallpaperNavigationButtonNode: HighlightTrackingButtonNode {
|
||||
case let .icon(icon, _):
|
||||
title = ""
|
||||
self.iconNode.image = generateTintedImage(image: icon, color: .white)
|
||||
self.darkIconNode.image = generateTintedImage(image: icon, color: UIColor(rgb: 0x000000, alpha: 0.25))
|
||||
}
|
||||
|
||||
self.textNode = ImmediateTextNode()
|
||||
self.textNode.attributedText = NSAttributedString(string: title, font: Font.semibold(15.0), textColor: .white)
|
||||
|
||||
self.darkTextNode = ImmediateTextNode()
|
||||
self.darkTextNode.attributedText = NSAttributedString(string: title, font: Font.semibold(15.0), textColor: UIColor(rgb: 0x000000, alpha: 0.25))
|
||||
|
||||
super.init()
|
||||
|
||||
self.addSubnode(self.backgroundNode)
|
||||
self.vibrancyView.contentView.addSubnode(self.iconNode)
|
||||
self.vibrancyView.contentView.addSubnode(self.textNode)
|
||||
self.backgroundNode.view.addSubview(self.vibrancyView)
|
||||
self.backgroundNode.addSubnode(self.darkIconNode)
|
||||
self.backgroundNode.addSubnode(self.darkTextNode)
|
||||
self.addSubnode(self.iconNode)
|
||||
self.addSubnode(self.textNode)
|
||||
|
||||
self.highligthedChanged = { [weak self] highlighted in
|
||||
if let strongSelf = self {
|
||||
@ -117,11 +94,11 @@ final class WallpaperNavigationButtonNode: HighlightTrackingButtonNode {
|
||||
|
||||
var buttonColor: UIColor = UIColor(rgb: 0x000000, alpha: 0.3) {
|
||||
didSet {
|
||||
if self.buttonColor == UIColor(rgb: 0x000000, alpha: 0.3) {
|
||||
self.backgroundNode.updateColor(color: UIColor(rgb: 0xf2f2f2, alpha: 0.75), transition: .immediate)
|
||||
} else {
|
||||
self.backgroundNode.updateColor(color: self.buttonColor, transition: .immediate)
|
||||
}
|
||||
// if self.buttonColor == UIColor(rgb: 0x000000, alpha: 0.3) {
|
||||
// self.backgroundNode.updateColor(color: UIColor(rgb: 0xf2f2f2, alpha: 0.75), transition: .immediate)
|
||||
// } else {
|
||||
// self.backgroundNode.updateColor(color: self.buttonColor, transition: .immediate)
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
@ -130,7 +107,6 @@ final class WallpaperNavigationButtonNode: HighlightTrackingButtonNode {
|
||||
switch self.content {
|
||||
case .text:
|
||||
let size = self.textNode.updateLayout(constrainedSize)
|
||||
let _ = self.darkTextNode.updateLayout(constrainedSize)
|
||||
self.textSize = size
|
||||
return CGSize(width: ceil(size.width) + 16.0, height: 28.0)
|
||||
case let .icon(_, size):
|
||||
@ -143,15 +119,13 @@ final class WallpaperNavigationButtonNode: HighlightTrackingButtonNode {
|
||||
|
||||
let size = self.bounds.size
|
||||
self.backgroundNode.frame = self.bounds
|
||||
self.backgroundNode.update(size: self.backgroundNode.bounds.size, cornerRadius: self.bounds.size.height / 2.0, transition: .immediate)
|
||||
self.vibrancyView.frame = self.bounds
|
||||
self.backgroundNode.updateLayout(size: self.backgroundNode.bounds.size)
|
||||
self.backgroundNode.cornerRadius = size.height / 2.0
|
||||
|
||||
self.iconNode.frame = self.bounds
|
||||
self.darkIconNode.frame = self.bounds
|
||||
|
||||
if let textSize = self.textSize {
|
||||
self.textNode.frame = CGRect(x: floorToScreenPixels((size.width - textSize.width) / 2.0), y: floorToScreenPixels((size.height - textSize.height) / 2.0), width: textSize.width, height: textSize.height)
|
||||
self.darkTextNode.frame = self.textNode.frame
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -159,15 +133,11 @@ final class WallpaperNavigationButtonNode: HighlightTrackingButtonNode {
|
||||
|
||||
final class WallpaperOptionButtonNode: HighlightTrackingButtonNode {
|
||||
private let backgroundNode: NavigationBackgroundNode
|
||||
private let vibrancyView: UIVisualEffectView
|
||||
|
||||
private let checkNode: CheckNode
|
||||
private let darkCheckNode: CheckNode
|
||||
|
||||
private let colorNode: ASImageNode
|
||||
|
||||
private let textNode: ImmediateTextNode
|
||||
private let darkTextNode: ImmediateTextNode
|
||||
|
||||
private var textSize: CGSize?
|
||||
|
||||
@ -189,14 +159,12 @@ final class WallpaperOptionButtonNode: HighlightTrackingButtonNode {
|
||||
self._value = .colors(newValue, colors)
|
||||
}
|
||||
self.checkNode.setSelected(newValue, animated: false)
|
||||
self.darkCheckNode.setSelected(newValue, animated: false)
|
||||
}
|
||||
}
|
||||
|
||||
var title: String {
|
||||
didSet {
|
||||
self.textNode.attributedText = NSAttributedString(string: title, font: Font.medium(13), textColor: .white)
|
||||
self.darkTextNode.attributedText = NSAttributedString(string: title, font: Font.medium(13), textColor: UIColor(rgb: 0x000000, alpha: 0.25))
|
||||
}
|
||||
}
|
||||
|
||||
@ -204,62 +172,38 @@ final class WallpaperOptionButtonNode: HighlightTrackingButtonNode {
|
||||
self._value = value
|
||||
self.title = title
|
||||
|
||||
self.backgroundNode = NavigationBackgroundNode(color: UIColor(rgb: 0xffffff, alpha: 0.4))
|
||||
self.backgroundNode = NavigationBackgroundNode(color: UIColor(rgb: 0x000000, alpha: 0.01))
|
||||
self.backgroundNode.cornerRadius = 14.0
|
||||
|
||||
let blurEffect: UIBlurEffect
|
||||
if #available(iOS 13.0, *) {
|
||||
blurEffect = UIBlurEffect(style: .extraLight)
|
||||
} else {
|
||||
blurEffect = UIBlurEffect(style: .light)
|
||||
}
|
||||
self.vibrancyView = UIVisualEffectView(effect: UIVibrancyEffect(blurEffect: blurEffect))
|
||||
|
||||
let darkColor = UIColor(rgb: 0x000000, alpha: 0.25)
|
||||
|
||||
|
||||
self.checkNode = CheckNode(theme: CheckNodeTheme(backgroundColor: .white, strokeColor: .clear, borderColor: .white, overlayBorder: false, hasInset: false, hasShadow: false, borderWidth: 1.5))
|
||||
self.checkNode.isUserInteractionEnabled = false
|
||||
|
||||
self.darkCheckNode = CheckNode(theme: CheckNodeTheme(backgroundColor: darkColor, strokeColor: .clear, borderColor: darkColor, overlayBorder: false, hasInset: false, hasShadow: false, borderWidth: 1.5))
|
||||
self.darkCheckNode.isUserInteractionEnabled = false
|
||||
|
||||
self.colorNode = ASImageNode()
|
||||
|
||||
self.textNode = ImmediateTextNode()
|
||||
self.textNode.displaysAsynchronously = false
|
||||
self.textNode.attributedText = NSAttributedString(string: title, font: Font.medium(13), textColor: .white)
|
||||
|
||||
self.darkTextNode = ImmediateTextNode()
|
||||
self.darkTextNode.displaysAsynchronously = false
|
||||
self.darkTextNode.attributedText = NSAttributedString(string: title, font: Font.medium(13), textColor: UIColor(rgb: 0x000000, alpha: 0.25))
|
||||
|
||||
|
||||
super.init()
|
||||
|
||||
switch value {
|
||||
case let .check(selected):
|
||||
self.checkNode.isHidden = false
|
||||
self.darkCheckNode.isHidden = false
|
||||
self.colorNode.isHidden = true
|
||||
self.checkNode.selected = selected
|
||||
self.darkCheckNode.selected = selected
|
||||
case let .color(_, color):
|
||||
self.checkNode.isHidden = true
|
||||
self.darkCheckNode.isHidden = true
|
||||
self.colorNode.isHidden = false
|
||||
self.colorNode.image = generateFilledCircleImage(diameter: 18.0, color: color)
|
||||
case let .colors(_, colors):
|
||||
self.checkNode.isHidden = true
|
||||
self.darkCheckNode.isHidden = true
|
||||
self.colorNode.isHidden = false
|
||||
self.colorNode.image = generateColorsImage(diameter: 18.0, colors: colors)
|
||||
}
|
||||
|
||||
self.addSubnode(self.backgroundNode)
|
||||
self.vibrancyView.contentView.addSubnode(self.checkNode)
|
||||
self.vibrancyView.contentView.addSubnode(self.textNode)
|
||||
self.backgroundNode.view.addSubview(self.vibrancyView)
|
||||
self.addSubnode(self.darkCheckNode)
|
||||
self.addSubnode(self.darkTextNode)
|
||||
self.addSubnode(self.checkNode)
|
||||
self.addSubnode(self.textNode)
|
||||
self.addSubnode(self.colorNode)
|
||||
|
||||
self.highligthedChanged = { [weak self] highlighted in
|
||||
@ -283,11 +227,11 @@ final class WallpaperOptionButtonNode: HighlightTrackingButtonNode {
|
||||
|
||||
var buttonColor: UIColor = UIColor(rgb: 0x000000, alpha: 0.3) {
|
||||
didSet {
|
||||
if self.buttonColor == UIColor(rgb: 0x000000, alpha: 0.3) {
|
||||
self.backgroundNode.updateColor(color: UIColor(rgb: 0xf2f2f2, alpha: 0.75), transition: .immediate)
|
||||
} else {
|
||||
self.backgroundNode.updateColor(color: self.buttonColor, transition: .immediate)
|
||||
}
|
||||
// if self.buttonColor == UIColor(rgb: 0x000000, alpha: 0.3) {
|
||||
// self.backgroundNode.updateColor(color: UIColor(rgb: 0xf2f2f2, alpha: 0.75), transition: .immediate)
|
||||
// } else {
|
||||
// self.backgroundNode.updateColor(color: self.buttonColor, transition: .immediate)
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
@ -357,7 +301,6 @@ final class WallpaperOptionButtonNode: HighlightTrackingButtonNode {
|
||||
self._value = .colors(selected, colors)
|
||||
}
|
||||
self.checkNode.setSelected(selected, animated: animated)
|
||||
self.darkCheckNode.setSelected(selected, animated: animated)
|
||||
}
|
||||
|
||||
func setEnabled(_ enabled: Bool) {
|
||||
@ -371,7 +314,6 @@ final class WallpaperOptionButtonNode: HighlightTrackingButtonNode {
|
||||
|
||||
override func measure(_ constrainedSize: CGSize) -> CGSize {
|
||||
let size = self.textNode.updateLayout(constrainedSize)
|
||||
let _ = self.darkTextNode.updateLayout(constrainedSize)
|
||||
self.textSize = size
|
||||
return CGSize(width: ceil(size.width) + 48.0, height: 30.0)
|
||||
}
|
||||
@ -381,7 +323,6 @@ final class WallpaperOptionButtonNode: HighlightTrackingButtonNode {
|
||||
|
||||
self.backgroundNode.frame = self.bounds
|
||||
self.backgroundNode.update(size: self.backgroundNode.bounds.size, cornerRadius: 15.0, transition: .immediate)
|
||||
self.vibrancyView.frame = self.bounds
|
||||
|
||||
guard let _ = self.textSize else {
|
||||
return
|
||||
@ -392,12 +333,10 @@ final class WallpaperOptionButtonNode: HighlightTrackingButtonNode {
|
||||
let checkSize = CGSize(width: 18.0, height: 18.0)
|
||||
let checkFrame = CGRect(origin: CGPoint(x: padding, y: padding), size: checkSize)
|
||||
self.checkNode.frame = checkFrame
|
||||
self.darkCheckNode.frame = checkFrame
|
||||
self.colorNode.frame = checkFrame
|
||||
|
||||
if let textSize = self.textSize {
|
||||
self.textNode.frame = CGRect(x: max(padding + checkSize.width + spacing, padding + checkSize.width + floor((self.bounds.width - padding - checkSize.width - textSize.width) / 2.0) - 2.0), y: floorToScreenPixels((self.bounds.height - textSize.height) / 2.0), width: textSize.width, height: textSize.height)
|
||||
self.darkTextNode.frame = self.textNode.frame
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -479,7 +479,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
|
||||
dict[-1434950843] = { return Api.MessageAction.parse_messageActionSetChatTheme($0) }
|
||||
dict[-1136350937] = { return Api.MessageAction.parse_messageActionSetChatWallPaper($0) }
|
||||
dict[1007897979] = { return Api.MessageAction.parse_messageActionSetMessagesTTL($0) }
|
||||
dict[-632006598] = { return Api.MessageAction.parse_messageActionSetSameChatWallPaper($0) }
|
||||
dict[-1065845395] = { return Api.MessageAction.parse_messageActionSetSameChatWallPaper($0) }
|
||||
dict[1474192222] = { return Api.MessageAction.parse_messageActionSuggestProfilePhoto($0) }
|
||||
dict[228168278] = { return Api.MessageAction.parse_messageActionTopicCreate($0) }
|
||||
dict[-1064024032] = { return Api.MessageAction.parse_messageActionTopicEdit($0) }
|
||||
|
@ -263,7 +263,7 @@ public extension Api {
|
||||
case messageActionSetChatTheme(emoticon: String)
|
||||
case messageActionSetChatWallPaper(wallpaper: Api.WallPaper)
|
||||
case messageActionSetMessagesTTL(flags: Int32, period: Int32, autoSettingFrom: Int64?)
|
||||
case messageActionSetSameChatWallPaper
|
||||
case messageActionSetSameChatWallPaper(wallpaper: Api.WallPaper)
|
||||
case messageActionSuggestProfilePhoto(photo: Api.Photo)
|
||||
case messageActionTopicCreate(flags: Int32, title: String, iconColor: Int32, iconEmojiId: Int64?)
|
||||
case messageActionTopicEdit(flags: Int32, title: String?, iconEmojiId: Int64?, closed: Api.Bool?, hidden: Api.Bool?)
|
||||
@ -522,11 +522,11 @@ public extension Api {
|
||||
serializeInt32(period, buffer: buffer, boxed: false)
|
||||
if Int(flags) & Int(1 << 0) != 0 {serializeInt64(autoSettingFrom!, buffer: buffer, boxed: false)}
|
||||
break
|
||||
case .messageActionSetSameChatWallPaper:
|
||||
case .messageActionSetSameChatWallPaper(let wallpaper):
|
||||
if boxed {
|
||||
buffer.appendInt32(-632006598)
|
||||
buffer.appendInt32(-1065845395)
|
||||
}
|
||||
|
||||
wallpaper.serialize(buffer, true)
|
||||
break
|
||||
case .messageActionSuggestProfilePhoto(let photo):
|
||||
if boxed {
|
||||
@ -637,8 +637,8 @@ public extension Api {
|
||||
return ("messageActionSetChatWallPaper", [("wallpaper", wallpaper as Any)])
|
||||
case .messageActionSetMessagesTTL(let flags, let period, let autoSettingFrom):
|
||||
return ("messageActionSetMessagesTTL", [("flags", flags as Any), ("period", period as Any), ("autoSettingFrom", autoSettingFrom as Any)])
|
||||
case .messageActionSetSameChatWallPaper:
|
||||
return ("messageActionSetSameChatWallPaper", [])
|
||||
case .messageActionSetSameChatWallPaper(let wallpaper):
|
||||
return ("messageActionSetSameChatWallPaper", [("wallpaper", wallpaper as Any)])
|
||||
case .messageActionSuggestProfilePhoto(let photo):
|
||||
return ("messageActionSuggestProfilePhoto", [("photo", photo as Any)])
|
||||
case .messageActionTopicCreate(let flags, let title, let iconColor, let iconEmojiId):
|
||||
@ -1092,7 +1092,17 @@ public extension Api {
|
||||
}
|
||||
}
|
||||
public static func parse_messageActionSetSameChatWallPaper(_ reader: BufferReader) -> MessageAction? {
|
||||
return Api.MessageAction.messageActionSetSameChatWallPaper
|
||||
var _1: Api.WallPaper?
|
||||
if let signature = reader.readInt32() {
|
||||
_1 = Api.parse(reader, signature: signature) as? Api.WallPaper
|
||||
}
|
||||
let _c1 = _1 != nil
|
||||
if _c1 {
|
||||
return Api.MessageAction.messageActionSetSameChatWallPaper(wallpaper: _1!)
|
||||
}
|
||||
else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
public static func parse_messageActionSuggestProfilePhoto(_ reader: BufferReader) -> MessageAction? {
|
||||
var _1: Api.Photo?
|
||||
|
@ -6884,11 +6884,11 @@ public extension Api.functions.messages {
|
||||
public extension Api.functions.messages {
|
||||
static func setChatWallPaper(flags: Int32, peer: Api.InputPeer, wallpaper: Api.InputWallPaper?, settings: Api.WallPaperSettings?, id: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Updates>) {
|
||||
let buffer = Buffer()
|
||||
buffer.appendInt32(-609568219)
|
||||
buffer.appendInt32(-1879389471)
|
||||
serializeInt32(flags, buffer: buffer, boxed: false)
|
||||
peer.serialize(buffer, true)
|
||||
if Int(flags) & Int(1 << 0) != 0 {wallpaper!.serialize(buffer, true)}
|
||||
if Int(flags) & Int(1 << 0) != 0 {settings!.serialize(buffer, true)}
|
||||
if Int(flags) & Int(1 << 2) != 0 {settings!.serialize(buffer, true)}
|
||||
if Int(flags) & Int(1 << 1) != 0 {serializeInt32(id!, buffer: buffer, boxed: false)}
|
||||
return (FunctionDescription(name: "messages.setChatWallPaper", parameters: [("flags", String(describing: flags)), ("peer", String(describing: peer)), ("wallpaper", String(describing: wallpaper)), ("settings", String(describing: settings)), ("id", String(describing: id))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in
|
||||
let reader = BufferReader(buffer)
|
||||
|
@ -110,8 +110,8 @@ func telegramMediaActionFromApiAction(_ action: Api.MessageAction) -> TelegramMe
|
||||
return TelegramMediaAction(action: .requestedPeer(buttonId: buttonId, peerId: peer.peerId))
|
||||
case let .messageActionSetChatWallPaper(wallpaper):
|
||||
return TelegramMediaAction(action: .setChatWallpaper(wallpaper: TelegramWallpaper(apiWallpaper: wallpaper)))
|
||||
case .messageActionSetSameChatWallPaper:
|
||||
return TelegramMediaAction(action: .setSameChatWallpaper)
|
||||
case let .messageActionSetSameChatWallPaper(wallpaper):
|
||||
return TelegramMediaAction(action: .setSameChatWallpaper(wallpaper: TelegramWallpaper(apiWallpaper: wallpaper)))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -102,7 +102,7 @@ public enum TelegramMediaActionType: PostboxCoding, Equatable {
|
||||
case attachMenuBotAllowed
|
||||
case requestedPeer(buttonId: Int32, peerId: PeerId)
|
||||
case setChatWallpaper(wallpaper: TelegramWallpaper)
|
||||
case setSameChatWallpaper
|
||||
case setSameChatWallpaper(wallpaper: TelegramWallpaper)
|
||||
|
||||
public init(decoder: PostboxDecoder) {
|
||||
let rawValue: Int32 = decoder.decodeInt32ForKey("_rawValue", orElse: 0)
|
||||
@ -190,7 +190,11 @@ public enum TelegramMediaActionType: PostboxCoding, Equatable {
|
||||
self = .unknown
|
||||
}
|
||||
case 34:
|
||||
self = .setSameChatWallpaper
|
||||
if let wallpaper = decoder.decode(TelegramWallpaperNativeCodable.self, forKey: "wallpaper")?.value {
|
||||
self = .setSameChatWallpaper(wallpaper: wallpaper)
|
||||
} else {
|
||||
self = .unknown
|
||||
}
|
||||
default:
|
||||
self = .unknown
|
||||
}
|
||||
@ -355,8 +359,9 @@ public enum TelegramMediaActionType: PostboxCoding, Equatable {
|
||||
case let .setChatWallpaper(wallpaper):
|
||||
encoder.encodeInt32(33, forKey: "_rawValue")
|
||||
encoder.encode(TelegramWallpaperNativeCodable(wallpaper), forKey: "wallpaper")
|
||||
case .setSameChatWallpaper:
|
||||
case let .setSameChatWallpaper(wallpaper):
|
||||
encoder.encodeInt32(34, forKey: "_rawValue")
|
||||
encoder.encode(TelegramWallpaperNativeCodable(wallpaper), forKey: "wallpaper")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -134,15 +134,17 @@ func _internal_setChatWallpaper(account: Account, peerId: PeerId, wallpaper: Tel
|
||||
}
|
||||
})
|
||||
|
||||
var flags: Int32 = 0
|
||||
|
||||
var inputWallpaper: Api.InputWallPaper?
|
||||
var inputSettings: Api.WallPaperSettings?
|
||||
if let inputWallpaperAndInputSettings = wallpaper?.apiInputWallpaperAndSettings {
|
||||
flags |= 1 << 0
|
||||
|
||||
inputWallpaper = inputWallpaperAndInputSettings.0
|
||||
inputSettings = inputWallpaperAndInputSettings.1
|
||||
}
|
||||
|
||||
let flags: Int32 = 1 << 0
|
||||
return account.network.request(Api.functions.messages.setChatWallPaper(flags: flags, peer: inputPeer, wallpaper: inputWallpaper ?? .inputWallPaperNoFile(id: 0), settings: inputSettings ?? apiWallpaperSettings(WallpaperSettings()), id: nil))
|
||||
return account.network.request(Api.functions.messages.setChatWallPaper(flags: flags, peer: inputPeer, wallpaper: inputWallpaper, settings: inputSettings, id: nil))
|
||||
|> `catch` { error in
|
||||
return .complete()
|
||||
}
|
||||
@ -158,7 +160,7 @@ public enum SetExistingChatWallpaperError {
|
||||
case generic
|
||||
}
|
||||
|
||||
func _internal_setExistingChatWallpaper(account: Account, messageId: MessageId) -> Signal<Void, SetExistingChatWallpaperError> {
|
||||
func _internal_setExistingChatWallpaper(account: Account, messageId: MessageId, wallpaper: TelegramWallpaper?) -> Signal<Void, SetExistingChatWallpaperError> {
|
||||
return account.postbox.transaction { transaction -> Peer? in
|
||||
if let peer = transaction.getPeer(messageId.peerId), let message = transaction.getMessage(messageId) {
|
||||
if let action = message.media.first(where: { $0 is TelegramMediaAction }) as? TelegramMediaAction, case let .setChatWallpaper(wallpaper) = action.action {
|
||||
@ -180,8 +182,14 @@ func _internal_setExistingChatWallpaper(account: Account, messageId: MessageId)
|
||||
guard let peer = peer, let inputPeer = apiInputPeer(peer) else {
|
||||
return .complete()
|
||||
}
|
||||
let flags: Int32 = 1 << 1
|
||||
return account.network.request(Api.functions.messages.setChatWallPaper(flags: flags, peer: inputPeer, wallpaper: nil, settings: nil, id: messageId.id))
|
||||
var flags: Int32 = 1 << 1
|
||||
|
||||
var inputSettings: Api.WallPaperSettings?
|
||||
if let inputWallpaperAndInputSettings = wallpaper?.apiInputWallpaperAndSettings {
|
||||
flags |= 1 << 2
|
||||
inputSettings = inputWallpaperAndInputSettings.1
|
||||
}
|
||||
return account.network.request(Api.functions.messages.setChatWallPaper(flags: flags, peer: inputPeer, wallpaper: nil, settings: inputSettings, id: messageId.id))
|
||||
|> `catch` { _ -> Signal<Api.Updates, SetExistingChatWallpaperError> in
|
||||
return .fail(.generic)
|
||||
}
|
||||
|
@ -21,8 +21,8 @@ public extension TelegramEngine {
|
||||
return _internal_setChatWallpaper(account: self.account, peerId: peerId, wallpaper: wallpaper)
|
||||
}
|
||||
|
||||
public func setExistingChatWallpaper(messageId: MessageId) -> Signal<Void, SetExistingChatWallpaperError> {
|
||||
return _internal_setExistingChatWallpaper(account: self.account, messageId: messageId)
|
||||
public func setExistingChatWallpaper(messageId: MessageId, wallpaper: TelegramWallpaper?) -> Signal<Void, SetExistingChatWallpaperError> {
|
||||
return _internal_setExistingChatWallpaper(account: self.account, messageId: messageId, wallpaper: wallpaper)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -846,7 +846,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
strongSelf.chatDisplayNode.dismissInput()
|
||||
let wallpaperPreviewController = WallpaperGalleryController(context: strongSelf.context, source: .wallpaper(wallpaper, nil, [], nil, nil, nil), mode: .peer(EnginePeer(peer), true))
|
||||
wallpaperPreviewController.apply = { wallpaper, options, _ in
|
||||
let _ = (strongSelf.context.engine.themes.setExistingChatWallpaper(messageId: message.id)
|
||||
let _ = (strongSelf.context.engine.themes.setExistingChatWallpaper(messageId: message.id, wallpaper: nil)
|
||||
|> deliverOnMainQueue).start(completed: { [weak wallpaperPreviewController] in
|
||||
wallpaperPreviewController?.dismiss()
|
||||
})
|
||||
@ -18537,7 +18537,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
controller.navigationPresentation = .modal
|
||||
controller.apply = { [weak self] wallpaper, options, cropRect in
|
||||
if let strongSelf = self {
|
||||
uploadCustomPeerWallpaper(context: strongSelf.context, wallpaper: wallpaper, mode: options, cropRect: cropRect, peerId: peerId, completion: {
|
||||
uploadCustomPeerWallpaper(context: strongSelf.context, wallpaper: wallpaper, mode: options, cropRect: cropRect, brightnessMultiplier: nil, peerId: peerId, completion: {
|
||||
dismissControllers()
|
||||
})
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user