Various fixes

This commit is contained in:
Ilya Laktyushin 2021-10-28 00:23:37 +04:00
parent a423239c18
commit d86b655413
4 changed files with 85 additions and 63 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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)