mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 22:55:00 +00:00
Video editor fixes
This commit is contained in:
@@ -11,6 +11,9 @@ import UniversalMediaPlayer
|
|||||||
import AccountContext
|
import AccountContext
|
||||||
import RadialStatusNode
|
import RadialStatusNode
|
||||||
import TelegramUniversalVideoContent
|
import TelegramUniversalVideoContent
|
||||||
|
import PresentationDataUtils
|
||||||
|
import OverlayStatusController
|
||||||
|
import StickerPackPreviewUI
|
||||||
import AppBundle
|
import AppBundle
|
||||||
|
|
||||||
public enum UniversalVideoGalleryItemContentInfo {
|
public enum UniversalVideoGalleryItemContentInfo {
|
||||||
@@ -244,7 +247,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
|
|||||||
fileprivate let _ready = Promise<Void>()
|
fileprivate let _ready = Promise<Void>()
|
||||||
fileprivate let _title = Promise<String>()
|
fileprivate let _title = Promise<String>()
|
||||||
fileprivate let _titleView = Promise<UIView?>()
|
fileprivate let _titleView = Promise<UIView?>()
|
||||||
fileprivate let _rightBarButtonItem = Promise<UIBarButtonItem?>()
|
fileprivate let _rightBarButtonItems = Promise<[UIBarButtonItem]?>()
|
||||||
|
|
||||||
private let scrubberView: ChatVideoGalleryItemScrubberView
|
private let scrubberView: ChatVideoGalleryItemScrubberView
|
||||||
private let footerContentNode: ChatItemGalleryFooterContentNode
|
private let footerContentNode: ChatItemGalleryFooterContentNode
|
||||||
@@ -445,8 +448,12 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
|
|||||||
|
|
||||||
self.dismissOnOrientationChange = item.landscape
|
self.dismissOnOrientationChange = item.landscape
|
||||||
|
|
||||||
var disablePictureInPicture = false
|
var hasLinkedStickers = false
|
||||||
|
if let content = item.content as? NativeVideoContent {
|
||||||
|
hasLinkedStickers = content.fileReference.media.hasLinkedStickers
|
||||||
|
}
|
||||||
|
|
||||||
|
var disablePictureInPicture = false
|
||||||
var disablePlayerControls = false
|
var disablePlayerControls = false
|
||||||
var isAnimated = false
|
var isAnimated = false
|
||||||
if let content = item.content as? NativeVideoContent {
|
if let content = item.content as? NativeVideoContent {
|
||||||
@@ -671,10 +678,16 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
|
|||||||
|
|
||||||
self.zoomableContent = (videoSize, videoNode)
|
self.zoomableContent = (videoSize, videoNode)
|
||||||
|
|
||||||
|
var barButtonItems: [UIBarButtonItem] = []
|
||||||
if !isAnimated && !disablePlayerControls && !disablePictureInPicture {
|
if !isAnimated && !disablePlayerControls && !disablePictureInPicture {
|
||||||
let rightBarButtonItem = UIBarButtonItem(image: pictureInPictureButtonImage, style: .plain, target: self, action: #selector(self.pictureInPictureButtonPressed))
|
let rightBarButtonItem = UIBarButtonItem(image: pictureInPictureButtonImage, style: .plain, target: self, action: #selector(self.pictureInPictureButtonPressed))
|
||||||
self._rightBarButtonItem.set(.single(rightBarButtonItem))
|
barButtonItems.append(rightBarButtonItem)
|
||||||
}
|
}
|
||||||
|
if hasLinkedStickers {
|
||||||
|
let rightBarButtonItem = UIBarButtonItem(image: UIImage(bundleImageName: "Media Gallery/Stickers"), style: .plain, target: self, action: #selector(self.openStickersButtonPressed))
|
||||||
|
barButtonItems.append(rightBarButtonItem)
|
||||||
|
}
|
||||||
|
self._rightBarButtonItems.set(.single(barButtonItems))
|
||||||
|
|
||||||
videoNode.playbackCompleted = { [weak videoNode] in
|
videoNode.playbackCompleted = { [weak videoNode] in
|
||||||
Queue.mainQueue().async {
|
Queue.mainQueue().async {
|
||||||
@@ -1218,8 +1231,8 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
|
|||||||
return self._titleView.get()
|
return self._titleView.get()
|
||||||
}
|
}
|
||||||
|
|
||||||
override func rightBarButtonItem() -> Signal<UIBarButtonItem?, NoError> {
|
override func rightBarButtonItems() -> Signal<[UIBarButtonItem]?, NoError> {
|
||||||
return self._rightBarButtonItem.get()
|
return self._rightBarButtonItems.get()
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func statusButtonPressed() {
|
@objc func statusButtonPressed() {
|
||||||
@@ -1307,6 +1320,46 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@objc func openStickersButtonPressed() {
|
||||||
|
if let content = self.item?.content as? NativeVideoContent {
|
||||||
|
let media = content.fileReference.abstract
|
||||||
|
|
||||||
|
let presentationData = self.context.sharedContext.currentPresentationData.with { $0 }
|
||||||
|
let progressSignal = Signal<Never, NoError> { [weak self] subscriber in
|
||||||
|
guard let strongSelf = self else {
|
||||||
|
return EmptyDisposable
|
||||||
|
}
|
||||||
|
let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil))
|
||||||
|
(strongSelf.baseNavigationController()?.topViewController as? ViewController)?.present(controller, in: .window(.root), with: nil)
|
||||||
|
return ActionDisposable { [weak controller] in
|
||||||
|
Queue.mainQueue().async() {
|
||||||
|
controller?.dismiss()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|> runOn(Queue.mainQueue())
|
||||||
|
|> delay(0.15, queue: Queue.mainQueue())
|
||||||
|
let progressDisposable = progressSignal.start()
|
||||||
|
|
||||||
|
let signal = stickerPacksAttachedToMedia(account: self.context.account, media: media)
|
||||||
|
|> afterDisposed {
|
||||||
|
Queue.mainQueue().async {
|
||||||
|
progressDisposable.dispose()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let _ = (signal
|
||||||
|
|> deliverOnMainQueue).start(next: { [weak self] packs in
|
||||||
|
guard let strongSelf = self, !packs.isEmpty else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let baseNavigationController = strongSelf.baseNavigationController()
|
||||||
|
baseNavigationController?.view.endEditing(true)
|
||||||
|
let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packs[0], stickerPacks: packs, sendSticker: nil)
|
||||||
|
(baseNavigationController?.topViewController as? ViewController)?.present(controller, in: .window(.root), with: nil)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override func footerContent() -> Signal<(GalleryFooterContentNode?, GalleryOverlayContentNode?), NoError> {
|
override func footerContent() -> Signal<(GalleryFooterContentNode?, GalleryOverlayContentNode?), NoError> {
|
||||||
return .single((self.footerContentNode, nil))
|
return .single((self.footerContentNode, nil))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,9 +143,10 @@ private final class LegacyAssetItemWrapper: NSObject {
|
|||||||
public func legacyAssetPickerItemGenerator() -> ((Any?, String?, [Any]?, String?) -> [AnyHashable : Any]?) {
|
public func legacyAssetPickerItemGenerator() -> ((Any?, String?, [Any]?, String?) -> [AnyHashable : Any]?) {
|
||||||
return { anyDict, caption, entities, hash in
|
return { anyDict, caption, entities, hash in
|
||||||
let dict = anyDict as! NSDictionary
|
let dict = anyDict as! NSDictionary
|
||||||
let stickers = (dict["stickers"] as? [TGDocumentMediaAttachment])?.compactMap { document -> FileMediaReference? in
|
let stickers = (dict["stickers"] as? [Data])?.compactMap { data -> FileMediaReference? in
|
||||||
if let sticker = stickerFromLegacyDocument(document) {
|
let decoder = PostboxDecoder(buffer: MemoryBuffer(data: data))
|
||||||
return FileMediaReference.standalone(media: sticker)
|
if let file = decoder.decodeRootObject() as? TelegramMediaFile {
|
||||||
|
return FileMediaReference.standalone(media: file)
|
||||||
} else {
|
} else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -440,6 +440,15 @@ public final class TelegramMediaFile: Media, Equatable, Codable {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public var hasLinkedStickers: Bool {
|
||||||
|
for attribute in self.attributes {
|
||||||
|
if case .HasLinkedStickers = attribute {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
public var isMusic: Bool {
|
public var isMusic: Bool {
|
||||||
for attribute in self.attributes {
|
for attribute in self.attributes {
|
||||||
if case .Audio(false, _, _, _, _) = attribute {
|
if case .Audio(false, _, _, _, _) = attribute {
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "GalleryEmbeddedStickersIcon@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "GalleryEmbeddedStickersIcon@3x.png",
|
|
||||||
"scale" : "3x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.7 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 2.6 KiB |
Reference in New Issue
Block a user