mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 06:35:51 +00:00
[WIP] Story collage
This commit is contained in:
@@ -319,12 +319,12 @@ public final class TelegramRootController: NavigationController, TelegramRootCon
|
||||
var returnToCameraImpl: (() -> Void)?
|
||||
var dismissCameraImpl: (() -> Void)?
|
||||
var showDraftTooltipImpl: (() -> Void)?
|
||||
let cameraController = CameraScreen(
|
||||
let cameraController = CameraScreenImpl(
|
||||
context: context,
|
||||
mode: .story,
|
||||
transitionIn: transitionIn.flatMap {
|
||||
if let sourceView = $0.sourceView {
|
||||
return CameraScreen.TransitionIn(
|
||||
return CameraScreenImpl.TransitionIn(
|
||||
sourceView: sourceView,
|
||||
sourceRect: $0.sourceRect,
|
||||
sourceCornerRadius: $0.sourceCornerRadius
|
||||
@@ -335,7 +335,7 @@ public final class TelegramRootController: NavigationController, TelegramRootCon
|
||||
},
|
||||
transitionOut: { finished in
|
||||
if let transitionOut = (externalState.transitionOut ?? transitionOut)(finished ? externalState.storyTarget : nil, externalState.isPeerArchived), let destinationView = transitionOut.destinationView {
|
||||
return CameraScreen.TransitionOut(
|
||||
return CameraScreenImpl.TransitionOut(
|
||||
destinationView: destinationView,
|
||||
destinationRect: transitionOut.destinationRect,
|
||||
destinationCornerRadius: transitionOut.destinationCornerRadius,
|
||||
@@ -346,9 +346,9 @@ public final class TelegramRootController: NavigationController, TelegramRootCon
|
||||
}
|
||||
},
|
||||
completion: { result, resultTransition, dismissed in
|
||||
let subject: Signal<MediaEditorScreen.Subject?, NoError> = result
|
||||
|> map { value -> MediaEditorScreen.Subject? in
|
||||
func editorPIPPosition(_ position: CameraScreen.PIPPosition) -> MediaEditorScreen.PIPPosition {
|
||||
let subject: Signal<MediaEditorScreenImpl.Subject?, NoError> = result
|
||||
|> map { value -> MediaEditorScreenImpl.Subject? in
|
||||
func editorPIPPosition(_ position: CameraScreenImpl.PIPPosition) -> MediaEditorScreenImpl.PIPPosition {
|
||||
switch position {
|
||||
case .topLeft:
|
||||
return .topLeft
|
||||
@@ -364,9 +364,23 @@ public final class TelegramRootController: NavigationController, TelegramRootCon
|
||||
case .pendingImage:
|
||||
return nil
|
||||
case let .image(image):
|
||||
return .image(image.image, PixelDimensions(image.image.size), image.additionalImage, editorPIPPosition(image.additionalImagePosition))
|
||||
return .image(image: image.image, dimensions: PixelDimensions(image.image.size), additionalImage: image.additionalImage, additionalImagePosition: editorPIPPosition(image.additionalImagePosition))
|
||||
case let .video(video):
|
||||
return .video(video.videoPath, video.coverImage, video.mirror, video.additionalVideoPath, video.additionalCoverImage, video.dimensions, video.duration, video.positionChangeTimestamps, editorPIPPosition(video.additionalVideoPosition))
|
||||
return .video(videoPath: video.videoPath, thumbnail: video.coverImage, mirror: video.mirror, additionalVideoPath: video.additionalVideoPath, additionalThumbnail: video.additionalCoverImage, dimensions: video.dimensions, duration: video.duration, videoPositionChanges: video.positionChangeTimestamps, additionalVideoPosition: editorPIPPosition(video.additionalVideoPosition))
|
||||
case let .videoCollage(collage):
|
||||
func editorCollageItem(_ item: CameraScreenImpl.Result.VideoCollage.Item) -> MediaEditorScreenImpl.Subject.VideoCollageItem {
|
||||
let content: MediaEditorScreenImpl.Subject.VideoCollageItem.Content
|
||||
switch item.content {
|
||||
case let .image(image):
|
||||
content = .image(image)
|
||||
case let .video(path, duration):
|
||||
content = .video(path, duration)
|
||||
case let .asset(asset):
|
||||
content = .asset(asset)
|
||||
}
|
||||
return MediaEditorScreenImpl.Subject.VideoCollageItem(content: content, frame: item.frame)
|
||||
}
|
||||
return .videoCollage(items: collage.items.map { editorCollageItem($0) })
|
||||
case let .asset(asset):
|
||||
return .asset(asset)
|
||||
case let .draft(draft):
|
||||
@@ -374,10 +388,10 @@ public final class TelegramRootController: NavigationController, TelegramRootCon
|
||||
}
|
||||
}
|
||||
|
||||
var transitionIn: MediaEditorScreen.TransitionIn?
|
||||
var transitionIn: MediaEditorScreenImpl.TransitionIn?
|
||||
if let resultTransition, let sourceView = resultTransition.sourceView {
|
||||
transitionIn = .gallery(
|
||||
MediaEditorScreen.TransitionIn.GalleryTransitionIn(
|
||||
MediaEditorScreenImpl.TransitionIn.GalleryTransitionIn(
|
||||
sourceView: sourceView,
|
||||
sourceRect: resultTransition.sourceRect,
|
||||
sourceImage: resultTransition.sourceImage
|
||||
@@ -398,7 +412,7 @@ public final class TelegramRootController: NavigationController, TelegramRootCon
|
||||
}
|
||||
}
|
||||
|
||||
let controller = MediaEditorScreen(
|
||||
let controller = MediaEditorScreenImpl(
|
||||
context: context,
|
||||
mode: .storyEditor,
|
||||
subject: subject,
|
||||
@@ -406,14 +420,14 @@ public final class TelegramRootController: NavigationController, TelegramRootCon
|
||||
transitionIn: transitionIn,
|
||||
transitionOut: { finished, isNew in
|
||||
if finished, let transitionOut = (externalState.transitionOut ?? transitionOut)(externalState.storyTarget, false), let destinationView = transitionOut.destinationView {
|
||||
return MediaEditorScreen.TransitionOut(
|
||||
return MediaEditorScreenImpl.TransitionOut(
|
||||
destinationView: destinationView,
|
||||
destinationRect: transitionOut.destinationRect,
|
||||
destinationCornerRadius: transitionOut.destinationCornerRadius,
|
||||
completion: transitionOut.completion
|
||||
)
|
||||
} else if !finished, let resultTransition, let (destinationView, destinationRect) = resultTransition.transitionOut(isNew) {
|
||||
return MediaEditorScreen.TransitionOut(
|
||||
return MediaEditorScreenImpl.TransitionOut(
|
||||
destinationView: destinationView,
|
||||
destinationRect: destinationRect,
|
||||
destinationCornerRadius: 0.0,
|
||||
@@ -469,7 +483,7 @@ public final class TelegramRootController: NavigationController, TelegramRootCon
|
||||
dismissCameraImpl?()
|
||||
})
|
||||
}
|
||||
} as (MediaEditorScreen.Result, @escaping (@escaping () -> Void) -> Void) -> Void
|
||||
} as (MediaEditorScreenImpl.Result, @escaping (@escaping () -> Void) -> Void) -> Void
|
||||
)
|
||||
controller.cancelled = { showDraftTooltip in
|
||||
if showDraftTooltip {
|
||||
@@ -525,7 +539,7 @@ public final class TelegramRootController: NavigationController, TelegramRootCon
|
||||
}
|
||||
|
||||
public func proceedWithStoryUpload(target: Stories.PendingTarget, result: MediaEditorScreenResult, existingMedia: EngineMedia?, forwardInfo: Stories.PendingForwardInfo?, externalState: MediaEditorTransitionOutExternalState, commit: @escaping (@escaping () -> Void) -> Void) {
|
||||
guard let result = result as? MediaEditorScreen.Result else {
|
||||
guard let result = result as? MediaEditorScreenImpl.Result else {
|
||||
return
|
||||
}
|
||||
let context = self.context
|
||||
@@ -734,7 +748,7 @@ public final class TelegramRootController: NavigationController, TelegramRootCon
|
||||
|
||||
//Xcode 16
|
||||
#if canImport(ContactProvider)
|
||||
extension MediaEditorScreen.Result: @retroactive MediaEditorScreenResult {
|
||||
extension MediaEditorScreenImpl.Result: @retroactive MediaEditorScreenResult {
|
||||
public var target: Stories.PendingTarget {
|
||||
if let sendAsPeerId = self.options.sendAsPeerId {
|
||||
return .peer(sendAsPeerId)
|
||||
@@ -744,7 +758,7 @@ extension MediaEditorScreen.Result: @retroactive MediaEditorScreenResult {
|
||||
}
|
||||
}
|
||||
#else
|
||||
extension MediaEditorScreen.Result: MediaEditorScreenResult {
|
||||
extension MediaEditorScreenImpl.Result: MediaEditorScreenResult {
|
||||
public var target: Stories.PendingTarget {
|
||||
if let sendAsPeerId = self.options.sendAsPeerId {
|
||||
return .peer(sendAsPeerId)
|
||||
|
||||
Reference in New Issue
Block a user