mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-10-09 03:20:48 +00:00
Various fixes
This commit is contained in:
parent
2f0070cccb
commit
4a4917f704
@ -10777,3 +10777,5 @@ Sorry for the inconvenience.";
|
||||
"ChatList.PremiumGiftInSettingsInfo" = "You can gift **Telegram Premium** to a friend later in **Settings**.";
|
||||
|
||||
"ChannelAppearance.BoostLevel" = "Level %@";
|
||||
|
||||
"Message.FullDateFormat" = "%1$@, %2$@";
|
||||
|
@ -276,21 +276,28 @@ public class DrawingStickerEntityView: DrawingEntityView {
|
||||
self.animatedImageView = imageView
|
||||
self.addSubview(imageView)
|
||||
self.setNeedsLayout()
|
||||
} else if case let .message(_, innerFile, _) = self.stickerEntity.content {
|
||||
let imageView = UIImageView()
|
||||
imageView.contentMode = .scaleAspectFit
|
||||
imageView.image = self.stickerEntity.renderImage
|
||||
self.animatedImageView = imageView
|
||||
self.addSubview(imageView)
|
||||
self.setNeedsLayout()
|
||||
|
||||
let _ = innerFile
|
||||
// if let innerFile, innerFile.isAnimated {
|
||||
// self.setupWithVideo(innerFile)
|
||||
// }
|
||||
} else if case .message = self.stickerEntity.content {
|
||||
if let image = self.stickerEntity.renderImage {
|
||||
self.setupWithImage(image)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func setupWithImage(_ image: UIImage) {
|
||||
let imageView: UIImageView
|
||||
if let current = self.animatedImageView {
|
||||
imageView = current
|
||||
} else {
|
||||
imageView = UIImageView()
|
||||
imageView.contentMode = .scaleAspectFit
|
||||
self.addSubview(imageView)
|
||||
self.animatedImageView = imageView
|
||||
}
|
||||
imageView.image = image
|
||||
self.currentSize = nil
|
||||
self.setNeedsLayout()
|
||||
}
|
||||
|
||||
private func setupWithVideo(_ file: TelegramMediaFile) {
|
||||
let videoNode = UniversalVideoNode(
|
||||
postbox: self.context.account.postbox,
|
||||
@ -366,10 +373,10 @@ public class DrawingStickerEntityView: DrawingEntityView {
|
||||
self.applyVisibility()
|
||||
}
|
||||
|
||||
private var isNight = false
|
||||
public func toggleNightTheme() {
|
||||
self.isNight = !self.isNight
|
||||
self.animatedImageView?.image = self.isNight ? self.stickerEntity.secondaryRenderImage : self.stickerEntity.renderImage
|
||||
public var isNightTheme = false {
|
||||
didSet {
|
||||
self.animatedImageView?.image = self.isNightTheme ? self.stickerEntity.secondaryRenderImage : self.stickerEntity.renderImage
|
||||
}
|
||||
}
|
||||
|
||||
func applyVisibility() {
|
||||
@ -615,6 +622,13 @@ public class DrawingStickerEntityView: DrawingEntityView {
|
||||
self.transform = CGAffineTransformScale(CGAffineTransformMakeRotation(self.stickerEntity.rotation), self.stickerEntity.scale, self.stickerEntity.scale)
|
||||
|
||||
self.updateAnimationColor()
|
||||
|
||||
if case .message = self.stickerEntity.content, self.animatedImageView == nil {
|
||||
let image = self.isNightTheme ? self.stickerEntity.secondaryRenderImage : self.stickerEntity.renderImage
|
||||
if let image {
|
||||
self.setupWithImage(image)
|
||||
}
|
||||
}
|
||||
|
||||
self.updateMirroring(animated: animated)
|
||||
|
||||
|
@ -634,8 +634,8 @@ public final class ChatMessageAttachedContentNode: ASDisplayNode {
|
||||
let statusLayoutAndContinueValue = makeStatusLayout(ChatMessageDateAndStatusNode.Arguments(
|
||||
context: context,
|
||||
presentationData: presentationData,
|
||||
edited: edited,
|
||||
impressionCount: viewCount,
|
||||
edited: edited && !isPreview,
|
||||
impressionCount: !isPreview ? viewCount : nil,
|
||||
dateText: dateText,
|
||||
type: statusType,
|
||||
layoutInput: .trailingContent(
|
||||
|
@ -2093,7 +2093,7 @@ public class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewI
|
||||
context: item.context,
|
||||
presentationData: item.presentationData,
|
||||
edited: edited && !item.presentationData.isPreview,
|
||||
impressionCount: viewCount,
|
||||
impressionCount: !item.presentationData.isPreview ? viewCount : nil,
|
||||
dateText: dateText,
|
||||
type: statusType,
|
||||
layoutInput: .standalone(reactionSettings: shouldDisplayInlineDateReactions(message: item.message, isPremium: item.associatedData.isPremium, forceInline: item.associatedData.forceInlineReactions) ? ChatMessageDateAndStatusNode.StandaloneReactionSettings() : nil),
|
||||
|
@ -111,9 +111,7 @@ public func stringForMessageTimestampStatus(accountPeerId: PeerId, message: Mess
|
||||
} else {
|
||||
dayText = strings.Date_ChatDateHeaderYear(monthAtIndex(Int(timeinfo.tm_mon), strings: strings), "\(timeinfo.tm_mday)", "\(1900 + timeinfo.tm_year)").string
|
||||
}
|
||||
|
||||
//TODO:localize
|
||||
dateText = "\(dayText), \(stringForMessageTimestamp(timestamp: timestamp, dateTimeFormat: dateTimeFormat))"
|
||||
dateText = strings.Message_FullDateFormat(dayText, stringForMessageTimestamp(timestamp: timestamp, dateTimeFormat: dateTimeFormat)).string
|
||||
}
|
||||
else if let forwardInfo = message.forwardInfo, forwardInfo.flags.contains(.isImported) {
|
||||
dateText = strings.Message_ImportedDateFormat(dateStringForDay(strings: strings, dateTimeFormat: dateTimeFormat, timestamp: forwardInfo.date), stringForMessageTimestamp(timestamp: forwardInfo.date, dateTimeFormat: dateTimeFormat), dateText).string
|
||||
|
@ -508,7 +508,7 @@ public class ChatMessageGiveawayBubbleContentNode: ChatMessageBubbleContentNode,
|
||||
context: item.context,
|
||||
presentationData: item.presentationData,
|
||||
edited: edited,
|
||||
impressionCount: viewCount,
|
||||
impressionCount: !item.presentationData.isPreview ? viewCount : nil,
|
||||
dateText: dateText,
|
||||
type: statusType,
|
||||
layoutInput: .trailingContent(contentWidth: 1000.0, reactionSettings: shouldDisplayInlineDateReactions(message: item.message, isPremium: item.associatedData.isPremium, forceInline: item.associatedData.forceInlineReactions) ? ChatMessageDateAndStatusNode.TrailingReactionSettings(displayInline: true, preferAdditionalInset: false) : nil),
|
||||
|
@ -919,8 +919,8 @@ public final class ChatMessageInteractiveFileNode: ASDisplayNode {
|
||||
statusSuggestedWidthAndContinue = statusLayout(ChatMessageDateAndStatusNode.Arguments(
|
||||
context: arguments.context,
|
||||
presentationData: arguments.presentationData,
|
||||
edited: edited,
|
||||
impressionCount: viewCount,
|
||||
edited: edited && !arguments.presentationData.isPreview,
|
||||
impressionCount: !arguments.presentationData.isPreview ? viewCount : nil,
|
||||
dateText: dateText,
|
||||
type: statusType,
|
||||
layoutInput: statusLayoutInput,
|
||||
|
@ -554,7 +554,7 @@ public class ChatMessageInteractiveInstantVideoNode: ASDisplayNode {
|
||||
context: item.context,
|
||||
presentationData: item.presentationData,
|
||||
edited: edited && !sentViaBot && !item.presentationData.isPreview,
|
||||
impressionCount: item.presentationData.isPreview ? nil : viewCount,
|
||||
impressionCount: !item.presentationData.isPreview ? viewCount : nil,
|
||||
dateText: dateText,
|
||||
type: statusType,
|
||||
layoutInput: .standalone(reactionSettings: shouldDisplayInlineDateReactions(message: item.message, isPremium: item.associatedData.isPremium, forceInline: item.associatedData.forceInlineReactions) ? ChatMessageDateAndStatusNode.StandaloneReactionSettings() : nil),
|
||||
|
@ -862,7 +862,7 @@ public final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTr
|
||||
context: context,
|
||||
presentationData: presentationData,
|
||||
edited: dateAndStatus.edited && !presentationData.isPreview,
|
||||
impressionCount: dateAndStatus.viewCount,
|
||||
impressionCount: !presentationData.isPreview ? dateAndStatus.viewCount : nil,
|
||||
dateText: dateAndStatus.dateText,
|
||||
type: dateAndStatus.type,
|
||||
layoutInput: .standalone(reactionSettings: shouldDisplayInlineDateReactions(message: message, isPremium: associatedData.isPremium, forceInline: associatedData.forceInlineReactions) ? ChatMessageDateAndStatusNode.StandaloneReactionSettings() : nil),
|
||||
|
@ -267,7 +267,7 @@ public class ChatMessageMapBubbleContentNode: ChatMessageBubbleContentNode {
|
||||
context: item.context,
|
||||
presentationData: item.presentationData,
|
||||
edited: edited,
|
||||
impressionCount: viewCount,
|
||||
impressionCount: !item.presentationData.isPreview ? viewCount : nil,
|
||||
dateText: dateText,
|
||||
type: statusType,
|
||||
layoutInput: .standalone(reactionSettings: shouldDisplayInlineDateReactions(message: item.message, isPremium: item.associatedData.isPremium, forceInline: item.associatedData.forceInlineReactions) ? ChatMessageDateAndStatusNode.StandaloneReactionSettings() : nil),
|
||||
|
@ -564,7 +564,7 @@ public class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode {
|
||||
context: item.context,
|
||||
presentationData: item.presentationData,
|
||||
edited: edited && !item.presentationData.isPreview,
|
||||
impressionCount: viewCount,
|
||||
impressionCount: !item.presentationData.isPreview ? viewCount : nil,
|
||||
dateText: dateText,
|
||||
type: statusType,
|
||||
layoutInput: dateLayoutInput,
|
||||
|
@ -73,6 +73,7 @@ public final class MediaEditorDraft: Codable, Equatable {
|
||||
case values
|
||||
case caption
|
||||
case privacy
|
||||
case forwardInfo
|
||||
case timestamp
|
||||
case locationLatitude
|
||||
case locationLongitude
|
||||
@ -87,11 +88,12 @@ public final class MediaEditorDraft: Codable, Equatable {
|
||||
public let values: MediaEditorValues
|
||||
public let caption: NSAttributedString
|
||||
public let privacy: MediaEditorResultPrivacy?
|
||||
public let forwardInfo: StoryId?
|
||||
public let timestamp: Int32
|
||||
public let location: CLLocationCoordinate2D?
|
||||
public let expiresOn: Int32?
|
||||
|
||||
public init(path: String, isVideo: Bool, thumbnail: UIImage, dimensions: PixelDimensions, duration: Double?, values: MediaEditorValues, caption: NSAttributedString, privacy: MediaEditorResultPrivacy?, timestamp: Int32, location: CLLocationCoordinate2D?, expiresOn: Int32?) {
|
||||
public init(path: String, isVideo: Bool, thumbnail: UIImage, dimensions: PixelDimensions, duration: Double?, values: MediaEditorValues, caption: NSAttributedString, privacy: MediaEditorResultPrivacy?, forwardInfo: StoryId?, timestamp: Int32, location: CLLocationCoordinate2D?, expiresOn: Int32?) {
|
||||
self.path = path
|
||||
self.isVideo = isVideo
|
||||
self.thumbnail = thumbnail
|
||||
@ -100,6 +102,7 @@ public final class MediaEditorDraft: Codable, Equatable {
|
||||
self.values = values
|
||||
self.caption = caption
|
||||
self.privacy = privacy
|
||||
self.forwardInfo = forwardInfo
|
||||
self.timestamp = timestamp
|
||||
self.location = location
|
||||
self.expiresOn = expiresOn
|
||||
@ -135,6 +138,8 @@ public final class MediaEditorDraft: Codable, Equatable {
|
||||
self.privacy = nil
|
||||
}
|
||||
|
||||
self.forwardInfo = try container.decodeIfPresent(StoryId.self, forKey: .forwardInfo)
|
||||
|
||||
self.timestamp = try container.decodeIfPresent(Int32.self, forKey: .timestamp) ?? 1688909663
|
||||
|
||||
if let latitude = try container.decodeIfPresent(Double.self, forKey: .locationLatitude), let longitude = try container.decodeIfPresent(Double.self, forKey: .locationLongitude) {
|
||||
@ -172,6 +177,8 @@ public final class MediaEditorDraft: Codable, Equatable {
|
||||
} else {
|
||||
try container.encodeNil(forKey: .privacy)
|
||||
}
|
||||
try container.encodeIfPresent(self.forwardInfo, forKey: .forwardInfo)
|
||||
|
||||
try container.encode(self.timestamp, forKey: .timestamp)
|
||||
|
||||
if let location = self.location {
|
||||
|
@ -52,6 +52,7 @@ extension MediaEditorScreen {
|
||||
|
||||
let values = mediaEditor.values
|
||||
let privacy = self.state.privacy
|
||||
let forwardSource = self.forwardSource
|
||||
let caption = self.getCaption()
|
||||
let duration = mediaEditor.duration ?? 0.0
|
||||
|
||||
@ -85,29 +86,74 @@ extension MediaEditorScreen {
|
||||
guard let resultImage else {
|
||||
return
|
||||
}
|
||||
let fittedSize = resultImage.size.aspectFitted(CGSize(width: 128.0, height: 128.0))
|
||||
|
||||
let context = self.context
|
||||
let saveImageDraft: (UIImage, PixelDimensions) -> Void = { image, dimensions in
|
||||
if let thumbnailImage = generateScaledImage(image: resultImage, size: fittedSize) {
|
||||
let path = "\(Int64.random(in: .min ... .max)).jpg"
|
||||
if let data = image.jpegData(compressionQuality: 0.87) {
|
||||
let draft = MediaEditorDraft(path: path, isVideo: false, thumbnail: thumbnailImage, dimensions: dimensions, duration: nil, values: values, caption: caption, privacy: privacy, timestamp: timestamp, location: location, expiresOn: expiresOn)
|
||||
try? data.write(to: URL(fileURLWithPath: draft.fullPath(engine: context.engine)))
|
||||
if let id {
|
||||
saveStorySource(engine: context.engine, item: draft, peerId: context.account.peerId, id: id)
|
||||
} else {
|
||||
addStoryDraft(engine: context.engine, item: draft)
|
||||
}
|
||||
enum MediaInput {
|
||||
case image(image: UIImage, dimensions: PixelDimensions)
|
||||
case video(path: String, dimensions: PixelDimensions, duration: Double)
|
||||
|
||||
var isVideo: Bool {
|
||||
switch self {
|
||||
case .video:
|
||||
return true
|
||||
case .image:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
var dimensions: PixelDimensions {
|
||||
switch self {
|
||||
case let .image(_, dimensions):
|
||||
return dimensions
|
||||
case let .video(_, dimensions, _):
|
||||
return dimensions
|
||||
}
|
||||
}
|
||||
|
||||
var duration: Double? {
|
||||
switch self {
|
||||
case .image:
|
||||
return nil
|
||||
case let .video(_, _, duration):
|
||||
return duration
|
||||
}
|
||||
}
|
||||
|
||||
var fileExtension: String {
|
||||
switch self {
|
||||
case .image:
|
||||
return "jpg"
|
||||
case .video:
|
||||
return "mp4"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let saveVideoDraft: (String, PixelDimensions, Double) -> Void = { videoPath, dimensions, duration in
|
||||
let context = self.context
|
||||
func innerSaveDraft(media: MediaInput) {
|
||||
let fittedSize = resultImage.size.aspectFitted(CGSize(width: 128.0, height: 128.0))
|
||||
if let thumbnailImage = generateScaledImage(image: resultImage, size: fittedSize) {
|
||||
let path = "\(Int64.random(in: .min ... .max)).mp4"
|
||||
let draft = MediaEditorDraft(path: path, isVideo: true, thumbnail: thumbnailImage, dimensions: dimensions, duration: duration, values: values, caption: caption, privacy: privacy, timestamp: timestamp, location: location, expiresOn: expiresOn)
|
||||
try? FileManager.default.copyItem(atPath: videoPath, toPath: draft.fullPath(engine: context.engine))
|
||||
let path = "\(Int64.random(in: .min ... .max)).\(media.fileExtension)"
|
||||
let draft = MediaEditorDraft(
|
||||
path: path,
|
||||
isVideo: media.isVideo,
|
||||
thumbnail: thumbnailImage,
|
||||
dimensions: media.dimensions,
|
||||
duration: media.duration,
|
||||
values: values,
|
||||
caption: caption,
|
||||
privacy: privacy,
|
||||
forwardInfo: forwardSource.flatMap { StoryId(peerId: $0.0.id, id: $0.1.id) },
|
||||
timestamp: timestamp,
|
||||
location: location,
|
||||
expiresOn: expiresOn
|
||||
)
|
||||
switch media {
|
||||
case let .image(image, _):
|
||||
if let data = image.jpegData(compressionQuality: 0.87) {
|
||||
try? data.write(to: URL(fileURLWithPath: draft.fullPath(engine: context.engine)))
|
||||
}
|
||||
case let .video(path, _, _):
|
||||
try? FileManager.default.copyItem(atPath: path, toPath: draft.fullPath(engine: context.engine))
|
||||
}
|
||||
if let id {
|
||||
saveStorySource(engine: context.engine, item: draft, peerId: context.account.peerId, id: id)
|
||||
} else {
|
||||
@ -118,14 +164,14 @@ extension MediaEditorScreen {
|
||||
|
||||
switch subject {
|
||||
case let .image(image, dimensions, _, _):
|
||||
saveImageDraft(image, dimensions)
|
||||
innerSaveDraft(media: .image(image: image, dimensions: dimensions))
|
||||
case let .video(path, _, _, _, _, dimensions, _, _, _):
|
||||
saveVideoDraft(path, dimensions, duration)
|
||||
innerSaveDraft(media: .video(path: path, dimensions: dimensions, duration: duration))
|
||||
case let .asset(asset):
|
||||
if asset.mediaType == .video {
|
||||
PHImageManager.default().requestAVAsset(forVideo: asset, options: nil) { avAsset, _, _ in
|
||||
if let urlAsset = avAsset as? AVURLAsset {
|
||||
saveVideoDraft(urlAsset.url.relativePath, PixelDimensions(width: Int32(asset.pixelWidth), height: Int32(asset.pixelHeight)), duration)
|
||||
innerSaveDraft(media: .video(path: urlAsset.url.relativePath, dimensions: PixelDimensions(width: Int32(asset.pixelWidth), height: Int32(asset.pixelHeight)), duration: duration))
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@ -133,19 +179,21 @@ extension MediaEditorScreen {
|
||||
options.deliveryMode = .highQualityFormat
|
||||
PHImageManager.default().requestImage(for: asset, targetSize: PHImageManagerMaximumSize, contentMode: .default, options: options) { image, _ in
|
||||
if let image {
|
||||
saveImageDraft(image, PixelDimensions(image.size))
|
||||
innerSaveDraft(media: .image(image: image, dimensions: PixelDimensions(image.size)))
|
||||
}
|
||||
}
|
||||
}
|
||||
case let .draft(draft, _):
|
||||
if draft.isVideo {
|
||||
saveVideoDraft(draft.fullPath(engine: context.engine), draft.dimensions, draft.duration ?? 0.0)
|
||||
innerSaveDraft(media: .video(path: draft.fullPath(engine: context.engine), dimensions: draft.dimensions, duration: draft.duration ?? 0.0))
|
||||
} else if let image = UIImage(contentsOfFile: draft.fullPath(engine: context.engine)) {
|
||||
saveImageDraft(image, draft.dimensions)
|
||||
innerSaveDraft(media: .image(image: image, dimensions: draft.dimensions))
|
||||
}
|
||||
removeStoryDraft(engine: self.context.engine, path: draft.path, delete: false)
|
||||
case let .message(messageId):
|
||||
let _ = messageId
|
||||
case .message:
|
||||
if let pixel = generateSingleColorImage(size: CGSize(width: 1, height: 1), color: .black) {
|
||||
innerSaveDraft(media: .image(image: pixel, dimensions: PixelDimensions(width: 1080, height: 1920)))
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -668,7 +668,7 @@ final class MediaEditorScreenComponent: Component {
|
||||
if self.component == nil {
|
||||
if let initialCaption = controller.initialCaption {
|
||||
self.inputPanelExternalState.initialText = initialCaption
|
||||
} else if case let .draft(draft, _) = controller.node.subject {
|
||||
} else if case let .draft(draft, _) = controller.node.actualSubject {
|
||||
self.inputPanelExternalState.initialText = draft.caption
|
||||
}
|
||||
}
|
||||
@ -1633,7 +1633,7 @@ final class MediaEditorScreenComponent: Component {
|
||||
mediaEditor.toggleNightTheme()
|
||||
controller.node.entitiesView.eachView { view in
|
||||
if let stickerEntityView = view as? DrawingStickerEntityView {
|
||||
stickerEntityView.toggleNightTheme()
|
||||
stickerEntityView.isNightTheme = mediaEditor.values.nightTheme
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2036,6 +2036,8 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
||||
private let initializationTimestamp = CACurrentMediaTime()
|
||||
|
||||
var subject: MediaEditorScreen.Subject?
|
||||
var actualSubject: MediaEditorScreen.Subject?
|
||||
|
||||
private var subjectDisposable: Disposable?
|
||||
private var appInForegroundDisposable: Disposable?
|
||||
|
||||
@ -2270,7 +2272,19 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
||||
}
|
||||
|
||||
private func setup(with subject: MediaEditorScreen.Subject) {
|
||||
self.subject = subject
|
||||
self.actualSubject = subject
|
||||
|
||||
var effectiveSubject = subject
|
||||
if case let .draft(draft, _ ) = subject {
|
||||
for entity in draft.values.entities {
|
||||
if case let .sticker(sticker) = entity, case let .message(ids, _, _) = sticker.content {
|
||||
effectiveSubject = .message(ids)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
self.subject = effectiveSubject
|
||||
|
||||
guard let controller = self.controller else {
|
||||
return
|
||||
}
|
||||
@ -2299,7 +2313,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
||||
controller.isSavingAvailable = isSavingAvailable
|
||||
controller.requestLayout(transition: .immediate)
|
||||
|
||||
let mediaDimensions = subject.dimensions
|
||||
let mediaDimensions = effectiveSubject.dimensions
|
||||
let maxSide: CGFloat = 1920.0 / UIScreen.main.scale
|
||||
let fittedSize = mediaDimensions.cgSize.fitted(CGSize(width: maxSide, height: maxSide))
|
||||
let mediaEntity = DrawingMediaEntity(size: fittedSize)
|
||||
@ -2354,7 +2368,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
||||
}
|
||||
}
|
||||
|
||||
let mediaEditor = MediaEditor(context: self.context, subject: subject.editorSubject, values: initialValues, hasHistogram: true)
|
||||
let mediaEditor = MediaEditor(context: self.context, subject: effectiveSubject.editorSubject, values: initialValues, hasHistogram: true)
|
||||
if let initialVideoPosition = controller.initialVideoPosition {
|
||||
mediaEditor.seek(initialVideoPosition, andPlay: true)
|
||||
}
|
||||
@ -2372,12 +2386,12 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
||||
}
|
||||
}
|
||||
|
||||
if case .message = subject {
|
||||
if case .message = effectiveSubject {
|
||||
} else {
|
||||
self.readyValue.set(.single(true))
|
||||
}
|
||||
|
||||
if case let .image(_, _, additionalImage, position) = subject, let additionalImage {
|
||||
if case let .image(_, _, additionalImage, position) = effectiveSubject, let additionalImage {
|
||||
let image = generateImage(CGSize(width: additionalImage.size.width, height: additionalImage.size.width), contextGenerator: { size, context in
|
||||
let bounds = CGRect(origin: .zero, size: size)
|
||||
context.clear(bounds)
|
||||
@ -2393,7 +2407,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
||||
imageEntity.scale = 1.625
|
||||
imageEntity.position = position.getPosition(storyDimensions)
|
||||
self.entitiesView.add(imageEntity, announce: false)
|
||||
} else if case let .video(_, _, mirror, additionalVideoPath, _, _, _, changes, position) = subject {
|
||||
} else if case let .video(_, _, mirror, additionalVideoPath, _, _, _, changes, position) = effectiveSubject {
|
||||
mediaEditor.setVideoIsMirrored(mirror)
|
||||
if let additionalVideoPath {
|
||||
let videoEntity = DrawingStickerEntity(content: .dualVideoReference(false))
|
||||
@ -2412,7 +2426,8 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if case let .message(messageIds) = subject {
|
||||
} else if case let .message(messageIds) = effectiveSubject {
|
||||
let isNightTheme = mediaEditor.values.nightTheme
|
||||
let _ = ((self.context.engine.data.get(
|
||||
EngineDataMap(messageIds.map(TelegramEngine.EngineData.Item.Messages.Message.init(id:)))
|
||||
))
|
||||
@ -2431,16 +2446,30 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
||||
|
||||
let renderer = DrawingMessageRenderer(context: self.context, messages: messages)
|
||||
renderer.render(completion: { size, dayImage, nightImage in
|
||||
let messageEntity = DrawingStickerEntity(content: .message(messageIds, maybeFile?.isVideo == true ? maybeFile : nil, size))
|
||||
messageEntity.renderImage = dayImage
|
||||
messageEntity.secondaryRenderImage = nightImage
|
||||
messageEntity.referenceDrawingSize = storyDimensions
|
||||
messageEntity.position = CGPoint(x: storyDimensions.width / 2.0, y: storyDimensions.height / 2.0)
|
||||
|
||||
let fraction = max(size.width, size.height) / 353.0
|
||||
messageEntity.scale = min(6.0, 3.3 * fraction)
|
||||
|
||||
self.entitiesView.add(messageEntity, announce: false)
|
||||
if case .draft = subject, let existingEntityView = self.entitiesView.getView(where: { entityView in
|
||||
if let stickerEntityView = entityView as? DrawingStickerEntityView, case .message = (stickerEntityView.entity as! DrawingStickerEntity).content {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}) as? DrawingStickerEntityView {
|
||||
existingEntityView.isNightTheme = isNightTheme
|
||||
let messageEntity = existingEntityView.entity as! DrawingStickerEntity
|
||||
messageEntity.renderImage = dayImage
|
||||
messageEntity.secondaryRenderImage = nightImage
|
||||
existingEntityView.update(animated: false)
|
||||
} else {
|
||||
let messageEntity = DrawingStickerEntity(content: .message(messageIds, maybeFile?.isVideo == true ? maybeFile : nil, size))
|
||||
messageEntity.renderImage = dayImage
|
||||
messageEntity.secondaryRenderImage = nightImage
|
||||
messageEntity.referenceDrawingSize = storyDimensions
|
||||
messageEntity.position = CGPoint(x: storyDimensions.width / 2.0, y: storyDimensions.height / 2.0)
|
||||
|
||||
let fraction = max(size.width, size.height) / 353.0
|
||||
messageEntity.scale = min(6.0, 3.3 * fraction)
|
||||
|
||||
self.entitiesView.add(messageEntity, announce: false)
|
||||
}
|
||||
|
||||
self.readyValue.set(.single(true))
|
||||
})
|
||||
@ -2477,7 +2506,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
||||
if controller.isEmbeddedEditor == true {
|
||||
mediaEditor.onFirstDisplay = { [weak self] in
|
||||
if let self {
|
||||
if subject.isPhoto {
|
||||
if effectiveSubject.isPhoto {
|
||||
self.previewContainerView.layer.allowsGroupOpacity = true
|
||||
self.previewContainerView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.25, completion: { _ in
|
||||
self.previewContainerView.layer.allowsGroupOpacity = false
|
||||
@ -2955,7 +2984,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if case .message = self.subject, let layout = self.validLayout {
|
||||
if case .message = self.actualSubject, let layout = self.validLayout {
|
||||
self.layer.animatePosition(from: CGPoint(x: 0.0, y: layout.size.height), to: .zero, duration: 0.4, timingFunction: kCAMediaTimingFunctionSpring, additive: true)
|
||||
completion()
|
||||
} else if let view = self.componentHost.view as? MediaEditorScreenComponent.View {
|
||||
@ -4862,7 +4891,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
||||
let presentationData = self.context.sharedContext.currentPresentationData.with { $0 }
|
||||
let title: String
|
||||
let save: String
|
||||
if case .draft = self.node.subject {
|
||||
if case .draft = self.node.actualSubject {
|
||||
title = presentationData.strings.Story_Editor_DraftDiscardDraft
|
||||
save = presentationData.strings.Story_Editor_DraftKeepDraft
|
||||
} else {
|
||||
@ -4898,7 +4927,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
||||
self.dismissAllTooltips()
|
||||
|
||||
var showDraftTooltip = saveDraft
|
||||
if let subject = self.node.subject, case .draft = subject {
|
||||
if let subject = self.node.actualSubject, case .draft = subject {
|
||||
showDraftTooltip = false
|
||||
}
|
||||
if saveDraft {
|
||||
@ -4957,7 +4986,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
||||
|
||||
private var didComplete = false
|
||||
func requestCompletion(animated: Bool) {
|
||||
guard let mediaEditor = self.node.mediaEditor, let subject = self.node.subject, !self.didComplete else {
|
||||
guard let mediaEditor = self.node.mediaEditor, let subject = self.node.subject, let actualSubject = self.node.actualSubject, !self.didComplete else {
|
||||
return
|
||||
}
|
||||
|
||||
@ -4983,14 +5012,14 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
||||
|
||||
var hasEntityChanges = false
|
||||
let randomId: Int64
|
||||
if case let .draft(_, id) = subject, let id {
|
||||
if case let .draft(_, id) = actualSubject, let id {
|
||||
randomId = id
|
||||
} else {
|
||||
randomId = Int64.random(in: .min ... .max)
|
||||
}
|
||||
|
||||
var mediaAreas: [MediaArea] = []
|
||||
if case let .draft(draft, _) = subject {
|
||||
if case let .draft(draft, _) = actualSubject {
|
||||
if draft.values.entities != codableEntities {
|
||||
hasEntityChanges = true
|
||||
}
|
||||
@ -5281,7 +5310,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
||||
}
|
||||
})
|
||||
|
||||
if case let .draft(draft, id) = subject, id == nil {
|
||||
if case let .draft(draft, id) = actualSubject, id == nil {
|
||||
removeStoryDraft(engine: self.context.engine, path: draft.path, delete: false)
|
||||
}
|
||||
} else {
|
||||
@ -5299,7 +5328,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
||||
}
|
||||
})
|
||||
})
|
||||
if case let .draft(draft, id) = subject, id == nil {
|
||||
if case let .draft(draft, id) = actualSubject, id == nil {
|
||||
removeStoryDraft(engine: self.context.engine, path: draft.path, delete: true)
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user