mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Merge branch 'master' of gitlab.com:peter-iakovlev/telegram-ios
This commit is contained in:
commit
d4a1857d6c
@ -1967,17 +1967,29 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController
|
|||||||
|
|
||||||
self.rawStoryArchiveSubscriptions = rawStoryArchiveSubscriptions
|
self.rawStoryArchiveSubscriptions = rawStoryArchiveSubscriptions
|
||||||
|
|
||||||
let hasUnseenArchive: Bool?
|
let archiveStoryState: ChatListNodeState.StoryState?
|
||||||
if rawStoryArchiveSubscriptions.items.isEmpty {
|
if rawStoryArchiveSubscriptions.items.isEmpty {
|
||||||
hasUnseenArchive = nil
|
archiveStoryState = nil
|
||||||
} else {
|
} else {
|
||||||
hasUnseenArchive = rawStoryArchiveSubscriptions.items.contains(where: { $0.hasUnseen })
|
var unseenCount = 0
|
||||||
|
for item in rawStoryArchiveSubscriptions.items {
|
||||||
|
if item.hasUnseen {
|
||||||
|
unseenCount += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
archiveStoryState = ChatListNodeState.StoryState(
|
||||||
|
stats: EngineChatList.StoryStats(
|
||||||
|
totalCount: rawStoryArchiveSubscriptions.items.count,
|
||||||
|
unseenCount: unseenCount
|
||||||
|
),
|
||||||
|
hasUnseenCloseFriends: rawStoryArchiveSubscriptions.items.contains(where: { $0.hasUnseenCloseFriends })
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.chatListDisplayNode.mainContainerNode.currentItemNode.updateState { chatListState in
|
self.chatListDisplayNode.mainContainerNode.currentItemNode.updateState { chatListState in
|
||||||
var chatListState = chatListState
|
var chatListState = chatListState
|
||||||
|
|
||||||
chatListState.hasUnseenArchiveStories = hasUnseenArchive
|
chatListState.archiveStoryState = archiveStoryState
|
||||||
|
|
||||||
return chatListState
|
return chatListState
|
||||||
}
|
}
|
||||||
|
@ -251,7 +251,7 @@ public struct ChatListNodeState: Equatable {
|
|||||||
public var foundPeers: [(EnginePeer, EnginePeer?)]
|
public var foundPeers: [(EnginePeer, EnginePeer?)]
|
||||||
public var selectedPeerMap: [EnginePeer.Id: EnginePeer]
|
public var selectedPeerMap: [EnginePeer.Id: EnginePeer]
|
||||||
public var selectedThreadIds: Set<Int64>
|
public var selectedThreadIds: Set<Int64>
|
||||||
public var hasUnseenArchiveStories: Bool?
|
public var archiveStoryState: StoryState?
|
||||||
|
|
||||||
public init(
|
public init(
|
||||||
presentationData: ChatListPresentationData,
|
presentationData: ChatListPresentationData,
|
||||||
@ -267,7 +267,7 @@ public struct ChatListNodeState: Equatable {
|
|||||||
hiddenItemShouldBeTemporaryRevealed: Bool,
|
hiddenItemShouldBeTemporaryRevealed: Bool,
|
||||||
hiddenPsaPeerId: EnginePeer.Id?,
|
hiddenPsaPeerId: EnginePeer.Id?,
|
||||||
selectedThreadIds: Set<Int64>,
|
selectedThreadIds: Set<Int64>,
|
||||||
hasUnseenArchiveStories: Bool?
|
archiveStoryState: StoryState?
|
||||||
) {
|
) {
|
||||||
self.presentationData = presentationData
|
self.presentationData = presentationData
|
||||||
self.editing = editing
|
self.editing = editing
|
||||||
@ -282,7 +282,7 @@ public struct ChatListNodeState: Equatable {
|
|||||||
self.hiddenItemShouldBeTemporaryRevealed = hiddenItemShouldBeTemporaryRevealed
|
self.hiddenItemShouldBeTemporaryRevealed = hiddenItemShouldBeTemporaryRevealed
|
||||||
self.hiddenPsaPeerId = hiddenPsaPeerId
|
self.hiddenPsaPeerId = hiddenPsaPeerId
|
||||||
self.selectedThreadIds = selectedThreadIds
|
self.selectedThreadIds = selectedThreadIds
|
||||||
self.hasUnseenArchiveStories = hasUnseenArchiveStories
|
self.archiveStoryState = archiveStoryState
|
||||||
}
|
}
|
||||||
|
|
||||||
public static func ==(lhs: ChatListNodeState, rhs: ChatListNodeState) -> Bool {
|
public static func ==(lhs: ChatListNodeState, rhs: ChatListNodeState) -> Bool {
|
||||||
@ -325,7 +325,7 @@ public struct ChatListNodeState: Equatable {
|
|||||||
if lhs.selectedThreadIds != rhs.selectedThreadIds {
|
if lhs.selectedThreadIds != rhs.selectedThreadIds {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if lhs.hasUnseenArchiveStories != rhs.hasUnseenArchiveStories {
|
if lhs.archiveStoryState != rhs.archiveStoryState {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
@ -1251,7 +1251,7 @@ public final class ChatListNode: ListView {
|
|||||||
isSelecting = true
|
isSelecting = true
|
||||||
}
|
}
|
||||||
|
|
||||||
self.currentState = ChatListNodeState(presentationData: ChatListPresentationData(theme: theme, fontSize: fontSize, strings: strings, dateTimeFormat: dateTimeFormat, nameSortOrder: nameSortOrder, nameDisplayOrder: nameDisplayOrder, disableAnimations: disableAnimations), editing: isSelecting, peerIdWithRevealedOptions: nil, selectedPeerIds: Set(), foundPeers: [], selectedPeerMap: [:], selectedAdditionalCategoryIds: Set(), peerInputActivities: nil, pendingRemovalItemIds: Set(), pendingClearHistoryPeerIds: Set(), hiddenItemShouldBeTemporaryRevealed: false, hiddenPsaPeerId: nil, selectedThreadIds: Set(), hasUnseenArchiveStories: nil)
|
self.currentState = ChatListNodeState(presentationData: ChatListPresentationData(theme: theme, fontSize: fontSize, strings: strings, dateTimeFormat: dateTimeFormat, nameSortOrder: nameSortOrder, nameDisplayOrder: nameDisplayOrder, disableAnimations: disableAnimations), editing: isSelecting, peerIdWithRevealedOptions: nil, selectedPeerIds: Set(), foundPeers: [], selectedPeerMap: [:], selectedAdditionalCategoryIds: Set(), peerInputActivities: nil, pendingRemovalItemIds: Set(), pendingClearHistoryPeerIds: Set(), hiddenItemShouldBeTemporaryRevealed: false, hiddenPsaPeerId: nil, selectedThreadIds: Set(), archiveStoryState: nil)
|
||||||
self.statePromise = ValuePromise(self.currentState, ignoreRepeated: true)
|
self.statePromise = ValuePromise(self.currentState, ignoreRepeated: true)
|
||||||
|
|
||||||
self.theme = theme
|
self.theme = theme
|
||||||
|
@ -834,13 +834,8 @@ func chatListNodeEntriesForView(view: EngineChatList, state: ChatListNodeState,
|
|||||||
for groupReference in view.groupItems {
|
for groupReference in view.groupItems {
|
||||||
let messageIndex = EngineMessage.Index(id: EngineMessage.Id(peerId: EnginePeer.Id(0), namespace: 0, id: 0), timestamp: 1)
|
let messageIndex = EngineMessage.Index(id: EngineMessage.Id(peerId: EnginePeer.Id(0), namespace: 0, id: 0), timestamp: 1)
|
||||||
var mappedStoryState: ChatListNodeState.StoryState?
|
var mappedStoryState: ChatListNodeState.StoryState?
|
||||||
if let hasUnseenArchiveStories = state.hasUnseenArchiveStories {
|
if let archiveStoryState = state.archiveStoryState {
|
||||||
mappedStoryState = ChatListNodeState.StoryState(
|
mappedStoryState = archiveStoryState
|
||||||
stats: EngineChatList.StoryStats(
|
|
||||||
totalCount: 1, unseenCount: hasUnseenArchiveStories ? 1 : 0
|
|
||||||
),
|
|
||||||
hasUnseenCloseFriends: false
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
result.append(.GroupReferenceEntry(ChatListNodeEntry.GroupReferenceEntryData(
|
result.append(.GroupReferenceEntry(ChatListNodeEntry.GroupReferenceEntryData(
|
||||||
index: .chatList(EngineChatList.Item.Index.ChatList(pinningIndex: pinningIndex, messageIndex: messageIndex)),
|
index: .chatList(EngineChatList.Item.Index.ChatList(pinningIndex: pinningIndex, messageIndex: messageIndex)),
|
||||||
|
@ -635,7 +635,7 @@ public final class DrawingTextEntityView: DrawingEntityView, UITextViewDelegate
|
|||||||
|
|
||||||
func getRenderImage() -> UIImage? {
|
func getRenderImage() -> UIImage? {
|
||||||
let rect = self.bounds
|
let rect = self.bounds
|
||||||
UIGraphicsBeginImageContextWithOptions(rect.size, false, 1.0)
|
UIGraphicsBeginImageContextWithOptions(rect.size, false, 2.0)
|
||||||
self.textView.drawHierarchy(in: rect, afterScreenUpdates: true)
|
self.textView.drawHierarchy(in: rect, afterScreenUpdates: true)
|
||||||
let image = UIGraphicsGetImageFromCurrentImageContext()
|
let image = UIGraphicsGetImageFromCurrentImageContext()
|
||||||
UIGraphicsEndImageContext()
|
UIGraphicsEndImageContext()
|
||||||
|
@ -414,6 +414,18 @@ public final class ChatListNavigationBar: Component {
|
|||||||
self.addSubview(headerContentView)
|
self.addSubview(headerContentView)
|
||||||
}
|
}
|
||||||
transition.setFrameWithAdditivePosition(view: headerContentView, frame: headerContentFrame)
|
transition.setFrameWithAdditivePosition(view: headerContentView, frame: headerContentFrame)
|
||||||
|
|
||||||
|
if component.isSearchActive != (headerContentView.alpha == 0.0) {
|
||||||
|
headerContentView.alpha = component.isSearchActive ? 0.0 : 1.0
|
||||||
|
|
||||||
|
if !transition.animation.isImmediate {
|
||||||
|
if component.isSearchActive {
|
||||||
|
headerContentView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.14)
|
||||||
|
} else {
|
||||||
|
headerContentView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if component.tabsNode !== self.tabsNode {
|
if component.tabsNode !== self.tabsNode {
|
||||||
|
@ -267,7 +267,9 @@ private func makeEditorImageFrameComposition(context: CIContext, inputImage: CII
|
|||||||
image = image.transformed(by: resetTransform)
|
image = image.transformed(by: resetTransform)
|
||||||
|
|
||||||
var baseScale: CGFloat = 1.0
|
var baseScale: CGFloat = 1.0
|
||||||
if let baseSize = entity.baseSize {
|
if let entityBaseScale = entity.baseScale {
|
||||||
|
baseScale = entityBaseScale
|
||||||
|
} else if let baseSize = entity.baseSize {
|
||||||
baseScale = baseSize.width / image.extent.width
|
baseScale = baseSize.width / image.extent.width
|
||||||
if baseSize.width != baseSize.height {
|
if baseSize.width != baseSize.height {
|
||||||
baseScale *= min(baseSize.width, baseSize.height) / max(baseSize.width, baseSize.height)
|
baseScale *= min(baseSize.width, baseSize.height) / max(baseSize.width, baseSize.height)
|
||||||
|
@ -28,14 +28,14 @@ func composerEntitiesForDrawingEntity(account: Account, entity: DrawingEntity, c
|
|||||||
return [MediaEditorComposerStickerEntity(account: account, content: content, position: entity.position, scale: entity.scale, rotation: entity.rotation, baseSize: entity.baseSize, mirrored: entity.mirrored, colorSpace: colorSpace, isStatic: entity.isExplicitlyStatic)]
|
return [MediaEditorComposerStickerEntity(account: account, content: content, position: entity.position, scale: entity.scale, rotation: entity.rotation, baseSize: entity.baseSize, mirrored: entity.mirrored, colorSpace: colorSpace, isStatic: entity.isExplicitlyStatic)]
|
||||||
} else if let renderImage = entity.renderImage, let image = CIImage(image: renderImage, options: [.colorSpace: colorSpace]) {
|
} else if let renderImage = entity.renderImage, let image = CIImage(image: renderImage, options: [.colorSpace: colorSpace]) {
|
||||||
if let entity = entity as? DrawingBubbleEntity {
|
if let entity = entity as? DrawingBubbleEntity {
|
||||||
return [MediaEditorComposerStaticEntity(image: image, position: entity.position, scale: 1.0, rotation: entity.rotation, baseSize: entity.size, mirrored: false)]
|
return [MediaEditorComposerStaticEntity(image: image, position: entity.position, scale: 1.0, rotation: entity.rotation, baseSize: entity.size, baseScale: nil, mirrored: false)]
|
||||||
} else if let entity = entity as? DrawingSimpleShapeEntity {
|
} else if let entity = entity as? DrawingSimpleShapeEntity {
|
||||||
return [MediaEditorComposerStaticEntity(image: image, position: entity.position, scale: 1.0, rotation: entity.rotation, baseSize: entity.size, mirrored: false)]
|
return [MediaEditorComposerStaticEntity(image: image, position: entity.position, scale: 1.0, rotation: entity.rotation, baseSize: entity.size, baseScale: nil, mirrored: false)]
|
||||||
} else if let entity = entity as? DrawingVectorEntity {
|
} else if let entity = entity as? DrawingVectorEntity {
|
||||||
return [MediaEditorComposerStaticEntity(image: image, position: CGPoint(x: entity.drawingSize.width * 0.5, y: entity.drawingSize.height * 0.5), scale: 1.0, rotation: 0.0, baseSize: entity.drawingSize, mirrored: false)]
|
return [MediaEditorComposerStaticEntity(image: image, position: CGPoint(x: entity.drawingSize.width * 0.5, y: entity.drawingSize.height * 0.5), scale: 1.0, rotation: 0.0, baseSize: entity.drawingSize, baseScale: nil, mirrored: false)]
|
||||||
} else if let entity = entity as? DrawingTextEntity {
|
} else if let entity = entity as? DrawingTextEntity {
|
||||||
var entities: [MediaEditorComposerEntity] = []
|
var entities: [MediaEditorComposerEntity] = []
|
||||||
entities.append(MediaEditorComposerStaticEntity(image: image, position: entity.position, scale: entity.scale, rotation: entity.rotation, baseSize: nil, mirrored: false))
|
entities.append(MediaEditorComposerStaticEntity(image: image, position: entity.position, scale: entity.scale, rotation: entity.rotation, baseSize: nil, baseScale: 0.5, mirrored: false))
|
||||||
if let renderSubEntities = entity.renderSubEntities {
|
if let renderSubEntities = entity.renderSubEntities {
|
||||||
for subEntity in renderSubEntities {
|
for subEntity in renderSubEntities {
|
||||||
entities.append(contentsOf: composerEntitiesForDrawingEntity(account: account, entity: subEntity, colorSpace: colorSpace))
|
entities.append(contentsOf: composerEntitiesForDrawingEntity(account: account, entity: subEntity, colorSpace: colorSpace))
|
||||||
@ -53,14 +53,16 @@ private class MediaEditorComposerStaticEntity: MediaEditorComposerEntity {
|
|||||||
let scale: CGFloat
|
let scale: CGFloat
|
||||||
let rotation: CGFloat
|
let rotation: CGFloat
|
||||||
let baseSize: CGSize?
|
let baseSize: CGSize?
|
||||||
|
let baseScale: CGFloat?
|
||||||
let mirrored: Bool
|
let mirrored: Bool
|
||||||
|
|
||||||
init(image: CIImage, position: CGPoint, scale: CGFloat, rotation: CGFloat, baseSize: CGSize?, mirrored: Bool) {
|
init(image: CIImage, position: CGPoint, scale: CGFloat, rotation: CGFloat, baseSize: CGSize?, baseScale: CGFloat?, mirrored: Bool) {
|
||||||
self.image = image
|
self.image = image
|
||||||
self.position = position
|
self.position = position
|
||||||
self.scale = scale
|
self.scale = scale
|
||||||
self.rotation = rotation
|
self.rotation = rotation
|
||||||
self.baseSize = baseSize
|
self.baseSize = baseSize
|
||||||
|
self.baseScale = baseScale
|
||||||
self.mirrored = mirrored
|
self.mirrored = mirrored
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,6 +90,7 @@ private class MediaEditorComposerStickerEntity: MediaEditorComposerEntity {
|
|||||||
let scale: CGFloat
|
let scale: CGFloat
|
||||||
let rotation: CGFloat
|
let rotation: CGFloat
|
||||||
let baseSize: CGSize?
|
let baseSize: CGSize?
|
||||||
|
let baseScale: CGFloat? = nil
|
||||||
let mirrored: Bool
|
let mirrored: Bool
|
||||||
let colorSpace: CGColorSpace
|
let colorSpace: CGColorSpace
|
||||||
let isStatic: Bool
|
let isStatic: Bool
|
||||||
@ -433,6 +436,7 @@ protocol MediaEditorComposerEntity {
|
|||||||
var scale: CGFloat { get }
|
var scale: CGFloat { get }
|
||||||
var rotation: CGFloat { get }
|
var rotation: CGFloat { get }
|
||||||
var baseSize: CGSize? { get }
|
var baseSize: CGSize? { get }
|
||||||
|
var baseScale: CGFloat? { get }
|
||||||
var mirrored: Bool { get }
|
var mirrored: Bool { get }
|
||||||
|
|
||||||
func image(for time: CMTime, frameRate: Float, context: CIContext, completion: @escaping (CIImage?) -> Void)
|
func image(for time: CMTime, frameRate: Float, context: CIContext, completion: @escaping (CIImage?) -> Void)
|
||||||
|
@ -3638,7 +3638,9 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
|||||||
let codableEntities = DrawingEntitiesView.encodeEntities(entities, entitiesView: self.node.entitiesView)
|
let codableEntities = DrawingEntitiesView.encodeEntities(entities, entitiesView: self.node.entitiesView)
|
||||||
mediaEditor.setDrawingAndEntities(data: nil, image: mediaEditor.values.drawing, entities: codableEntities)
|
mediaEditor.setDrawingAndEntities(data: nil, image: mediaEditor.values.drawing, entities: codableEntities)
|
||||||
|
|
||||||
let caption = self.getCaption()
|
var caption = self.getCaption()
|
||||||
|
caption = convertMarkdownToAttributes(caption)
|
||||||
|
|
||||||
let randomId: Int64
|
let randomId: Int64
|
||||||
if case let .draft(_, id) = subject, let id {
|
if case let .draft(_, id) = subject, let id {
|
||||||
randomId = id
|
randomId = id
|
||||||
|
@ -1335,7 +1335,7 @@ final class ShareWithPeersScreenComponent: Component {
|
|||||||
sideInset: sideInset,
|
sideInset: sideInset,
|
||||||
title: "Name",
|
title: "Name",
|
||||||
peer: nil,
|
peer: nil,
|
||||||
subtitle: nil,
|
subtitle: "sub",
|
||||||
subtitleAccessory: .none,
|
subtitleAccessory: .none,
|
||||||
presence: nil,
|
presence: nil,
|
||||||
selectionState: .editing(isSelected: false, isTinted: false),
|
selectionState: .editing(isSelected: false, isTinted: false),
|
||||||
|
@ -3547,12 +3547,12 @@ public final class StoryItemSetContainerComponent: Component {
|
|||||||
|
|
||||||
var tip: ContextController.Tip?
|
var tip: ContextController.Tip?
|
||||||
var tipSignal: Signal<ContextController.Tip?, NoError>?
|
var tipSignal: Signal<ContextController.Tip?, NoError>?
|
||||||
if hasLinkedStickers {
|
if hasLinkedStickers, let peerReference = PeerReference(component.slice.peer._asPeer()) {
|
||||||
let context = component.context
|
let context = component.context
|
||||||
tip = .animatedEmoji(text: nil, arguments: nil, file: nil, action: nil)
|
tip = .animatedEmoji(text: nil, arguments: nil, file: nil, action: nil)
|
||||||
|
|
||||||
let packsPromise = Promise<[StickerPackReference]>()
|
let packsPromise = Promise<[StickerPackReference]>()
|
||||||
packsPromise.set(context.engine.stickers.stickerPacksAttachedToMedia(media: .standalone(media: media)))
|
packsPromise.set(context.engine.stickers.stickerPacksAttachedToMedia(media: .story(peer: peerReference, id: component.slice.item.storyItem.id, media: media)))
|
||||||
|
|
||||||
let action: () -> Void = { [weak self] in
|
let action: () -> Void = { [weak self] in
|
||||||
if let self {
|
if let self {
|
||||||
|
@ -889,7 +889,7 @@ public final class StoryPeerListComponent: Component {
|
|||||||
rightItemFrame = calculateItem(i + 1).itemFrame
|
rightItemFrame = calculateItem(i + 1).itemFrame
|
||||||
}
|
}
|
||||||
|
|
||||||
itemAlpha = collapsedState.sideAlphaFraction * 1.0 + (1.0 - collapsedState.sideAlphaFraction) * (1.0 - collapsedState.activityFraction)
|
itemAlpha = (collapsedState.sideAlphaFraction * 1.0 + (1.0 - collapsedState.sideAlphaFraction) * (1.0 - collapsedState.activityFraction)) * collapsedState.sideAlphaFraction
|
||||||
} else {
|
} else {
|
||||||
if itemLayout.itemCount == 1 {
|
if itemLayout.itemCount == 1 {
|
||||||
itemAlpha = min(1.0, (collapsedState.minFraction + collapsedState.maxFraction) * 4.0)
|
itemAlpha = min(1.0, (collapsedState.minFraction + collapsedState.maxFraction) * 4.0)
|
||||||
|
@ -64,9 +64,8 @@ private func calculateMergingCircleShape(center: CGPoint, leftCenter: CGPoint?,
|
|||||||
|
|
||||||
let segmentCount = max(totalCount, 1)
|
let segmentCount = max(totalCount, 1)
|
||||||
|
|
||||||
if segmentCount == 1 {
|
|
||||||
if isSeen {
|
if isSeen {
|
||||||
if unseenCount == 0 {
|
if unseenCount < totalCount {
|
||||||
} else {
|
} else {
|
||||||
return path
|
return path
|
||||||
}
|
}
|
||||||
@ -76,7 +75,6 @@ private func calculateMergingCircleShape(center: CGPoint, leftCenter: CGPoint?,
|
|||||||
return path
|
return path
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if let leftAngles, let rightAngles {
|
if let leftAngles, let rightAngles {
|
||||||
path.addArc(center: center, radius: radius, startAngle: leftAngles.point1Angle, endAngle: rightAngles.point2Angle, clockwise: true)
|
path.addArc(center: center, radius: radius, startAngle: leftAngles.point1Angle, endAngle: rightAngles.point2Angle, clockwise: true)
|
||||||
@ -625,12 +623,12 @@ public final class StoryPeerListItemComponent: Component {
|
|||||||
transition.setFrame(view: avatarNode.view, frame: CGRect(origin: CGPoint(), size: avatarFrame.size))
|
transition.setFrame(view: avatarNode.view, frame: CGRect(origin: CGPoint(), size: avatarFrame.size))
|
||||||
transition.setFrame(view: self.avatarBackgroundView, frame: CGRect(origin: CGPoint(), size: avatarFrame.size).insetBy(dx: -3.0 - UIScreenPixel * 2.0, dy: -3.0 - UIScreenPixel * 2.0))
|
transition.setFrame(view: self.avatarBackgroundView, frame: CGRect(origin: CGPoint(), size: avatarFrame.size).insetBy(dx: -3.0 - UIScreenPixel * 2.0, dy: -3.0 - UIScreenPixel * 2.0))
|
||||||
|
|
||||||
let indicatorFrame = avatarFrame.insetBy(dx: -6.0, dy: -6.0)
|
let indicatorFrame = avatarFrame.insetBy(dx: -8.0, dy: -8.0)
|
||||||
|
|
||||||
let baseLineUnseenWidth: CGFloat = 2.0
|
let baseLineUnseenWidth: CGFloat = 2.0
|
||||||
let baseLineSeenWidth: CGFloat = 1.0 + UIScreenPixel
|
let baseLineSeenWidth: CGFloat = 1.0 + UIScreenPixel
|
||||||
|
|
||||||
let minimizedLineWidth: CGFloat = 3.0
|
let minimizedLineWidth: CGFloat = 4.3
|
||||||
|
|
||||||
let indicatorLineSeenWidth: CGFloat = baseLineSeenWidth * component.scale + minimizedLineWidth * (1.0 - component.scale)
|
let indicatorLineSeenWidth: CGFloat = baseLineSeenWidth * component.scale + minimizedLineWidth * (1.0 - component.scale)
|
||||||
let indicatorLineUnseenWidth: CGFloat = baseLineUnseenWidth * component.scale + minimizedLineWidth * (1.0 - component.scale)
|
let indicatorLineUnseenWidth: CGFloat = baseLineUnseenWidth * component.scale + minimizedLineWidth * (1.0 - component.scale)
|
||||||
@ -706,7 +704,7 @@ public final class StoryPeerListItemComponent: Component {
|
|||||||
self.avatarBackgroundView.isHidden = component.ringAnimation != nil || self.indicatorColorSeenLayer.isHidden
|
self.avatarBackgroundView.isHidden = component.ringAnimation != nil || self.indicatorColorSeenLayer.isHidden
|
||||||
|
|
||||||
let baseRadius: CGFloat = 30.0
|
let baseRadius: CGFloat = 30.0
|
||||||
let collapsedRadius: CGFloat = 32.0
|
let collapsedRadius: CGFloat = 35.0
|
||||||
let indicatorRadius: CGFloat = baseRadius * component.scale + collapsedRadius * (1.0 - component.scale)
|
let indicatorRadius: CGFloat = baseRadius * component.scale + collapsedRadius * (1.0 - component.scale)
|
||||||
|
|
||||||
self.indicatorShapeSeenLayer.lineWidth = indicatorLineSeenWidth
|
self.indicatorShapeSeenLayer.lineWidth = indicatorLineSeenWidth
|
||||||
@ -763,7 +761,7 @@ public final class StoryPeerListItemComponent: Component {
|
|||||||
let cutoutSize: CGFloat = 18.0 + UIScreenPixel * 2.0
|
let cutoutSize: CGFloat = 18.0 + UIScreenPixel * 2.0
|
||||||
avatarPath.addEllipse(in: CGRect(origin: CGPoint(x: avatarSize.width - cutoutSize + UIScreenPixel, y: avatarSize.height - 1.0 - cutoutSize + UIScreenPixel), size: CGSize(width: cutoutSize, height: cutoutSize)))
|
avatarPath.addEllipse(in: CGRect(origin: CGPoint(x: avatarSize.width - cutoutSize + UIScreenPixel, y: avatarSize.height - 1.0 - cutoutSize + UIScreenPixel), size: CGSize(width: cutoutSize, height: cutoutSize)))
|
||||||
} else if let mappedLeftCenter {
|
} else if let mappedLeftCenter {
|
||||||
avatarPath.addEllipse(in: CGRect(origin: CGPoint(), size: avatarSize).insetBy(dx: -indicatorLineSeenWidth, dy: -indicatorLineSeenWidth).offsetBy(dx: -abs(indicatorCenter.x - mappedLeftCenter.x), dy: -abs(indicatorCenter.y - mappedLeftCenter.y)))
|
avatarPath.addEllipse(in: CGRect(origin: CGPoint(), size: avatarSize).insetBy(dx: -indicatorLineSeenWidth * 1.4, dy: -indicatorLineSeenWidth * 1.4).offsetBy(dx: -abs(indicatorCenter.x - mappedLeftCenter.x), dy: -abs(indicatorCenter.y - mappedLeftCenter.y)))
|
||||||
}
|
}
|
||||||
Transition.immediate.setShapeLayerPath(layer: self.avatarShapeLayer, path: avatarPath)
|
Transition.immediate.setShapeLayerPath(layer: self.avatarShapeLayer, path: avatarPath)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user