Various improvements

This commit is contained in:
Ilya Laktyushin 2023-01-10 19:03:20 +04:00
parent c61bf3330a
commit e5793073e6
10 changed files with 65 additions and 19 deletions

View File

@ -562,31 +562,31 @@ private func internalChatListFilterAddChatsController(context: AccountContext, f
ChatListNodeAdditionalCategory( ChatListNodeAdditionalCategory(
id: AdditionalCategoryId.contacts.rawValue, id: AdditionalCategoryId.contacts.rawValue,
icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Contact"), color: .white), cornerRadius: 12.0, color: .blue), icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Contact"), color: .white), cornerRadius: 12.0, color: .blue),
smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Contact"), color: .white), iconScale: 0.6, cornerRadius: 11.0, circleCorners: true, color: .blue), smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Contact"), color: .white), iconScale: 0.6, cornerRadius: 6.0, circleCorners: true, color: .blue),
title: presentationData.strings.ChatListFolder_CategoryContacts title: presentationData.strings.ChatListFolder_CategoryContacts
), ),
ChatListNodeAdditionalCategory( ChatListNodeAdditionalCategory(
id: AdditionalCategoryId.nonContacts.rawValue, id: AdditionalCategoryId.nonContacts.rawValue,
icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/User"), color: .white), cornerRadius: 12.0, color: .yellow), icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/User"), color: .white), cornerRadius: 12.0, color: .yellow),
smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/User"), color: .white), iconScale: 0.6, cornerRadius: 11.0, circleCorners: true, color: .yellow), smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/User"), color: .white), iconScale: 0.6, cornerRadius: 6.0, circleCorners: true, color: .yellow),
title: presentationData.strings.ChatListFolder_CategoryNonContacts title: presentationData.strings.ChatListFolder_CategoryNonContacts
), ),
ChatListNodeAdditionalCategory( ChatListNodeAdditionalCategory(
id: AdditionalCategoryId.groups.rawValue, id: AdditionalCategoryId.groups.rawValue,
icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Group"), color: .white), cornerRadius: 12.0, color: .green), icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Group"), color: .white), cornerRadius: 12.0, color: .green),
smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Group"), color: .white), iconScale: 0.6, cornerRadius: 11.0, circleCorners: true, color: .green), smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Group"), color: .white), iconScale: 0.6, cornerRadius: 6.0, circleCorners: true, color: .green),
title: presentationData.strings.ChatListFolder_CategoryGroups title: presentationData.strings.ChatListFolder_CategoryGroups
), ),
ChatListNodeAdditionalCategory( ChatListNodeAdditionalCategory(
id: AdditionalCategoryId.channels.rawValue, id: AdditionalCategoryId.channels.rawValue,
icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Channel"), color: .white), cornerRadius: 12.0, color: .red), icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Channel"), color: .white), cornerRadius: 12.0, color: .red),
smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Channel"), color: .white), iconScale: 0.6, cornerRadius: 11.0, circleCorners: true, color: .red), smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Channel"), color: .white), iconScale: 0.6, cornerRadius: 6.0, circleCorners: true, color: .red),
title: presentationData.strings.ChatListFolder_CategoryChannels title: presentationData.strings.ChatListFolder_CategoryChannels
), ),
ChatListNodeAdditionalCategory( ChatListNodeAdditionalCategory(
id: AdditionalCategoryId.bots.rawValue, id: AdditionalCategoryId.bots.rawValue,
icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Bot"), color: .white), cornerRadius: 12.0, color: .violet), icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Bot"), color: .white), cornerRadius: 12.0, color: .violet),
smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Bot"), color: .white), iconScale: 0.6, cornerRadius: 11.0, circleCorners: true, color: .violet), smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Bot"), color: .white), iconScale: 0.6, cornerRadius: 6.0, circleCorners: true, color: .violet),
title: presentationData.strings.ChatListFolder_CategoryBots title: presentationData.strings.ChatListFolder_CategoryBots
) )
] ]
@ -710,19 +710,19 @@ private func internalChatListFilterExcludeChatsController(context: AccountContex
ChatListNodeAdditionalCategory( ChatListNodeAdditionalCategory(
id: AdditionalExcludeCategoryId.muted.rawValue, id: AdditionalExcludeCategoryId.muted.rawValue,
icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Muted"), color: .white), cornerRadius: 12.0, color: .red), icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Muted"), color: .white), cornerRadius: 12.0, color: .red),
smallIcon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Muted"), color: .white), iconScale: 0.6, cornerRadius: 11.0, circleCorners: true, color: .red), smallIcon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Muted"), color: .white), iconScale: 0.6, cornerRadius: 6.0, circleCorners: true, color: .red),
title: presentationData.strings.ChatListFolder_CategoryMuted title: presentationData.strings.ChatListFolder_CategoryMuted
), ),
ChatListNodeAdditionalCategory( ChatListNodeAdditionalCategory(
id: AdditionalExcludeCategoryId.read.rawValue, id: AdditionalExcludeCategoryId.read.rawValue,
icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Read"), color: .white), cornerRadius: 12.0, color: .blue), icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Read"), color: .white), cornerRadius: 12.0, color: .blue),
smallIcon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Read"), color: .white), iconScale: 0.6, cornerRadius: 11.0, circleCorners: true, color: .blue), smallIcon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Read"), color: .white), iconScale: 0.6, cornerRadius: 6.0, circleCorners: true, color: .blue),
title: presentationData.strings.ChatListFolder_CategoryRead title: presentationData.strings.ChatListFolder_CategoryRead
), ),
ChatListNodeAdditionalCategory( ChatListNodeAdditionalCategory(
id: AdditionalExcludeCategoryId.archived.rawValue, id: AdditionalExcludeCategoryId.archived.rawValue,
icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Archive"), color: .white), cornerRadius: 12.0, color: .yellow), icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Archive"), color: .white), cornerRadius: 12.0, color: .yellow),
smallIcon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Archive"), color: .white), iconScale: 0.6, cornerRadius: 11.0, circleCorners: true, color: .yellow), smallIcon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Archive"), color: .white), iconScale: 0.6, cornerRadius: 6.0, circleCorners: true, color: .yellow),
title: presentationData.strings.ChatListFolder_CategoryArchived title: presentationData.strings.ChatListFolder_CategoryArchived
), ),
] ]

