mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Attachment Menu Improvements
This commit is contained in:
parent
95b6b44d0a
commit
2efbb9170f
@ -12,71 +12,15 @@ import ChatPresentationInterfaceState
|
||||
import ChatSendMessageActionUI
|
||||
import ChatTextLinkEditUI
|
||||
|
||||
let panelButtonSize = CGSize(width: 80.0, height: 72.0)
|
||||
let smallPanelButtonSize = CGSize(width: 60.0, height: 49.0)
|
||||
|
||||
private let iconSize = CGSize(width: 54.0, height: 42.0)
|
||||
private let normalSideInset: CGFloat = 3.0
|
||||
private let smallSideInset: CGFloat = 0.0
|
||||
private let buttonSize = CGSize(width: 75.0, height: 49.0)
|
||||
private let iconSize = CGSize(width: 30.0, height: 30.0)
|
||||
private let sideInset: CGFloat = 0.0
|
||||
|
||||
private enum AttachmentButtonTransition {
|
||||
case transitionIn
|
||||
case selection
|
||||
}
|
||||
|
||||
private func generateBackgroundImage(colors: [UIColor]) -> UIImage? {
|
||||
return generateImage(iconSize, rotatedContext: { size, context in
|
||||
var locations: [CGFloat]
|
||||
if colors.count == 3 {
|
||||
locations = [1.0, 0.5, 0.0]
|
||||
} else {
|
||||
locations = [1.0, 0.0]
|
||||
}
|
||||
let colors: [CGColor] = colors.map { $0.cgColor }
|
||||
let colorSpace = CGColorSpaceCreateDeviceRGB()
|
||||
let gradient = CGGradient(colorsSpace: colorSpace, colors: colors as CFArray, locations: &locations)!
|
||||
|
||||
if colors.count == 2 {
|
||||
context.drawLinearGradient(gradient, start: CGPoint(), end: CGPoint(x: 0.0, y: size.height), options: .drawsAfterEndLocation)
|
||||
} else if colors.count == 3 {
|
||||
context.drawLinearGradient(gradient, start: CGPoint(x: 0.0, y: size.height), end: CGPoint(x: size.width, y: 0.0), options: .drawsAfterEndLocation)
|
||||
}
|
||||
// let center = CGPoint(x: 10.0, y: 10.0)
|
||||
// context.drawRadialGradient(gradient, startCenter: center, startRadius: 0.0, endCenter: center, endRadius: size.width, options: .drawsAfterEndLocation)
|
||||
})
|
||||
}
|
||||
|
||||
private let buttonGlowImage: UIImage? = {
|
||||
let inset: CGFloat = 6.0
|
||||
return generateImage(CGSize(width: iconSize.width + inset * 2.0, height: iconSize.height + inset * 2.0), rotatedContext: { size, context in
|
||||
let bounds = CGRect(origin: CGPoint(), size: size)
|
||||
context.clear(bounds)
|
||||
|
||||
let rect = bounds.insetBy(dx: inset, dy: inset)
|
||||
let path = UIBezierPath(roundedRect: rect, cornerRadius: 21.0).cgPath
|
||||
context.addRect(bounds)
|
||||
context.addPath(path)
|
||||
context.clip(using: .evenOdd)
|
||||
|
||||
context.addPath(path)
|
||||
context.setShadow(offset: CGSize(), blur: 14.0, color: UIColor(rgb: 0xffffff, alpha: 0.8).cgColor)
|
||||
context.setFillColor(UIColor.white.cgColor)
|
||||
context.fillPath()
|
||||
})?.withRenderingMode(.alwaysTemplate)
|
||||
}()
|
||||
|
||||
private let buttonSelectionMaskImage: UIImage? = {
|
||||
let inset: CGFloat = 3.0
|
||||
return generateImage(CGSize(width: iconSize.width + inset * 2.0, height: iconSize.height + inset * 2.0), rotatedContext: { size, context in
|
||||
let bounds = CGRect(origin: CGPoint(), size: size)
|
||||
context.clear(bounds)
|
||||
|
||||
let path = UIBezierPath(roundedRect: bounds, cornerRadius: 23.0).cgPath
|
||||
context.addPath(path)
|
||||
context.setFillColor(UIColor(rgb: 0xffffff).cgColor)
|
||||
context.fillPath()
|
||||
})?.withRenderingMode(.alwaysTemplate)
|
||||
}()
|
||||
|
||||
private final class AttachButtonComponent: CombinedComponent {
|
||||
let context: AccountContext
|
||||
@ -134,103 +78,87 @@ private final class AttachButtonComponent: CombinedComponent {
|
||||
}
|
||||
|
||||
static var body: Body {
|
||||
let icon = Child(AttachButtonIconComponent.self)
|
||||
let icon = Child(Image.self)
|
||||
let title = Child(Text.self)
|
||||
|
||||
return { context in
|
||||
let name: String
|
||||
let animationName: String?
|
||||
let imageName: String?
|
||||
let backgroundColors: [UIColor]
|
||||
let foregroundColor: UIColor = .white
|
||||
|
||||
let isCollapsed = context.component.isCollapsed
|
||||
let component = context.component
|
||||
let strings = component.strings
|
||||
|
||||
switch context.component.type {
|
||||
switch component.type {
|
||||
case .camera:
|
||||
name = context.component.strings.Attachment_Camera
|
||||
name = strings.Attachment_Camera
|
||||
animationName = "anim_camera"
|
||||
imageName = "Chat/Attach Menu/Camera"
|
||||
backgroundColors = [UIColor(rgb: 0xba4aae), UIColor(rgb: 0xdd4e6f), UIColor(rgb: 0xf4b76c)]
|
||||
case .gallery:
|
||||
name = context.component.strings.Attachment_Gallery
|
||||
name = strings.Attachment_Gallery
|
||||
animationName = "anim_gallery"
|
||||
imageName = "Chat/Attach Menu/Gallery"
|
||||
backgroundColors = [UIColor(rgb: 0x2071f1), UIColor(rgb: 0x1bc9fa)]
|
||||
case .file:
|
||||
name = context.component.strings.Attachment_File
|
||||
name = strings.Attachment_File
|
||||
animationName = "anim_file"
|
||||
imageName = "Chat/Attach Menu/File"
|
||||
backgroundColors = [UIColor(rgb: 0xed705d), UIColor(rgb: 0xffa14c)]
|
||||
case .location:
|
||||
name = context.component.strings.Attachment_Location
|
||||
name = strings.Attachment_Location
|
||||
animationName = "anim_location"
|
||||
imageName = "Chat/Attach Menu/Location"
|
||||
backgroundColors = [UIColor(rgb: 0x5fb84f), UIColor(rgb: 0x99de6f)]
|
||||
case .contact:
|
||||
name = context.component.strings.Attachment_Contact
|
||||
name = strings.Attachment_Contact
|
||||
animationName = "anim_contact"
|
||||
imageName = "Chat/Attach Menu/Contact"
|
||||
backgroundColors = [UIColor(rgb: 0xaa47d6), UIColor(rgb: 0xd67cf4)]
|
||||
case .poll:
|
||||
name = context.component.strings.Attachment_Poll
|
||||
name = strings.Attachment_Poll
|
||||
animationName = "anim_poll"
|
||||
imageName = "Chat/Attach Menu/Poll"
|
||||
backgroundColors = [UIColor(rgb: 0xe9484f), UIColor(rgb: 0xee707e)]
|
||||
case let .app(appName):
|
||||
name = appName
|
||||
animationName = nil
|
||||
imageName = nil
|
||||
backgroundColors = [UIColor(rgb: 0x000000), UIColor(rgb: 0x000000)]
|
||||
}
|
||||
|
||||
let image = imageName.flatMap { UIImage(bundleImageName: $0)?.withRenderingMode(.alwaysTemplate) }
|
||||
let tintColor = component.isSelected ? component.theme.rootController.tabBar.selectedIconColor : component.theme.rootController.tabBar.iconColor
|
||||
|
||||
let icon = icon.update(
|
||||
component: AttachButtonIconComponent(
|
||||
animationName: animationName,
|
||||
imageName: imageName,
|
||||
isSelected: context.component.isSelected,
|
||||
backgroundColors: backgroundColors,
|
||||
foregroundColor: foregroundColor,
|
||||
theme: context.component.theme,
|
||||
context: context.component.context,
|
||||
action: context.component.action
|
||||
),
|
||||
availableSize: iconSize,
|
||||
component: Image(image: image, tintColor: tintColor),
|
||||
availableSize: CGSize(width: 30.0, height: 30.0),
|
||||
transition: context.transition
|
||||
)
|
||||
|
||||
print(animationName ?? "")
|
||||
|
||||
let title = title.update(
|
||||
component: Text(
|
||||
text: name,
|
||||
font: Font.regular(11.0),
|
||||
color: context.component.theme.actionSheet.primaryTextColor
|
||||
font: Font.regular(10.0),
|
||||
color: context.component.isSelected ? component.theme.rootController.tabBar.selectedTextColor : component.theme.rootController.tabBar.textColor
|
||||
),
|
||||
availableSize: context.availableSize,
|
||||
transition: .immediate
|
||||
)
|
||||
|
||||
let topInset: CGFloat = 8.0
|
||||
let spacing: CGFloat = 3.0 + UIScreenPixel
|
||||
let topInset: CGFloat = 5.0 + UIScreenPixel
|
||||
let spacing: CGFloat = 15.0 + UIScreenPixel
|
||||
|
||||
let normalIconScale = isCollapsed ? 0.7 : 1.0
|
||||
let smallIconScale = isCollapsed ? 0.5 : 0.6
|
||||
|
||||
let iconScale = normalIconScale - (normalIconScale - smallIconScale) * abs(context.component.transitionFraction)
|
||||
let iconOffset: CGFloat = (isCollapsed ? 10.0 : 20.0) * context.component.transitionFraction
|
||||
let iconFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((context.availableSize.width - icon.size.width) / 2.0) + iconOffset, y: isCollapsed ? 3.0 : topInset), size: icon.size)
|
||||
var titleFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((context.availableSize.width - title.size.width) / 2.0) + iconOffset, y: iconFrame.midY + (iconFrame.height * 0.5 * iconScale) + spacing), size: title.size)
|
||||
if isCollapsed {
|
||||
titleFrame.origin.y = floorToScreenPixels(iconFrame.midY - title.size.height / 2.0)
|
||||
}
|
||||
let iconFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((context.availableSize.width - icon.size.width) / 2.0), y: topInset), size: icon.size)
|
||||
let titleFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((context.availableSize.width - title.size.width) / 2.0), y: iconFrame.midY + spacing), size: title.size)
|
||||
|
||||
context.add(title
|
||||
.position(CGPoint(x: titleFrame.midX, y: titleFrame.midY))
|
||||
.opacity(isCollapsed ? 0.0 : 1.0 - abs(context.component.transitionFraction))
|
||||
.gesture(.tap {
|
||||
component.action()
|
||||
})
|
||||
)
|
||||
|
||||
context.add(icon
|
||||
.position(CGPoint(x: iconFrame.midX, y: iconFrame.midY))
|
||||
.scale(iconScale)
|
||||
.gesture(.tap {
|
||||
component.action()
|
||||
})
|
||||
)
|
||||
|
||||
return context.availableSize
|
||||
@ -238,197 +166,6 @@ private final class AttachButtonComponent: CombinedComponent {
|
||||
}
|
||||
}
|
||||
|
||||
private final class AttachButtonIconComponent: Component {
|
||||
let animationName: String?
|
||||
let imageName: String?
|
||||
let isSelected: Bool
|
||||
let backgroundColors: [UIColor]
|
||||
let foregroundColor: UIColor
|
||||
let theme: PresentationTheme
|
||||
let context: AccountContext
|
||||
|
||||
let action: () -> Void
|
||||
|
||||
init(
|
||||
animationName: String?,
|
||||
imageName: String?,
|
||||
isSelected: Bool,
|
||||
backgroundColors: [UIColor],
|
||||
foregroundColor: UIColor,
|
||||
theme: PresentationTheme,
|
||||
context: AccountContext,
|
||||
action: @escaping () -> Void
|
||||
) {
|
||||
self.animationName = animationName
|
||||
self.imageName = imageName
|
||||
self.isSelected = isSelected
|
||||
self.backgroundColors = backgroundColors
|
||||
self.foregroundColor = foregroundColor
|
||||
self.theme = theme
|
||||
self.context = context
|
||||
self.action = action
|
||||
}
|
||||
|
||||
static func ==(lhs: AttachButtonIconComponent, rhs: AttachButtonIconComponent) -> Bool {
|
||||
if lhs.animationName != rhs.animationName {
|
||||
return false
|
||||
}
|
||||
if lhs.imageName != rhs.imageName {
|
||||
return false
|
||||
}
|
||||
if lhs.isSelected != rhs.isSelected {
|
||||
return false
|
||||
}
|
||||
if lhs.backgroundColors != rhs.backgroundColors {
|
||||
return false
|
||||
}
|
||||
if lhs.foregroundColor != rhs.foregroundColor {
|
||||
return false
|
||||
}
|
||||
if lhs.theme !== rhs.theme {
|
||||
return false
|
||||
}
|
||||
if lhs.context !== rhs.context {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
final class View: HighlightTrackingButton {
|
||||
private let containerView: UIView
|
||||
private let glowView: UIImageView
|
||||
private let selectionView: UIImageView
|
||||
private let backgroundView: UIView
|
||||
private let iconView: UIImageView
|
||||
private let highlightView: UIView
|
||||
|
||||
private var action: (() -> Void)?
|
||||
|
||||
private var currentColors: [UIColor] = []
|
||||
private var currentImageName: String?
|
||||
private var currentIsSelected: Bool?
|
||||
|
||||
private let hapticFeedback = HapticFeedback()
|
||||
|
||||
init() {
|
||||
self.containerView = UIView()
|
||||
self.containerView.isUserInteractionEnabled = false
|
||||
|
||||
self.glowView = UIImageView()
|
||||
self.glowView.image = buttonGlowImage
|
||||
self.glowView.isUserInteractionEnabled = false
|
||||
|
||||
self.selectionView = UIImageView()
|
||||
self.selectionView.image = buttonSelectionMaskImage
|
||||
self.selectionView.isUserInteractionEnabled = false
|
||||
|
||||
self.backgroundView = UIView()
|
||||
self.backgroundView.clipsToBounds = true
|
||||
self.backgroundView.isUserInteractionEnabled = false
|
||||
self.backgroundView.layer.cornerRadius = 21.0
|
||||
|
||||
self.iconView = UIImageView()
|
||||
|
||||
self.highlightView = UIView()
|
||||
self.highlightView.alpha = 0.0
|
||||
self.highlightView.backgroundColor = UIColor(rgb: 0x000000, alpha: 0.1)
|
||||
self.highlightView.isUserInteractionEnabled = false
|
||||
|
||||
super.init(frame: CGRect())
|
||||
|
||||
self.addSubview(self.containerView)
|
||||
self.containerView.addSubview(self.glowView)
|
||||
self.containerView.addSubview(self.selectionView)
|
||||
self.containerView.addSubview(self.backgroundView)
|
||||
self.backgroundView.addSubview(self.iconView)
|
||||
self.backgroundView.addSubview(self.highlightView)
|
||||
|
||||
self.addTarget(self, action: #selector(self.pressed), for: .touchUpInside)
|
||||
self.highligthedChanged = { [weak self] highlighted in
|
||||
if let strongSelf = self {
|
||||
if highlighted {
|
||||
strongSelf.containerView.layer.animateScale(from: 1.0, to: 0.9, duration: 0.3, removeOnCompletion: false)
|
||||
|
||||
strongSelf.highlightView.layer.removeAnimation(forKey: "opacity")
|
||||
strongSelf.highlightView.alpha = 1.0
|
||||
|
||||
strongSelf.hapticFeedback.impact(.click05)
|
||||
} else {
|
||||
if let presentationLayer = strongSelf.containerView.layer.presentation() {
|
||||
strongSelf.containerView.layer.animateScale(from: CGFloat((presentationLayer.value(forKeyPath: "transform.scale.y") as? NSNumber)?.floatValue ?? 1.0), to: 1.0, duration: 0.2, removeOnCompletion: false)
|
||||
}
|
||||
|
||||
strongSelf.highlightView.alpha = 0.0
|
||||
strongSelf.highlightView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2)
|
||||
|
||||
strongSelf.hapticFeedback.impact(.click06)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
required init?(coder aDecoder: NSCoder) {
|
||||
preconditionFailure()
|
||||
}
|
||||
|
||||
@objc private func pressed() {
|
||||
self.action?()
|
||||
}
|
||||
|
||||
func update(component: AttachButtonIconComponent, availableSize: CGSize, transition: Transition) -> CGSize {
|
||||
self.action = component.action
|
||||
|
||||
if self.currentColors != component.backgroundColors {
|
||||
self.currentColors = component.backgroundColors
|
||||
self.backgroundView.layer.contents = generateBackgroundImage(colors: component.backgroundColors)?.cgImage
|
||||
|
||||
if let color = component.backgroundColors.last {
|
||||
self.glowView.tintColor = color
|
||||
self.selectionView.tintColor = color.withAlphaComponent(0.2)
|
||||
}
|
||||
}
|
||||
|
||||
if self.currentImageName != component.imageName {
|
||||
self.currentImageName = component.imageName
|
||||
if let imageName = component.imageName, let image = UIImage(bundleImageName: imageName) {
|
||||
self.iconView.image = image
|
||||
|
||||
let scale: CGFloat = 0.875
|
||||
let iconSize = CGSize(width: floorToScreenPixels(image.size.width * scale), height: floorToScreenPixels(image.size.height * scale))
|
||||
self.iconView.frame = CGRect(origin: CGPoint(x: floorToScreenPixels((availableSize.width - iconSize.width) / 2.0), y: floorToScreenPixels((availableSize.height - iconSize.height) / 2.0)), size: iconSize)
|
||||
}
|
||||
}
|
||||
|
||||
if self.currentIsSelected != component.isSelected {
|
||||
self.currentIsSelected = component.isSelected
|
||||
|
||||
transition.setScale(view: self.selectionView, scale: component.isSelected ? 1.0 : 0.8)
|
||||
}
|
||||
|
||||
let contentFrame = CGRect(origin: CGPoint(), size: availableSize)
|
||||
self.containerView.frame = contentFrame
|
||||
self.backgroundView.frame = contentFrame
|
||||
self.highlightView.frame = contentFrame
|
||||
|
||||
self.glowView.bounds = CGRect(origin: CGPoint(), size: CGSize(width: contentFrame.width + 12.0, height: contentFrame.height + 12.0))
|
||||
self.glowView.center = CGPoint(x: contentFrame.midX, y: contentFrame.midY)
|
||||
|
||||
self.selectionView.bounds = CGRect(origin: CGPoint(), size: CGSize(width: contentFrame.width + 6.0, height: contentFrame.height + 6.0))
|
||||
self.selectionView.center = CGPoint(x: contentFrame.midX, y: contentFrame.midY)
|
||||
|
||||
return availableSize
|
||||
}
|
||||
}
|
||||
|
||||
func makeView() -> View {
|
||||
return View()
|
||||
}
|
||||
|
||||
func update(view: View, availableSize: CGSize, environment: Environment<Empty>, transition: Transition) -> CGSize {
|
||||
return view.update(component: self, availableSize: availableSize, transition: transition)
|
||||
}
|
||||
}
|
||||
|
||||
final class AttachmentPanel: ASDisplayNode, UIScrollViewDelegate {
|
||||
private let context: AccountContext
|
||||
private var presentationData: PresentationData
|
||||
@ -707,9 +444,7 @@ final class AttachmentPanel: ASDisplayNode, UIScrollViewDelegate {
|
||||
let actualVisibleRect = self.scrollNode.bounds
|
||||
var validButtons = Set<Int>()
|
||||
|
||||
let buttonSize = self.isCollapsed ? smallPanelButtonSize : panelButtonSize
|
||||
var sideInset = self.isCollapsed ? smallSideInset : normalSideInset
|
||||
|
||||
var sideInset = sideInset
|
||||
let buttonsWidth = sideInset * 2.0 + buttonSize.width * CGFloat(self.buttons.count)
|
||||
if buttonsWidth < layout.size.width {
|
||||
sideInset = floorToScreenPixels((layout.size.width - buttonsWidth) / 2.0)
|
||||
@ -779,11 +514,16 @@ final class AttachmentPanel: ASDisplayNode, UIScrollViewDelegate {
|
||||
return false
|
||||
}
|
||||
|
||||
let buttonSize = self.isCollapsed ? smallPanelButtonSize : panelButtonSize
|
||||
let contentSize = CGSize(width: (self.isCollapsed ? smallSideInset : normalSideInset) * 2.0 + CGFloat(self.buttons.count) * buttonSize.width, height: buttonSize.height)
|
||||
var sideInset = sideInset
|
||||
let buttonsWidth = sideInset * 2.0 + buttonSize.width * CGFloat(self.buttons.count)
|
||||
if buttonsWidth < layout.size.width {
|
||||
sideInset = floorToScreenPixels((layout.size.width - buttonsWidth) / 2.0)
|
||||
}
|
||||
|
||||
let contentSize = CGSize(width: sideInset * 2.0 + CGFloat(self.buttons.count) * buttonSize.width, height: buttonSize.height)
|
||||
self.scrollLayout = (layout.size.width, contentSize)
|
||||
|
||||
transition.updateFrame(node: self.scrollNode, frame: CGRect(origin: CGPoint(x: 0.0, y: self.isSelecting ? -panelButtonSize.height : 0.0), size: CGSize(width: layout.size.width, height: panelButtonSize.height)))
|
||||
transition.updateFrame(node: self.scrollNode, frame: CGRect(origin: CGPoint(x: 0.0, y: self.isSelecting ? -buttonSize.height : 0.0), size: CGSize(width: layout.size.width, height: buttonSize.height)))
|
||||
self.scrollNode.view.contentSize = contentSize
|
||||
|
||||
return true
|
||||
@ -866,13 +606,11 @@ final class AttachmentPanel: ASDisplayNode, UIScrollViewDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
let bounds = CGRect(origin: CGPoint(), size: CGSize(width: layout.size.width, height: panelButtonSize.height + insets.bottom))
|
||||
let bounds = CGRect(origin: CGPoint(), size: CGSize(width: layout.size.width, height: buttonSize.height + insets.bottom))
|
||||
let containerTransition: ContainedViewLayoutTransition
|
||||
let containerFrame: CGRect
|
||||
if isSelecting {
|
||||
containerFrame = CGRect(origin: CGPoint(), size: CGSize(width: bounds.width, height: textPanelHeight + insets.bottom))
|
||||
} else if isCollapsed {
|
||||
containerFrame = CGRect(origin: CGPoint(), size: CGSize(width: bounds.width, height: smallPanelButtonSize.height + insets.bottom))
|
||||
} else {
|
||||
containerFrame = bounds
|
||||
}
|
||||
|
@ -285,47 +285,6 @@ private final class DayEnvironment: Equatable {
|
||||
}
|
||||
}
|
||||
|
||||
private final class ImageComponent: Component {
|
||||
let image: UIImage?
|
||||
|
||||
init(
|
||||
image: UIImage?
|
||||
) {
|
||||
self.image = image
|
||||
}
|
||||
|
||||
static func ==(lhs: ImageComponent, rhs: ImageComponent) -> Bool {
|
||||
if lhs.image !== rhs.image {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
final class View: UIImageView {
|
||||
init() {
|
||||
super.init(frame: CGRect())
|
||||
}
|
||||
|
||||
required init?(coder aDecoder: NSCoder) {
|
||||
preconditionFailure()
|
||||
}
|
||||
|
||||
func update(component: ImageComponent, availableSize: CGSize, environment: Environment<Empty>, transition: Transition) -> CGSize {
|
||||
self.image = component.image
|
||||
|
||||
return availableSize
|
||||
}
|
||||
}
|
||||
|
||||
func makeView() -> View {
|
||||
return View()
|
||||
}
|
||||
|
||||
func update(view: View, availableSize: CGSize, environment: Environment<Empty>, transition: Transition) -> CGSize {
|
||||
return view.update(component: self, availableSize: availableSize, environment: environment, transition: transition)
|
||||
}
|
||||
}
|
||||
|
||||
private final class DayComponent: Component {
|
||||
typealias EnvironmentType = DayEnvironment
|
||||
|
||||
@ -894,7 +853,7 @@ private final class MonthComponent: CombinedComponent {
|
||||
|
||||
let selectionRect = CGRect(origin: CGPoint(x: minX, y: minY), size: CGSize(width: maxX - minX, height: maxY - minY))
|
||||
let selection = selections[lineIndex].update(
|
||||
component: AnyComponent(ImageComponent(image: dayEnvironment.imageCache.monthSelection(leftRadius: selectionRadius, rightRadius: selectionRadius, maxRadius: selectionRadius, color: monthSelectionColor))),
|
||||
component: AnyComponent(Image(image: dayEnvironment.imageCache.monthSelection(leftRadius: selectionRadius, rightRadius: selectionRadius, maxRadius: selectionRadius, color: monthSelectionColor))),
|
||||
availableSize: selectionRect.size,
|
||||
transition: .immediate
|
||||
)
|
||||
|
@ -475,6 +475,7 @@ private class _AnyCombinedComponentContext {
|
||||
} else {
|
||||
let gestureInstance = gesture.create()
|
||||
self.gestures[gesture.id.id] = gestureInstance
|
||||
self.view.isUserInteractionEnabled = true
|
||||
self.view.addGestureRecognizer(gestureInstance)
|
||||
}
|
||||
}
|
||||
|
50
submodules/ComponentFlow/Source/Components/Image.swift
Normal file
50
submodules/ComponentFlow/Source/Components/Image.swift
Normal file
@ -0,0 +1,50 @@
|
||||
import Foundation
|
||||
import UIKit
|
||||
|
||||
public final class Image: Component {
|
||||
public let image: UIImage?
|
||||
public let tintColor: UIColor?
|
||||
|
||||
public init(
|
||||
image: UIImage?,
|
||||
tintColor: UIColor? = nil
|
||||
) {
|
||||
self.image = image
|
||||
self.tintColor = tintColor
|
||||
}
|
||||
|
||||
public static func ==(lhs: Image, rhs: Image) -> Bool {
|
||||
if lhs.image !== rhs.image {
|
||||
return false
|
||||
}
|
||||
if lhs.tintColor != rhs.tintColor {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
public final class View: UIImageView {
|
||||
init() {
|
||||
super.init(frame: CGRect())
|
||||
}
|
||||
|
||||
required init?(coder aDecoder: NSCoder) {
|
||||
preconditionFailure()
|
||||
}
|
||||
|
||||
func update(component: Image, availableSize: CGSize, environment: Environment<Empty>, transition: Transition) -> CGSize {
|
||||
self.image = component.image
|
||||
self.tintColor = component.tintColor
|
||||
|
||||
return availableSize
|
||||
}
|
||||
}
|
||||
|
||||
public func makeView() -> View {
|
||||
return View()
|
||||
}
|
||||
|
||||
public func update(view: View, availableSize: CGSize, environment: Environment<Empty>, transition: Transition) -> CGSize {
|
||||
return view.update(component: self, availableSize: availableSize, environment: environment, transition: transition)
|
||||
}
|
||||
}
|
@ -215,7 +215,7 @@ public protocol CustomViewControllerNavigationDataSummary: AnyObject {
|
||||
open func navigationLayout(layout: ContainerViewLayout) -> NavigationLayout {
|
||||
let statusBarHeight: CGFloat = layout.statusBarHeight ?? 0.0
|
||||
var defaultNavigationBarHeight: CGFloat
|
||||
if self._presentedInModal {
|
||||
if self._presentedInModal && layout.orientation == .portrait {
|
||||
defaultNavigationBarHeight = 56.0
|
||||
} else {
|
||||
defaultNavigationBarHeight = 44.0
|
||||
|
@ -33,7 +33,7 @@
|
||||
@property (nonatomic) bool hasSilentPosting;
|
||||
@property (nonatomic) bool hasSchedule;
|
||||
@property (nonatomic) bool reminder;
|
||||
@property (nonatomic, copy) void (^presentScheduleController)(void (^)(int32_t));
|
||||
@property (nonatomic, copy) void (^presentScheduleController)(bool, void (^)(int32_t));
|
||||
@property (nonatomic, copy) void (^presentTimerController)(void (^)(int32_t));
|
||||
|
||||
@property (nonatomic, strong) NSArray *underlyingViews;
|
||||
|
@ -58,7 +58,7 @@ typedef enum {
|
||||
@property (nonatomic, copy) void(^finishedTransitionOut)(void);
|
||||
@property (nonatomic, copy) void(^customPresentOverlayController)(TGOverlayController *(^)(id<LegacyComponentsContext>));
|
||||
|
||||
@property (nonatomic, copy) void (^presentScheduleController)(void (^)(int32_t));
|
||||
@property (nonatomic, copy) void (^presentScheduleController)(bool, void (^)(int32_t));
|
||||
@property (nonatomic, copy) void (^presentTimerController)(void (^)(int32_t));
|
||||
|
||||
- (instancetype)initWithContext:(id<LegacyComponentsContext>)context saveEditedPhotos:(bool)saveEditedPhotos saveCapturedMedia:(bool)saveCapturedMedia;
|
||||
|
@ -64,7 +64,7 @@ typedef enum
|
||||
@property (nonatomic, assign) bool hasSilentPosting;
|
||||
@property (nonatomic, assign) bool hasSchedule;
|
||||
@property (nonatomic, assign) bool reminder;
|
||||
@property (nonatomic, copy) void (^presentScheduleController)(void (^)(int32_t));
|
||||
@property (nonatomic, copy) void (^presentScheduleController)(bool, void (^)(int32_t));
|
||||
@property (nonatomic, copy) void (^presentTimerController)(void (^)(int32_t));
|
||||
|
||||
@property (nonatomic, assign) bool liveVideoUploadEnabled;
|
||||
@ -92,7 +92,7 @@ typedef enum
|
||||
- (UIBarButtonItem *)rightBarButtonItem;
|
||||
|
||||
- (void)send:(bool)silently;
|
||||
- (void)schedule;
|
||||
- (void)schedule:(bool)schedule;
|
||||
|
||||
- (NSArray *)resultSignalsWithCurrentItem:(TGMediaAsset *)currentItem descriptionGenerator:(id (^)(id, NSAttributedString *, NSString *, NSString *))descriptionGenerator;
|
||||
|
||||
|
@ -30,7 +30,7 @@
|
||||
@property (nonatomic, assign) bool hasSilentPosting;
|
||||
@property (nonatomic, assign) bool hasSchedule;
|
||||
@property (nonatomic, assign) bool reminder;
|
||||
@property (nonatomic, copy) void (^presentScheduleController)(void (^)(int32_t));
|
||||
@property (nonatomic, copy) void (^presentScheduleController)(bool, void (^)(int32_t));
|
||||
@property (nonatomic, copy) void (^presentTimerController)(void (^)(int32_t));
|
||||
|
||||
@property (nonatomic, assign) CGFloat topInset;
|
||||
|
@ -28,7 +28,7 @@
|
||||
@property (nonatomic, copy) void (^editorOpened)(void);
|
||||
@property (nonatomic, copy) void (^editorClosed)(void);
|
||||
|
||||
@property (nonatomic, copy) void (^presentScheduleController)(void (^)(int32_t));
|
||||
@property (nonatomic, copy) void (^presentScheduleController)(bool, void (^)(int32_t));
|
||||
@property (nonatomic, copy) void (^presentTimerController)(void (^)(int32_t));
|
||||
|
||||
- (instancetype)initWithContext:(id<LegacyComponentsContext>)context item:(id)item fetchResult:(TGMediaAssetFetchResult *)fetchResult parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions inhibitMute:(bool)inhibitMute asFile:(bool)asFile itemsLimit:(NSUInteger)itemsLimit recipientName:(NSString *)recipientName hasSilentPosting:(bool)hasSilentPosting hasSchedule:(bool)hasSchedule reminder:(bool)reminder stickersContext:(id<TGPhotoPaintStickersContext>)stickersContext;
|
||||
|
@ -1618,7 +1618,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus
|
||||
if (strongSelf == nil)
|
||||
return;
|
||||
|
||||
strongSelf.presentScheduleController(^(int32_t time) {
|
||||
strongSelf.presentScheduleController(true, ^(int32_t time) {
|
||||
__strong TGCameraController *strongSelf = weakSelf;
|
||||
__strong TGMediaPickerGalleryModel *strongModel = weakModel;
|
||||
|
||||
|
@ -363,7 +363,7 @@
|
||||
self.pickerController.reminder = reminder;
|
||||
}
|
||||
|
||||
- (void)setPresentScheduleController:(void (^)(void (^)(int32_t)))presentScheduleController {
|
||||
- (void)setPresentScheduleController:(void (^)(bool, void (^)(int32_t)))presentScheduleController {
|
||||
_presentScheduleController = [presentScheduleController copy];
|
||||
self.pickerController.presentScheduleController = presentScheduleController;
|
||||
}
|
||||
@ -1432,9 +1432,9 @@
|
||||
[self completeWithCurrentItem:nil silentPosting:silently scheduleTime:0];
|
||||
}
|
||||
|
||||
- (void)schedule {
|
||||
- (void)schedule:(bool)media {
|
||||
__weak TGMediaAssetsController *weakSelf = self;
|
||||
self.presentScheduleController(^(int32_t scheduleTime) {
|
||||
self.presentScheduleController(media, ^(int32_t scheduleTime) {
|
||||
[weakSelf completeWithCurrentItem:nil silentPosting:false scheduleTime:scheduleTime];
|
||||
});
|
||||
}
|
||||
|
@ -191,7 +191,7 @@
|
||||
if (strongSelf == nil)
|
||||
return;
|
||||
|
||||
strongSelf.presentScheduleController(^(int32_t time) {
|
||||
strongSelf.presentScheduleController(true, ^(int32_t time) {
|
||||
__strong TGMediaPickerModernGalleryMixin *strongSelf = weakSelf;
|
||||
if (strongSelf == nil)
|
||||
return;
|
||||
|
@ -123,7 +123,7 @@ public func legacyMediaEditor(context: AccountContext, peer: Peer, media: AnyMed
|
||||
})
|
||||
}
|
||||
|
||||
public func legacyAttachmentMenu(context: AccountContext, peer: Peer, chatLocation: ChatLocation, editMediaOptions: LegacyAttachmentMenuMediaEditing?, saveEditedPhotos: Bool, allowGrouping: Bool, hasSchedule: Bool, canSendPolls: Bool, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>), parentController: LegacyController, recentlyUsedInlineBots: [Peer], initialCaption: NSAttributedString, openGallery: @escaping () -> Void, openCamera: @escaping (TGAttachmentCameraView?, TGMenuSheetController?) -> Void, openFileGallery: @escaping () -> Void, openWebSearch: @escaping () -> Void, openMap: @escaping () -> Void, openContacts: @escaping () -> Void, openPoll: @escaping () -> Void, presentSelectionLimitExceeded: @escaping () -> Void, presentCantSendMultipleFiles: @escaping () -> Void, presentJpegConversionAlert: @escaping (@escaping (Bool) -> Void) -> Void, presentSchedulePicker: @escaping (@escaping (Int32) -> Void) -> Void, presentTimerPicker: @escaping (@escaping (Int32) -> Void) -> Void, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32, ((String) -> UIView?)?, @escaping () -> Void) -> Void, selectRecentlyUsedInlineBot: @escaping (Peer) -> Void, presentStickers: @escaping (@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?, getCaptionPanelView: @escaping () -> TGCaptionPanelView?, present: @escaping (ViewController, Any?) -> Void) -> TGMenuSheetController {
|
||||
public func legacyAttachmentMenu(context: AccountContext, peer: Peer, chatLocation: ChatLocation, editMediaOptions: LegacyAttachmentMenuMediaEditing?, saveEditedPhotos: Bool, allowGrouping: Bool, hasSchedule: Bool, canSendPolls: Bool, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>), parentController: LegacyController, recentlyUsedInlineBots: [Peer], initialCaption: NSAttributedString, openGallery: @escaping () -> Void, openCamera: @escaping (TGAttachmentCameraView?, TGMenuSheetController?) -> Void, openFileGallery: @escaping () -> Void, openWebSearch: @escaping () -> Void, openMap: @escaping () -> Void, openContacts: @escaping () -> Void, openPoll: @escaping () -> Void, presentSelectionLimitExceeded: @escaping () -> Void, presentCantSendMultipleFiles: @escaping () -> Void, presentJpegConversionAlert: @escaping (@escaping (Bool) -> Void) -> Void, presentSchedulePicker: @escaping (Bool, @escaping (Int32) -> Void) -> Void, presentTimerPicker: @escaping (@escaping (Int32) -> Void) -> Void, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32, ((String) -> UIView?)?, @escaping () -> Void) -> Void, selectRecentlyUsedInlineBot: @escaping (Peer) -> Void, presentStickers: @escaping (@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?, getCaptionPanelView: @escaping () -> TGCaptionPanelView?, present: @escaping (ViewController, Any?) -> Void) -> TGMenuSheetController {
|
||||
let defaultVideoPreset = defaultVideoPresetForContext(context)
|
||||
UserDefaults.standard.set(defaultVideoPreset.rawValue as NSNumber, forKey: "TG_preferredVideoPreset_v0")
|
||||
|
||||
@ -219,10 +219,10 @@ public func legacyAttachmentMenu(context: AccountContext, peer: Peer, chatLocati
|
||||
}
|
||||
carouselItem.hasSchedule = hasSchedule
|
||||
carouselItem.reminder = peer.id == context.account.peerId
|
||||
carouselItem.presentScheduleController = { done in
|
||||
presentSchedulePicker { time in
|
||||
carouselItem.presentScheduleController = { media, done in
|
||||
presentSchedulePicker(media, { time in
|
||||
done?(time)
|
||||
}
|
||||
})
|
||||
}
|
||||
carouselItem.presentTimerController = { done in
|
||||
presentTimerPicker { time in
|
||||
|
@ -20,7 +20,7 @@ public func guessMimeTypeByFileExtension(_ ext: String) -> String {
|
||||
return TGMimeTypeMap.mimeType(forExtension: ext) ?? "application/binary"
|
||||
}
|
||||
|
||||
public func configureLegacyAssetPicker(_ controller: TGMediaAssetsController, context: AccountContext, peer: Peer, chatLocation: ChatLocation, captionsEnabled: Bool = true, storeCreatedAssets: Bool = true, showFileTooltip: Bool = false, initialCaption: NSAttributedString, hasSchedule: Bool, presentWebSearch: (() -> Void)?, presentSelectionLimitExceeded: @escaping () -> Void, presentSchedulePicker: @escaping (@escaping (Int32) -> Void) -> Void, presentTimerPicker: @escaping (@escaping (Int32) -> Void) -> Void, presentStickers: @escaping (@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?, getCaptionPanelView: @escaping () -> TGCaptionPanelView?) {
|
||||
public func configureLegacyAssetPicker(_ controller: TGMediaAssetsController, context: AccountContext, peer: Peer, chatLocation: ChatLocation, captionsEnabled: Bool = true, storeCreatedAssets: Bool = true, showFileTooltip: Bool = false, initialCaption: NSAttributedString, hasSchedule: Bool, presentWebSearch: (() -> Void)?, presentSelectionLimitExceeded: @escaping () -> Void, presentSchedulePicker: @escaping (Bool, @escaping (Int32) -> Void) -> Void, presentTimerPicker: @escaping (@escaping (Int32) -> Void) -> Void, presentStickers: @escaping (@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?, getCaptionPanelView: @escaping () -> TGCaptionPanelView?) {
|
||||
let paintStickersContext = LegacyPaintStickersContext(context: context)
|
||||
paintStickersContext.captionPanelView = {
|
||||
return getCaptionPanelView()
|
||||
@ -44,10 +44,10 @@ public func configureLegacyAssetPicker(_ controller: TGMediaAssetsController, co
|
||||
}
|
||||
controller.hasSchedule = hasSchedule
|
||||
controller.reminder = peer.id == context.account.peerId
|
||||
controller.presentScheduleController = { done in
|
||||
presentSchedulePicker { time in
|
||||
controller.presentScheduleController = { media, done in
|
||||
presentSchedulePicker(media, { time in
|
||||
done?(time)
|
||||
}
|
||||
})
|
||||
}
|
||||
controller.presentTimerController = { done in
|
||||
presentTimerPicker { time in
|
||||
@ -109,7 +109,7 @@ public class LegacyAssetPickerContext: AttachmentMediaPickerContext {
|
||||
}
|
||||
|
||||
public func schedule() {
|
||||
self.controller?.schedule()
|
||||
self.controller?.schedule(false)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -207,7 +207,7 @@ final class LocationMapHeaderNode: ASDisplayNode {
|
||||
transition.updateAlpha(node: self.notificationButtonNode, alpha: self.proximityNotification != nil ? 1.0 : 0.0)
|
||||
transition.updateAlpha(node: self.optionsSecondSeparatorNode, alpha: self.proximityNotification != nil ? 1.0 : 0.0)
|
||||
|
||||
transition.updateFrame(node: self.optionsBackgroundNode, frame: CGRect(x: size.width - inset - panelButtonSize.width - panelInset * 2.0, y: navigationBarHeight + topPadding + inset, width: panelButtonSize.width + panelInset * 2.0, height: panelHeight + panelInset * 2.0))
|
||||
transition.updateFrame(node: self.optionsBackgroundNode, frame: CGRect(x: size.width - inset - panelButtonSize.width - panelInset * 2.0 - layout.safeInsets.right, y: navigationBarHeight + topPadding + inset, width: panelButtonSize.width + panelInset * 2.0, height: panelHeight + panelInset * 2.0))
|
||||
|
||||
let alphaTransition = ContainedViewLayoutTransition.animated(duration: 0.2, curve: .easeInOut)
|
||||
let optionsAlpha: CGFloat = size.height > 160.0 + navigationBarHeight && !self.forceIsHidden ? 1.0 : 0.0
|
||||
|
@ -55,7 +55,7 @@ final class LocationOptionsNode: ASDisplayNode {
|
||||
transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(), size: size))
|
||||
transition.updateFrame(node: self.separatorNode, frame: CGRect(x: 0.0, y: size.height, width: size.width, height: UIScreenPixel))
|
||||
|
||||
let controlSize = self.segmentedControlNode.updateLayout(.stretchToFill(width: size.width - 16.0), transition: .immediate)
|
||||
let controlSize = self.segmentedControlNode.updateLayout(.stretchToFill(width: size.width - 16.0 - leftInset - rightInset), transition: .immediate)
|
||||
self.segmentedControlNode.frame = CGRect(origin: CGPoint(x: floor((size.width - controlSize.width) / 2.0), y: 0.0), size: controlSize)
|
||||
}
|
||||
}
|
||||
|
@ -882,7 +882,7 @@ final class LocationPickerControllerNode: ViewControllerTracingNode, CLLocationM
|
||||
let optionsOffset: CGFloat = self.state.displayingMapModeOptions ? navigationHeight : navigationHeight - optionsHeight
|
||||
let optionsFrame = CGRect(x: 0.0, y: optionsOffset, width: layout.size.width, height: optionsHeight)
|
||||
transition.updateFrame(node: self.optionsNode, frame: optionsFrame)
|
||||
self.optionsNode.updateLayout(size: optionsFrame.size, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, transition: transition)
|
||||
self.optionsNode.updateLayout(size: optionsFrame.size, leftInset: insets.left, rightInset: insets.right, transition: transition)
|
||||
self.optionsNode.isUserInteractionEnabled = self.state.displayingMapModeOptions
|
||||
|
||||
if let searchContainerNode = self.searchContainerNode {
|
||||
|
@ -10,6 +10,7 @@ public enum SearchMessagesLocation: Equatable {
|
||||
case group(groupId: PeerGroupId, tags: MessageTags?, minDate: Int32?, maxDate: Int32?)
|
||||
case peer(peerId: PeerId, fromId: PeerId?, tags: MessageTags?, topMsgId: MessageId?, minDate: Int32?, maxDate: Int32?)
|
||||
case publicForwards(messageId: MessageId, datacenterId: Int?)
|
||||
case recentDocuments
|
||||
}
|
||||
|
||||
private struct SearchMessagesPeerState: Equatable {
|
||||
@ -338,6 +339,42 @@ func _internal_searchMessages(account: Account, location: SearchMessagesLocation
|
||||
return .single((nil, nil))
|
||||
}
|
||||
}
|
||||
case .recentDocuments:
|
||||
let filter: Api.MessagesFilter = messageFilterForTagMask(.file) ?? .inputMessagesFilterEmpty
|
||||
let peerId = account.peerId
|
||||
|
||||
remoteSearchResult = account.postbox.transaction { transaction -> Peer? in
|
||||
guard let peer = transaction.getPeer(peerId) else {
|
||||
return nil
|
||||
}
|
||||
return peer
|
||||
}
|
||||
|> mapToSignal { peer -> Signal<(Api.messages.Messages?, Api.messages.Messages?), NoError> in
|
||||
guard let peer = peer else {
|
||||
return .single((nil, nil))
|
||||
}
|
||||
let inputPeer = Api.InputPeer.inputPeerEmpty
|
||||
|
||||
var flags: Int32 = 0
|
||||
|
||||
let fromInputPeer = apiInputPeer(peer)
|
||||
flags |= (1 << 0)
|
||||
|
||||
let peerMessages: Signal<Api.messages.Messages?, NoError>
|
||||
if let completed = state?.main.completed, completed {
|
||||
peerMessages = .single(nil)
|
||||
} else {
|
||||
let lowerBound = state?.main.messages.last.flatMap({ $0.index })
|
||||
let signal = account.network.request(Api.functions.messages.search(flags: flags, peer: inputPeer, q: query, fromId: fromInputPeer, topMsgId: nil, filter: filter, minDate: 0, maxDate: (Int32.max - 1), offsetId: lowerBound?.id.id ?? 0, addOffset: 0, limit: limit, maxId: Int32.max - 1, minId: 0, hash: 0))
|
||||
|
||||
peerMessages = signal
|
||||
|> map(Optional.init)
|
||||
|> `catch` { _ -> Signal<Api.messages.Messages?, NoError> in
|
||||
return .single(nil)
|
||||
}
|
||||
}
|
||||
return combineLatest(peerMessages, .single(nil))
|
||||
}
|
||||
}
|
||||
|
||||
return remoteSearchResult
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "Property 1=Camera.pdf",
|
||||
"filename" : "Icon-3.pdf",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
|
107
submodules/TelegramUI/Images.xcassets/Chat/Attach Menu/Camera.imageset/Icon-3.pdf
vendored
Normal file
107
submodules/TelegramUI/Images.xcassets/Chat/Attach Menu/Camera.imageset/Icon-3.pdf
vendored
Normal file
@ -0,0 +1,107 @@
|
||||
%PDF-1.7
|
||||
|
||||
1 0 obj
|
||||
<< >>
|
||||
endobj
|
||||
|
||||
2 0 obj
|
||||
<< /Length 3 0 R >>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 3.000000 5.000000 cm
|
||||
0.635294 0.635294 0.635294 scn
|
||||
0.000000 12.652475 m
|
||||
0.000000 13.439779 0.000000 13.833430 0.049142 14.163219 c
|
||||
0.340950 16.121538 1.878462 17.659050 3.836780 17.950859 c
|
||||
4.166570 18.000000 4.560222 18.000000 5.347525 18.000000 c
|
||||
5.881966 18.000000 l
|
||||
6.567171 18.000000 7.193567 18.387135 7.500000 19.000000 c
|
||||
7.806434 19.612865 8.432830 20.000000 9.118035 20.000000 c
|
||||
14.881966 20.000000 l
|
||||
15.567171 20.000000 16.193567 19.612865 16.500000 19.000000 c
|
||||
16.806433 18.387135 17.432829 18.000000 18.118034 18.000000 c
|
||||
18.652475 18.000000 l
|
||||
19.439775 18.000000 19.833426 18.000000 20.163214 17.950859 c
|
||||
22.121534 17.659052 23.659048 16.121538 23.950855 14.163218 c
|
||||
23.999996 13.833429 23.999996 13.439779 23.999996 12.652477 c
|
||||
23.999996 7.200001 l
|
||||
23.999996 4.679764 23.999996 3.419645 23.509525 2.457043 c
|
||||
23.078094 1.610313 22.389683 0.921902 21.542953 0.490471 c
|
||||
20.580351 0.000000 19.320232 0.000000 16.799995 0.000000 c
|
||||
7.199999 0.000000 l
|
||||
4.679763 0.000000 3.419646 0.000000 2.457043 0.490471 c
|
||||
1.610313 0.921902 0.921901 1.610313 0.490471 2.457043 c
|
||||
0.000000 3.419645 0.000000 4.679764 0.000000 7.200000 c
|
||||
0.000000 12.652475 l
|
||||
h
|
||||
12.000000 12.375000 m
|
||||
10.136039 12.375000 8.625000 10.863961 8.625000 9.000000 c
|
||||
8.625000 7.136039 10.136039 5.625000 12.000000 5.625000 c
|
||||
13.863961 5.625000 15.375000 7.136039 15.375000 9.000000 c
|
||||
15.375000 10.863961 13.863961 12.375000 12.000000 12.375000 c
|
||||
h
|
||||
6.375000 9.000000 m
|
||||
6.375000 12.106602 8.893398 14.625000 12.000000 14.625000 c
|
||||
15.106602 14.625000 17.625000 12.106602 17.625000 9.000000 c
|
||||
17.625000 5.893398 15.106602 3.375000 12.000000 3.375000 c
|
||||
8.893398 3.375000 6.375000 5.893398 6.375000 9.000000 c
|
||||
h
|
||||
19.500000 12.000000 m
|
||||
20.328426 12.000000 21.000000 12.671573 21.000000 13.500000 c
|
||||
21.000000 14.328427 20.328426 15.000000 19.500000 15.000000 c
|
||||
18.671574 15.000000 18.000000 14.328427 18.000000 13.500000 c
|
||||
18.000000 12.671573 18.671574 12.000000 19.500000 12.000000 c
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
3 0 obj
|
||||
2018
|
||||
endobj
|
||||
|
||||
4 0 obj
|
||||
<< /Annots []
|
||||
/Type /Page
|
||||
/MediaBox [ 0.000000 0.000000 30.000000 30.000000 ]
|
||||
/Resources 1 0 R
|
||||
/Contents 2 0 R
|
||||
/Parent 5 0 R
|
||||
>>
|
||||
endobj
|
||||
|
||||
5 0 obj
|
||||
<< /Kids [ 4 0 R ]
|
||||
/Count 1
|
||||
/Type /Pages
|
||||
>>
|
||||
endobj
|
||||
|
||||
6 0 obj
|
||||
<< /Pages 5 0 R
|
||||
/Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
|
||||
xref
|
||||
0 7
|
||||
0000000000 65535 f
|
||||
0000000010 00000 n
|
||||
0000000034 00000 n
|
||||
0000002108 00000 n
|
||||
0000002131 00000 n
|
||||
0000002304 00000 n
|
||||
0000002378 00000 n
|
||||
trailer
|
||||
<< /ID [ (some) (id) ]
|
||||
/Root 6 0 R
|
||||
/Size 7
|
||||
>>
|
||||
startxref
|
||||
2437
|
||||
%%EOF
|
@ -1,118 +0,0 @@
|
||||
%PDF-1.7
|
||||
|
||||
1 0 obj
|
||||
<< >>
|
||||
endobj
|
||||
|
||||
2 0 obj
|
||||
<< /Length 3 0 R >>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 14.000000 17.000000 cm
|
||||
1.000000 1.000000 1.000000 scn
|
||||
0.000000 16.899923 m
|
||||
0.000000 17.921806 0.000000 18.432747 0.062100 18.861015 c
|
||||
0.443433 21.490837 2.509163 23.556566 5.138984 23.937901 c
|
||||
5.567253 24.000000 6.078194 24.000000 7.100077 24.000000 c
|
||||
7.197224 24.000000 l
|
||||
7.389089 24.000000 7.485021 24.000000 7.575428 24.005465 c
|
||||
8.449500 24.058290 9.256863 24.490376 9.785665 25.188347 c
|
||||
9.840356 25.260532 9.893565 25.340347 9.999977 25.499966 c
|
||||
10.000000 25.500000 l
|
||||
10.000046 25.500069 l
|
||||
10.000060 25.500093 l
|
||||
10.106449 25.659672 10.159652 25.739475 10.214336 25.811653 c
|
||||
10.743138 26.509623 11.550501 26.941710 12.424573 26.994535 c
|
||||
12.514979 27.000000 12.610912 27.000000 12.802777 27.000000 c
|
||||
19.197224 27.000000 l
|
||||
19.389088 27.000000 19.485020 27.000000 19.575428 26.994535 c
|
||||
20.449501 26.941710 21.256863 26.509623 21.785666 25.811653 c
|
||||
21.840359 25.739460 21.893574 25.659641 22.000000 25.500000 c
|
||||
22.106426 25.340359 22.159641 25.260540 22.214334 25.188347 c
|
||||
22.743137 24.490377 23.550499 24.058289 24.424572 24.005465 c
|
||||
24.514980 24.000000 24.610912 24.000000 24.802776 24.000000 c
|
||||
24.899923 24.000000 l
|
||||
25.921803 24.000000 26.432743 24.000000 26.861012 23.937901 c
|
||||
29.490833 23.556566 31.556562 21.490837 31.937897 18.861015 c
|
||||
31.999996 18.432747 31.999996 17.921806 31.999996 16.899923 c
|
||||
31.999996 9.600000 l
|
||||
31.999996 6.239685 31.999996 4.559526 31.346035 3.276056 c
|
||||
30.770796 2.147085 29.852911 1.229200 28.723940 0.653961 c
|
||||
27.440470 0.000000 25.760311 0.000000 22.399996 0.000000 c
|
||||
9.599999 0.000000 l
|
||||
6.239685 0.000000 4.559527 0.000000 3.276057 0.653961 c
|
||||
2.147084 1.229200 1.229201 2.147085 0.653961 3.276056 c
|
||||
0.000000 4.559526 0.000000 6.239685 0.000000 9.600000 c
|
||||
0.000000 16.899923 l
|
||||
h
|
||||
16.000000 16.500000 m
|
||||
13.514719 16.500000 11.500000 14.485281 11.500000 12.000000 c
|
||||
11.500000 9.514719 13.514719 7.500000 16.000000 7.500000 c
|
||||
18.485281 7.500000 20.500000 9.514719 20.500000 12.000000 c
|
||||
20.500000 14.485281 18.485281 16.500000 16.000000 16.500000 c
|
||||
h
|
||||
8.500000 12.000000 m
|
||||
8.500000 16.142136 11.857864 19.500000 16.000000 19.500000 c
|
||||
20.142136 19.500000 23.500000 16.142136 23.500000 12.000000 c
|
||||
23.500000 7.857864 20.142136 4.500000 16.000000 4.500000 c
|
||||
11.857864 4.500000 8.500000 7.857864 8.500000 12.000000 c
|
||||
h
|
||||
26.000000 16.000000 m
|
||||
27.104570 16.000000 28.000000 16.895432 28.000000 18.000000 c
|
||||
28.000000 19.104568 27.104570 20.000000 26.000000 20.000000 c
|
||||
24.895430 20.000000 24.000000 19.104568 24.000000 18.000000 c
|
||||
24.000000 16.895432 24.895430 16.000000 26.000000 16.000000 c
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
3 0 obj
|
||||
2589
|
||||
endobj
|
||||
|
||||
4 0 obj
|
||||
<< /Annots []
|
||||
/Type /Page
|
||||
/MediaBox [ 0.000000 0.000000 60.000000 60.000000 ]
|
||||
/Resources 1 0 R
|
||||
/Contents 2 0 R
|
||||
/Parent 5 0 R
|
||||
>>
|
||||
endobj
|
||||
|
||||
5 0 obj
|
||||
<< /Kids [ 4 0 R ]
|
||||
/Count 1
|
||||
/Type /Pages
|
||||
>>
|
||||
endobj
|
||||
|
||||
6 0 obj
|
||||
<< /Pages 5 0 R
|
||||
/Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
|
||||
xref
|
||||
0 7
|
||||
0000000000 65535 f
|
||||
0000000010 00000 n
|
||||
0000000034 00000 n
|
||||
0000002679 00000 n
|
||||
0000002702 00000 n
|
||||
0000002875 00000 n
|
||||
0000002949 00000 n
|
||||
trailer
|
||||
<< /ID [ (some) (id) ]
|
||||
/Root 6 0 R
|
||||
/Size 7
|
||||
>>
|
||||
startxref
|
||||
3008
|
||||
%%EOF
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "Union-2.pdf",
|
||||
"filename" : "Type=Default-4.pdf",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
|
89
submodules/TelegramUI/Images.xcassets/Chat/Attach Menu/Contact.imageset/Type=Default-4.pdf
vendored
Normal file
89
submodules/TelegramUI/Images.xcassets/Chat/Attach Menu/Contact.imageset/Type=Default-4.pdf
vendored
Normal file
@ -0,0 +1,89 @@
|
||||
%PDF-1.7
|
||||
|
||||
1 0 obj
|
||||
<< >>
|
||||
endobj
|
||||
|
||||
2 0 obj
|
||||
<< /Length 3 0 R >>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 2.000000 2.000000 cm
|
||||
0.000000 0.000000 0.000000 scn
|
||||
26.000000 13.000000 m
|
||||
26.000000 5.820297 20.179703 0.000000 13.000000 0.000000 c
|
||||
5.820298 0.000000 0.000000 5.820297 0.000000 13.000000 c
|
||||
0.000000 20.179703 5.820298 26.000000 13.000000 26.000000 c
|
||||
20.179703 26.000000 26.000000 20.179703 26.000000 13.000000 c
|
||||
h
|
||||
20.003258 6.872458 m
|
||||
18.344250 8.290819 16.009829 9.000000 13.000000 9.000000 c
|
||||
9.992910 9.000000 7.660003 8.292110 6.000182 6.876038 c
|
||||
5.833464 6.733803 5.622884 6.515335 5.426986 6.300488 c
|
||||
5.083337 5.923595 5.107304 5.346016 5.475027 4.992571 c
|
||||
5.660997 4.813824 5.854316 4.634521 6.004015 4.511009 c
|
||||
7.905313 2.942308 10.342612 2.000000 13.000000 2.000000 c
|
||||
15.659546 2.000000 18.098646 2.943840 20.000311 4.515163 c
|
||||
20.148626 4.637714 20.340015 4.815340 20.524366 4.992630 c
|
||||
20.891705 5.345900 20.915785 5.922966 20.572666 6.299803 c
|
||||
20.377987 6.513613 20.168888 6.730852 20.003258 6.872458 c
|
||||
h
|
||||
17.000000 16.000000 m
|
||||
17.000000 18.209139 15.209139 20.000000 13.000000 20.000000 c
|
||||
10.790861 20.000000 9.000000 18.209139 9.000000 16.000000 c
|
||||
9.000000 13.790861 10.790861 12.000000 13.000000 12.000000 c
|
||||
15.209139 12.000000 17.000000 13.790861 17.000000 16.000000 c
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
3 0 obj
|
||||
1257
|
||||
endobj
|
||||
|
||||
4 0 obj
|
||||
<< /Annots []
|
||||
/Type /Page
|
||||
/MediaBox [ 0.000000 0.000000 30.000000 30.000000 ]
|
||||
/Resources 1 0 R
|
||||
/Contents 2 0 R
|
||||
/Parent 5 0 R
|
||||
>>
|
||||
endobj
|
||||
|
||||
5 0 obj
|
||||
<< /Kids [ 4 0 R ]
|
||||
/Count 1
|
||||
/Type /Pages
|
||||
>>
|
||||
endobj
|
||||
|
||||
6 0 obj
|
||||
<< /Pages 5 0 R
|
||||
/Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
|
||||
xref
|
||||
0 7
|
||||
0000000000 65535 f
|
||||
0000000010 00000 n
|
||||
0000000034 00000 n
|
||||
0000001347 00000 n
|
||||
0000001370 00000 n
|
||||
0000001543 00000 n
|
||||
0000001617 00000 n
|
||||
trailer
|
||||
<< /ID [ (some) (id) ]
|
||||
/Root 6 0 R
|
||||
/Size 7
|
||||
>>
|
||||
startxref
|
||||
1676
|
||||
%%EOF
|
@ -1,79 +0,0 @@
|
||||
%PDF-1.7
|
||||
|
||||
1 0 obj
|
||||
<< >>
|
||||
endobj
|
||||
|
||||
2 0 obj
|
||||
<< /Length 3 0 R >>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
|
||||
1.000000 1.000000 1.000000 scn
|
||||
12.473795 18.000000 m
|
||||
15.787504 18.000000 18.473795 20.686291 18.473795 24.000000 c
|
||||
18.473795 27.313709 15.787504 30.000000 12.473795 30.000000 c
|
||||
9.160086 30.000000 6.473795 27.313709 6.473795 24.000000 c
|
||||
6.473795 20.686291 9.160086 18.000000 12.473795 18.000000 c
|
||||
h
|
||||
12.473970 14.000000 m
|
||||
17.620707 14.000000 22.118784 11.222771 24.551340 7.085182 c
|
||||
25.277521 5.850006 24.987329 4.309250 23.837667 3.454098 c
|
||||
21.863237 1.985462 18.145235 0.000000 12.473970 0.000000 c
|
||||
6.802708 0.000000 3.084706 1.985462 1.110274 3.454098 c
|
||||
-0.039390 4.309246 -0.329582 5.850006 0.396601 7.085182 c
|
||||
2.829157 11.222771 7.327235 14.000000 12.473970 14.000000 c
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
3 0 obj
|
||||
770
|
||||
endobj
|
||||
|
||||
4 0 obj
|
||||
<< /Annots []
|
||||
/Type /Page
|
||||
/MediaBox [ 0.000000 0.000000 24.947937 30.000000 ]
|
||||
/Resources 1 0 R
|
||||
/Contents 2 0 R
|
||||
/Parent 5 0 R
|
||||
>>
|
||||
endobj
|
||||
|
||||
5 0 obj
|
||||
<< /Kids [ 4 0 R ]
|
||||
/Count 1
|
||||
/Type /Pages
|
||||
>>
|
||||
endobj
|
||||
|
||||
6 0 obj
|
||||
<< /Pages 5 0 R
|
||||
/Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
|
||||
xref
|
||||
0 7
|
||||
0000000000 65535 f
|
||||
0000000010 00000 n
|
||||
0000000034 00000 n
|
||||
0000000860 00000 n
|
||||
0000000882 00000 n
|
||||
0000001055 00000 n
|
||||
0000001129 00000 n
|
||||
trailer
|
||||
<< /ID [ (some) (id) ]
|
||||
/Root 6 0 R
|
||||
/Size 7
|
||||
>>
|
||||
startxref
|
||||
1188
|
||||
%%EOF
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "Subtract.pdf",
|
||||
"filename" : "Type=Default-2.pdf",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
|
@ -1,96 +0,0 @@
|
||||
%PDF-1.7
|
||||
|
||||
1 0 obj
|
||||
<< >>
|
||||
endobj
|
||||
|
||||
2 0 obj
|
||||
<< /Length 3 0 R >>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
|
||||
1.000000 1.000000 1.000000 scn
|
||||
14.400000 0.000000 m
|
||||
9.600000 0.000000 l
|
||||
6.239685 0.000000 4.559527 0.000000 3.276057 0.653961 c
|
||||
2.147084 1.229200 1.229201 2.147085 0.653961 3.276056 c
|
||||
0.000000 4.559526 0.000000 6.239685 0.000000 9.600000 c
|
||||
0.000000 20.400002 l
|
||||
0.000000 23.760315 0.000000 25.440472 0.653961 26.723944 c
|
||||
1.229201 27.852915 2.147084 28.770800 3.276057 29.346039 c
|
||||
4.559527 30.000000 6.239685 30.000000 9.600000 30.000000 c
|
||||
11.341846 30.000000 l
|
||||
12.345142 30.000000 12.846791 30.000000 13.317464 29.884233 c
|
||||
13.734708 29.781607 14.132692 29.612423 14.496114 29.383186 c
|
||||
14.906072 29.124596 15.254162 28.763371 15.950342 28.040918 c
|
||||
22.208498 21.546604 l
|
||||
22.208509 21.546591 l
|
||||
22.870174 20.859959 23.201010 20.516640 23.437363 20.119482 c
|
||||
23.646940 19.767319 23.801153 19.385040 23.894608 18.986031 c
|
||||
24.000000 18.536037 24.000000 18.059254 24.000000 17.105690 c
|
||||
24.000000 9.600000 l
|
||||
24.000000 6.239685 24.000000 4.559526 23.346039 3.276056 c
|
||||
22.770800 2.147085 21.852915 1.229200 20.723944 0.653961 c
|
||||
19.440474 0.000000 17.760315 0.000000 14.400000 0.000000 c
|
||||
h
|
||||
21.023287 16.875000 m
|
||||
14.187500 16.875000 l
|
||||
13.082931 16.875000 12.187500 17.770432 12.187500 18.875000 c
|
||||
12.187500 25.710787 l
|
||||
12.187500 26.601692 13.264641 27.047859 13.894606 26.417894 c
|
||||
21.730392 18.582108 l
|
||||
22.360359 17.952141 21.914192 16.875000 21.023287 16.875000 c
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
3 0 obj
|
||||
1447
|
||||
endobj
|
||||
|
||||
4 0 obj
|
||||
<< /Annots []
|
||||
/Type /Page
|
||||
/MediaBox [ 0.000000 0.000000 24.000000 30.000000 ]
|
||||
/Resources 1 0 R
|
||||
/Contents 2 0 R
|
||||
/Parent 5 0 R
|
||||
>>
|
||||
endobj
|
||||
|
||||
5 0 obj
|
||||
<< /Kids [ 4 0 R ]
|
||||
/Count 1
|
||||
/Type /Pages
|
||||
>>
|
||||
endobj
|
||||
|
||||
6 0 obj
|
||||
<< /Pages 5 0 R
|
||||
/Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
|
||||
xref
|
||||
0 7
|
||||
0000000000 65535 f
|
||||
0000000010 00000 n
|
||||
0000000034 00000 n
|
||||
0000001537 00000 n
|
||||
0000001560 00000 n
|
||||
0000001733 00000 n
|
||||
0000001807 00000 n
|
||||
trailer
|
||||
<< /ID [ (some) (id) ]
|
||||
/Root 6 0 R
|
||||
/Size 7
|
||||
>>
|
||||
startxref
|
||||
1866
|
||||
%%EOF
|
98
submodules/TelegramUI/Images.xcassets/Chat/Attach Menu/File.imageset/Type=Default-2.pdf
vendored
Normal file
98
submodules/TelegramUI/Images.xcassets/Chat/Attach Menu/File.imageset/Type=Default-2.pdf
vendored
Normal file
@ -0,0 +1,98 @@
|
||||
%PDF-1.7
|
||||
|
||||
1 0 obj
|
||||
<< >>
|
||||
endobj
|
||||
|
||||
2 0 obj
|
||||
<< /Length 3 0 R >>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 5.000000 2.500000 cm
|
||||
0.000000 0.000000 0.000000 scn
|
||||
12.000015 0.000000 m
|
||||
8.000006 0.000000 l
|
||||
5.199739 0.000000 3.799606 0.000000 2.730047 0.544968 c
|
||||
1.789237 1.024334 1.024334 1.789238 0.544967 2.730047 c
|
||||
0.000000 3.799606 0.000000 5.199738 0.000000 8.000000 c
|
||||
0.000000 17.000000 l
|
||||
0.000000 19.800262 0.000000 21.200394 0.544967 22.269953 c
|
||||
1.024334 23.210762 1.789237 23.975666 2.730047 24.455032 c
|
||||
3.799606 25.000000 5.199738 25.000000 8.000000 25.000000 c
|
||||
10.011778 25.000000 l
|
||||
10.745548 25.000000 11.112434 25.000000 11.457696 24.917110 c
|
||||
11.763804 24.843620 12.056438 24.722406 12.324855 24.557922 c
|
||||
12.627604 24.372398 12.887030 24.112972 13.405881 23.594124 c
|
||||
13.405887 23.594116 l
|
||||
18.594124 18.405888 l
|
||||
18.594152 18.405859 l
|
||||
18.594193 18.405819 l
|
||||
19.113003 17.887009 19.372419 17.627590 19.557934 17.324856 c
|
||||
19.722422 17.056438 19.843634 16.763803 19.917126 16.457695 c
|
||||
20.000015 16.112431 20.000015 15.745545 20.000015 15.011772 c
|
||||
20.000015 8.000000 l
|
||||
20.000015 5.199738 20.000015 3.799606 19.455048 2.730047 c
|
||||
18.975681 1.789238 18.210777 1.024334 17.269968 0.544968 c
|
||||
16.200409 0.000000 14.800278 0.000000 12.000015 0.000000 c
|
||||
h
|
||||
17.292892 15.000001 m
|
||||
11.000000 15.000001 l
|
||||
10.447715 15.000001 10.000000 15.447717 10.000000 16.000000 c
|
||||
10.000000 22.292892 l
|
||||
10.000000 22.738346 10.538570 22.961430 10.853554 22.646446 c
|
||||
17.646446 15.853554 l
|
||||
17.961430 15.538572 17.738346 15.000001 17.292892 15.000001 c
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
3 0 obj
|
||||
1491
|
||||
endobj
|
||||
|
||||
4 0 obj
|
||||
<< /Annots []
|
||||
/Type /Page
|
||||
/MediaBox [ 0.000000 0.000000 30.000000 30.000000 ]
|
||||
/Resources 1 0 R
|
||||
/Contents 2 0 R
|
||||
/Parent 5 0 R
|
||||
>>
|
||||
endobj
|
||||
|
||||
5 0 obj
|
||||
<< /Kids [ 4 0 R ]
|
||||
/Count 1
|
||||
/Type /Pages
|
||||
>>
|
||||
endobj
|
||||
|
||||
6 0 obj
|
||||
<< /Pages 5 0 R
|
||||
/Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
|
||||
xref
|
||||
0 7
|
||||
0000000000 65535 f
|
||||
0000000010 00000 n
|
||||
0000000034 00000 n
|
||||
0000001581 00000 n
|
||||
0000001604 00000 n
|
||||
0000001777 00000 n
|
||||
0000001851 00000 n
|
||||
trailer
|
||||
<< /ID [ (some) (id) ]
|
||||
/Root 6 0 R
|
||||
/Size 7
|
||||
>>
|
||||
startxref
|
||||
1910
|
||||
%%EOF
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "Union.pdf",
|
||||
"filename" : "Type=Default.pdf",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
|
124
submodules/TelegramUI/Images.xcassets/Chat/Attach Menu/Gallery.imageset/Type=Default.pdf
vendored
Normal file
124
submodules/TelegramUI/Images.xcassets/Chat/Attach Menu/Gallery.imageset/Type=Default.pdf
vendored
Normal file
@ -0,0 +1,124 @@
|
||||
%PDF-1.7
|
||||
|
||||
1 0 obj
|
||||
<< >>
|
||||
endobj
|
||||
|
||||
2 0 obj
|
||||
<< /Length 3 0 R >>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 0.000000 2.000000 cm
|
||||
0.000000 0.000000 0.000000 scn
|
||||
0.435974 23.815962 m
|
||||
0.000000 22.960316 0.000000 21.840210 0.000000 19.600000 c
|
||||
0.000000 13.400001 l
|
||||
0.000000 11.159790 0.000000 10.039685 0.435974 9.184038 c
|
||||
0.819467 8.431389 1.431390 7.819468 2.184038 7.435974 c
|
||||
2.659054 7.193941 3.215575 7.086273 4.000000 7.038378 c
|
||||
4.000000 12.400000 l
|
||||
4.000000 15.760315 4.000000 17.440472 4.653961 18.723944 c
|
||||
5.229201 19.852917 6.147084 20.770798 7.276057 21.346039 c
|
||||
8.559527 22.000000 10.239685 22.000000 13.600000 22.000000 c
|
||||
23.961622 22.000000 l
|
||||
23.913727 22.784424 23.806059 23.340946 23.564026 23.815962 c
|
||||
23.180532 24.568611 22.568611 25.180532 21.815962 25.564026 c
|
||||
20.960316 26.000000 19.840210 26.000000 17.600000 26.000000 c
|
||||
6.400001 26.000000 l
|
||||
4.159790 26.000000 3.039685 26.000000 2.184038 25.564026 c
|
||||
1.431390 25.180532 0.819467 24.568611 0.435974 23.815962 c
|
||||
h
|
||||
6.000000 13.600000 m
|
||||
6.000000 15.840210 6.000000 16.960316 6.435974 17.815962 c
|
||||
6.819468 18.568611 7.431390 19.180532 8.184038 19.564026 c
|
||||
9.039685 20.000000 10.159790 20.000000 12.400001 20.000000 c
|
||||
23.600000 20.000000 l
|
||||
25.840210 20.000000 26.960316 20.000000 27.815962 19.564026 c
|
||||
28.568611 19.180532 29.180532 18.568611 29.564026 17.815962 c
|
||||
30.000000 16.960316 30.000000 15.840210 30.000000 13.600000 c
|
||||
30.000000 6.400000 l
|
||||
30.000000 4.159790 30.000000 3.039684 29.564026 2.184038 c
|
||||
29.180532 1.431389 28.568611 0.819468 27.815962 0.435974 c
|
||||
26.960316 0.000000 25.840210 0.000000 23.600000 0.000000 c
|
||||
12.400000 0.000000 l
|
||||
10.159790 0.000000 9.039685 0.000000 8.184038 0.435974 c
|
||||
7.431390 0.819468 6.819468 1.431389 6.435974 2.184038 c
|
||||
6.000000 3.039684 6.000000 4.159790 6.000000 6.400000 c
|
||||
6.000000 13.600000 l
|
||||
h
|
||||
13.999928 11.500000 m
|
||||
15.380639 11.500000 16.499928 12.619288 16.499928 14.000000 c
|
||||
16.499928 15.380712 15.380639 16.500000 13.999928 16.500000 c
|
||||
12.619216 16.500000 11.499928 15.380712 11.499928 14.000000 c
|
||||
11.499928 12.619288 12.619216 11.500000 13.999928 11.500000 c
|
||||
h
|
||||
27.999968 5.878641 m
|
||||
27.999968 6.276464 27.841932 6.657997 27.560627 6.939301 c
|
||||
23.560589 10.939340 l
|
||||
22.974800 11.525126 22.025053 11.525126 21.439266 10.939340 c
|
||||
16.749928 6.250000 l
|
||||
15.060588 7.939339 l
|
||||
14.474801 8.525127 13.525055 8.525127 12.939268 7.939341 c
|
||||
8.665479 3.665550 l
|
||||
8.371915 3.371986 8.275769 2.909405 8.564352 2.610941 c
|
||||
8.722180 2.447710 8.903227 2.314165 9.091988 2.217987 c
|
||||
9.519811 2.000000 10.079864 2.000000 11.199968 2.000000 c
|
||||
24.799969 2.000000 l
|
||||
25.920073 2.000000 26.480125 2.000000 26.907949 2.217987 c
|
||||
27.284273 2.409733 27.590235 2.715694 27.781981 3.092018 c
|
||||
27.999968 3.519842 27.999968 4.079895 27.999968 5.200001 c
|
||||
27.999968 5.878641 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
3 0 obj
|
||||
2713
|
||||
endobj
|
||||
|
||||
4 0 obj
|
||||
<< /Annots []
|
||||
/Type /Page
|
||||
/MediaBox [ 0.000000 0.000000 30.000000 30.000000 ]
|
||||
/Resources 1 0 R
|
||||
/Contents 2 0 R
|
||||
/Parent 5 0 R
|
||||
>>
|
||||
endobj
|
||||
|
||||
5 0 obj
|
||||
<< /Kids [ 4 0 R ]
|
||||
/Count 1
|
||||
/Type /Pages
|
||||
>>
|
||||
endobj
|
||||
|
||||
6 0 obj
|
||||
<< /Pages 5 0 R
|
||||
/Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
|
||||
xref
|
||||
0 7
|
||||
0000000000 65535 f
|
||||
0000000010 00000 n
|
||||
0000000034 00000 n
|
||||
0000002803 00000 n
|
||||
0000002826 00000 n
|
||||
0000002999 00000 n
|
||||
0000003073 00000 n
|
||||
trailer
|
||||
<< /ID [ (some) (id) ]
|
||||
/Root 6 0 R
|
||||
/Size 7
|
||||
>>
|
||||
startxref
|
||||
3132
|
||||
%%EOF
|
@ -1,123 +0,0 @@
|
||||
%PDF-1.7
|
||||
|
||||
1 0 obj
|
||||
<< >>
|
||||
endobj
|
||||
|
||||
2 0 obj
|
||||
<< /Length 3 0 R >>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 0.000000 -0.000050 cm
|
||||
1.000000 1.000000 1.000000 scn
|
||||
11.100000 28.000050 m
|
||||
11.035790 28.000050 l
|
||||
9.410112 28.000065 8.098883 28.000076 7.037065 27.913322 c
|
||||
5.943791 27.823997 4.983509 27.635279 4.095072 27.182598 c
|
||||
2.683856 26.463547 1.536502 25.316193 0.817452 23.904978 c
|
||||
0.364771 23.016541 0.176052 22.056259 0.086728 20.962984 c
|
||||
-0.000027 19.901167 -0.000015 18.589939 0.000000 16.964260 c
|
||||
0.000000 16.900049 l
|
||||
0.000000 11.100050 l
|
||||
0.000000 11.035839 l
|
||||
-0.000015 9.410160 -0.000027 8.098932 0.086728 7.037113 c
|
||||
0.176052 5.943840 0.364771 4.983559 0.817452 4.095121 c
|
||||
1.536502 2.683905 2.683856 1.536551 4.095072 0.817501 c
|
||||
4.983509 0.364819 5.943791 0.176100 7.037065 0.086777 c
|
||||
8.098874 0.000023 9.410091 0.000034 11.035753 0.000050 c
|
||||
11.100000 0.000050 l
|
||||
16.900000 0.000050 l
|
||||
16.964247 0.000050 l
|
||||
18.589909 0.000034 19.901125 0.000023 20.962936 0.086777 c
|
||||
22.056210 0.176100 23.016491 0.364819 23.904928 0.817501 c
|
||||
25.316145 1.536551 26.463499 2.683905 27.182549 4.095121 c
|
||||
27.635231 4.983559 27.823950 5.943840 27.913273 7.037113 c
|
||||
28.000027 8.098925 28.000015 9.410141 28.000000 11.035803 c
|
||||
28.000000 11.100050 l
|
||||
28.000000 16.900049 l
|
||||
28.000000 16.964296 l
|
||||
28.000015 18.589958 28.000027 19.901175 27.913273 20.962984 c
|
||||
27.823950 22.056259 27.635231 23.016541 27.182549 23.904978 c
|
||||
26.463499 25.316193 25.316145 26.463547 23.904928 27.182598 c
|
||||
23.016491 27.635279 22.056210 27.823997 20.962936 27.913322 c
|
||||
19.901117 28.000076 18.589890 28.000065 16.964211 28.000050 c
|
||||
16.900000 28.000050 l
|
||||
11.100000 28.000050 l
|
||||
h
|
||||
3.093551 7.093601 m
|
||||
3.170904 6.300156 3.303499 5.824047 3.490471 5.457092 c
|
||||
3.921902 4.610363 4.610314 3.921951 5.457044 3.490520 c
|
||||
5.852077 3.289240 6.373610 3.150980 7.281361 3.076813 c
|
||||
8.206622 3.001217 9.395091 3.000050 11.100000 3.000050 c
|
||||
16.900000 3.000050 l
|
||||
18.604908 3.000050 19.793379 3.001217 20.718641 3.076813 c
|
||||
21.626392 3.150980 22.147924 3.289240 22.542957 3.490520 c
|
||||
23.389687 3.921951 24.078098 4.610363 24.509529 5.457092 c
|
||||
24.710810 5.852125 24.849070 6.373657 24.923237 7.281408 c
|
||||
24.963232 7.770926 24.982393 8.334116 24.991571 9.008478 c
|
||||
19.060661 14.939390 l
|
||||
18.474873 15.525175 17.525127 15.525177 16.939339 14.939390 c
|
||||
11.000000 9.000050 l
|
||||
9.060661 10.939388 l
|
||||
8.474873 11.525177 7.525128 11.525177 6.939342 10.939392 c
|
||||
3.093551 7.093601 l
|
||||
h
|
||||
9.000000 16.000050 m
|
||||
10.656855 16.000050 12.000000 17.343195 12.000000 19.000050 c
|
||||
12.000000 20.656902 10.656855 22.000050 9.000000 22.000050 c
|
||||
7.343146 22.000050 6.000001 20.656902 6.000001 19.000050 c
|
||||
6.000001 17.343195 7.343146 16.000050 9.000000 16.000050 c
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
3 0 obj
|
||||
2627
|
||||
endobj
|
||||
|
||||
4 0 obj
|
||||
<< /Annots []
|
||||
/Type /Page
|
||||
/MediaBox [ 0.000000 0.000000 28.000000 28.000000 ]
|
||||
/Resources 1 0 R
|
||||
/Contents 2 0 R
|
||||
/Parent 5 0 R
|
||||
>>
|
||||
endobj
|
||||
|
||||
5 0 obj
|
||||
<< /Kids [ 4 0 R ]
|
||||
/Count 1
|
||||
/Type /Pages
|
||||
>>
|
||||
endobj
|
||||
|
||||
6 0 obj
|
||||
<< /Pages 5 0 R
|
||||
/Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
|
||||
xref
|
||||
0 7
|
||||
0000000000 65535 f
|
||||
0000000010 00000 n
|
||||
0000000034 00000 n
|
||||
0000002717 00000 n
|
||||
0000002740 00000 n
|
||||
0000002913 00000 n
|
||||
0000002987 00000 n
|
||||
trailer
|
||||
<< /ID [ (some) (id) ]
|
||||
/Root 6 0 R
|
||||
/Size 7
|
||||
>>
|
||||
startxref
|
||||
3046
|
||||
%%EOF
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "Subtract-2.pdf",
|
||||
"filename" : "Type=Default-3.pdf",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
|
@ -1,77 +0,0 @@
|
||||
%PDF-1.7
|
||||
|
||||
1 0 obj
|
||||
<< >>
|
||||
endobj
|
||||
|
||||
2 0 obj
|
||||
<< /Length 3 0 R >>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
|
||||
1.000000 1.000000 1.000000 scn
|
||||
12.000000 0.000000 m
|
||||
15.627419 0.000000 24.000000 11.372581 24.000000 20.000000 c
|
||||
24.000000 26.627417 18.627419 32.000000 12.000000 32.000000 c
|
||||
5.372583 32.000000 0.000000 26.627417 0.000000 20.000000 c
|
||||
0.000000 11.372581 8.372583 0.000000 12.000000 0.000000 c
|
||||
h
|
||||
12.000000 15.000000 m
|
||||
14.761425 15.000000 17.000000 17.238577 17.000000 20.000000 c
|
||||
17.000000 22.761423 14.761425 25.000000 12.000000 25.000000 c
|
||||
9.238577 25.000000 7.000000 22.761423 7.000000 20.000000 c
|
||||
7.000000 17.238577 9.238577 15.000000 12.000000 15.000000 c
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
3 0 obj
|
||||
656
|
||||
endobj
|
||||
|
||||
4 0 obj
|
||||
<< /Annots []
|
||||
/Type /Page
|
||||
/MediaBox [ 0.000000 0.000000 24.000000 32.000000 ]
|
||||
/Resources 1 0 R
|
||||
/Contents 2 0 R
|
||||
/Parent 5 0 R
|
||||
>>
|
||||
endobj
|
||||
|
||||
5 0 obj
|
||||
<< /Kids [ 4 0 R ]
|
||||
/Count 1
|
||||
/Type /Pages
|
||||
>>
|
||||
endobj
|
||||
|
||||
6 0 obj
|
||||
<< /Pages 5 0 R
|
||||
/Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
|
||||
xref
|
||||
0 7
|
||||
0000000000 65535 f
|
||||
0000000010 00000 n
|
||||
0000000034 00000 n
|
||||
0000000746 00000 n
|
||||
0000000768 00000 n
|
||||
0000000941 00000 n
|
||||
0000001015 00000 n
|
||||
trailer
|
||||
<< /ID [ (some) (id) ]
|
||||
/Root 6 0 R
|
||||
/Size 7
|
||||
>>
|
||||
startxref
|
||||
1074
|
||||
%%EOF
|
77
submodules/TelegramUI/Images.xcassets/Chat/Attach Menu/Location.imageset/Type=Default-3.pdf
vendored
Normal file
77
submodules/TelegramUI/Images.xcassets/Chat/Attach Menu/Location.imageset/Type=Default-3.pdf
vendored
Normal file
@ -0,0 +1,77 @@
|
||||
%PDF-1.7
|
||||
|
||||
1 0 obj
|
||||
<< >>
|
||||
endobj
|
||||
|
||||
2 0 obj
|
||||
<< /Length 3 0 R >>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 5.000000 1.333336 cm
|
||||
0.000000 0.000000 0.000000 scn
|
||||
10.000000 -0.000002 m
|
||||
13.022847 -0.000002 20.000000 9.477150 20.000000 16.666664 c
|
||||
20.000000 22.189512 15.522848 26.666664 10.000000 26.666664 c
|
||||
4.477152 26.666664 0.000000 22.189512 0.000000 16.666664 c
|
||||
0.000000 9.477150 6.977153 -0.000002 10.000000 -0.000002 c
|
||||
h
|
||||
10.000000 12.666664 m
|
||||
12.209139 12.666664 14.000000 14.457525 14.000000 16.666664 c
|
||||
14.000000 18.875803 12.209139 20.666664 10.000000 20.666664 c
|
||||
7.790861 20.666664 6.000000 18.875803 6.000000 16.666664 c
|
||||
6.000000 14.457525 7.790861 12.666664 10.000000 12.666664 c
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
3 0 obj
|
||||
658
|
||||
endobj
|
||||
|
||||
4 0 obj
|
||||
<< /Annots []
|
||||
/Type /Page
|
||||
/MediaBox [ 0.000000 0.000000 30.000000 30.000000 ]
|
||||
/Resources 1 0 R
|
||||
/Contents 2 0 R
|
||||
/Parent 5 0 R
|
||||
>>
|
||||
endobj
|
||||
|
||||
5 0 obj
|
||||
<< /Kids [ 4 0 R ]
|
||||
/Count 1
|
||||
/Type /Pages
|
||||
>>
|
||||
endobj
|
||||
|
||||
6 0 obj
|
||||
<< /Pages 5 0 R
|
||||
/Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
|
||||
xref
|
||||
0 7
|
||||
0000000000 65535 f
|
||||
0000000010 00000 n
|
||||
0000000034 00000 n
|
||||
0000000748 00000 n
|
||||
0000000770 00000 n
|
||||
0000000943 00000 n
|
||||
0000001017 00000 n
|
||||
trailer
|
||||
<< /ID [ (some) (id) ]
|
||||
/Root 6 0 R
|
||||
/Size 7
|
||||
>>
|
||||
startxref
|
||||
1076
|
||||
%%EOF
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "Union.png",
|
||||
"filename" : "Icon-4.pdf",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
|
157
submodules/TelegramUI/Images.xcassets/Chat/Attach Menu/Poll.imageset/Icon-4.pdf
vendored
Normal file
157
submodules/TelegramUI/Images.xcassets/Chat/Attach Menu/Poll.imageset/Icon-4.pdf
vendored
Normal file
@ -0,0 +1,157 @@
|
||||
%PDF-1.7
|
||||
|
||||
1 0 obj
|
||||
<< >>
|
||||
endobj
|
||||
|
||||
2 0 obj
|
||||
<< /Length 3 0 R >>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 4.500000 4.499939 cm
|
||||
0.635294 0.635294 0.635294 scn
|
||||
8.325001 21.000061 m
|
||||
8.276846 21.000061 l
|
||||
7.057586 21.000072 6.074163 21.000082 5.277799 20.935015 c
|
||||
4.457843 20.868023 3.737631 20.726484 3.071304 20.386972 c
|
||||
2.012892 19.847685 1.152376 18.987169 0.613089 17.928757 c
|
||||
0.273578 17.262430 0.132038 16.542217 0.065045 15.722262 c
|
||||
-0.000020 14.925898 -0.000011 13.942474 0.000000 12.723215 c
|
||||
0.000000 12.675060 l
|
||||
0.000000 8.325061 l
|
||||
0.000000 8.276906 l
|
||||
-0.000011 7.057647 -0.000020 6.074224 0.065045 5.277859 c
|
||||
0.132038 4.457905 0.273578 3.737692 0.613089 3.071363 c
|
||||
1.152376 2.012953 2.012892 1.152437 3.071304 0.613150 c
|
||||
3.737631 0.273638 4.457843 0.132099 5.277799 0.065105 c
|
||||
6.074152 0.000040 7.057559 0.000050 8.276797 0.000061 c
|
||||
8.276814 0.000061 l
|
||||
8.325001 0.000061 l
|
||||
12.675000 0.000061 l
|
||||
12.723186 0.000061 l
|
||||
12.723204 0.000061 l
|
||||
13.942441 0.000050 14.925848 0.000040 15.722202 0.065105 c
|
||||
16.542156 0.132099 17.262369 0.273638 17.928698 0.613150 c
|
||||
18.987108 1.152437 19.847624 2.012953 20.386911 3.071363 c
|
||||
20.726423 3.737692 20.867962 4.457905 20.934956 5.277860 c
|
||||
21.000021 6.074213 21.000011 7.057621 21.000000 8.276858 c
|
||||
21.000000 8.276875 l
|
||||
21.000000 8.325062 l
|
||||
21.000000 12.675060 l
|
||||
21.000000 12.723248 l
|
||||
21.000000 12.723265 l
|
||||
21.000011 13.942501 21.000021 14.925909 20.934956 15.722262 c
|
||||
20.867962 16.542217 20.726423 17.262430 20.386911 17.928757 c
|
||||
19.847624 18.987169 18.987108 19.847685 17.928698 20.386972 c
|
||||
17.262369 20.726484 16.542156 20.868023 15.722201 20.935015 c
|
||||
14.925837 21.000082 13.942413 21.000072 12.723154 21.000061 c
|
||||
12.674999 21.000061 l
|
||||
8.325001 21.000061 l
|
||||
h
|
||||
9.000000 16.800060 m
|
||||
9.000000 17.220100 9.000000 17.430120 9.081745 17.590553 c
|
||||
9.153650 17.731674 9.268385 17.846411 9.409508 17.918316 c
|
||||
9.569941 18.000061 9.779961 18.000061 10.200000 18.000061 c
|
||||
10.799999 18.000061 l
|
||||
11.220039 18.000061 11.430059 18.000061 11.590492 17.918316 c
|
||||
11.731615 17.846411 11.846350 17.731674 11.918255 17.590553 c
|
||||
12.000000 17.430120 12.000000 17.220100 12.000000 16.800060 c
|
||||
12.000000 4.200062 l
|
||||
12.000000 3.780022 12.000000 3.570002 11.918255 3.409569 c
|
||||
11.846350 3.268448 11.731615 3.153711 11.590492 3.081806 c
|
||||
11.430059 3.000061 11.220039 3.000061 10.800000 3.000061 c
|
||||
10.200001 3.000061 l
|
||||
9.779961 3.000061 9.569941 3.000061 9.409508 3.081806 c
|
||||
9.268385 3.153711 9.153650 3.268448 9.081745 3.409569 c
|
||||
9.000000 3.570002 9.000000 3.780022 9.000000 4.200062 c
|
||||
9.000000 16.800060 l
|
||||
h
|
||||
3.750000 12.300061 m
|
||||
3.750000 12.720100 3.750000 12.930120 3.831745 13.090553 c
|
||||
3.903650 13.231675 4.018386 13.346411 4.159507 13.418316 c
|
||||
4.319942 13.500061 4.529961 13.500061 4.950000 13.500061 c
|
||||
5.550001 13.500061 l
|
||||
5.970040 13.500061 6.180060 13.500061 6.340494 13.418316 c
|
||||
6.481615 13.346411 6.596350 13.231675 6.668255 13.090553 c
|
||||
6.750000 12.930120 6.750000 12.720100 6.750000 12.300060 c
|
||||
6.750000 4.200062 l
|
||||
6.750000 3.780022 6.750000 3.570002 6.668255 3.409569 c
|
||||
6.596350 3.268448 6.481615 3.153711 6.340494 3.081806 c
|
||||
6.180060 3.000061 5.970040 3.000061 5.550001 3.000061 c
|
||||
4.950000 3.000061 l
|
||||
4.529961 3.000061 4.319942 3.000061 4.159507 3.081806 c
|
||||
4.018386 3.153711 3.903650 3.268448 3.831745 3.409569 c
|
||||
3.750000 3.570002 3.750000 3.780022 3.750000 4.200062 c
|
||||
3.750000 12.300061 l
|
||||
h
|
||||
14.331745 8.590554 m
|
||||
14.250000 8.430120 14.250000 8.220100 14.250000 7.800061 c
|
||||
14.250000 4.200062 l
|
||||
14.250000 3.780022 14.250000 3.570002 14.331745 3.409569 c
|
||||
14.403650 3.268448 14.518386 3.153711 14.659507 3.081806 c
|
||||
14.819941 3.000061 15.029961 3.000061 15.450000 3.000061 c
|
||||
16.049999 3.000061 l
|
||||
16.470039 3.000061 16.680059 3.000061 16.840492 3.081806 c
|
||||
16.981613 3.153711 17.096350 3.268448 17.168255 3.409569 c
|
||||
17.250000 3.570002 17.250000 3.780022 17.250000 4.200062 c
|
||||
17.250000 7.800061 l
|
||||
17.250000 8.220100 17.250000 8.430120 17.168255 8.590554 c
|
||||
17.096350 8.731675 16.981613 8.846411 16.840492 8.918316 c
|
||||
16.680059 9.000061 16.470039 9.000061 16.049999 9.000061 c
|
||||
15.450000 9.000061 l
|
||||
15.029961 9.000061 14.819941 9.000061 14.659507 8.918316 c
|
||||
14.518386 8.846411 14.403650 8.731675 14.331745 8.590554 c
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
3 0 obj
|
||||
4096
|
||||
endobj
|
||||
|
||||
4 0 obj
|
||||
<< /Annots []
|
||||
/Type /Page
|
||||
/MediaBox [ 0.000000 0.000000 30.000000 30.000000 ]
|
||||
/Resources 1 0 R
|
||||
/Contents 2 0 R
|
||||
/Parent 5 0 R
|
||||
>>
|
||||
endobj
|
||||
|
||||
5 0 obj
|
||||
<< /Kids [ 4 0 R ]
|
||||
/Count 1
|
||||
/Type /Pages
|
||||
>>
|
||||
endobj
|
||||
|
||||
6 0 obj
|
||||
<< /Pages 5 0 R
|
||||
/Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
|
||||
xref
|
||||
0 7
|
||||
0000000000 65535 f
|
||||
0000000010 00000 n
|
||||
0000000034 00000 n
|
||||
0000004186 00000 n
|
||||
0000004209 00000 n
|
||||
0000004382 00000 n
|
||||
0000004456 00000 n
|
||||
trailer
|
||||
<< /ID [ (some) (id) ]
|
||||
/Root 6 0 R
|
||||
/Size 7
|
||||
>>
|
||||
startxref
|
||||
4515
|
||||
%%EOF
|
Binary file not shown.
Before Width: | Height: | Size: 354 B |
@ -12,6 +12,7 @@ import PresentationDataUtils
|
||||
import AccountContext
|
||||
import ItemListPeerActionItem
|
||||
import AttachmentUI
|
||||
import TelegramStringFormatting
|
||||
|
||||
private final class AttachmentFileControllerArguments {
|
||||
let openGallery: () -> Void
|
||||
@ -28,17 +29,28 @@ private enum AttachmentFileSection: Int32 {
|
||||
case recent
|
||||
}
|
||||
|
||||
private func areMessagesEqual(_ lhsMessage: Message, _ rhsMessage: Message) -> Bool {
|
||||
if lhsMessage.stableVersion != rhsMessage.stableVersion {
|
||||
return false
|
||||
}
|
||||
if lhsMessage.id != rhsMessage.id || lhsMessage.flags != rhsMessage.flags {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
private enum AttachmentFileEntry: ItemListNodeEntry {
|
||||
case selectFromGallery(PresentationTheme, String)
|
||||
case selectFromFiles(PresentationTheme, String)
|
||||
|
||||
case recentHeader(PresentationTheme, String)
|
||||
case file(Int32, PresentationTheme, Message)
|
||||
|
||||
var section: ItemListSectionId {
|
||||
switch self {
|
||||
case .selectFromGallery, .selectFromFiles:
|
||||
return AttachmentFileSection.select.rawValue
|
||||
case .recentHeader:
|
||||
case .recentHeader, .file:
|
||||
return AttachmentFileSection.recent.rawValue
|
||||
}
|
||||
}
|
||||
@ -51,6 +63,8 @@ private enum AttachmentFileEntry: ItemListNodeEntry {
|
||||
return 1
|
||||
case .recentHeader:
|
||||
return 2
|
||||
case let .file(index, _, _):
|
||||
return 3 + index
|
||||
}
|
||||
}
|
||||
|
||||
@ -74,6 +88,12 @@ private enum AttachmentFileEntry: ItemListNodeEntry {
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .file(lhsIndex, lhsTheme, lhsMessage):
|
||||
if case let .file(rhsIndex, rhsTheme, rhsMessage) = rhs, lhsIndex != rhsIndex, lhsTheme === rhsTheme, areMessagesEqual(lhsMessage, rhsMessage) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -94,17 +114,35 @@ private enum AttachmentFileEntry: ItemListNodeEntry {
|
||||
})
|
||||
case let .recentHeader(_, text):
|
||||
return ItemListSectionHeaderItem(presentationData: presentationData, text: text, sectionId: self.section)
|
||||
case let .file(_, _, message):
|
||||
let file = message.media.first(where: { $0 is TelegramMediaFile }) as? TelegramMediaFile
|
||||
let label: String
|
||||
if let file = file {
|
||||
label = dataSizeString(file.size ?? 0, formatting: DataSizeStringFormatting(strings: presentationData.strings, decimalSeparator: "."))
|
||||
} else {
|
||||
label = ""
|
||||
}
|
||||
return ItemListDisclosureItem(presentationData: presentationData, title: file?.fileName ?? "", label: label, sectionId: self.section, style: .blocks, action: {
|
||||
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func attachmentFileControllerEntries(presentationData: PresentationData) -> [AttachmentFileEntry] {
|
||||
private func attachmentFileControllerEntries(presentationData: PresentationData, recentDocuments: [Message]?) -> [AttachmentFileEntry] {
|
||||
var entries: [AttachmentFileEntry] = []
|
||||
|
||||
entries.append(.selectFromGallery(presentationData.theme, presentationData.strings.Attachment_SelectFromGallery))
|
||||
entries.append(.selectFromFiles(presentationData.theme, presentationData.strings.Attachment_SelectFromFiles))
|
||||
|
||||
if let _ = recentDocuments {
|
||||
// entries.append(.recentHeader(presentationData.theme, "RECENTLY SENT FILES".uppercased()))
|
||||
// var i: Int32 = 0
|
||||
// for file in recentDocuments {
|
||||
// entries.append(.file(i, presentationData.theme, file))
|
||||
// i += 1
|
||||
// }
|
||||
}
|
||||
|
||||
return entries
|
||||
}
|
||||
@ -123,13 +161,20 @@ public func attachmentFileController(context: AccountContext, presentGallery: @e
|
||||
presentFiles()
|
||||
})
|
||||
|
||||
let signal = context.sharedContext.presentationData
|
||||
|> deliverOnMainQueue
|
||||
|> map { presentationData -> (ItemListControllerState, (ItemListNodeState, Any)) in
|
||||
let recentDocuments: Signal<[Message]?, NoError> = .single(nil)
|
||||
|> then(
|
||||
context.engine.messages.searchMessages(location: .recentDocuments, query: "", state: nil)
|
||||
|> map { result -> [Message]? in
|
||||
return result.0.messages
|
||||
}
|
||||
)
|
||||
|
||||
let signal = combineLatest(queue: Queue.mainQueue(), context.sharedContext.presentationData, recentDocuments)
|
||||
|> map { presentationData, recentDocuments -> (ItemListControllerState, (ItemListNodeState, Any)) in
|
||||
let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: .text(presentationData.strings.Attachment_File), leftNavigationButton: ItemListNavigationButton(content: .text(presentationData.strings.Common_Cancel), style: .regular, enabled: true, action: {
|
||||
dismissImpl?()
|
||||
}), rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false)
|
||||
let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: attachmentFileControllerEntries(presentationData: presentationData), style: .blocks, emptyStateItem: nil, animateChanges: false)
|
||||
let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: attachmentFileControllerEntries(presentationData: presentationData, recentDocuments: recentDocuments), style: .blocks, emptyStateItem: nil, animateChanges: false)
|
||||
|
||||
return (controllerState, (listState, arguments))
|
||||
} |> afterDisposed {
|
||||
|
@ -10258,7 +10258,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
strongSelf.openResolved(result: ResolvedUrl.proxy(host: host, port: port, username: username, password: password, secret: secret), sourceMessageId: nil)
|
||||
}
|
||||
}
|
||||
}, presentSchedulePicker: { [weak self] done in
|
||||
}, presentSchedulePicker: { [weak self] _, done in
|
||||
if let strongSelf = self {
|
||||
strongSelf.presentScheduleTimePicker(style: .media, completion: { [weak self] time in
|
||||
if let strongSelf = self {
|
||||
@ -10664,7 +10664,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
strongSelf.openResolved(result: ResolvedUrl.proxy(host: host, port: port, username: username, password: password, secret: secret), sourceMessageId: nil)
|
||||
}
|
||||
}
|
||||
}, presentSchedulePicker: { [weak self] done in
|
||||
}, presentSchedulePicker: { [weak self] _, done in
|
||||
if let strongSelf = self {
|
||||
strongSelf.presentScheduleTimePicker(style: .media, completion: { [weak self] time in
|
||||
if let strongSelf = self {
|
||||
@ -10730,7 +10730,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
}), TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.MediaPicker_ConvertToJpeg, action: {
|
||||
completion(true)
|
||||
})], actionLayout: .vertical), in: .window(.root))
|
||||
}, presentSchedulePicker: { [weak self] done in
|
||||
}, presentSchedulePicker: { [weak self] _, done in
|
||||
if let strongSelf = self {
|
||||
strongSelf.presentScheduleTimePicker(style: .media, completion: { [weak self] time in
|
||||
if let strongSelf = self {
|
||||
@ -11016,9 +11016,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
}
|
||||
|
||||
strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: strongSelf.presentationData), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
}, presentSchedulePicker: { [weak self] done in
|
||||
}, presentSchedulePicker: { [weak self] media, done in
|
||||
if let strongSelf = self {
|
||||
strongSelf.presentScheduleTimePicker(style: .media, completion: { [weak self] time in
|
||||
strongSelf.presentScheduleTimePicker(style: media ? .media : .default, completion: { [weak self] time in
|
||||
if let strongSelf = self {
|
||||
done(time)
|
||||
if strongSelf.presentationInterfaceState.subject != .scheduledMessages && time != scheduleWhenOnlineTimestamp {
|
||||
|
@ -10,7 +10,7 @@ import ShareController
|
||||
import LegacyUI
|
||||
import LegacyMediaPickerUI
|
||||
|
||||
func presentedLegacyCamera(context: AccountContext, peer: Peer, chatLocation: ChatLocation, cameraView: TGAttachmentCameraView?, menuController: TGMenuSheetController?, parentController: ViewController, editingMedia: Bool, saveCapturedPhotos: Bool, mediaGrouping: Bool, initialCaption: String, hasSchedule: Bool, photoOnly: Bool, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32) -> Void, recognizedQRCode: @escaping (String) -> Void = { _ in }, presentSchedulePicker: @escaping (@escaping (Int32) -> Void) -> Void, presentTimerPicker: @escaping (@escaping (Int32) -> Void) -> Void, presentStickers: @escaping (@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?, getCaptionPanelView: @escaping () -> TGCaptionPanelView?) {
|
||||
func presentedLegacyCamera(context: AccountContext, peer: Peer, chatLocation: ChatLocation, cameraView: TGAttachmentCameraView?, menuController: TGMenuSheetController?, parentController: ViewController, editingMedia: Bool, saveCapturedPhotos: Bool, mediaGrouping: Bool, initialCaption: String, hasSchedule: Bool, photoOnly: Bool, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32) -> Void, recognizedQRCode: @escaping (String) -> Void = { _ in }, presentSchedulePicker: @escaping (Bool, @escaping (Int32) -> Void) -> Void, presentTimerPicker: @escaping (@escaping (Int32) -> Void) -> Void, presentStickers: @escaping (@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?, getCaptionPanelView: @escaping () -> TGCaptionPanelView?) {
|
||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||
let legacyController = LegacyController(presentation: .custom, theme: presentationData.theme)
|
||||
legacyController.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .portrait, compactSize: .portrait)
|
||||
@ -28,10 +28,10 @@ func presentedLegacyCamera(context: AccountContext, peer: Peer, chatLocation: Ch
|
||||
}
|
||||
controller.inhibitMultipleCapture = editingMedia
|
||||
|
||||
controller.presentScheduleController = { done in
|
||||
presentSchedulePicker { time in
|
||||
controller.presentScheduleController = { _, done in
|
||||
presentSchedulePicker(true, { time in
|
||||
done?(time)
|
||||
}
|
||||
})
|
||||
}
|
||||
controller.presentTimerController = { done in
|
||||
presentTimerPicker { time in
|
||||
|
Loading…
x
Reference in New Issue
Block a user