mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-10-09 03:20:48 +00:00
Various fixes
This commit is contained in:
parent
a423239c18
commit
d86b655413
@ -113,6 +113,10 @@ final class ItemListRecentSessionItem: ListViewItem, ItemListItem {
|
||||
private func iconForSession(_ session: RecentAccountSession) -> UIImage? {
|
||||
let platform = session.platform.lowercased()
|
||||
let device = session.deviceModel.lowercased()
|
||||
let systemVersion = session.systemVersion.lowercased()
|
||||
if device.contains("xbox") {
|
||||
return UIImage(bundleImageName: "Settings/Devices/Xbox")
|
||||
}
|
||||
if device.contains("chrome") && !device.contains("chromebook") {
|
||||
return UIImage(bundleImageName: "Settings/Devices/Chrome")
|
||||
}
|
||||
@ -140,7 +144,7 @@ private func iconForSession(_ session: RecentAccountSession) -> UIImage? {
|
||||
if platform.contains("linux") {
|
||||
return UIImage(bundleImageName: "Settings/Devices/Linux")
|
||||
}
|
||||
if platform.contains("windows") {
|
||||
if platform.contains("windows") || systemVersion.contains("windows") {
|
||||
return UIImage(bundleImageName: "Settings/Devices/Windows")
|
||||
}
|
||||
return nil
|
||||
|
@ -578,52 +578,54 @@ public func themePickerController(context: AccountContext, focusOnItemTag: Theme
|
||||
presentControllerImpl?(shareController, nil)
|
||||
})
|
||||
})))
|
||||
items.append(.action(ContextMenuActionItem(text: presentationData.strings.Appearance_RemoveTheme, textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { c, f in
|
||||
c.dismiss(completion: {
|
||||
let actionSheet = ActionSheetController(presentationData: presentationData)
|
||||
var items: [ActionSheetItem] = []
|
||||
items.append(ActionSheetButtonItem(title: presentationData.strings.Appearance_RemoveThemeConfirmation, color: .destructive, action: { [weak actionSheet] in
|
||||
actionSheet?.dismissAnimated()
|
||||
let _ = (cloudThemes.get()
|
||||
|> take(1)
|
||||
|> deliverOnMainQueue).start(next: { themes in
|
||||
removedThemeIndexesPromise.set(.single(removedThemeIndexes.modify({ value in
|
||||
var updated = value
|
||||
updated.insert(theme.theme.id)
|
||||
return updated
|
||||
})))
|
||||
|
||||
if isCurrent, let currentThemeIndex = themes.firstIndex(where: { $0.id == theme.theme.id }) {
|
||||
if let settings = theme.theme.settings?.first {
|
||||
if settings.baseTheme == .night {
|
||||
selectAccentColorImpl?(nil, PresentationThemeAccentColor(baseColor: .blue))
|
||||
} else {
|
||||
selectAccentColorImpl?(nil, nil)
|
||||
}
|
||||
} else {
|
||||
let previousThemeIndex = themes.prefix(upTo: currentThemeIndex).reversed().firstIndex(where: { $0.file != nil })
|
||||
let newTheme: PresentationThemeReference
|
||||
if let previousThemeIndex = previousThemeIndex {
|
||||
let theme = themes[themes.index(before: previousThemeIndex.base)]
|
||||
newTheme = .cloud(PresentationCloudTheme(theme: theme, resolvedWallpaper: nil, creatorAccountId: theme.isCreator ? context.account.id : nil))
|
||||
} else {
|
||||
newTheme = .builtin(.nightAccent)
|
||||
}
|
||||
selectThemeImpl?(nil, newTheme)
|
||||
}
|
||||
}
|
||||
|
||||
let _ = deleteThemeInteractively(account: context.account, accountManager: context.sharedContext.accountManager, theme: theme.theme).start()
|
||||
})
|
||||
}))
|
||||
actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [
|
||||
ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, font: .bold, action: { [weak actionSheet] in
|
||||
if !theme.theme.isDefault {
|
||||
items.append(.action(ContextMenuActionItem(text: presentationData.strings.Appearance_RemoveTheme, textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { c, f in
|
||||
c.dismiss(completion: {
|
||||
let actionSheet = ActionSheetController(presentationData: presentationData)
|
||||
var items: [ActionSheetItem] = []
|
||||
items.append(ActionSheetButtonItem(title: presentationData.strings.Appearance_RemoveThemeConfirmation, color: .destructive, action: { [weak actionSheet] in
|
||||
actionSheet?.dismissAnimated()
|
||||
})
|
||||
])])
|
||||
presentControllerImpl?(actionSheet, nil)
|
||||
})
|
||||
})))
|
||||
let _ = (cloudThemes.get()
|
||||
|> take(1)
|
||||
|> deliverOnMainQueue).start(next: { themes in
|
||||
removedThemeIndexesPromise.set(.single(removedThemeIndexes.modify({ value in
|
||||
var updated = value
|
||||
updated.insert(theme.theme.id)
|
||||
return updated
|
||||
})))
|
||||
|
||||
if isCurrent, let currentThemeIndex = themes.firstIndex(where: { $0.id == theme.theme.id }) {
|
||||
if let settings = theme.theme.settings?.first {
|
||||
if settings.baseTheme == .night {
|
||||
selectAccentColorImpl?(nil, PresentationThemeAccentColor(baseColor: .blue))
|
||||
} else {
|
||||
selectAccentColorImpl?(nil, nil)
|
||||
}
|
||||
} else {
|
||||
let previousThemeIndex = themes.prefix(upTo: currentThemeIndex).reversed().firstIndex(where: { $0.file != nil })
|
||||
let newTheme: PresentationThemeReference
|
||||
if let previousThemeIndex = previousThemeIndex {
|
||||
let theme = themes[themes.index(before: previousThemeIndex.base)]
|
||||
newTheme = .cloud(PresentationCloudTheme(theme: theme, resolvedWallpaper: nil, creatorAccountId: theme.isCreator ? context.account.id : nil))
|
||||
} else {
|
||||
newTheme = .builtin(.nightAccent)
|
||||
}
|
||||
selectThemeImpl?(nil, newTheme)
|
||||
}
|
||||
}
|
||||
|
||||
let _ = deleteThemeInteractively(account: context.account, accountManager: context.sharedContext.accountManager, theme: theme.theme).start()
|
||||
})
|
||||
}))
|
||||
actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [
|
||||
ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, font: .bold, action: { [weak actionSheet] in
|
||||
actionSheet?.dismissAnimated()
|
||||
})
|
||||
])])
|
||||
presentControllerImpl?(actionSheet, nil)
|
||||
})
|
||||
})))
|
||||
}
|
||||
} else {
|
||||
items.append(.action(ContextMenuActionItem(text: strings.Theme_Context_ChangeColors, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/ApplyTheme"), color: theme.contextMenu.primaryColor)
|
||||
}, action: { c, f in
|
||||
@ -817,7 +819,7 @@ public func themePickerController(context: AccountContext, focusOnItemTag: Theme
|
||||
presentControllerImpl?(shareController, nil)
|
||||
})
|
||||
})))
|
||||
if cloudThemeExists {
|
||||
if cloudThemeExists && !cloudTheme.theme.isDefault {
|
||||
items.append(.action(ContextMenuActionItem(text: presentationData.strings.Appearance_RemoveTheme, textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { c, f in
|
||||
c.dismiss(completion: {
|
||||
let actionSheet = ActionSheetController(presentationData: presentationData)
|
||||
|
@ -19,6 +19,7 @@ import TelegramAnimatedStickerNode
|
||||
import ShimmerEffect
|
||||
import StickerResources
|
||||
|
||||
|
||||
private var cachedBorderImages: [String: UIImage] = [:]
|
||||
private func generateBorderImage(theme: PresentationTheme, bordered: Bool, selected: Bool) -> UIImage? {
|
||||
let key = "\(theme.list.itemBlocksBackgroundColor.hexString)_\(selected ? "s" + theme.list.itemAccentColor.hexString : theme.list.disclosureArrowColor.hexString)"
|
||||
@ -78,13 +79,11 @@ private final class ThemeGridThemeItemIconNode : ASDisplayNode {
|
||||
self.emojiContainerNode = ASDisplayNode()
|
||||
|
||||
self.imageNode = TransformImageNode()
|
||||
self.imageNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: 120.0, height: 150.0))
|
||||
self.imageNode.isLayerBacked = true
|
||||
self.imageNode.cornerRadius = 8.0
|
||||
self.imageNode.clipsToBounds = true
|
||||
|
||||
self.overlayNode = ASImageNode()
|
||||
self.overlayNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: 122.0, height: 152.0))
|
||||
self.overlayNode.isLayerBacked = true
|
||||
|
||||
self.textNode = TextNode()
|
||||
@ -195,7 +194,7 @@ private final class ThemeGridThemeItemIconNode : ASDisplayNode {
|
||||
} else {
|
||||
string = themeDisplayName(strings: item.strings, reference: item.themeReference)
|
||||
}
|
||||
|
||||
|
||||
let text = NSAttributedString(string: string ?? item.strings.Conversation_Theme_NoTheme, font: Font.bold(14.0), textColor: .white)
|
||||
let (textLayout, textApply) = makeTextLayout(TextNodeLayoutArguments(attributedString: text, backgroundColor: nil, maximumNumberOfLines: 2, truncationType: .end, constrainedSize: CGSize(width: 70.0, height: CGFloat.greatestFiniteMagnitude), alignment: .center, cutout: nil, insets: UIEdgeInsets()))
|
||||
|
||||
@ -226,13 +225,13 @@ private final class ThemeGridThemeItemIconNode : ASDisplayNode {
|
||||
self.textNode.frame = CGRect(origin: CGPoint(x: floorToScreenPixels((90.0 - textLayout.size.width) / 2.0), y: 83.0), size: textLayout.size)
|
||||
self.textNode.isHidden = string == nil
|
||||
|
||||
self.containerNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: 120.0, height: 150.0))
|
||||
self.emojiContainerNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: 120.0, height: 150.0))
|
||||
self.containerNode.frame = CGRect(origin: CGPoint(), size: size)
|
||||
self.emojiContainerNode.frame = CGRect(origin: CGPoint(), size: size)
|
||||
|
||||
let _ = textApply()
|
||||
let _ = emojiApply()
|
||||
|
||||
let imageSize = CGSize(width: 120.0, height: 150.0)
|
||||
let imageSize = size
|
||||
self.imageNode.frame = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: imageSize)
|
||||
let applyLayout = makeImageLayout(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: imageSize, intrinsicInsets: UIEdgeInsets(), emptyColor: .clear))
|
||||
applyLayout()
|
||||
@ -240,7 +239,7 @@ private final class ThemeGridThemeItemIconNode : ASDisplayNode {
|
||||
self.overlayNode.frame = self.imageNode.frame.insetBy(dx: -1.0, dy: -1.0)
|
||||
self.emojiNode.frame = CGRect(origin: CGPoint(x: 0.0, y: 79.0), size: CGSize(width: 90.0, height: 30.0))
|
||||
|
||||
let emojiFrame = CGRect(origin: CGPoint(x: 39.0, y: 98.0), size: CGSize(width: 42.0, height: 42.0))
|
||||
let emojiFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - 42.0) / 2.0), y: 98.0), size: CGSize(width: 42.0, height: 42.0))
|
||||
if let file = item.emojiFile, currentItem == nil {
|
||||
let imageApply = self.emojiImageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: emojiFrame.size, boundingSize: emojiFrame.size, intrinsicInsets: UIEdgeInsets()))
|
||||
imageApply()
|
||||
@ -407,11 +406,28 @@ class ThemeGridThemeItemNode: ListViewItemNode, ItemListItemNode {
|
||||
let insets: UIEdgeInsets
|
||||
let separatorHeight = UIScreenPixel
|
||||
|
||||
let itemSize = CGSize(width: 120.0, height: 150.0)
|
||||
let itemSpacing: CGFloat = 7.0
|
||||
let rows = ceil(CGFloat(item.themes.count) / 3.0)
|
||||
let minSpacing: CGFloat = 6.0
|
||||
|
||||
contentSize = CGSize(width: params.width, height: itemSpacing + rows * (itemSize.height + itemSpacing) + 2.0)
|
||||
let referenceImageSize: CGSize
|
||||
let screenWidth = min(params.width, params.availableHeight)
|
||||
if screenWidth >= 375.0 {
|
||||
referenceImageSize = CGSize(width: 110.0, height: 150.0)
|
||||
} else {
|
||||
referenceImageSize = CGSize(width: 91.0, height: 150.0)
|
||||
}
|
||||
let totalWidth = params.width - params.leftInset - params.rightInset
|
||||
let imageCount = Int((totalWidth - minSpacing) / (referenceImageSize.width + minSpacing))
|
||||
let itemSize = referenceImageSize.aspectFilled(CGSize(width: floorToScreenPixels((totalWidth - CGFloat(imageCount + 1) * minSpacing) / CGFloat(imageCount)), height: referenceImageSize.height))
|
||||
let itemSpacing = floorToScreenPixels((totalWidth - CGFloat(imageCount) * itemSize.width) / CGFloat(imageCount + 1))
|
||||
|
||||
var spacingOffset: CGFloat = 0.0
|
||||
if totalWidth - imageCount * itemSize - (imageCount + 1) * itemSpacing == 1.0 {
|
||||
spacingOffset = UIScreenPixel
|
||||
}
|
||||
|
||||
let rows = ceil(CGFloat(item.themes.count) / CGFloat(imageCount))
|
||||
|
||||
contentSize = CGSize(width: params.width, height: minSpacing + rows * (itemSize.height + itemSpacing))
|
||||
insets = itemListNeighborsGroupedInsets(neighbors)
|
||||
|
||||
let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets)
|
||||
@ -496,9 +512,9 @@ class ThemeGridThemeItemNode: ListViewItemNode, ItemListItemNode {
|
||||
strongSelf.addSubnode(addedItemNode)
|
||||
}
|
||||
|
||||
let col = CGFloat(index % 3)
|
||||
let row = floor(CGFloat(index) / 3.0)
|
||||
let itemFrame = CGRect(origin: CGPoint(x: params.leftInset + itemSpacing + 1.0 + (itemSize.width + itemSpacing) * col, y: itemSpacing + 1.0 + (itemSize.height + itemSpacing) * row), size: itemSize)
|
||||
let col = CGFloat(index % imageCount)
|
||||
let row = floor(CGFloat(index) / CGFloat(imageCount))
|
||||
let itemFrame = CGRect(origin: CGPoint(x: params.leftInset + spacingOffset + itemSpacing + (itemSize.width + itemSpacing) * col, y: minSpacing + (itemSize.height + itemSpacing) * row), size: itemSize)
|
||||
itemNode.frame = itemFrame
|
||||
|
||||
index += 1
|
||||
|
@ -1627,8 +1627,8 @@ public func themeIconImage(account: Account, accountManager: AccountManager<Tele
|
||||
if emoticon {
|
||||
if large {
|
||||
c.saveGState()
|
||||
|
||||
c.translateBy(x: -71.0, y: 66.0)
|
||||
|
||||
c.translateBy(x: (drawingRect.width - 120) - 71, y: 66.0)
|
||||
c.translateBy(x: 114.0, y: 32.0)
|
||||
c.scaleBy(x: 1.0, y: -1.0)
|
||||
c.translateBy(x: 0.0, y: -32.0)
|
||||
|
Loading…
x
Reference in New Issue
Block a user