mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Tune wallpaper pattern scale on iPad
This commit is contained in:
parent
4f5e7548d9
commit
2adf8a010d
@ -1070,7 +1070,7 @@ final class MediaPickerSelectedListNode: ASDisplayNode, UIScrollViewDelegate, UI
|
|||||||
self.wallpaperBackgroundNode.update(wallpaper: wallpaper)
|
self.wallpaperBackgroundNode.update(wallpaper: wallpaper)
|
||||||
self.wallpaperBackgroundNode.updateBubbleTheme(bubbleTheme: theme, bubbleCorners: bubbleCorners)
|
self.wallpaperBackgroundNode.updateBubbleTheme(bubbleTheme: theme, bubbleCorners: bubbleCorners)
|
||||||
transition.updateFrame(node: self.wallpaperBackgroundNode, frame: CGRect(origin: CGPoint(x: inset, y: 0.0), size: CGSize(width: size.width - inset * 2.0, height: size.height)))
|
transition.updateFrame(node: self.wallpaperBackgroundNode, frame: CGRect(origin: CGPoint(x: inset, y: 0.0), size: CGSize(width: size.width - inset * 2.0, height: size.height)))
|
||||||
self.wallpaperBackgroundNode.updateLayout(size: CGSize(width: size.width - inset * 2.0, height: size.height), tile: false, transition: transition)
|
self.wallpaperBackgroundNode.updateLayout(size: CGSize(width: size.width - inset * 2.0, height: size.height), displayMode: .aspectFill, transition: transition)
|
||||||
|
|
||||||
self.updateItems(transition: itemsTransition)
|
self.updateItems(transition: itemsTransition)
|
||||||
|
|
||||||
|
@ -285,7 +285,7 @@ private final class BubbleSettingsControllerNode: ASDisplayNode, UIScrollViewDel
|
|||||||
bottomInset = 37.0
|
bottomInset = 37.0
|
||||||
|
|
||||||
self.chatBackgroundNode.frame = chatFrame
|
self.chatBackgroundNode.frame = chatFrame
|
||||||
self.chatBackgroundNode.updateLayout(size: chatFrame.size, tile: false, transition: transition)
|
self.chatBackgroundNode.updateLayout(size: chatFrame.size, displayMode: .aspectFill, transition: transition)
|
||||||
self.messagesContainerNode.frame = chatFrame
|
self.messagesContainerNode.frame = chatFrame
|
||||||
|
|
||||||
transition.updateFrame(node: self.toolbarNode, frame: CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - toolbarHeight), size: CGSize(width: layout.size.width, height: toolbarHeight + layout.intrinsicInsets.bottom)))
|
transition.updateFrame(node: self.toolbarNode, frame: CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - toolbarHeight), size: CGSize(width: layout.size.width, height: toolbarHeight + layout.intrinsicInsets.bottom)))
|
||||||
|
@ -179,29 +179,11 @@ class ForwardPrivacyChatPreviewItemNode: ListViewItemNode {
|
|||||||
let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets)
|
let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets)
|
||||||
let layoutSize = layout.size
|
let layoutSize = layout.size
|
||||||
|
|
||||||
var authorNameCenter: CGFloat?
|
let attributedMeasureText = NSAttributedString(string: item.peerName, font: Font.regular(13.0), textColor: .black)
|
||||||
|
let (authorNameLayout, _) = makeTextLayout(TextNodeLayoutArguments(attributedString: attributedMeasureText, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets()))
|
||||||
|
|
||||||
let forwardedString = item.strings.Message_ForwardedMessageShort("").string
|
let authorNameWidth = authorNameLayout.size.width
|
||||||
var fromString: String?
|
let authorNameCenter = authorNameWidth / 2.0 + 3.0
|
||||||
if let newlineRange = forwardedString.range(of: "\n") {
|
|
||||||
let from = forwardedString[newlineRange.upperBound...]
|
|
||||||
if !from.isEmpty {
|
|
||||||
fromString = String(from)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let authorString = item.peerName
|
|
||||||
|
|
||||||
if let fromString = fromString {
|
|
||||||
var attributedMeasureText = NSAttributedString(string: fromString, font: Font.regular(13.0), textColor: .black)
|
|
||||||
let (fromTextLayout, _) = makeTextLayout(TextNodeLayoutArguments(attributedString: attributedMeasureText, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets()))
|
|
||||||
|
|
||||||
let fromWidth = fromTextLayout.size.width
|
|
||||||
attributedMeasureText = NSAttributedString(string: authorString, font: Font.regular(13.0), textColor: .black)
|
|
||||||
let (authorNameLayout, _) = makeTextLayout(TextNodeLayoutArguments(attributedString: attributedMeasureText, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets()))
|
|
||||||
|
|
||||||
let authorNameWidth = authorNameLayout.size.width
|
|
||||||
authorNameCenter = fromWidth + authorNameWidth / 2.0 + 3.0
|
|
||||||
}
|
|
||||||
|
|
||||||
return (layout, { [weak self] in
|
return (layout, { [weak self] in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
@ -264,11 +246,26 @@ class ForwardPrivacyChatPreviewItemNode: ListViewItemNode {
|
|||||||
|
|
||||||
let backgroundFrame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight)))
|
let backgroundFrame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight)))
|
||||||
|
|
||||||
|
let displayMode: WallpaperDisplayMode
|
||||||
|
if abs(params.availableHeight - params.width) < 100.0, params.availableHeight > 700.0 {
|
||||||
|
displayMode = .halfAspectFill
|
||||||
|
} else {
|
||||||
|
if backgroundFrame.width > backgroundFrame.height * 4.0 {
|
||||||
|
if params.availableHeight < 700.0 {
|
||||||
|
displayMode = .halfAspectFill
|
||||||
|
} else {
|
||||||
|
displayMode = .aspectFill
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
displayMode = .aspectFill
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let backgroundNode = strongSelf.backgroundNode {
|
if let backgroundNode = strongSelf.backgroundNode {
|
||||||
backgroundNode.frame = backgroundFrame.insetBy(dx: 0.0, dy: -100.0)
|
backgroundNode.frame = backgroundFrame.insetBy(dx: 0.0, dy: -100.0)
|
||||||
backgroundNode.update(wallpaper: item.wallpaper)
|
backgroundNode.update(wallpaper: item.wallpaper)
|
||||||
backgroundNode.updateBubbleTheme(bubbleTheme: item.theme, bubbleCorners: item.chatBubbleCorners)
|
backgroundNode.updateBubbleTheme(bubbleTheme: item.theme, bubbleCorners: item.chatBubbleCorners)
|
||||||
backgroundNode.updateLayout(size: backgroundNode.bounds.size, tile: false, transition: .immediate)
|
backgroundNode.updateLayout(size: backgroundNode.bounds.size, displayMode: displayMode, transition: .immediate)
|
||||||
}
|
}
|
||||||
|
|
||||||
strongSelf.maskNode.frame = backgroundFrame.insetBy(dx: params.leftInset, dy: 0.0)
|
strongSelf.maskNode.frame = backgroundFrame.insetBy(dx: params.leftInset, dy: 0.0)
|
||||||
@ -285,10 +282,8 @@ class ForwardPrivacyChatPreviewItemNode: ListViewItemNode {
|
|||||||
var sourceRect: CGRect
|
var sourceRect: CGRect
|
||||||
if let messageNode = strongSelf.messageNode as? ChatMessagePreviewItemNode, let forwardInfoNode = messageNode.forwardInfoReferenceNode {
|
if let messageNode = strongSelf.messageNode as? ChatMessagePreviewItemNode, let forwardInfoNode = messageNode.forwardInfoReferenceNode {
|
||||||
sourceRect = forwardInfoNode.convert(forwardInfoNode.bounds, to: strongSelf)
|
sourceRect = forwardInfoNode.convert(forwardInfoNode.bounds, to: strongSelf)
|
||||||
if let authorNameCenter = authorNameCenter {
|
sourceRect.origin = CGPoint(x: sourceRect.minX + authorNameCenter, y: sourceRect.minY)
|
||||||
sourceRect.origin = CGPoint(x: sourceRect.minX + authorNameCenter, y: sourceRect.minY)
|
sourceRect.size.width = 0.0
|
||||||
sourceRect.size.width = 0.0
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
sourceRect = CGRect(origin: CGPoint(x: layout.size.width / 2.0, y: layout.size.height / 2.0), size: CGSize())
|
sourceRect = CGRect(origin: CGPoint(x: layout.size.width / 2.0, y: layout.size.height / 2.0), size: CGSize())
|
||||||
}
|
}
|
||||||
|
@ -389,11 +389,26 @@ class ReactionChatPreviewItemNode: ListViewItemNode {
|
|||||||
|
|
||||||
let backgroundFrame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight)))
|
let backgroundFrame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight)))
|
||||||
|
|
||||||
|
let displayMode: WallpaperDisplayMode
|
||||||
|
if abs(params.availableHeight - params.width) < 100.0, params.availableHeight > 700.0 {
|
||||||
|
displayMode = .halfAspectFill
|
||||||
|
} else {
|
||||||
|
if backgroundFrame.width > backgroundFrame.height * 4.0 {
|
||||||
|
if params.availableHeight < 700.0 {
|
||||||
|
displayMode = .halfAspectFill
|
||||||
|
} else {
|
||||||
|
displayMode = .aspectFill
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
displayMode = .aspectFill
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let backgroundNode = strongSelf.backgroundNode {
|
if let backgroundNode = strongSelf.backgroundNode {
|
||||||
backgroundNode.frame = backgroundFrame.insetBy(dx: 0.0, dy: -100.0)
|
backgroundNode.frame = backgroundFrame.insetBy(dx: 0.0, dy: -100.0)
|
||||||
backgroundNode.update(wallpaper: item.wallpaper)
|
backgroundNode.update(wallpaper: item.wallpaper)
|
||||||
backgroundNode.updateBubbleTheme(bubbleTheme: item.theme, bubbleCorners: item.chatBubbleCorners)
|
backgroundNode.updateBubbleTheme(bubbleTheme: item.theme, bubbleCorners: item.chatBubbleCorners)
|
||||||
backgroundNode.updateLayout(size: backgroundNode.bounds.size, tile: false, transition: .immediate)
|
backgroundNode.updateLayout(size: backgroundNode.bounds.size, displayMode: displayMode, transition: .immediate)
|
||||||
}
|
}
|
||||||
|
|
||||||
strongSelf.maskNode.frame = backgroundFrame.insetBy(dx: params.leftInset, dy: 0.0)
|
strongSelf.maskNode.frame = backgroundFrame.insetBy(dx: params.leftInset, dy: 0.0)
|
||||||
|
@ -564,7 +564,7 @@ private final class TextSizeSelectionControllerNode: ASDisplayNode, UIScrollView
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.chatBackgroundNode.frame = chatFrame
|
self.chatBackgroundNode.frame = chatFrame
|
||||||
self.chatBackgroundNode.updateLayout(size: chatFrame.size, tile: false, transition: transition)
|
self.chatBackgroundNode.updateLayout(size: chatFrame.size, displayMode: .aspectFill, transition: transition)
|
||||||
self.messagesContainerNode.frame = chatFrame
|
self.messagesContainerNode.frame = chatFrame
|
||||||
|
|
||||||
transition.updateFrame(node: self.toolbarNode, frame: CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - toolbarHeight), size: CGSize(width: layout.size.width, height: toolbarHeight + layout.intrinsicInsets.bottom)))
|
transition.updateFrame(node: self.toolbarNode, frame: CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - toolbarHeight), size: CGSize(width: layout.size.width, height: toolbarHeight + layout.intrinsicInsets.bottom)))
|
||||||
|
@ -1198,7 +1198,7 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate
|
|||||||
transition.updateFrame(node: self.backgroundContainerNode, frame: CGRect(origin: CGPoint(), size: backgroundSize))
|
transition.updateFrame(node: self.backgroundContainerNode, frame: CGRect(origin: CGPoint(), size: backgroundSize))
|
||||||
|
|
||||||
transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(), size: layout.size))
|
transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(), size: layout.size))
|
||||||
self.backgroundNode.updateLayout(size: self.backgroundNode.bounds.size, tile: false, transition: transition)
|
self.backgroundNode.updateLayout(size: self.backgroundNode.bounds.size, displayMode: .aspectFill, transition: transition)
|
||||||
|
|
||||||
transition.updatePosition(node: self.backgroundWrapperNode, position: CGPoint(x: backgroundSize.width / 2.0, y: backgroundSize.height / 2.0))
|
transition.updatePosition(node: self.backgroundWrapperNode, position: CGPoint(x: backgroundSize.width / 2.0, y: backgroundSize.height / 2.0))
|
||||||
|
|
||||||
|
@ -712,11 +712,11 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate {
|
|||||||
|
|
||||||
self.messagesContainerNode.frame = self.chatContainerNode.bounds
|
self.messagesContainerNode.frame = self.chatContainerNode.bounds
|
||||||
self.instantChatBackgroundNode.frame = self.chatContainerNode.bounds
|
self.instantChatBackgroundNode.frame = self.chatContainerNode.bounds
|
||||||
self.instantChatBackgroundNode.updateLayout(size: self.instantChatBackgroundNode.bounds.size, tile: false, transition: .immediate)
|
self.instantChatBackgroundNode.updateLayout(size: self.instantChatBackgroundNode.bounds.size, displayMode: .aspectFill, transition: .immediate)
|
||||||
self.remoteChatBackgroundNode.frame = self.chatContainerNode.bounds
|
self.remoteChatBackgroundNode.frame = self.chatContainerNode.bounds
|
||||||
self.blurredNode.frame = self.chatContainerNode.bounds
|
self.blurredNode.frame = self.chatContainerNode.bounds
|
||||||
self.wallpaperNode.frame = self.chatContainerNode.bounds
|
self.wallpaperNode.frame = self.chatContainerNode.bounds
|
||||||
self.wallpaperNode.updateLayout(size: self.wallpaperNode.bounds.size, tile: false, transition: .immediate)
|
self.wallpaperNode.updateLayout(size: self.wallpaperNode.bounds.size, displayMode: .aspectFill, transition: .immediate)
|
||||||
|
|
||||||
transition.updateFrame(node: self.toolbarNode, frame: CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - toolbarHeight), size: CGSize(width: layout.size.width, height: toolbarHeight)))
|
transition.updateFrame(node: self.toolbarNode, frame: CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - toolbarHeight), size: CGSize(width: layout.size.width, height: toolbarHeight)))
|
||||||
self.toolbarNode.updateLayout(size: CGSize(width: layout.size.width, height: 49.0), layout: layout, transition: transition)
|
self.toolbarNode.updateLayout(size: CGSize(width: layout.size.width, height: 49.0), layout: layout, transition: transition)
|
||||||
|
@ -265,9 +265,25 @@ class ThemeSettingsChatPreviewItemNode: ListViewItemNode {
|
|||||||
strongSelf.maskNode.image = hasCorners ? PresentationResourcesItemList.cornersImage(item.componentTheme, top: hasTopCorners, bottom: hasBottomCorners) : nil
|
strongSelf.maskNode.image = hasCorners ? PresentationResourcesItemList.cornersImage(item.componentTheme, top: hasTopCorners, bottom: hasBottomCorners) : nil
|
||||||
|
|
||||||
let backgroundFrame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight)))
|
let backgroundFrame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight)))
|
||||||
|
|
||||||
|
let displayMode: WallpaperDisplayMode
|
||||||
|
if abs(params.availableHeight - params.width) < 100.0, params.availableHeight > 700.0 {
|
||||||
|
displayMode = .halfAspectFill
|
||||||
|
} else {
|
||||||
|
if backgroundFrame.width > backgroundFrame.height * 4.0 {
|
||||||
|
if params.availableHeight < 700.0 {
|
||||||
|
displayMode = .halfAspectFill
|
||||||
|
} else {
|
||||||
|
displayMode = .aspectFill
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
displayMode = .aspectFill
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let backgroundNode = strongSelf.backgroundNode {
|
if let backgroundNode = strongSelf.backgroundNode {
|
||||||
backgroundNode.frame = backgroundFrame.insetBy(dx: 0.0, dy: -100.0)
|
backgroundNode.frame = backgroundFrame.insetBy(dx: 0.0, dy: -100.0)
|
||||||
backgroundNode.updateLayout(size: backgroundNode.bounds.size, tile: false, transition: .immediate)
|
backgroundNode.updateLayout(size: backgroundNode.bounds.size, displayMode: displayMode, transition: .immediate)
|
||||||
}
|
}
|
||||||
strongSelf.maskNode.frame = backgroundFrame.insetBy(dx: params.leftInset, dy: 0.0)
|
strongSelf.maskNode.frame = backgroundFrame.insetBy(dx: params.leftInset, dy: 0.0)
|
||||||
strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: layoutSize.width, height: separatorHeight))
|
strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: layoutSize.width, height: separatorHeight))
|
||||||
|
@ -1169,7 +1169,15 @@ final class WallpaperGalleryItemNode: GalleryItemNode {
|
|||||||
if self.cropNode.supernode == nil {
|
if self.cropNode.supernode == nil {
|
||||||
self.imageNode.frame = self.wrapperNode.bounds
|
self.imageNode.frame = self.wrapperNode.bounds
|
||||||
self.nativeNode.frame = self.wrapperNode.bounds
|
self.nativeNode.frame = self.wrapperNode.bounds
|
||||||
self.nativeNode.updateLayout(size: self.nativeNode.bounds.size, tile: false, transition: .immediate)
|
|
||||||
|
let displayMode: WallpaperDisplayMode
|
||||||
|
if case .regular = layout.metrics.widthClass {
|
||||||
|
displayMode = .aspectFit
|
||||||
|
} else {
|
||||||
|
displayMode = .aspectFill
|
||||||
|
}
|
||||||
|
|
||||||
|
self.nativeNode.updateLayout(size: self.nativeNode.bounds.size, displayMode: displayMode, transition: .immediate)
|
||||||
self.blurredNode.frame = self.imageNode.frame
|
self.blurredNode.frame = self.imageNode.frame
|
||||||
} else {
|
} else {
|
||||||
self.cropNode.frame = self.wrapperNode.bounds
|
self.cropNode.frame = self.wrapperNode.bounds
|
||||||
|
@ -1625,7 +1625,7 @@ final class MessageStoryRenderer {
|
|||||||
let size = layout.size
|
let size = layout.size
|
||||||
self.containerNode.frame = CGRect(origin: CGPoint(), size: layout.size)
|
self.containerNode.frame = CGRect(origin: CGPoint(), size: layout.size)
|
||||||
self.instantChatBackgroundNode.frame = CGRect(origin: CGPoint(), size: layout.size)
|
self.instantChatBackgroundNode.frame = CGRect(origin: CGPoint(), size: layout.size)
|
||||||
self.instantChatBackgroundNode.updateLayout(size: size, tile: false, transition: .immediate)
|
self.instantChatBackgroundNode.updateLayout(size: size, displayMode: .aspectFill, transition: .immediate)
|
||||||
self.messagesContainerNode.frame = CGRect(origin: CGPoint(), size: layout.size)
|
self.messagesContainerNode.frame = CGRect(origin: CGPoint(), size: layout.size)
|
||||||
|
|
||||||
let addressLayout = self.addressNode.updateLayout(size)
|
let addressLayout = self.addressNode.updateLayout(size)
|
||||||
|
@ -1469,11 +1469,11 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate {
|
|||||||
|
|
||||||
transition.updateFrame(node: self.backgroundNode, frame: contentBounds)
|
transition.updateFrame(node: self.backgroundNode, frame: contentBounds)
|
||||||
|
|
||||||
var shouldTile = false
|
var displayMode: WallpaperDisplayMode = .aspectFill
|
||||||
if case .regular = layout.metrics.widthClass, layout.size.height == layout.deviceMetrics.screenSize.width {
|
if case .regular = layout.metrics.widthClass, layout.size.height == layout.deviceMetrics.screenSize.width {
|
||||||
shouldTile = true
|
displayMode = .aspectFit
|
||||||
}
|
}
|
||||||
self.backgroundNode.updateLayout(size: contentBounds.size, tile: shouldTile, transition: transition)
|
self.backgroundNode.updateLayout(size: contentBounds.size, displayMode: displayMode, transition: transition)
|
||||||
|
|
||||||
transition.updateBounds(node: self.historyNodeContainer, bounds: contentBounds)
|
transition.updateBounds(node: self.historyNodeContainer, bounds: contentBounds)
|
||||||
transition.updatePosition(node: self.historyNodeContainer, position: contentBounds.center)
|
transition.updatePosition(node: self.historyNodeContainer, position: contentBounds.center)
|
||||||
|
@ -1852,7 +1852,14 @@ private class QrContentNode: ASDisplayNode, ContentNode {
|
|||||||
transition.updateFrame(node: self.containerNode, frame: CGRect(origin: CGPoint(), size: size))
|
transition.updateFrame(node: self.containerNode, frame: CGRect(origin: CGPoint(), size: size))
|
||||||
|
|
||||||
transition.updateFrame(node: self.wallpaperBackgroundNode, frame: CGRect(origin: CGPoint(), size: size))
|
transition.updateFrame(node: self.wallpaperBackgroundNode, frame: CGRect(origin: CGPoint(), size: size))
|
||||||
self.wallpaperBackgroundNode.updateLayout(size: size, tile: false, transition: transition)
|
|
||||||
|
let displayMode: WallpaperDisplayMode
|
||||||
|
if max(size.width, size.height) > 1000.0 {
|
||||||
|
displayMode = .aspectFit
|
||||||
|
} else {
|
||||||
|
displayMode = .aspectFill
|
||||||
|
}
|
||||||
|
self.wallpaperBackgroundNode.updateLayout(size: size, displayMode: displayMode, transition: transition)
|
||||||
|
|
||||||
let textLength = self.codeTextNode.attributedText?.string.count ?? 0
|
let textLength = self.codeTextNode.attributedText?.string.count ?? 0
|
||||||
|
|
||||||
@ -2195,7 +2202,7 @@ private class MessageContentNode: ASDisplayNode, ContentNode {
|
|||||||
transition.updateFrame(node: self.containerNode, frame: CGRect(origin: CGPoint(), size: size))
|
transition.updateFrame(node: self.containerNode, frame: CGRect(origin: CGPoint(), size: size))
|
||||||
|
|
||||||
transition.updateFrame(node: self.wallpaperBackgroundNode, frame: CGRect(origin: CGPoint(), size: size))
|
transition.updateFrame(node: self.wallpaperBackgroundNode, frame: CGRect(origin: CGPoint(), size: size))
|
||||||
self.wallpaperBackgroundNode.updateLayout(size: size, tile: false, transition: transition)
|
self.wallpaperBackgroundNode.updateLayout(size: size, displayMode: .aspectFill, transition: transition)
|
||||||
|
|
||||||
let inset: CGFloat = 24.0
|
let inset: CGFloat = 24.0
|
||||||
let contentInset: CGFloat = 16.0
|
let contentInset: CGFloat = 16.0
|
||||||
|
@ -666,7 +666,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
|
|||||||
let cleanInsets = layout.insets(options: [])
|
let cleanInsets = layout.insets(options: [])
|
||||||
|
|
||||||
transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(), size: layout.size))
|
transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(), size: layout.size))
|
||||||
self.backgroundNode.updateLayout(size: self.backgroundNode.bounds.size, tile: false, transition: transition)
|
self.backgroundNode.updateLayout(size: self.backgroundNode.bounds.size, displayMode: .aspectFill, transition: transition)
|
||||||
|
|
||||||
let intrinsicPanelHeight: CGFloat = 47.0
|
let intrinsicPanelHeight: CGFloat = 47.0
|
||||||
let panelHeight = intrinsicPanelHeight + cleanInsets.bottom
|
let panelHeight = intrinsicPanelHeight + cleanInsets.bottom
|
||||||
|
@ -138,7 +138,7 @@ final class MetalWallpaperBackgroundNode: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateLayout(size: CGSize, tile: Bool, transition: ContainedViewLayoutTransition) {
|
func updateLayout(size: CGSize, displayMode: WallpaperDisplayMode, transition: ContainedViewLayoutTransition) {
|
||||||
if self.metalLayer.drawableSize != size {
|
if self.metalLayer.drawableSize != size {
|
||||||
self.metalLayer.drawableSize = size
|
self.metalLayer.drawableSize = size
|
||||||
|
|
||||||
|
@ -54,13 +54,30 @@ public protocol WallpaperBubbleBackgroundNode: ASDisplayNode {
|
|||||||
func offsetSpring(value: CGFloat, duration: Double, damping: CGFloat)
|
func offsetSpring(value: CGFloat, duration: Double, damping: CGFloat)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum WallpaperDisplayMode {
|
||||||
|
case aspectFill
|
||||||
|
case aspectFit
|
||||||
|
case halfAspectFill
|
||||||
|
|
||||||
|
var argumentsDisplayMode: PatternWallpaperArguments.DisplayMode {
|
||||||
|
switch self {
|
||||||
|
case .aspectFill:
|
||||||
|
return .aspectFill
|
||||||
|
case .aspectFit:
|
||||||
|
return .aspectFit
|
||||||
|
case .halfAspectFill:
|
||||||
|
return .halfAspectFill
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public protocol WallpaperBackgroundNode: ASDisplayNode {
|
public protocol WallpaperBackgroundNode: ASDisplayNode {
|
||||||
var isReady: Signal<Bool, NoError> { get }
|
var isReady: Signal<Bool, NoError> { get }
|
||||||
var rotation: CGFloat { get set }
|
var rotation: CGFloat { get set }
|
||||||
|
|
||||||
func update(wallpaper: TelegramWallpaper)
|
func update(wallpaper: TelegramWallpaper)
|
||||||
func _internalUpdateIsSettingUpWallpaper()
|
func _internalUpdateIsSettingUpWallpaper()
|
||||||
func updateLayout(size: CGSize, tile: Bool, transition: ContainedViewLayoutTransition)
|
func updateLayout(size: CGSize, displayMode: WallpaperDisplayMode, transition: ContainedViewLayoutTransition)
|
||||||
func updateIsLooping(_ isLooping: Bool)
|
func updateIsLooping(_ isLooping: Bool)
|
||||||
func animateEvent(transition: ContainedViewLayoutTransition, extendAnimation: Bool)
|
func animateEvent(transition: ContainedViewLayoutTransition, extendAnimation: Bool)
|
||||||
func updateBubbleTheme(bubbleTheme: PresentationTheme, bubbleCorners: PresentationChatBubbleCorners)
|
func updateBubbleTheme(bubbleTheme: PresentationTheme, bubbleCorners: PresentationChatBubbleCorners)
|
||||||
@ -599,7 +616,7 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
|
|
||||||
private let bakedBackgroundView: UIImageView
|
private let bakedBackgroundView: UIImageView
|
||||||
|
|
||||||
private var validLayout: (CGSize, Bool)?
|
private var validLayout: (CGSize, WallpaperDisplayMode)?
|
||||||
private var wallpaper: TelegramWallpaper?
|
private var wallpaper: TelegramWallpaper?
|
||||||
private var isSettingUpWallpaper: Bool = false
|
private var isSettingUpWallpaper: Bool = false
|
||||||
|
|
||||||
@ -884,8 +901,8 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let (size, tile) = self.validLayout {
|
if let (size, displayMode) = self.validLayout {
|
||||||
self.updateLayout(size: size, tile: tile, transition: .immediate)
|
self.updateLayout(size: size, displayMode: displayMode, transition: .immediate)
|
||||||
self.updateBubbles()
|
self.updateBubbles()
|
||||||
|
|
||||||
if scheduleLoopingEvent {
|
if scheduleLoopingEvent {
|
||||||
@ -953,7 +970,7 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func loadPatternForSizeIfNeeded(size: CGSize, tile: Bool, transition: ContainedViewLayoutTransition) {
|
private func loadPatternForSizeIfNeeded(size: CGSize, displayMode: WallpaperDisplayMode, transition: ContainedViewLayoutTransition) {
|
||||||
guard let wallpaper = self.wallpaper else {
|
guard let wallpaper = self.wallpaper else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -1024,8 +1041,8 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
|
|
||||||
strongSelf.validPatternImage = ValidPatternImage(wallpaper: wallpaper, invertPattern: invertPattern, generate: generator)
|
strongSelf.validPatternImage = ValidPatternImage(wallpaper: wallpaper, invertPattern: invertPattern, generate: generator)
|
||||||
strongSelf.validPatternGeneratedImage = nil
|
strongSelf.validPatternGeneratedImage = nil
|
||||||
if let (size, tile) = strongSelf.validLayout {
|
if let (size, displayMode) = strongSelf.validLayout {
|
||||||
strongSelf.loadPatternForSizeIfNeeded(size: size, tile: tile, transition: .immediate)
|
strongSelf.loadPatternForSizeIfNeeded(size: size, displayMode: displayMode, transition: .immediate)
|
||||||
} else {
|
} else {
|
||||||
strongSelf._isReady.set(true)
|
strongSelf._isReady.set(true)
|
||||||
}
|
}
|
||||||
@ -1067,7 +1084,7 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
self.patternImageLayer.suspendCompositionUpdates = false
|
self.patternImageLayer.suspendCompositionUpdates = false
|
||||||
self.patternImageLayer.updateCompositionIfNeeded()
|
self.patternImageLayer.updateCompositionIfNeeded()
|
||||||
} else {
|
} else {
|
||||||
let patternArguments = TransformImageArguments(corners: ImageCorners(), imageSize: size, boundingSize: size, intrinsicInsets: UIEdgeInsets(), custom: PatternWallpaperArguments(colors: [patternBackgroundColor], rotation: nil, customPatternColor: patternColor, preview: false, tile: tile), scale: min(2.0, UIScreenScale))
|
let patternArguments = TransformImageArguments(corners: ImageCorners(), imageSize: size, boundingSize: size, intrinsicInsets: UIEdgeInsets(), custom: PatternWallpaperArguments(colors: [patternBackgroundColor], rotation: nil, customPatternColor: patternColor, preview: false, displayMode: displayMode.argumentsDisplayMode), scale: min(2.0, UIScreenScale))
|
||||||
if self.useSharedAnimationPhase || self.patternImageLayer.contents == nil {
|
if self.useSharedAnimationPhase || self.patternImageLayer.contents == nil {
|
||||||
if let drawingContext = validPatternImage.generate(patternArguments) {
|
if let drawingContext = validPatternImage.generate(patternArguments) {
|
||||||
if let image = drawingContext.generateImage() {
|
if let image = drawingContext.generateImage() {
|
||||||
@ -1121,9 +1138,9 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
transition.updateFrame(layer: self.patternImageLayer, frame: CGRect(origin: CGPoint(), size: size))
|
transition.updateFrame(layer: self.patternImageLayer, frame: CGRect(origin: CGPoint(), size: size))
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateLayout(size: CGSize, tile: Bool, transition: ContainedViewLayoutTransition) {
|
func updateLayout(size: CGSize, displayMode: WallpaperDisplayMode, transition: ContainedViewLayoutTransition) {
|
||||||
let isFirstLayout = self.validLayout == nil
|
let isFirstLayout = self.validLayout == nil
|
||||||
self.validLayout = (size, tile)
|
self.validLayout = (size, displayMode)
|
||||||
|
|
||||||
if let blurredBackgroundPortalSourceView = self.blurredBackgroundPortalSourceView {
|
if let blurredBackgroundPortalSourceView = self.blurredBackgroundPortalSourceView {
|
||||||
transition.updateFrame(view: blurredBackgroundPortalSourceView, frame: CGRect(origin: CGPoint(), size: size))
|
transition.updateFrame(view: blurredBackgroundPortalSourceView, frame: CGRect(origin: CGPoint(), size: size))
|
||||||
@ -1151,7 +1168,7 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
outgoingBubbleGradientBackgroundNode.updateLayout(size: size, transition: transition, extendAnimation: false, backwards: false, completion: {})
|
outgoingBubbleGradientBackgroundNode.updateLayout(size: size, transition: transition, extendAnimation: false, backwards: false, completion: {})
|
||||||
}
|
}
|
||||||
|
|
||||||
self.loadPatternForSizeIfNeeded(size: size, tile: tile, transition: transition)
|
self.loadPatternForSizeIfNeeded(size: size, displayMode: displayMode, transition: transition)
|
||||||
|
|
||||||
/*for (animationNode, relativePosition) in self.inlineAnimationNodes {
|
/*for (animationNode, relativePosition) in self.inlineAnimationNodes {
|
||||||
let sizeNorm = CGSize(width: 1440, height: 2960)
|
let sizeNorm = CGSize(width: 1440, height: 2960)
|
||||||
@ -2021,7 +2038,7 @@ final class WallpaperBackgroundNodeMergedImpl: ASDisplayNode, WallpaperBackgroun
|
|||||||
self.isSettingUpWallpaper = true
|
self.isSettingUpWallpaper = true
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateLayout(size: CGSize, tile: Bool, transition: ContainedViewLayoutTransition) {
|
func updateLayout(size: CGSize, displayMode: WallpaperDisplayMode, transition: ContainedViewLayoutTransition) {
|
||||||
self.validLayout = size
|
self.validLayout = size
|
||||||
|
|
||||||
self.staticView.frame = CGRect(origin: CGPoint(), size: size)
|
self.staticView.frame = CGRect(origin: CGPoint(), size: size)
|
||||||
|
@ -336,20 +336,25 @@ public enum PatternWallpaperDrawMode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public struct PatternWallpaperArguments: TransformImageCustomArguments {
|
public struct PatternWallpaperArguments: TransformImageCustomArguments {
|
||||||
|
public enum DisplayMode: Int32 {
|
||||||
|
case aspectFill
|
||||||
|
case aspectFit
|
||||||
|
case halfAspectFill
|
||||||
|
}
|
||||||
let colors: [UIColor]
|
let colors: [UIColor]
|
||||||
let rotation: Int32?
|
let rotation: Int32?
|
||||||
let preview: Bool
|
let preview: Bool
|
||||||
let customPatternColor: UIColor?
|
let customPatternColor: UIColor?
|
||||||
let bakePatternAlpha: CGFloat
|
let bakePatternAlpha: CGFloat
|
||||||
let tile: Bool
|
let displayMode: DisplayMode
|
||||||
|
|
||||||
public init(colors: [UIColor], rotation: Int32?, customPatternColor: UIColor? = nil, preview: Bool = false, bakePatternAlpha: CGFloat = 1.0, tile: Bool = false) {
|
public init(colors: [UIColor], rotation: Int32?, customPatternColor: UIColor? = nil, preview: Bool = false, bakePatternAlpha: CGFloat = 1.0, displayMode: DisplayMode = .aspectFill) {
|
||||||
self.colors = colors
|
self.colors = colors
|
||||||
self.rotation = rotation
|
self.rotation = rotation
|
||||||
self.customPatternColor = customPatternColor
|
self.customPatternColor = customPatternColor
|
||||||
self.preview = preview
|
self.preview = preview
|
||||||
self.bakePatternAlpha = bakePatternAlpha
|
self.bakePatternAlpha = bakePatternAlpha
|
||||||
self.tile = tile
|
self.displayMode = displayMode
|
||||||
}
|
}
|
||||||
|
|
||||||
public func serialized() -> NSArray {
|
public func serialized() -> NSArray {
|
||||||
@ -361,7 +366,7 @@ public struct PatternWallpaperArguments: TransformImageCustomArguments {
|
|||||||
}
|
}
|
||||||
array.add(NSNumber(value: self.preview))
|
array.add(NSNumber(value: self.preview))
|
||||||
array.add(NSNumber(value: Double(self.bakePatternAlpha)))
|
array.add(NSNumber(value: Double(self.bakePatternAlpha)))
|
||||||
array.add(NSNumber(value: self.tile))
|
array.add(NSNumber(value: self.displayMode.rawValue))
|
||||||
return array
|
return array
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -542,13 +547,13 @@ private func patternWallpaperImageInternal(fullSizeData: Data?, fullSizeComplete
|
|||||||
c.restoreGState()
|
c.restoreGState()
|
||||||
}
|
}
|
||||||
|
|
||||||
let tile = customArguments.tile
|
let displayMode = customArguments.displayMode
|
||||||
let overlayImage = generateImage(arguments.drawingRect.size, rotatedContext: { size, c in
|
let overlayImage = generateImage(arguments.drawingRect.size, rotatedContext: { size, c in
|
||||||
c.clear(CGRect(origin: CGPoint(), size: size))
|
c.clear(CGRect(origin: CGPoint(), size: size))
|
||||||
var image: UIImage?
|
var image: UIImage?
|
||||||
if let fullSizeData = fullSizeData {
|
if let fullSizeData = fullSizeData {
|
||||||
if mode == .screen {
|
if mode == .screen {
|
||||||
image = renderPreparedImage(fullSizeData, CGSize(width: size.width * context.scale, height: size.height * context.scale), .black, 1.0, tile)
|
image = renderPreparedImage(fullSizeData, CGSize(width: size.width * context.scale, height: size.height * context.scale), .black, 1.0, displayMode != .aspectFill)
|
||||||
} else {
|
} else {
|
||||||
image = UIImage(data: fullSizeData)
|
image = UIImage(data: fullSizeData)
|
||||||
}
|
}
|
||||||
@ -570,10 +575,14 @@ private func patternWallpaperImageInternal(fullSizeData: Data?, fullSizeComplete
|
|||||||
if abs(fittedSize.height - arguments.boundingSize.height).isLessThanOrEqualTo(CGFloat(1.0)) {
|
if abs(fittedSize.height - arguments.boundingSize.height).isLessThanOrEqualTo(CGFloat(1.0)) {
|
||||||
fittedSize.height = arguments.boundingSize.height
|
fittedSize.height = arguments.boundingSize.height
|
||||||
}
|
}
|
||||||
if tile {
|
switch displayMode {
|
||||||
fittedSize = fittedSize.aspectFitted(arguments.drawingRect.size)
|
case .aspectFill:
|
||||||
} else {
|
|
||||||
fittedSize = fittedSize.aspectFilled(arguments.drawingRect.size)
|
fittedSize = fittedSize.aspectFilled(arguments.drawingRect.size)
|
||||||
|
case .halfAspectFill:
|
||||||
|
fittedSize = fittedSize.aspectFilled(arguments.drawingRect.size)
|
||||||
|
fittedSize = CGSize(width: fittedSize.width * 0.5, height: fittedSize.height * 0.5)
|
||||||
|
case .aspectFit:
|
||||||
|
fittedSize = fittedSize.aspectFitted(arguments.drawingRect.size)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.interpolationQuality = customArguments.preview ? .low : .medium
|
c.interpolationQuality = customArguments.preview ? .low : .medium
|
||||||
@ -611,16 +620,18 @@ private func patternWallpaperImageInternal(fullSizeData: Data?, fullSizeComplete
|
|||||||
c.restoreGState()
|
c.restoreGState()
|
||||||
}
|
}
|
||||||
|
|
||||||
if tile {
|
switch displayMode {
|
||||||
|
case .aspectFit, .halfAspectFill:
|
||||||
var fittedRect = CGRect(origin: CGPoint(x: drawingRect.origin.x, y: drawingRect.origin.y + (drawingRect.size.height - fittedSize.height) / 2.0), size: fittedSize)
|
var fittedRect = CGRect(origin: CGPoint(x: drawingRect.origin.x, y: drawingRect.origin.y + (drawingRect.size.height - fittedSize.height) / 2.0), size: fittedSize)
|
||||||
drawTile(fittedRect)
|
drawTile(fittedRect)
|
||||||
fittedRect = fittedRect.offsetBy(dx: fittedSize.width, dy: 0.0)
|
while (fittedRect.maxX < size.width) {
|
||||||
drawTile(fittedRect)
|
fittedRect = fittedRect.offsetBy(dx: fittedSize.width, dy: 0.0)
|
||||||
} else {
|
drawTile(fittedRect)
|
||||||
|
}
|
||||||
|
case .aspectFill:
|
||||||
let fittedRect = CGRect(origin: CGPoint(x: drawingRect.origin.x + (drawingRect.size.width - fittedSize.width) / 2.0, y: drawingRect.origin.y + (drawingRect.size.height - fittedSize.height) / 2.0), size: fittedSize)
|
let fittedRect = CGRect(origin: CGPoint(x: drawingRect.origin.x + (drawingRect.size.width - fittedSize.width) / 2.0, y: drawingRect.origin.y + (drawingRect.size.height - fittedSize.height) / 2.0), size: fittedSize)
|
||||||
drawTile(fittedRect)
|
drawTile(fittedRect)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
if let customPatternColor = customArguments.customPatternColor, customPatternColor.alpha < 1.0 {
|
if let customPatternColor = customArguments.customPatternColor, customPatternColor.alpha < 1.0 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user