[WIP] Story collage

This commit is contained in:
Ilya Laktyushin
2024-11-27 18:41:03 +04:00
parent 0794812bae
commit d2b5476293
78 changed files with 6086 additions and 1224 deletions

View File

@@ -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)