Various fixes

This commit is contained in:
Ilya Laktyushin 2023-07-09 01:29:08 +02:00
parent 74de28b154
commit a038e40dbb
3 changed files with 98 additions and 51 deletions

View File

@ -2342,10 +2342,10 @@ public class DrawingScreen: ViewController, TGPhotoDrawingInterfaceController, U
return self._selectionContainerView! return self._selectionContainerView!
} }
private var _contentWrapperView: PortalSourceView? private var _contentWrapperView: UIView?
var contentWrapperView: PortalSourceView { var contentWrapperView: UIView {
if self._contentWrapperView == nil { if self._contentWrapperView == nil {
self._contentWrapperView = PortalSourceView() self._contentWrapperView = UIView()
} }
return self._contentWrapperView! return self._contentWrapperView!
} }
@ -2423,6 +2423,7 @@ public class DrawingScreen: ViewController, TGPhotoDrawingInterfaceController, U
context: self.context, context: self.context,
drawingView: self.drawingView, drawingView: self.drawingView,
entitiesView: self.entitiesView, entitiesView: self.entitiesView,
contentWrapperView: self.contentWrapperView,
selectionContainerView: self.selectionContainerView, selectionContainerView: self.selectionContainerView,
isVideo: controller.isVideo, isVideo: controller.isVideo,
updateSelectedEntity: { [weak self] entity in updateSelectedEntity: { [weak self] entity in
@ -2786,7 +2787,7 @@ public class DrawingScreen: ViewController, TGPhotoDrawingInterfaceController, U
return self.node.selectionContainerView return self.node.selectionContainerView
} }
public var contentWrapperView: PortalSourceView { public var contentWrapperView: UIView {
return self.node.contentWrapperView return self.node.contentWrapperView
} }
@ -2954,6 +2955,7 @@ public final class DrawingToolsInteraction {
private let context: AccountContext private let context: AccountContext
private let drawingView: DrawingView private let drawingView: DrawingView
private let entitiesView: DrawingEntitiesView private let entitiesView: DrawingEntitiesView
private weak var contentWrapperView: UIView?
private let selectionContainerView: DrawingSelectionContainerView private let selectionContainerView: DrawingSelectionContainerView
private let isVideo: Bool private let isVideo: Bool
private let updateSelectedEntity: (DrawingEntity?) -> Void private let updateSelectedEntity: (DrawingEntity?) -> Void
@ -2983,6 +2985,7 @@ public final class DrawingToolsInteraction {
context: AccountContext, context: AccountContext,
drawingView: DrawingView, drawingView: DrawingView,
entitiesView: DrawingEntitiesView, entitiesView: DrawingEntitiesView,
contentWrapperView: UIView,
selectionContainerView: DrawingSelectionContainerView, selectionContainerView: DrawingSelectionContainerView,
isVideo: Bool, isVideo: Bool,
updateSelectedEntity: @escaping (DrawingEntity?) -> Void, updateSelectedEntity: @escaping (DrawingEntity?) -> Void,
@ -2998,6 +3001,7 @@ public final class DrawingToolsInteraction {
self.context = context self.context = context
self.drawingView = drawingView self.drawingView = drawingView
self.entitiesView = entitiesView self.entitiesView = entitiesView
self.contentWrapperView = contentWrapperView
self.selectionContainerView = selectionContainerView self.selectionContainerView = selectionContainerView
self.isVideo = isVideo self.isVideo = isVideo
self.updateSelectedEntity = updateSelectedEntity self.updateSelectedEntity = updateSelectedEntity
@ -3182,50 +3186,51 @@ public final class DrawingToolsInteraction {
return return
} }
guard let currentImage = self.getCurrentImage() else { let currentImage = self.getCurrentImage()
self.entitiesView.play()
self.updateVideoPlayback(true)
return
}
let sourceImage = generateImage(self.drawingView.imageSize, contextGenerator: { size, context in let sourceImage = generateImage(self.drawingView.imageSize, contextGenerator: { size, context in
let bounds = CGRect(origin: .zero, size: size) let bounds = CGRect(origin: .zero, size: size)
if let cgImage = currentImage.cgImage { if let cgImage = currentImage?.cgImage {
context.draw(cgImage, in: bounds) context.draw(cgImage, in: bounds)
} }
if let cgImage = self.drawingView.drawingImage?.cgImage { if self.drawingView.superview !== self.entitiesView {
context.draw(cgImage, in: bounds) if let cgImage = self.drawingView.drawingImage?.cgImage {
context.draw(cgImage, in: bounds)
}
} }
context.translateBy(x: size.width / 2.0, y: size.height / 2.0) context.translateBy(x: size.width / 2.0, y: size.height / 2.0)
context.scaleBy(x: 1.0, y: -1.0) context.scaleBy(x: 1.0, y: -1.0)
context.translateBy(x: -size.width / 2.0, y: -size.height / 2.0) context.translateBy(x: -size.width / 2.0, y: -size.height / 2.0)
self.entitiesView.layer.render(in: context) self.entitiesView.layer.render(in: context)
}, opaque: true, scale: 1.0) }, opaque: true, scale: 1.0)
guard let sourceImage = sourceImage else {
guard let sourceImage, var contentWrapperView = self.contentWrapperView, let controllerView = self.getControllerNode()?.view else {
return return
} }
let _ = sourceImage if contentWrapperView.frame.width.isZero {
contentWrapperView = self.entitiesView.superview!
}
let eyedropperView = EyedropperView(containerSize: contentWrapperView.frame.size, drawingView: self.drawingView, sourceImage: sourceImage)
eyedropperView.completed = { [weak self] color in
if let self {
self.updateColor(color)
self.entitiesView.play()
self.updateVideoPlayback(true)
// let eyedropperView = EyedropperView(containerSize: controller.contentWrapperView.frame.size, drawingView: self.drawingView, sourceImage: sourceImage) dismissed()
// eyedropperView.completed = { [weak self] color in }
// if let self { }
// self.updateColor(color) eyedropperView.dismissed = { [weak self] in
// self.entitiesView.play() if let self {
// self.updateVideoPlayback(true) self.entitiesView.play()
// self.updateVideoPlayback(true)
// dismissed() }
// } }
// } eyedropperView.frame = contentWrapperView.convert(contentWrapperView.bounds, to: controllerView)
// eyedropperView.dismissed = { [weak self] in self.addSubview(eyedropperView)
// if let self { self.currentEyedropperView = eyedropperView
// self.entitiesView.play()
// self.updateVideoPlayback(true)
// }
// }
// eyedropperView.frame = controller.contentWrapperView.convert(controller.contentWrapperView.bounds, to: controller.view)
// self.addSubview(eyedropperView)
// self.currentEyedropperView = eyedropperView
} }
func dismissCurrentEyedropper() { func dismissCurrentEyedropper() {

View File

@ -56,7 +56,7 @@ public final class EyedropperView: UIView {
var completed: (DrawingColor) -> Void = { _ in } var completed: (DrawingColor) -> Void = { _ in }
var dismissed: () -> Void = { } var dismissed: () -> Void = { }
init(containerSize: CGSize, drawingView: DrawingView, sourceImage: UIImage) { init(containerSize: CGSize, drawingView: DrawingView, sourceImage: UIImage) {
self.drawingView = drawingView self.drawingView = drawingView

View File

@ -2005,23 +2005,11 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
if let self { if let self {
switch action { switch action {
case .play: case .play:
self.entitiesView.eachView({ view in self.entitiesView.play()
if let sticker = view.entity as? DrawingStickerEntity, case .video = sticker.content {
view.play()
}
})
case .pause: case .pause:
self.entitiesView.eachView({ view in self.entitiesView.pause()
if let sticker = view.entity as? DrawingStickerEntity, case .video = sticker.content {
view.pause()
}
})
case let .seek(timestamp): case let .seek(timestamp):
self.entitiesView.eachView({ view in self.entitiesView.seek(to: timestamp)
if let sticker = view.entity as? DrawingStickerEntity, case .video = sticker.content {
view.seek(to: timestamp)
}
})
} }
} }
} }
@ -2061,6 +2049,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
context: self.context, context: self.context,
drawingView: self.drawingView, drawingView: self.drawingView,
entitiesView: self.entitiesView, entitiesView: self.entitiesView,
contentWrapperView: self.previewContainerView,
selectionContainerView: self.selectionContainerView, selectionContainerView: self.selectionContainerView,
isVideo: false, isVideo: false,
updateSelectedEntity: { [weak self] _ in updateSelectedEntity: { [weak self] _ in
@ -2904,7 +2893,60 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
self.previousDrawingEntities = self.entitiesView.entities self.previousDrawingEntities = self.entitiesView.entities
self.interaction?.deactivate() self.interaction?.deactivate()
let controller = DrawingScreen(context: self.context, sourceHint: .storyEditor, size: self.previewContainerView.frame.size, originalSize: storyDimensions, isVideo: false, isAvatar: false, drawingView: self.drawingView, entitiesView: self.entitiesView, selectionContainerView: self.selectionContainerView, existingStickerPickerInputData: self.stickerPickerInputData) let controller = DrawingScreen(
context: self.context,
sourceHint: .storyEditor,
size: self.previewContainerView.frame.size,
originalSize: storyDimensions,
isVideo: self.mediaEditor?.sourceIsVideo ?? false,
isAvatar: false,
drawingView: self.drawingView,
entitiesView: self.entitiesView,
selectionContainerView: self.selectionContainerView,
existingStickerPickerInputData: self.stickerPickerInputData
)
controller.getCurrentImage = { [weak self] in
guard let self else {
return nil
}
let colorSpace = CGColorSpaceCreateDeviceRGB()
let imageSize = CGSize(width: 1080, height: 1920)
let context = DrawingContext(size: imageSize, scale: 1.0, opaque: true, colorSpace: colorSpace)
context?.withFlippedContext { context in
if let gradientImage = self.gradientView.image?.cgImage {
context.draw(gradientImage, in: CGRect(origin: .zero, size: imageSize))
}
if let image = self.mediaEditor?.resultImage, let values = self.mediaEditor?.values {
let initialScale: CGFloat
if image.size.height > image.size.width {
initialScale = max(imageSize.width / image.size.width, imageSize.height / image.size.height)
} else {
initialScale = imageSize.width / image.size.width
}
let scale = initialScale * values.cropScale
context.translateBy(x: imageSize.width / 2.0 + values.cropOffset.x, y: imageSize.height / 2.0 - values.cropOffset.y)
context.rotate(by: -values.cropRotation)
context.scaleBy(x: scale, y: scale)
if let cgImage = image.cgImage {
context.draw(cgImage, in: CGRect(x: -image.size.width / 2.0, y: -image.size.height / 2.0, width: image.size.width, height: image.size.height))
}
}
}
return context?.generateImage(colorSpace: colorSpace)
}
controller.updateVideoPlayback = { [weak self] play in
guard let self else {
return
}
if play {
self.mediaEditor?.play()
} else {
self.mediaEditor?.stop()
}
}
self.drawingScreen = controller self.drawingScreen = controller
self.drawingView.isUserInteractionEnabled = true self.drawingView.isUserInteractionEnabled = true