Swiftgram/submodules/ListMessageItem/Sources/ListMessageDateHeader.swift
2020-09-29 04:03:20 +04:00

118 lines
4.0 KiB
Swift

import Foundation
import UIKit
import Display
import SyncCore
import AsyncDisplayKit
import TelegramPresentationData
import TelegramUIPreferences
import TelegramStringFormatting
import ListSectionHeaderNode
private let timezoneOffset: Int32 = {
let nowTimestamp = Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970)
var now: time_t = time_t(nowTimestamp)
var timeinfoNow: tm = tm()
localtime_r(&now, &timeinfoNow)
return Int32(timeinfoNow.tm_gmtoff)
}()
public func listMessageDateHeaderId(timestamp: Int32) -> Int64 {
let unclippedValue: Int64 = min(Int64(Int32.max), Int64(timestamp))
var time: time_t = time_t(Int32(clamping: unclippedValue))
var timeinfo: tm = tm()
localtime_r(&time, &timeinfo)
let roundedTimestamp = timeinfo.tm_year * 100 + timeinfo.tm_mon
return Int64(roundedTimestamp)
}
public func listMessageDateHeaderInfo(timestamp: Int32) -> (year: Int32, month: Int32) {
var time: time_t = time_t(timestamp)
var timeinfo: tm = tm()
localtime_r(&time, &timeinfo)
return (timeinfo.tm_year, timeinfo.tm_mon)
}
final class ListMessageDateHeader: ListViewItemHeader {
private let timestamp: Int32
private let roundedTimestamp: Int32
private let month: Int32
private let year: Int32
let id: Int64
let theme: PresentationTheme
let strings: PresentationStrings
let fontSize: PresentationFontSize
init(timestamp: Int32, theme: PresentationTheme, strings: PresentationStrings, fontSize: PresentationFontSize) {
self.timestamp = timestamp
self.theme = theme
self.strings = strings
self.fontSize = fontSize
var time: time_t = time_t(timestamp)
var timeinfo: tm = tm()
localtime_r(&time, &timeinfo)
self.roundedTimestamp = timeinfo.tm_year * 100 + timeinfo.tm_mon
self.month = timeinfo.tm_mon
self.year = timeinfo.tm_year
self.id = Int64(self.roundedTimestamp)
}
let stickDirection: ListViewItemHeaderStickDirection = .top
let height: CGFloat = 28.0
func node() -> ListViewItemHeaderNode {
return ListMessageDateHeaderNode(theme: self.theme, strings: self.strings, fontSize: self.fontSize, roundedTimestamp: self.roundedTimestamp, month: self.month, year: self.year)
}
func updateNode(_ node: ListViewItemHeaderNode, previous: ListViewItemHeader?, next: ListViewItemHeader?) {
}
}
public final class ListMessageDateHeaderNode: ListViewItemHeaderNode {
var theme: PresentationTheme
var strings: PresentationStrings
let headerNode: ListSectionHeaderNode
let month: Int32
let year: Int32
init(theme: PresentationTheme, strings: PresentationStrings, fontSize: PresentationFontSize, roundedTimestamp: Int32, month: Int32, year: Int32) {
self.theme = theme
self.strings = strings
self.month = month
self.year = year
self.headerNode = ListSectionHeaderNode(theme: theme)
super.init()
self.addSubnode(self.headerNode)
self.headerNode.title = stringForMonth(strings: strings, month: month, ofYear: year).uppercased()
}
public func updateThemeAndStrings(theme: PresentationTheme, strings: PresentationStrings) {
self.theme = theme
self.headerNode.updateTheme(theme: theme)
self.strings = strings
self.headerNode.title = stringForMonth(strings: strings, month: self.month, ofYear: self.year).uppercased()
self.setNeedsLayout()
}
override public func updateLayout(size: CGSize, leftInset: CGFloat, rightInset: CGFloat) {
let headerFrame = CGRect(origin: CGPoint(x: 0.0, y: -UIScreenPixel), size: CGSize(width: size.width, height: size.height + UIScreenPixel))
self.headerNode.frame = headerFrame
self.headerNode.updateLayout(size: headerFrame.size, leftInset: leftInset, rightInset: rightInset)
}
}