View File

@ -444,9 +444,9 @@ class CreatePollOptionItemNode: ItemListRevealOptionsItemNode, ItemListItemNode,
} }
let _ = reorderSizeAndApply.1(layout.contentSize.height, displayTextLimit, transition) let _ = reorderSizeAndApply.1(layout.contentSize.height, displayTextLimit, transition)
let reorderControlFrame = CGRect(origin: CGPoint(x: params.width + revealOffset - params.rightInset - reorderSizeAndApply.0, y: 0.0), size: CGSize(width: reorderSizeAndApply.0, height: layout.contentSize.height)) let reorderControlFrame = CGRect(origin: CGPoint(x: params.width + revealOffset - params.rightInset - reorderSizeAndApply.0 + (!item.canMove ? 44.0 + params.rightInset : 0.0), y: 0.0), size: CGSize(width: reorderSizeAndApply.0, height: layout.contentSize.height))
strongSelf.reorderControlNode.frame = reorderControlFrame transition.updateFrameAdditive(node: strongSelf.reorderControlNode, frame: reorderControlFrame)
strongSelf.reorderControlNode.isHidden = !item.canMove strongSelf.reorderControlNode.isUserInteractionEnabled = item.canMove
let _ = textLimitApply() let _ = textLimitApply()
strongSelf.textLimitNode.frame = CGRect(origin: CGPoint(x: reorderControlFrame.minX + floor((reorderControlFrame.width - textLimitLayout.size.width) / 2.0) - 4.0 - UIScreenPixel, y: max(floor(reorderControlFrame.midY + 2.0), layout.contentSize.height - 15.0 - textLimitLayout.size.height)), size: textLimitLayout.size) strongSelf.textLimitNode.frame = CGRect(origin: CGPoint(x: reorderControlFrame.minX + floor((reorderControlFrame.width - textLimitLayout.size.width) / 2.0) - 4.0 - UIScreenPixel, y: max(floor(reorderControlFrame.midY + 2.0), layout.contentSize.height - 15.0 - textLimitLayout.size.height)), size: textLimitLayout.size)

