mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
186 lines
7.0 KiB
Swift
186 lines
7.0 KiB
Swift
import Postbox
|
|
import UIKit
|
|
import TelegramCore
|
|
import SyncCore
|
|
import SwiftSignalKit
|
|
import Display
|
|
import TelegramPresentationData
|
|
import MergeLists
|
|
|
|
enum ChatMediaInputGridEntryStableId: Equatable, Hashable {
|
|
case search
|
|
case peerSpecificSetup
|
|
case sticker(ItemCollectionId, ItemCollectionItemIndex.Id)
|
|
case trending(ItemCollectionId)
|
|
}
|
|
|
|
enum ChatMediaInputGridEntryIndex: Equatable, Comparable {
|
|
case search
|
|
case peerSpecificSetup(dismissed: Bool)
|
|
case collectionIndex(ItemCollectionViewEntryIndex)
|
|
case trending(ItemCollectionId, Int)
|
|
|
|
var stableId: ChatMediaInputGridEntryStableId {
|
|
switch self {
|
|
case .search:
|
|
return .search
|
|
case .peerSpecificSetup:
|
|
return .peerSpecificSetup
|
|
case let .collectionIndex(index):
|
|
return .sticker(index.collectionId, index.itemIndex.id)
|
|
case let .trending(id, index):
|
|
return .trending(id)
|
|
}
|
|
}
|
|
|
|
static func <(lhs: ChatMediaInputGridEntryIndex, rhs: ChatMediaInputGridEntryIndex) -> Bool {
|
|
switch lhs {
|
|
case .search:
|
|
if case .search = rhs {
|
|
return false
|
|
} else {
|
|
return true
|
|
}
|
|
case let .peerSpecificSetup(lhsDismissed):
|
|
switch rhs {
|
|
case .search, .peerSpecificSetup:
|
|
return false
|
|
case let .collectionIndex(index):
|
|
if lhsDismissed {
|
|
return false
|
|
} else {
|
|
if index.collectionId.id == 0 {
|
|
return false
|
|
} else {
|
|
return true
|
|
}
|
|
}
|
|
case .trending:
|
|
return true
|
|
}
|
|
case let .collectionIndex(lhsIndex):
|
|
switch rhs {
|
|
case .search:
|
|
return false
|
|
case let .peerSpecificSetup(dismissed):
|
|
if dismissed {
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
case let .collectionIndex(rhsIndex):
|
|
return lhsIndex < rhsIndex
|
|
case .trending:
|
|
return true
|
|
}
|
|
case let .trending(_, lhsIndex):
|
|
switch rhs {
|
|
case .search, .peerSpecificSetup, .collectionIndex:
|
|
return false
|
|
case let .trending(_, rhsIndex):
|
|
return lhsIndex < rhsIndex
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
enum ChatMediaInputGridEntry: Equatable, Comparable, Identifiable {
|
|
case search(theme: PresentationTheme, strings: PresentationStrings)
|
|
case peerSpecificSetup(theme: PresentationTheme, strings: PresentationStrings, dismissed: Bool)
|
|
case sticker(index: ItemCollectionViewEntryIndex, stickerItem: StickerPackItem, stickerPackInfo: StickerPackCollectionInfo?, canManagePeerSpecificPack: Bool?, maybeManageable: Bool, theme: PresentationTheme)
|
|
case trending(TrendingPanePackEntry)
|
|
|
|
var index: ChatMediaInputGridEntryIndex {
|
|
switch self {
|
|
case .search:
|
|
return .search
|
|
case let .peerSpecificSetup(_, _, dismissed):
|
|
return .peerSpecificSetup(dismissed: dismissed)
|
|
case let .sticker(index, _, _, _, _, _):
|
|
return .collectionIndex(index)
|
|
case let .trending(entry):
|
|
return .trending(entry.info.id, entry.index)
|
|
}
|
|
}
|
|
|
|
var stableId: ChatMediaInputGridEntryStableId {
|
|
return self.index.stableId
|
|
}
|
|
|
|
static func ==(lhs: ChatMediaInputGridEntry, rhs: ChatMediaInputGridEntry) -> Bool {
|
|
switch lhs {
|
|
case let .search(lhsTheme, lhsStrings):
|
|
if case let .search(rhsTheme, rhsStrings) = rhs {
|
|
if lhsTheme !== rhsTheme {
|
|
return false
|
|
}
|
|
if lhsStrings !== rhsStrings {
|
|
return false
|
|
}
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
case let .peerSpecificSetup(lhsTheme, lhsStrings, lhsDismissed):
|
|
if case let .peerSpecificSetup(rhsTheme, rhsStrings, rhsDismissed) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDismissed == rhsDismissed {
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
case let .sticker(lhsIndex, lhsStickerItem, lhsStickerPackInfo, lhsCanManagePeerSpecificPack, lhsMaybeManageable, lhsTheme):
|
|
if case let .sticker(rhsIndex, rhsStickerItem, rhsStickerPackInfo, rhsCanManagePeerSpecificPack, rhsMaybeManageable, rhsTheme) = rhs {
|
|
if lhsIndex != rhsIndex {
|
|
return false
|
|
}
|
|
if lhsStickerItem != rhsStickerItem {
|
|
return false
|
|
}
|
|
if lhsStickerPackInfo != rhsStickerPackInfo {
|
|
return false
|
|
}
|
|
if lhsCanManagePeerSpecificPack != rhsCanManagePeerSpecificPack {
|
|
return false
|
|
}
|
|
if lhsMaybeManageable != rhsMaybeManageable {
|
|
return false
|
|
}
|
|
if lhsTheme !== rhsTheme {
|
|
return false
|
|
}
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
case let .trending(entry):
|
|
if case .trending(entry) = rhs {
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
|
|
static func <(lhs: ChatMediaInputGridEntry, rhs: ChatMediaInputGridEntry) -> Bool {
|
|
return lhs.index < rhs.index
|
|
}
|
|
|
|
func item(account: Account, interfaceInteraction: ChatControllerInteraction, inputNodeInteraction: ChatMediaInputNodeInteraction, trendingInteraction: TrendingPaneInteraction) -> GridItem {
|
|
switch self {
|
|
case let .search(theme, strings):
|
|
return PaneSearchBarPlaceholderItem(theme: theme, strings: strings, type: .stickers, activate: {
|
|
inputNodeInteraction.toggleSearch(true, .sticker, "")
|
|
})
|
|
case let .peerSpecificSetup(theme, strings, dismissed):
|
|
return StickerPanePeerSpecificSetupGridItem(theme: theme, strings: strings, setup: {
|
|
inputNodeInteraction.openPeerSpecificSettings()
|
|
}, dismiss: dismissed ? nil : {
|
|
inputNodeInteraction.dismissPeerSpecificSettings()
|
|
})
|
|
case let .sticker(index, stickerItem, stickerPackInfo, canManagePeerSpecificPack, maybeManageable, theme):
|
|
return ChatMediaInputStickerGridItem(account: account, collectionId: index.collectionId, stickerPackInfo: stickerPackInfo, index: index, stickerItem: stickerItem, canManagePeerSpecificPack: canManagePeerSpecificPack, interfaceInteraction: interfaceInteraction, inputNodeInteraction: inputNodeInteraction, hasAccessory: maybeManageable, theme: theme, selected: { })
|
|
case let .trending(entry):
|
|
return entry.item(account: account, interaction: trendingInteraction, grid: false)
|
|
}
|
|
}
|
|
}
|