mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-22 14:20:20 +00:00
Various theme improvements
This commit is contained in:
@@ -13,42 +13,64 @@ private let itemSize = CGSize(width: 88.0, height: 88.0)
|
||||
private let inset: CGFloat = 12.0
|
||||
|
||||
final class WallpaperPatternPanelNode: ASDisplayNode {
|
||||
private let theme: PresentationTheme
|
||||
private let context: AccountContext
|
||||
private var theme: PresentationTheme
|
||||
|
||||
private let backgroundNode: ASDisplayNode
|
||||
private let topSeparatorNode: ASDisplayNode
|
||||
|
||||
private let scrollNode: ASScrollNode
|
||||
|
||||
private let labelNode: ASTextNode
|
||||
private let titleNode: ImmediateTextNode
|
||||
private let labelNode: ImmediateTextNode
|
||||
private var sliderView: TGPhotoEditorSliderView?
|
||||
|
||||
private var disposable: Disposable?
|
||||
private var wallpapers: [TelegramWallpaper] = []
|
||||
var wallpapers: [TelegramWallpaper] = []
|
||||
private var currentWallpaper: TelegramWallpaper?
|
||||
|
||||
var patternChanged: ((TelegramWallpaper, Int32?, Bool) -> Void)?
|
||||
var serviceBackgroundColor: UIColor = UIColor(rgb: 0x748698) {
|
||||
didSet {
|
||||
guard let nodes = self.scrollNode.subnodes else {
|
||||
return
|
||||
}
|
||||
for case let node as SettingsThemeWallpaperNode in nodes {
|
||||
node.setOverlayBackgroundColor(self.serviceBackgroundColor.withAlphaComponent(0.4))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private var validLayout: CGSize?
|
||||
|
||||
var patternChanged: ((TelegramWallpaper?, Int32?, Bool) -> Void)?
|
||||
|
||||
init(context: AccountContext, theme: PresentationTheme, strings: PresentationStrings) {
|
||||
self.context = context
|
||||
self.theme = theme
|
||||
|
||||
self.backgroundNode = ASDisplayNode()
|
||||
self.backgroundNode.backgroundColor = theme.chat.inputPanel.panelBackgroundColor
|
||||
self.backgroundNode.backgroundColor = self.theme.chat.inputPanel.panelBackgroundColor
|
||||
|
||||
self.topSeparatorNode = ASDisplayNode()
|
||||
self.topSeparatorNode.backgroundColor = theme.chat.inputPanel.panelSeparatorColor
|
||||
self.topSeparatorNode.backgroundColor = self.theme.chat.inputPanel.panelSeparatorColor
|
||||
|
||||
self.scrollNode = ASScrollNode()
|
||||
|
||||
self.labelNode = ASTextNode()
|
||||
self.titleNode = ImmediateTextNode()
|
||||
self.titleNode.attributedText = NSAttributedString(string: strings.WallpaperPreview_PatternTitle, font: Font.bold(17.0), textColor: theme.rootController.navigationBar.primaryTextColor)
|
||||
|
||||
self.labelNode = ImmediateTextNode()
|
||||
self.labelNode.attributedText = NSAttributedString(string: strings.WallpaperPreview_PatternIntensity, font: Font.regular(14.0), textColor: theme.rootController.navigationBar.primaryTextColor)
|
||||
|
||||
super.init()
|
||||
|
||||
self.allowsGroupOpacity = true
|
||||
|
||||
self.addSubnode(self.backgroundNode)
|
||||
self.addSubnode(self.topSeparatorNode)
|
||||
self.addSubnode(self.scrollNode)
|
||||
|
||||
self.addSubnode(self.titleNode)
|
||||
self.addSubnode(self.labelNode)
|
||||
|
||||
self.disposable = ((telegramWallpapers(postbox: context.account.postbox, network: context.account.network)
|
||||
@@ -63,46 +85,8 @@ final class WallpaperPatternPanelNode: ASDisplayNode {
|
||||
}
|
||||
|> deliverOnMainQueue).start(next: { [weak self] wallpapers in
|
||||
if let strongSelf = self {
|
||||
if let subnodes = strongSelf.scrollNode.subnodes {
|
||||
for node in subnodes {
|
||||
node.removeFromSupernode()
|
||||
}
|
||||
}
|
||||
|
||||
var selected = true
|
||||
for wallpaper in wallpapers {
|
||||
let node = SettingsThemeWallpaperNode(overlayBackgroundColor: UIColor(rgb: 0x748698, alpha: 0.4))
|
||||
node.clipsToBounds = true
|
||||
node.cornerRadius = 5.0
|
||||
|
||||
var updatedWallpaper = wallpaper
|
||||
if case let .file(file) = updatedWallpaper {
|
||||
let settings = WallpaperSettings(blur: false, motion: false, color: 0xd6e2ee, intensity: 100)
|
||||
updatedWallpaper = .file(id: file.id, accessHash: file.accessHash, isCreator: file.isCreator, isDefault: file.isDefault, isPattern: file.isPattern, isDark: file.isDark, slug: file.slug, file: file.file, settings: settings)
|
||||
}
|
||||
|
||||
node.setWallpaper(context: context, wallpaper: updatedWallpaper, selected: selected, size: itemSize)
|
||||
node.pressed = { [weak self, weak node] in
|
||||
if let strongSelf = self {
|
||||
strongSelf.currentWallpaper = updatedWallpaper
|
||||
if let sliderView = strongSelf.sliderView {
|
||||
strongSelf.patternChanged?(updatedWallpaper, Int32(sliderView.value), false)
|
||||
}
|
||||
if let subnodes = strongSelf.scrollNode.subnodes {
|
||||
for case let subnode as SettingsThemeWallpaperNode in subnodes {
|
||||
subnode.setSelected(node === subnode, animated: true)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
strongSelf.scrollNode.addSubnode(node)
|
||||
|
||||
selected = false
|
||||
}
|
||||
strongSelf.scrollNode.view.contentSize = CGSize(width: (itemSize.width + inset) * CGFloat(wallpapers.count) + inset, height: 112.0)
|
||||
strongSelf.layoutItemNodes(transition: .immediate)
|
||||
|
||||
strongSelf.wallpapers = wallpapers
|
||||
strongSelf.updateWallpapers()
|
||||
}
|
||||
}))
|
||||
}
|
||||
@@ -135,6 +119,66 @@ final class WallpaperPatternPanelNode: ASDisplayNode {
|
||||
self.sliderView = sliderView
|
||||
}
|
||||
|
||||
func updateWallpapers() {
|
||||
guard let subnodes = self.scrollNode.subnodes else {
|
||||
return
|
||||
}
|
||||
|
||||
for node in subnodes {
|
||||
node.removeFromSupernode()
|
||||
}
|
||||
|
||||
var selected = true
|
||||
for wallpaper in wallpapers {
|
||||
let node = SettingsThemeWallpaperNode(overlayBackgroundColor: UIColor(rgb: 0x748698, alpha: 0.4))
|
||||
node.clipsToBounds = true
|
||||
node.cornerRadius = 5.0
|
||||
|
||||
var updatedWallpaper = wallpaper
|
||||
if case let .file(file) = updatedWallpaper {
|
||||
let settings = WallpaperSettings(blur: false, motion: false, color: 0xd6e2ee, intensity: 100)
|
||||
updatedWallpaper = .file(id: file.id, accessHash: file.accessHash, isCreator: file.isCreator, isDefault: file.isDefault, isPattern: file.isPattern, isDark: file.isDark, slug: file.slug, file: file.file, settings: settings)
|
||||
}
|
||||
|
||||
node.setWallpaper(context: self.context, wallpaper: updatedWallpaper, selected: selected, size: itemSize)
|
||||
node.pressed = { [weak self, weak node] in
|
||||
if let strongSelf = self {
|
||||
strongSelf.currentWallpaper = updatedWallpaper
|
||||
if let sliderView = strongSelf.sliderView {
|
||||
strongSelf.patternChanged?(updatedWallpaper, Int32(sliderView.value), false)
|
||||
}
|
||||
if let subnodes = strongSelf.scrollNode.subnodes {
|
||||
for case let subnode as SettingsThemeWallpaperNode in subnodes {
|
||||
subnode.setSelected(node === subnode, animated: true)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
self.scrollNode.addSubnode(node)
|
||||
|
||||
selected = false
|
||||
}
|
||||
|
||||
self.scrollNode.view.contentSize = CGSize(width: (itemSize.width + inset) * CGFloat(wallpapers.count) + inset, height: 112.0)
|
||||
self.layoutItemNodes(transition: .immediate)
|
||||
}
|
||||
|
||||
func updateTheme(_ theme: PresentationTheme) {
|
||||
self.theme = theme
|
||||
|
||||
self.backgroundNode.backgroundColor = self.theme.chat.inputPanel.panelBackgroundColor
|
||||
self.topSeparatorNode.backgroundColor = self.theme.chat.inputPanel.panelSeparatorColor
|
||||
|
||||
self.sliderView?.backColor = self.theme.list.disclosureArrowColor
|
||||
self.sliderView?.trackColor = self.theme.list.itemAccentColor
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.labelNode.attributedText?.string ?? "", font: Font.bold(17.0), textColor: self.theme.rootController.navigationBar.primaryTextColor)
|
||||
self.labelNode.attributedText = NSAttributedString(string: self.labelNode.attributedText?.string ?? "", font: Font.regular(14.0), textColor: self.theme.rootController.navigationBar.primaryTextColor)
|
||||
|
||||
if let size = self.validLayout {
|
||||
self.updateLayout(size: size, transition: .immediate)
|
||||
}
|
||||
}
|
||||
|
||||
@objc func sliderValueChanged() {
|
||||
guard let sliderView = self.sliderView else {
|
||||
return
|
||||
@@ -145,37 +189,46 @@ final class WallpaperPatternPanelNode: ASDisplayNode {
|
||||
}
|
||||
}
|
||||
|
||||
func didAppear() {
|
||||
if let wallpaper = self.wallpapers.first {
|
||||
func didAppear(initialWallpaper: TelegramWallpaper? = nil) {
|
||||
var wallpaper = initialWallpaper ?? self.wallpapers.first
|
||||
|
||||
if let wallpaper = wallpaper {
|
||||
self.currentWallpaper = wallpaper
|
||||
self.sliderView?.value = 40.0
|
||||
|
||||
self.scrollNode.view.contentOffset = CGPoint()
|
||||
|
||||
var selected = true
|
||||
if let subnodes = self.scrollNode.subnodes {
|
||||
for case let subnode as SettingsThemeWallpaperNode in subnodes {
|
||||
subnode.setSelected(selected, animated: false)
|
||||
selected = false
|
||||
subnode.setSelected(wallpaper == subnode.wallpaper, animated: false)
|
||||
}
|
||||
}
|
||||
|
||||
if let wallpaper = self.currentWallpaper, let sliderView = self.sliderView {
|
||||
if initialWallpaper == nil, let wallpaper = self.currentWallpaper, let sliderView = self.sliderView {
|
||||
self.patternChanged?(wallpaper, Int32(sliderView.value), false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func updateLayout(size: CGSize, transition: ContainedViewLayoutTransition) {
|
||||
let separatorHeight = UIScreenPixel
|
||||
self.validLayout = size
|
||||
|
||||
transition.updateFrame(node: self.backgroundNode, frame: CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height))
|
||||
transition.updateFrame(node: self.topSeparatorNode, frame: CGRect(x: 0.0, y: 0.0, width: size.width, height: separatorHeight))
|
||||
transition.updateFrame(node: self.scrollNode, frame: CGRect(x: 0.0, y: 0.0, width: size.width, height: 114.0))
|
||||
transition.updateFrame(node: self.topSeparatorNode, frame: CGRect(x: 0.0, y: 0.0, width: size.width, height: UIScreenPixel))
|
||||
|
||||
let labelSize = self.labelNode.measure(self.bounds.size)
|
||||
transition.updateFrame(node: labelNode, frame: CGRect(origin: CGPoint(x: 14.0, y: 128.0), size: labelSize))
|
||||
let titleSize = self.titleNode.updateLayout(self.bounds.size)
|
||||
transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: floor((self.bounds.width - titleSize.width) / 2.0), y: 19.0), size: titleSize))
|
||||
|
||||
self.sliderView?.frame = CGRect(origin: CGPoint(x: 15.0, y: 136.0), size: CGSize(width: size.width - 15.0 * 2.0, height: 44.0))
|
||||
let scrollViewFrame = CGRect(x: 0.0, y: 52.0, width: size.width, height: 114.0)
|
||||
transition.updateFrame(node: self.scrollNode, frame: scrollViewFrame)
|
||||
|
||||
let labelSize = self.labelNode.updateLayout(self.bounds.size)
|
||||
var combinedHeight = labelSize.height + 34.0
|
||||
|
||||
var originY: CGFloat = scrollViewFrame.maxY + floor((size.height - scrollViewFrame.maxY - combinedHeight) / 2.0)
|
||||
transition.updateFrame(node: self.labelNode, frame: CGRect(origin: CGPoint(x: 14.0, y: originY), size: labelSize))
|
||||
|
||||
self.sliderView?.frame = CGRect(origin: CGPoint(x: 15.0, y: originY + 8.0), size: CGSize(width: size.width - 15.0 * 2.0, height: 44.0))
|
||||
|
||||
self.layoutItemNodes(transition: transition)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user