View File

@ -542,6 +542,9 @@ final class NavigationModalContainer: ASDisplayNode, UIScrollViewDelegate, UIGes
} else if listNode.scroller.isDecelerating && listNode.scroller.contentOffset.y < listNode.scroller.contentInset.top { } else if listNode.scroller.isDecelerating && listNode.scroller.contentOffset.y < listNode.scroller.contentInset.top {
return self.scrollNode.view return self.scrollNode.view
} }
} else if let currentParent, currentParent.disablesInteractiveModalDismiss {
enableScrolling = false
break
} }
currentParent = currentParent?.superview currentParent = currentParent?.superview
} }

View File

@ -225,8 +225,8 @@ public final class DrawingEntitiesView: UIView, TGPhotoDrawingEntitiesView {
} }
} }
var entitiesData: Data? { public static func encodeEntities(_ entities: [DrawingEntity]) -> Data? {
let entities = self.entities let entities = entities
guard !entities.isEmpty else { guard !entities.isEmpty else {
return nil return nil
} }
@ -241,6 +241,10 @@ public final class DrawingEntitiesView: UIView, TGPhotoDrawingEntitiesView {
} }
} }
var entitiesData: Data? {
return DrawingEntitiesView.encodeEntities(self.entities)
}
var hasChanges: Bool { var hasChanges: Bool {
if let initialEntitiesData = self.initialEntitiesData { if let initialEntitiesData = self.initialEntitiesData {
let entitiesData = self.entitiesData let entitiesData = self.entitiesData

View File

@ -54,7 +54,7 @@ public final class DrawingStickerEntity: DrawingEntity, Codable {
} }
} }
init(content: Content) { public init(content: Content) {
self.uuid = UUID() self.uuid = UUID()
self.content = content self.content = content

View File

@ -29,7 +29,7 @@ private func generateKnobImage() -> UIImage? {
return image?.stretchableImage(withLeftCapWidth: Int(margin + side * 0.5), topCapHeight: Int(margin + side * 0.5)) return image?.stretchableImage(withLeftCapWidth: Int(margin + side * 0.5), topCapHeight: Int(margin + side * 0.5))
} }
class ModeAndSizeComponent: Component { final class ModeAndSizeComponent: Component {
let values: [String] let values: [String]
let sizeValue: CGFloat let sizeValue: CGFloat
let isEditing: Bool let isEditing: Bool

View File

@ -261,6 +261,7 @@ private final class MediaPlayerScrubbingBufferingNode: ASDisplayNode {
self.containerNode = ASDisplayNode() self.containerNode = ASDisplayNode()
self.containerNode.isLayerBacked = true self.containerNode.isLayerBacked = true
self.containerNode.clipsToBounds = true self.containerNode.clipsToBounds = true
self.containerNode.cornerRadius = lineHeight / 2.0
self.foregroundNode = ASImageNode() self.foregroundNode = ASImageNode()
self.foregroundNode.isLayerBacked = true self.foregroundNode.isLayerBacked = true

View File

@ -622,7 +622,7 @@ final class PremiumOptionComponent: CombinedComponent {
text: .plain(subtitleString), text: .plain(subtitleString),
maximumNumberOfLines: 1 maximumNumberOfLines: 1
), ),
availableSize: CGSize(width: context.availableSize.width - insets.left - insets.right - label.size.width, height: context.availableSize.height), availableSize: CGSize(width: context.availableSize.width - insets.left - insets.right, height: context.availableSize.height),
transition: context.transition transition: context.transition
) )
context.add(subtitle context.add(subtitle

View File

@ -5667,7 +5667,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
if isAnonymousNumber && !accountIsFromUS { if isAnonymousNumber && !accountIsFromUS {
actions.tip = .animatedEmoji(text: strongSelf.presentationData.strings.UserInfo_AnonymousNumberInfo, arguments: nil, file: nil, action: { [weak self] in actions.tip = .animatedEmoji(text: strongSelf.presentationData.strings.UserInfo_AnonymousNumberInfo, arguments: nil, file: nil, action: { [weak self] in
if let strongSelf = self { if let strongSelf = self {
strongSelf.context.sharedContext.openExternalUrl(context: strongSelf.context, urlContext: .generic, url: "https://fragment.com", forceExternal: true, presentationData: strongSelf.presentationData, navigationController: nil, dismissInput: {}) strongSelf.context.sharedContext.openExternalUrl(context: strongSelf.context, urlContext: .generic, url: "https://fragment.com/numbers", forceExternal: true, presentationData: strongSelf.presentationData, navigationController: nil, dismissInput: {})
} }
}) })
} }

View File

@ -231,21 +231,59 @@ private func navigatedMessageFromMessages(_ messages: [Message], anchorIndex: Me
private func navigatedMessageFromView(_ view: MessageHistoryView, anchorIndex: MessageIndex, position: NavigatedMessageFromViewPosition) -> (message: Message, around: [Message], exact: Bool)? { private func navigatedMessageFromView(_ view: MessageHistoryView, anchorIndex: MessageIndex, position: NavigatedMessageFromViewPosition) -> (message: Message, around: [Message], exact: Bool)? {
var index = 0 var index = 0
for entry in view.entries { for entry in view.entries {
if entry.index.id == anchorIndex.id { if entry.index.id == anchorIndex.id {
let currentGroupKey = entry.message.groupingKey
switch position { switch position {
case .exact: case .exact:
return (entry.message, aroundMessagesFromView(view: view, centralIndex: entry.index), true) return (entry.message, aroundMessagesFromView(view: view, centralIndex: entry.index), true)
case .later: case .later:
if index + 1 < view.entries.count { if let currentGroupKey {
if index - 1 > 0, view.entries[index - 1].message.groupingKey == currentGroupKey {
let message = view.entries[index - 1].message
return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[index - 1].index), true)
} else {
for i in index ..< view.entries.count {
if view.entries[i].message.groupingKey != currentGroupKey {
let message = view.entries[i].message
return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[i].index), true)
}
}
}
} else if index + 1 < view.entries.count {
let message = view.entries[index + 1].message let message = view.entries[index + 1].message
return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[index + 1].index), true) return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[index + 1].index), true)
} else { } else {
return nil return nil
} }
case .earlier: case .earlier:
if index != 0 { if let currentGroupKey {
if index + 1 < view.entries.count, view.entries[index + 1].message.groupingKey == currentGroupKey {
let message = view.entries[index + 1].message
return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[index + 1].index), true)
} else {
for i in (0 ..< index).reversed() {
if view.entries[i].message.groupingKey != currentGroupKey {
let message = view.entries[i].message
return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[i].index), true)
}
}
}
} else if index != 0 {
let message = view.entries[index - 1].message let message = view.entries[index - 1].message
if let nextGroupingKey = message.groupingKey {
for i in (0 ..< index).reversed() {
if view.entries[i].message.groupingKey != nextGroupingKey {
let message = view.entries[i + 1].message
return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[i + 1].index), true)
} else if i == 0 {
let message = view.entries[i].message
return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[i].index), true)
}
}
}
return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[index - 1].index), true) return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[index - 1].index), true)
} else { } else {
return nil return nil