From fce792b02fd2bb914f00ac5da27f5affe17eed79 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 11 Apr 2024 18:00:26 +0400 Subject: [PATCH] [WIP] Stickers editor --- .../Sources/PeekControllerNode.swift | 3 +- .../Sources/DrawingReactionView.swift | 2 +- .../Sources/ReactionContextNode.swift | 1 + .../Sources/ReactionSelectionNode.swift | 17 ++++++++++ .../CameraScreen/Sources/CameraScreen.swift | 4 ++- .../Sources/EmojiPagerContentSignals.swift | 2 +- .../Sources/ImageObjectClassification.swift | 31 +------------------ .../Sources/MediaEditorScreen.swift | 6 ++++ 8 files changed, 32 insertions(+), 34 deletions(-) diff --git a/submodules/ContextUI/Sources/PeekControllerNode.swift b/submodules/ContextUI/Sources/PeekControllerNode.swift index 66de8be0c8..201e0a91ce 100644 --- a/submodules/ContextUI/Sources/PeekControllerNode.swift +++ b/submodules/ContextUI/Sources/PeekControllerNode.swift @@ -134,8 +134,9 @@ final class PeekControllerNode: ViewControllerTracingNode { self.addSubnode(self.darkDimNode) self.containerNode.addSubnode(self.contentNode) - self.addSubnode(self.containerNode) self.addSubnode(self.actionsStackNode) + self.addSubnode(self.containerNode) + if let fullScreenAccessoryNode = self.fullScreenAccessoryNode { self.fullScreenAccessoryNode?.dismiss = { [weak self] in diff --git a/submodules/DrawingUI/Sources/DrawingReactionView.swift b/submodules/DrawingUI/Sources/DrawingReactionView.swift index 8ecbabc19d..0396953a96 100644 --- a/submodules/DrawingUI/Sources/DrawingReactionView.swift +++ b/submodules/DrawingUI/Sources/DrawingReactionView.swift @@ -110,7 +110,7 @@ public class DrawingReactionEntityView: DrawingStickerEntityView { private weak var reactionContextNode: ReactionContextNode? fileprivate func presentReactionSelection() { - guard let containerView = self.containerView, let superview = containerView.superview?.superview?.superview?.superview, self.reactionContextNode == nil else { + guard let containerView = self.containerView, let superview = containerView.superview?.superview?.superview?.superview?.superview?.superview, self.reactionContextNode == nil else { return } diff --git a/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift b/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift index 33b3547781..99fdb21828 100644 --- a/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift +++ b/submodules/ReactionSelectionNode/Sources/ReactionContextNode.swift @@ -2144,6 +2144,7 @@ public final class ReactionContextNode: ASDisplayNode, ASScrollViewDelegate { itemDelay = mainCircleDelay + Double(i) * 0.06 } + itemNode.willAppear(animated: true) DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + itemDelay * UIView.animationDurationFactor(), execute: { [weak itemNode] in guard let itemNode = itemNode else { return diff --git a/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift b/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift index 852a0caf1c..044584d3b4 100644 --- a/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift +++ b/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift @@ -47,6 +47,7 @@ protocol ReactionItemNode: ASDisplayNode { var maskNode: ASDisplayNode? { get } + func willAppear(animated: Bool) func appear(animated: Bool) func updateLayout(size: CGSize, isExpanded: Bool, largeExpanded: Bool, isPreviewing: Bool, transition: ContainedViewLayoutTransition) } @@ -181,6 +182,10 @@ public final class ReactionNode: ASDisplayNode, ReactionItemNode { return nil } + func willAppear(animated: Bool) { + + } + func appear(animated: Bool) { if animated { if self.item.isCustom { @@ -556,6 +561,10 @@ final class PremiumReactionsNode: ASDisplayNode, ReactionItemNode { self.starsNode = starsNode } + func willAppear(animated: Bool) { + + } + func appear(animated: Bool) { if animated { let delay: Double = 0.1 @@ -624,6 +633,13 @@ final class EmojiItemNode: ASDisplayNode, ReactionItemNode { self.addSubnode(self.imageNode) } + func willAppear(animated: Bool) { + if animated { + let initialScale: CGFloat = 0.25 + self.imageNode.transform = CATransform3DMakeScale(initialScale, initialScale, 1.0) + } + } + func appear(animated: Bool) { if animated { let delay: Double = 0.1 @@ -631,6 +647,7 @@ final class EmojiItemNode: ASDisplayNode, ReactionItemNode { let damping: CGFloat = 60.0 let initialScale: CGFloat = 0.25 + self.imageNode.transform = CATransform3DIdentity self.imageNode.layer.animateSpring(from: initialScale as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: duration, delay: delay, damping: damping) self.selectionView?.layer.animateAlpha(from: 0.0, to: self.selectionView?.alpha ?? 1.0, duration: 0.2) diff --git a/submodules/TelegramUI/Components/CameraScreen/Sources/CameraScreen.swift b/submodules/TelegramUI/Components/CameraScreen/Sources/CameraScreen.swift index 3aa9509d4f..cebce222c0 100644 --- a/submodules/TelegramUI/Components/CameraScreen/Sources/CameraScreen.swift +++ b/submodules/TelegramUI/Components/CameraScreen/Sources/CameraScreen.swift @@ -2815,7 +2815,9 @@ public class CameraScreen: ViewController { self.requestAudioSession() - self.postingAvailabilityPromise.set(self.context.engine.messages.checkStoriesUploadAvailability(target: .myStories)) + if case .story = mode { + self.postingAvailabilityPromise.set(self.context.engine.messages.checkStoriesUploadAvailability(target: .myStories)) + } } required public init(coder: NSCoder) { diff --git a/submodules/TelegramUI/Components/EntityKeyboard/Sources/EmojiPagerContentSignals.swift b/submodules/TelegramUI/Components/EntityKeyboard/Sources/EmojiPagerContentSignals.swift index 68aaa85996..e7208d01ca 100644 --- a/submodules/TelegramUI/Components/EntityKeyboard/Sources/EmojiPagerContentSignals.swift +++ b/submodules/TelegramUI/Components/EntityKeyboard/Sources/EmojiPagerContentSignals.swift @@ -1190,7 +1190,7 @@ public extension EmojiPagerContentComponent { } } - let hasRecentEmoji = ![.reaction(onlyTop: true), .reaction(onlyTop: false), .quickReaction, .status, .profilePhoto, .groupPhoto, .topicIcon, .backgroundIcon, .reactionList, .messageTag].contains(subject) + let hasRecentEmoji = ![.reaction(onlyTop: true), .reaction(onlyTop: false), .quickReaction, .status, .profilePhoto, .groupPhoto, .topicIcon, .backgroundIcon, .reactionList, .messageTag, .stickerAlt].contains(subject) if let recentEmoji = recentEmoji, hasRecentEmoji { for item in recentEmoji.items { diff --git a/submodules/TelegramUI/Components/MediaEditor/Sources/ImageObjectClassification.swift b/submodules/TelegramUI/Components/MediaEditor/Sources/ImageObjectClassification.swift index 7ec65a5033..a62e58af27 100644 --- a/submodules/TelegramUI/Components/MediaEditor/Sources/ImageObjectClassification.swift +++ b/submodules/TelegramUI/Components/MediaEditor/Sources/ImageObjectClassification.swift @@ -51,8 +51,6 @@ public func emojiForClasses(_ classes: [String]) -> [String] { "accordion": "๐Ÿช—", "acorn": "๐ŸŒฐ", "acrobat": "๐Ÿคธ", - "adult": "๐Ÿง‘", - "adult_cat": "๐Ÿˆ", "agriculture": "๐ŸŒพ", "aircraft": "โœˆ๏ธ", "airplane": "โœˆ๏ธ", @@ -237,7 +235,6 @@ public func emojiForClasses(_ classes: [String]) -> [String] { "canyon": "๐Ÿž๏ธ", "caprese": "๐Ÿฅ—", "car": "๐Ÿš—", - "car_seat": "๐Ÿš—", "caramel": "๐Ÿฌ", "cardboard_box": "๐Ÿ“ฆ", "carnation": "๐ŸŒบ", @@ -311,9 +308,7 @@ public func emojiForClasses(_ classes: [String]) -> [String] { "clock": "โฐ", "clock_tower": "๐Ÿ•ฐ๏ธ", "closet": "๐Ÿšช", - "clothesline": "๐Ÿ‘š", "clothespin": "๐Ÿ“Œ", - "clothing": "๐Ÿ‘•", "cloudy": "โ˜๏ธ", "clover": "๐Ÿ€", "clown": "๐Ÿคก", @@ -336,13 +331,10 @@ public func emojiForClasses(_ classes: [String]) -> [String] { "conch": "๐Ÿš", "condiment": "๐Ÿง‚", "conference": "๐Ÿข", - "consumer_electronics": "๐Ÿ“ฑ", "container": "๐Ÿ“ฆ", - "convertible": "๐Ÿš—", "cookie": "๐Ÿช", "cookware": "๐Ÿณ", "coral_reef": "๐Ÿ ", - "cord": "๐Ÿ”Œ", "corgi": "๐Ÿ•", "corkscrew": "๐Ÿพ", "corn": "๐ŸŒฝ", @@ -460,7 +452,6 @@ public func emojiForClasses(_ classes: [String]) -> [String] { "falafel": "๐Ÿง†", "farm": "๐Ÿšœ", "fedora": "๐ŸŽฉ", - "feline": "๐Ÿฑ", "fencing_sport": "๐Ÿคบ", "ferns": "๐ŸŒฟ", "ferret": "๐Ÿพ", @@ -508,9 +499,7 @@ public func emojiForClasses(_ classes: [String]) -> [String] { "frog": "๐Ÿธ", "frozen": "โ„๏ธ", "frozen_dessert": "๐Ÿจ", - "fruit": "๐Ÿ‰", "fruitcake": "๐Ÿฐ", - "furniture": "๐Ÿ›‹๏ธ", "gamepad": "๐ŸŽฎ", "games": "๐Ÿ•น๏ธ", "garage": "๐Ÿš—", @@ -718,7 +707,6 @@ public func emojiForClasses(_ classes: [String]) -> [String] { "lychee": "๐Ÿˆ", "lynx": "๐Ÿˆ", "macadamia": "๐ŸŒฐ", - "machine": "๐Ÿญ", "mackerel": "๐ŸŸ", "magazine": "๐Ÿ“ฐ", "mailbox": "๐Ÿ“ซ", @@ -743,13 +731,11 @@ public func emojiForClasses(_ classes: [String]) -> [String] { "mast": "โ›ต", "mastiff": "๐Ÿ•", "matches": "๐Ÿ”ฅ", - "material": "๐Ÿงต", "matzo": "๐Ÿช", "measuring_tape": "๐Ÿ“", "meat": "๐Ÿ–", "meatball": "๐Ÿ", "medal": "๐Ÿ…", - "media": "๐Ÿ“บ", "medicine": "๐Ÿ’Š", "megalith": "๐Ÿชจ", "megaphone": "๐Ÿ“ฃ", @@ -768,7 +754,6 @@ public func emojiForClasses(_ classes: [String]) -> [String] { "money": "๐Ÿ’ต", "monitor_lizard": "๐ŸฆŽ", "monorail": "๐Ÿš", - "monument": "๐Ÿ›๏ธ", "moon": "๐ŸŒ•", "moose": "๐ŸฆŒ", "mop": "๐Ÿงน", @@ -785,7 +770,6 @@ public func emojiForClasses(_ classes: [String]) -> [String] { "mug": "โ˜•", "museum": "๐Ÿ›๏ธ", "mushroom": "๐Ÿ„", - "music": "๐ŸŽต", "musical_instrument": "๐ŸŽธ", "mussel": "๐Ÿš", "mustard": "๐ŸŒญ", @@ -795,7 +779,6 @@ public func emojiForClasses(_ classes: [String]) -> [String] { "necktie": "๐Ÿ‘”", "nectarine": "๐Ÿ‘", "nest": "๐Ÿฆ", - "newfoundland": "๐Ÿ•", "newspaper": "๐Ÿ“ฐ", "night_sky": "๐ŸŒŒ", "nightclub": "๐ŸŽค", @@ -805,7 +788,6 @@ public func emojiForClasses(_ classes: [String]) -> [String] { "oatmeal": "๐Ÿฅฃ", "obelisk": "๐Ÿ—ฟ", "ocean": "๐ŸŒŠ", - "office_supplies": "๐Ÿ–‡๏ธ", "omelet": "๐Ÿณ", "onion": "๐Ÿง…", "optical_equipment": "๐Ÿ”ญ", @@ -817,7 +799,6 @@ public func emojiForClasses(_ classes: [String]) -> [String] { "origami": "๐Ÿ”–", "ostrich": "๐Ÿฆข", "otter": "๐Ÿฆฆ", - "outdoor": "๐ŸŒฒ", "oven": "๐Ÿณ", "owl": "๐Ÿฆ‰", "oyster": "๐Ÿฆช", @@ -875,7 +856,6 @@ public func emojiForClasses(_ classes: [String]) -> [String] { "pillow": "๐Ÿ›Œ", "pineapple": "๐Ÿ", "ping_pong": "๐Ÿ“", - "pipe": "๐Ÿšฌ", "pistachio": "๐Ÿฅœ", "pita": "๐Ÿฅ™", "pitbull": "๐Ÿ•", @@ -884,14 +864,12 @@ public func emojiForClasses(_ classes: [String]) -> [String] { "plate": "๐Ÿฝ๏ธ", "play_card": "๐Ÿƒ", "playground": "๐ŸŽ ", - "pliers": "๐Ÿ”ง", "plum": "๐Ÿ‘", "podium": "๐Ÿ†", "poinsettia": "๐ŸŒบ", "poker": "๐Ÿƒ", "pole": "๐Ÿšฉ", "police_car": "๐Ÿš“", - "polka_dots": "๐Ÿ”˜", "poncho": "๐Ÿงฅ", "pool": "๐ŸŠ", "popcorn": "๐Ÿฟ", @@ -911,14 +889,12 @@ public func emojiForClasses(_ classes: [String]) -> [String] { "pyramid": "๐Ÿ”บ", "rabbit": "๐Ÿฐ", "raccoon": "๐Ÿฆ", - "radish": "๐Ÿ†", "rainbow": "๐ŸŒˆ", "rake": "๐Ÿ‚", "raspberry": "๐Ÿ‡", "rat": "๐Ÿ€", "raven": "๐Ÿฆ…", "record": "๐Ÿ’ฟ", - "refrigerator": "๐ŸงŠ", "rhinoceros": "๐Ÿฆ", "rice": "๐Ÿš", "river": "๐ŸŒŠ", @@ -995,20 +971,16 @@ public func emojiForClasses(_ classes: [String]) -> [String] { "sprinkler": "๐Ÿ’ฆ", "squirrel": "๐Ÿฟ๏ธ", "stadium": "๐ŸŸ๏ธ", - "stained_glass": "๐Ÿ–ผ๏ธ", "starfish": "๐ŸŒŸ", "statue": "๐Ÿ—ฟ", "steak": "๐Ÿฅฉ", "stethoscope": "๐Ÿฉบ", - "stingray": "๐ŸŸ", - "stool": "๐Ÿ’บ", "stove": "๐Ÿ”ฅ", "straw_drinking": "๐Ÿฅค", "street": "๐Ÿ›ฃ๏ธ", "streetcar": "๐Ÿš‹", "string_instrument": "๐ŸŽป", "stroller": "๐Ÿ‘ถ", - "structure": "๐Ÿ—๏ธ", "suit": "๐Ÿ‘”", "suitcase": "๐Ÿงณ", "sun": "โ˜€๏ธ", @@ -1028,12 +1000,11 @@ public func emojiForClasses(_ classes: [String]) -> [String] { "television": "๐Ÿ“บ", "tennis": "๐ŸŽพ", "tent": "โ›บ", - "terrier": "๐Ÿ•", "theater": "๐ŸŽญ", "thermometer": "๐ŸŒก๏ธ", "tiara": "๐Ÿ‘‘", "ticket": "๐ŸŽซ", - "tiger": "๐Ÿ…", + "tiger": "๐Ÿฏ", "tire": "๐Ÿš—", "toad": "๐Ÿธ", "toaster": "๐Ÿž", diff --git a/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift b/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift index 6f5fb0535a..769ffe2aef 100644 --- a/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift +++ b/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift @@ -3396,6 +3396,12 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate } return true } else { + let location = gestureRecognizer.location(in: self.view) + if let reactionNode = self.view.subviews.last?.asyncdisplaykit_node as? ReactionContextNode { + if let hitTestResult = self.view.hitTest(location, with: nil), hitTestResult.isDescendant(of: reactionNode.view) { + return false + } + } return true } }