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
93476cf662
commit
b6b5abbc46
@ -22,7 +22,7 @@ public enum AttachmentButtonType: Equatable {
|
|||||||
|
|
||||||
public protocol AttachmentContainable: ViewController {
|
public protocol AttachmentContainable: ViewController {
|
||||||
var requestAttachmentMenuExpansion: () -> Void { get set }
|
var requestAttachmentMenuExpansion: () -> Void { get set }
|
||||||
var updateNavigationStack: (@escaping ([AttachmentContainable]) -> [AttachmentContainable]) -> Void { get set }
|
var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void { get set }
|
||||||
var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void { get set }
|
var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void { get set }
|
||||||
var cancelPanGesture: () -> Void { get set }
|
var cancelPanGesture: () -> Void { get set }
|
||||||
|
|
||||||
@ -298,7 +298,9 @@ public class AttachmentController: ViewController {
|
|||||||
}
|
}
|
||||||
controller.updateNavigationStack = { [weak self] f in
|
controller.updateNavigationStack = { [weak self] f in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
strongSelf.currentControllers = f(strongSelf.currentControllers)
|
let (controllers, mediaPickerContext) = f(strongSelf.currentControllers)
|
||||||
|
strongSelf.currentControllers = controllers
|
||||||
|
strongSelf.mediaPickerContext = mediaPickerContext
|
||||||
if let layout = strongSelf.validLayout {
|
if let layout = strongSelf.validLayout {
|
||||||
strongSelf.containerLayoutUpdated(layout, transition: .animated(duration: 0.4, curve: .spring))
|
strongSelf.containerLayoutUpdated(layout, transition: .animated(duration: 0.4, curve: .spring))
|
||||||
}
|
}
|
||||||
|
@ -518,7 +518,7 @@ public final class ComposedPoll {
|
|||||||
|
|
||||||
private class CreatePollControllerImpl: ItemListController, AttachmentContainable {
|
private class CreatePollControllerImpl: ItemListController, AttachmentContainable {
|
||||||
public var requestAttachmentMenuExpansion: () -> Void = {}
|
public var requestAttachmentMenuExpansion: () -> Void = {}
|
||||||
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> [AttachmentContainable]) -> Void = { _ in }
|
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
||||||
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
public var cancelPanGesture: () -> Void = { }
|
public var cancelPanGesture: () -> Void = { }
|
||||||
}
|
}
|
||||||
|
@ -406,7 +406,7 @@ open class LegacyController: ViewController, PresentableController, AttachmentCo
|
|||||||
public var disposables = DisposableSet()
|
public var disposables = DisposableSet()
|
||||||
|
|
||||||
open var requestAttachmentMenuExpansion: () -> Void = {}
|
open var requestAttachmentMenuExpansion: () -> Void = {}
|
||||||
open var updateNavigationStack: (@escaping ([AttachmentContainable]) -> [AttachmentContainable]) -> Void = { _ in }
|
open var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
||||||
open var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
open var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
open var cancelPanGesture: () -> Void = { }
|
open var cancelPanGesture: () -> Void = { }
|
||||||
|
|
||||||
|
@ -72,7 +72,7 @@ public final class LocationPickerController: ViewController, AttachmentContainab
|
|||||||
private var interaction: LocationPickerInteraction?
|
private var interaction: LocationPickerInteraction?
|
||||||
|
|
||||||
public var requestAttachmentMenuExpansion: () -> Void = {}
|
public var requestAttachmentMenuExpansion: () -> Void = {}
|
||||||
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> [AttachmentContainable]) -> Void = { _ in }
|
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
||||||
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
public var cancelPanGesture: () -> Void = { }
|
public var cancelPanGesture: () -> Void = { }
|
||||||
|
|
||||||
|
@ -298,7 +298,7 @@ final class LocationPickerControllerNode: ViewControllerTracingNode, CLLocationM
|
|||||||
|
|
||||||
private var placeholderBackgroundNode: NavigationBackgroundNode?
|
private var placeholderBackgroundNode: NavigationBackgroundNode?
|
||||||
private var placeholderNode: LocationPlaceholderNode?
|
private var placeholderNode: LocationPlaceholderNode?
|
||||||
private var locationAccessDenied = true
|
private var locationAccessDenied = false
|
||||||
|
|
||||||
private var enqueuedTransitions: [LocationPickerTransaction] = []
|
private var enqueuedTransitions: [LocationPickerTransaction] = []
|
||||||
|
|
||||||
@ -994,6 +994,10 @@ final class LocationPickerControllerNode: ViewControllerTracingNode, CLLocationM
|
|||||||
self.placeholderNode = nil
|
self.placeholderNode = nil
|
||||||
placeholderNode.removeFromSupernode()
|
placeholderNode.removeFromSupernode()
|
||||||
}
|
}
|
||||||
|
if let placeholderBackgroundNode = self.placeholderBackgroundNode {
|
||||||
|
self.placeholderBackgroundNode = nil
|
||||||
|
placeholderBackgroundNode.removeFromSupernode()
|
||||||
|
}
|
||||||
self.controller?.updateTabBarAlpha(1.0, .immediate)
|
self.controller?.updateTabBarAlpha(1.0, .immediate)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ enum LegacyMediaPickerGallerySource {
|
|||||||
case selection(item: TGMediaSelectableItem)
|
case selection(item: TGMediaSelectableItem)
|
||||||
}
|
}
|
||||||
|
|
||||||
func presentLegacyMediaPickerGallery(context: AccountContext, peer: EnginePeer?, chatLocation: ChatLocation?, presentationData: PresentationData, source: LegacyMediaPickerGallerySource, immediateThumbnail: UIImage?, selectionContext: TGMediaSelectionContext?, editingContext: TGMediaEditingContext, hasSilentPosting: Bool, hasSchedule: Bool, hasTimer: Bool, updateHiddenMedia: @escaping (String?) -> Void, initialLayout: ContainerViewLayout?, transitionHostView: @escaping () -> UIView?, transitionView: @escaping (String) -> UIView?, completed: @escaping (TGMediaSelectableItem & TGMediaEditableItem, Bool, Int32?) -> Void, presentStickers: ((@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?)?, presentSchedulePicker: @escaping (Bool, @escaping (Int32) -> Void) -> Void, presentTimerPicker: @escaping (@escaping (Int32) -> Void) -> Void, getCaptionPanelView: @escaping () -> TGCaptionPanelView?, present: @escaping (ViewController, Any?) -> Void, finishedTransitionIn: @escaping () -> Void) {
|
func presentLegacyMediaPickerGallery(context: AccountContext, peer: EnginePeer?, chatLocation: ChatLocation?, presentationData: PresentationData, source: LegacyMediaPickerGallerySource, immediateThumbnail: UIImage?, selectionContext: TGMediaSelectionContext?, editingContext: TGMediaEditingContext, hasSilentPosting: Bool, hasSchedule: Bool, hasTimer: Bool, updateHiddenMedia: @escaping (String?) -> Void, initialLayout: ContainerViewLayout?, transitionHostView: @escaping () -> UIView?, transitionView: @escaping (String) -> UIView?, completed: @escaping (TGMediaSelectableItem & TGMediaEditableItem, Bool, Int32?) -> Void, presentStickers: ((@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?)?, presentSchedulePicker: @escaping (Bool, @escaping (Int32) -> Void) -> Void, presentTimerPicker: @escaping (@escaping (Int32) -> Void) -> Void, getCaptionPanelView: @escaping () -> TGCaptionPanelView?, present: @escaping (ViewController, Any?) -> Void, finishedTransitionIn: @escaping () -> Void, dismissAll: @escaping () -> Void) {
|
||||||
let reminder = peer?.id == context.account.peerId
|
let reminder = peer?.id == context.account.peerId
|
||||||
|
|
||||||
let legacyController = LegacyController(presentation: .custom, theme: presentationData.theme, initialLayout: nil)
|
let legacyController = LegacyController(presentation: .custom, theme: presentationData.theme, initialLayout: nil)
|
||||||
@ -186,10 +186,12 @@ func presentLegacyMediaPickerGallery(context: AccountContext, peer: EnginePeer?,
|
|||||||
updateHiddenMedia(nil)
|
updateHiddenMedia(nil)
|
||||||
legacyController?.dismiss()
|
legacyController?.dismiss()
|
||||||
}
|
}
|
||||||
|
|
||||||
model.interfaceView.donePressed = { [weak controller] item in
|
model.interfaceView.donePressed = { [weak controller] item in
|
||||||
if let item = item as? TGMediaPickerGalleryItem {
|
if let item = item as? TGMediaPickerGalleryItem {
|
||||||
controller?.dismissWhenReady(animated: true)
|
controller?.dismissWhenReady(animated: true)
|
||||||
completed(item.asset, false, nil)
|
completed(item.asset, false, nil)
|
||||||
|
dismissAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
model.interfaceView.doneLongPressed = { [weak selectionContext, weak editingContext, weak legacyController, weak model] item in
|
model.interfaceView.doneLongPressed = { [weak selectionContext, weak editingContext, weak legacyController, weak model] item in
|
||||||
|
@ -101,10 +101,12 @@ public final class MediaPickerScreen: ViewController, AttachmentContainable {
|
|||||||
public var legacyCompletion: (_ signals: [Any], _ silently: Bool, _ scheduleTime: Int32?) -> Void = { _, _, _ in }
|
public var legacyCompletion: (_ signals: [Any], _ silently: Bool, _ scheduleTime: Int32?) -> Void = { _, _, _ in }
|
||||||
|
|
||||||
public var requestAttachmentMenuExpansion: () -> Void = { }
|
public var requestAttachmentMenuExpansion: () -> Void = { }
|
||||||
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> [AttachmentContainable]) -> Void = { _ in }
|
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
||||||
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
public var cancelPanGesture: () -> Void = { }
|
public var cancelPanGesture: () -> Void = { }
|
||||||
|
|
||||||
|
var dismissAll: () -> Void = { }
|
||||||
|
|
||||||
private class Node: ViewControllerTracingNode, UIGestureRecognizerDelegate {
|
private class Node: ViewControllerTracingNode, UIGestureRecognizerDelegate {
|
||||||
enum DisplayMode {
|
enum DisplayMode {
|
||||||
case all
|
case all
|
||||||
@ -168,6 +170,10 @@ public final class MediaPickerScreen: ViewController, AttachmentContainable {
|
|||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
|
if controller.collection != nil {
|
||||||
|
self.preloadPromise.set(false)
|
||||||
|
}
|
||||||
|
|
||||||
self.addSubnode(self.containerNode)
|
self.addSubnode(self.containerNode)
|
||||||
self.containerNode.addSubnode(self.backgroundNode)
|
self.containerNode.addSubnode(self.backgroundNode)
|
||||||
self.containerNode.addSubnode(self.gridNode)
|
self.containerNode.addSubnode(self.gridNode)
|
||||||
@ -492,8 +498,10 @@ public final class MediaPickerScreen: ViewController, AttachmentContainable {
|
|||||||
}
|
}
|
||||||
}, presentStickers: controller.presentStickers, presentSchedulePicker: controller.presentSchedulePicker, presentTimerPicker: controller.presentTimerPicker, getCaptionPanelView: controller.getCaptionPanelView, present: { [weak self] c, a in
|
}, presentStickers: controller.presentStickers, presentSchedulePicker: controller.presentSchedulePicker, presentTimerPicker: controller.presentTimerPicker, getCaptionPanelView: controller.getCaptionPanelView, present: { [weak self] c, a in
|
||||||
self?.controller?.present(c, in: .window(.root), with: a)
|
self?.controller?.present(c, in: .window(.root), with: a)
|
||||||
}, finishedTransitionIn: {
|
}, finishedTransitionIn: { [weak self] in
|
||||||
self.openingMedia = false
|
self?.openingMedia = false
|
||||||
|
}, dismissAll: { [weak self] in
|
||||||
|
self?.controller?.dismissAll()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -523,8 +531,10 @@ public final class MediaPickerScreen: ViewController, AttachmentContainable {
|
|||||||
}
|
}
|
||||||
}, presentStickers: controller.presentStickers, presentSchedulePicker: controller.presentSchedulePicker, presentTimerPicker: controller.presentTimerPicker, getCaptionPanelView: controller.getCaptionPanelView, present: { [weak self] c, a in
|
}, presentStickers: controller.presentStickers, presentSchedulePicker: controller.presentSchedulePicker, presentTimerPicker: controller.presentTimerPicker, getCaptionPanelView: controller.getCaptionPanelView, present: { [weak self] c, a in
|
||||||
self?.controller?.present(c, in: .window(.root), with: a, blockInteraction: true)
|
self?.controller?.present(c, in: .window(.root), with: a, blockInteraction: true)
|
||||||
}, finishedTransitionIn: {
|
}, finishedTransitionIn: { [weak self] in
|
||||||
self.openingMedia = false
|
self?.openingMedia = false
|
||||||
|
}, dismissAll: { [weak self] in
|
||||||
|
self?.controller?.dismissAll()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -986,6 +996,8 @@ public final class MediaPickerScreen: ViewController, AttachmentContainable {
|
|||||||
}
|
}
|
||||||
}, selectionState: selectionContext ?? TGMediaSelectionContext(), editingState: editingContext ?? TGMediaEditingContext())
|
}, selectionState: selectionContext ?? TGMediaSelectionContext(), editingState: editingContext ?? TGMediaEditingContext())
|
||||||
self.interaction?.selectionState?.grouping = true
|
self.interaction?.selectionState?.grouping = true
|
||||||
|
|
||||||
|
self.updateSelectionState(count: Int32(selectionContext?.count() ?? 0))
|
||||||
}
|
}
|
||||||
|
|
||||||
required init(coder aDecoder: NSCoder) {
|
required init(coder aDecoder: NSCoder) {
|
||||||
@ -1032,7 +1044,11 @@ public final class MediaPickerScreen: ViewController, AttachmentContainable {
|
|||||||
|
|
||||||
@objc private func backPressed() {
|
@objc private func backPressed() {
|
||||||
self.updateNavigationStack { current in
|
self.updateNavigationStack { current in
|
||||||
return current.filter { $0 !== self }
|
var mediaPickerContext: AttachmentMediaPickerContext?
|
||||||
|
if let first = current.first as? MediaPickerScreen {
|
||||||
|
mediaPickerContext = first.webSearchController?.mediaPickerContext ?? first.mediaPickerContext
|
||||||
|
}
|
||||||
|
return (current.filter { $0 !== self }, mediaPickerContext)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1079,9 +1095,19 @@ public final class MediaPickerScreen: ViewController, AttachmentContainable {
|
|||||||
}
|
}
|
||||||
if collection.assetCollectionSubtype != .smartAlbumUserLibrary {
|
if collection.assetCollectionSubtype != .smartAlbumUserLibrary {
|
||||||
let mediaPicker = MediaPickerScreen(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peer: strongSelf.peer, chatLocation: strongSelf.chatLocation, bannedSendMedia: strongSelf.bannedSendMedia, collection: collection, editingContext: strongSelf.interaction?.editingState, selectionContext: strongSelf.interaction?.selectionState)
|
let mediaPicker = MediaPickerScreen(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peer: strongSelf.peer, chatLocation: strongSelf.chatLocation, bannedSendMedia: strongSelf.bannedSendMedia, collection: collection, editingContext: strongSelf.interaction?.editingState, selectionContext: strongSelf.interaction?.selectionState)
|
||||||
|
|
||||||
|
mediaPicker.presentStickers = strongSelf.presentStickers
|
||||||
|
mediaPicker.presentSchedulePicker = strongSelf.presentSchedulePicker
|
||||||
|
mediaPicker.presentTimerPicker = strongSelf.presentTimerPicker
|
||||||
|
mediaPicker.getCaptionPanelView = strongSelf.getCaptionPanelView
|
||||||
|
mediaPicker.legacyCompletion = strongSelf.legacyCompletion
|
||||||
|
mediaPicker.dismissAll = { [weak self] in
|
||||||
|
self?.dismiss(animated: true, completion: nil)
|
||||||
|
}
|
||||||
|
|
||||||
mediaPicker._presentedInModal = true
|
mediaPicker._presentedInModal = true
|
||||||
mediaPicker.updateNavigationStack = strongSelf.updateNavigationStack
|
mediaPicker.updateNavigationStack = strongSelf.updateNavigationStack
|
||||||
strongSelf.updateNavigationStack({ _ in return [strongSelf, mediaPicker]})
|
strongSelf.updateNavigationStack({ _ in return ([strongSelf, mediaPicker], strongSelf.mediaPickerContext)})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
|
@ -165,7 +165,7 @@ private func attachmentFileControllerEntries(presentationData: PresentationData,
|
|||||||
|
|
||||||
private class AttachmentFileControllerImpl: ItemListController, AttachmentContainable {
|
private class AttachmentFileControllerImpl: ItemListController, AttachmentContainable {
|
||||||
public var requestAttachmentMenuExpansion: () -> Void = {}
|
public var requestAttachmentMenuExpansion: () -> Void = {}
|
||||||
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> [AttachmentContainable]) -> Void = { _ in }
|
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
||||||
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
public var cancelPanGesture: () -> Void = { }
|
public var cancelPanGesture: () -> Void = { }
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ class ContactSelectionControllerImpl: ViewController, ContactSelectionController
|
|||||||
}
|
}
|
||||||
|
|
||||||
var requestAttachmentMenuExpansion: () -> Void = {}
|
var requestAttachmentMenuExpansion: () -> Void = {}
|
||||||
var updateNavigationStack: (@escaping ([AttachmentContainable]) -> [AttachmentContainable]) -> Void = { _ in }
|
var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
||||||
var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
var cancelPanGesture: () -> Void = { }
|
var cancelPanGesture: () -> Void = { }
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user