Story location picking

This commit is contained in:
Ilya Laktyushin
2023-07-30 15:01:25 +02:00
parent b3146436dc
commit b70586eb28
43 changed files with 2397 additions and 133 deletions

View File

@@ -2210,6 +2210,12 @@ public protocol EmojiContentPeekBehavior: AnyObject {
func setGestureRecognizerEnabled(view: UIView, isEnabled: Bool, itemAtPoint: @escaping (CGPoint) -> (AnyHashable, CALayer, TelegramMediaFile)?)
}
public protocol EmojiCustomContentView: UIView {
var tintContainerView: UIView { get }
func update(theme: PresentationTheme, useOpaqueTheme: Bool, availableSize: CGSize, transition: Transition) -> CGSize
}
public final class EmojiPagerContentComponent: Component {
public static let staticEmojiMapping: [(EmojiPagerContentComponent.StaticEmojiSegment, [String])] = {
guard let path = getAppBundle().path(forResource: "emoji1016", ofType: "txt") else {
@@ -2263,7 +2269,7 @@ public final class EmojiPagerContentComponent: Component {
self.isDisabled = isDisabled
}
}
public struct CustomLayout: Equatable {
public var itemsPerRow: Int
public var itemSize: CGFloat
@@ -2322,6 +2328,7 @@ public final class EmojiPagerContentComponent: Component {
public let customLayout: CustomLayout?
public let externalBackground: ExternalBackground?
public weak var externalExpansionView: UIView?
public let customContentView: EmojiCustomContentView?
public let useOpaqueTheme: Bool
public let hideBackground: Bool
public let scrollingStickersGridPromise = ValuePromise<Bool>(false)
@@ -2350,6 +2357,7 @@ public final class EmojiPagerContentComponent: Component {
customLayout: CustomLayout?,
externalBackground: ExternalBackground?,
externalExpansionView: UIView?,
customContentView: EmojiCustomContentView?,
useOpaqueTheme: Bool,
hideBackground: Bool,
stateContext: StateContext?,
@@ -2376,6 +2384,7 @@ public final class EmojiPagerContentComponent: Component {
self.customLayout = customLayout
self.externalBackground = externalBackground
self.externalExpansionView = externalExpansionView
self.customContentView = customContentView
self.useOpaqueTheme = useOpaqueTheme
self.hideBackground = hideBackground
self.stateContext = stateContext
@@ -2849,6 +2858,7 @@ public final class EmojiPagerContentComponent: Component {
var verticalGroupDefaultSpacing: CGFloat
var verticalGroupFeaturedSpacing: CGFloat
var itemsPerRow: Int
var customContentHeight: CGFloat
var contentSize: CGSize
var searchInsets: UIEdgeInsets
@@ -2857,9 +2867,21 @@ public final class EmojiPagerContentComponent: Component {
var premiumButtonInset: CGFloat
var premiumButtonHeight: CGFloat
init(layoutType: ItemLayoutType, width: CGFloat, containerInsets: UIEdgeInsets, itemGroups: [ItemGroupDescription], expandedGroupIds: Set<AnyHashable>, curveNearBounds: Bool, displaySearch: Bool, isSearchActivated: Bool, customLayout: CustomLayout?) {
init(
layoutType: ItemLayoutType,
width: CGFloat,
containerInsets: UIEdgeInsets,
itemGroups: [ItemGroupDescription],
expandedGroupIds: Set<AnyHashable>,
curveNearBounds: Bool,
displaySearch: Bool,
isSearchActivated: Bool,
customContentHeight: CGFloat,
customLayout: CustomLayout?
) {
self.layoutType = layoutType
self.width = width
self.customContentHeight = customContentHeight
self.premiumButtonInset = 6.0
self.premiumButtonHeight = 50.0
@@ -2926,6 +2948,8 @@ public final class EmojiPagerContentComponent: Component {
self.itemInsets.left = floorToScreenPixels((width - actualContentWidth) / 2.0)
self.itemInsets.right = self.itemInsets.left
self.itemInsets.top += self.customContentHeight
if displaySearch {
self.itemInsets.top += self.searchHeight - 4.0
}
@@ -3651,6 +3675,7 @@ public final class EmojiPagerContentComponent: Component {
private let placeholdersContainerView: UIView
private var visibleSearchHeader: EmojiSearchHeaderView?
private var visibleEmptySearchResultsView: EmptySearchResultsView?
private var visibleCustomContentView: EmojiCustomContentView?
private var visibleItemPlaceholderViews: [ItemLayer.Key: ItemPlaceholderView] = [:]
private var visibleFillPlaceholdersViews: [Int: ItemPlaceholderView] = [:]
private var visibleItemSelectionLayers: [ItemLayer.Key: ItemSelectionLayer] = [:]
@@ -6357,6 +6382,7 @@ public final class EmojiPagerContentComponent: Component {
var updatedItemPositions: [VisualItemKey: CGPoint]?
let contentAnimation = transition.userData(ContentAnimation.self)
let useOpaqueTheme = component.inputInteractionHolder.inputInteraction?.useOpaqueTheme ?? false
var transitionHintInstalledGroupId: AnyHashable?
var transitionHintExpandedGroupId: AnyHashable?
@@ -6483,6 +6509,30 @@ public final class EmojiPagerContentComponent: Component {
calculateUpdatedItemPositions = true
}
var customContentHeight: CGFloat = 0.0
if let customContentView = component.inputInteractionHolder.inputInteraction?.customContentView {
var customContentViewTransition = transition
if let _ = self.visibleCustomContentView {
} else {
customContentViewTransition = .immediate
self.visibleCustomContentView = customContentView
self.scrollView.addSubview(customContentView)
self.mirrorContentScrollView.addSubview(customContentView.tintContainerView)
}
let availableCustomContentSize = availableSize
let customContentViewSize = customContentView.update(theme: keyboardChildEnvironment.theme, useOpaqueTheme: useOpaqueTheme, availableSize: availableCustomContentSize, transition: customContentViewTransition)
customContentViewTransition.setFrame(view: customContentView, frame: CGRect(origin: CGPoint(x: 0.0, y: pagerEnvironment.containerInsets.top + (component.displaySearchWithPlaceholder != nil ? 54.0 : 0.0)), size: customContentViewSize))
customContentHeight = customContentViewSize.height
} else {
if let visibleCustomContentView = self.visibleCustomContentView {
self.visibleCustomContentView = nil
visibleCustomContentView.removeFromSuperview()
visibleCustomContentView.tintContainerView.removeFromSuperview()
}
}
var itemGroups: [ItemGroupDescription] = []
for itemGroup in component.contentItemGroups {
itemGroups.append(ItemGroupDescription(
@@ -6508,6 +6558,7 @@ public final class EmojiPagerContentComponent: Component {
curveNearBounds: component.warpContentsOnEdges,
displaySearch: component.displaySearchWithPlaceholder != nil,
isSearchActivated: self.isSearchActivated,
customContentHeight: customContentHeight,
customLayout: component.inputInteractionHolder.inputInteraction?.customLayout
)
let itemLayout = extractedExpr
@@ -6704,7 +6755,6 @@ public final class EmojiPagerContentComponent: Component {
}
}
let useOpaqueTheme = component.inputInteractionHolder.inputInteraction?.useOpaqueTheme ?? false
if let displaySearchWithPlaceholder = component.displaySearchWithPlaceholder {
let visibleSearchHeader: EmojiSearchHeaderView
@@ -6812,8 +6862,7 @@ public final class EmojiPagerContentComponent: Component {
visibleSearchHeader.tintContainerView.removeFromSuperview()
}
}
if let emptySearchResults = component.emptySearchResults {
let visibleEmptySearchResultsView: EmptySearchResultsView
var emptySearchResultsTransition = transition