mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-11-07 09:20:08 +00:00
Various fixes
This commit is contained in:
parent
e33b789f40
commit
ca1dc72e57
@ -7,6 +7,7 @@ public final class Button: Component {
|
|||||||
public let tag: AnyObject?
|
public let tag: AnyObject?
|
||||||
public let automaticHighlight: Bool
|
public let automaticHighlight: Bool
|
||||||
public let isEnabled: Bool
|
public let isEnabled: Bool
|
||||||
|
public let isExclusive: Bool
|
||||||
public let action: () -> Void
|
public let action: () -> Void
|
||||||
public let holdAction: (() -> Void)?
|
public let holdAction: (() -> Void)?
|
||||||
public let highlightedAction: ActionSlot<Bool>?
|
public let highlightedAction: ActionSlot<Bool>?
|
||||||
@ -36,6 +37,7 @@ public final class Button: Component {
|
|||||||
tag: AnyObject? = nil,
|
tag: AnyObject? = nil,
|
||||||
automaticHighlight: Bool = true,
|
automaticHighlight: Bool = true,
|
||||||
isEnabled: Bool = true,
|
isEnabled: Bool = true,
|
||||||
|
isExclusive: Bool = true,
|
||||||
action: @escaping () -> Void,
|
action: @escaping () -> Void,
|
||||||
holdAction: (() -> Void)?,
|
holdAction: (() -> Void)?,
|
||||||
highlightedAction: ActionSlot<Bool>?
|
highlightedAction: ActionSlot<Bool>?
|
||||||
@ -45,6 +47,7 @@ public final class Button: Component {
|
|||||||
self.tag = tag
|
self.tag = tag
|
||||||
self.automaticHighlight = automaticHighlight
|
self.automaticHighlight = automaticHighlight
|
||||||
self.isEnabled = isEnabled
|
self.isEnabled = isEnabled
|
||||||
|
self.isExclusive = isExclusive
|
||||||
self.action = action
|
self.action = action
|
||||||
self.holdAction = holdAction
|
self.holdAction = holdAction
|
||||||
self.highlightedAction = highlightedAction
|
self.highlightedAction = highlightedAction
|
||||||
@ -57,12 +60,28 @@ public final class Button: Component {
|
|||||||
tag: self.tag,
|
tag: self.tag,
|
||||||
automaticHighlight: self.automaticHighlight,
|
automaticHighlight: self.automaticHighlight,
|
||||||
isEnabled: self.isEnabled,
|
isEnabled: self.isEnabled,
|
||||||
|
isExclusive: self.isExclusive,
|
||||||
action: self.action,
|
action: self.action,
|
||||||
holdAction: self.holdAction,
|
holdAction: self.holdAction,
|
||||||
highlightedAction: self.highlightedAction
|
highlightedAction: self.highlightedAction
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func withIsExclusive(_ isExclusive: Bool) -> Button {
|
||||||
|
return Button(
|
||||||
|
content: self.content,
|
||||||
|
minSize: self.minSize,
|
||||||
|
tag: self.tag,
|
||||||
|
automaticHighlight: self.automaticHighlight,
|
||||||
|
isEnabled: self.isEnabled,
|
||||||
|
isExclusive: isExclusive,
|
||||||
|
action: self.action,
|
||||||
|
holdAction: self.holdAction,
|
||||||
|
highlightedAction: self.highlightedAction
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public func withHoldAction(_ holdAction: (() -> Void)?) -> Button {
|
public func withHoldAction(_ holdAction: (() -> Void)?) -> Button {
|
||||||
return Button(
|
return Button(
|
||||||
content: self.content,
|
content: self.content,
|
||||||
@ -70,6 +89,7 @@ public final class Button: Component {
|
|||||||
tag: self.tag,
|
tag: self.tag,
|
||||||
automaticHighlight: self.automaticHighlight,
|
automaticHighlight: self.automaticHighlight,
|
||||||
isEnabled: self.isEnabled,
|
isEnabled: self.isEnabled,
|
||||||
|
isExclusive: self.isExclusive,
|
||||||
action: self.action,
|
action: self.action,
|
||||||
holdAction: holdAction,
|
holdAction: holdAction,
|
||||||
highlightedAction: self.highlightedAction
|
highlightedAction: self.highlightedAction
|
||||||
@ -83,6 +103,7 @@ public final class Button: Component {
|
|||||||
tag: tag,
|
tag: tag,
|
||||||
automaticHighlight: self.automaticHighlight,
|
automaticHighlight: self.automaticHighlight,
|
||||||
isEnabled: self.isEnabled,
|
isEnabled: self.isEnabled,
|
||||||
|
isExclusive: self.isExclusive,
|
||||||
action: self.action,
|
action: self.action,
|
||||||
holdAction: self.holdAction,
|
holdAction: self.holdAction,
|
||||||
highlightedAction: self.highlightedAction
|
highlightedAction: self.highlightedAction
|
||||||
@ -105,6 +126,9 @@ public final class Button: Component {
|
|||||||
if lhs.isEnabled != rhs.isEnabled {
|
if lhs.isEnabled != rhs.isEnabled {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
if lhs.isExclusive != rhs.isExclusive {
|
||||||
|
return false
|
||||||
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,8 +181,6 @@ public final class Button: Component {
|
|||||||
|
|
||||||
super.init(frame: frame)
|
super.init(frame: frame)
|
||||||
|
|
||||||
self.isExclusiveTouch = true
|
|
||||||
|
|
||||||
self.addSubview(self.contentView)
|
self.addSubview(self.contentView)
|
||||||
|
|
||||||
self.addTarget(self, action: #selector(self.pressed), for: .touchUpInside)
|
self.addTarget(self, action: #selector(self.pressed), for: .touchUpInside)
|
||||||
@ -267,6 +289,7 @@ public final class Button: Component {
|
|||||||
|
|
||||||
self.updateAlpha(transition: transition)
|
self.updateAlpha(transition: transition)
|
||||||
self.isEnabled = component.isEnabled
|
self.isEnabled = component.isEnabled
|
||||||
|
self.isExclusiveTouch = component.isExclusive
|
||||||
|
|
||||||
transition.setFrame(view: self.contentView, frame: CGRect(origin: CGPoint(x: floor((size.width - contentSize.width) / 2.0), y: floor((size.height - contentSize.height) / 2.0)), size: contentSize), completion: nil)
|
transition.setFrame(view: self.contentView, frame: CGRect(origin: CGPoint(x: floor((size.width - contentSize.width) / 2.0), y: floor((size.height - contentSize.height) / 2.0)), size: contentSize), completion: nil)
|
||||||
|
|
||||||
|
|||||||
@ -14,6 +14,49 @@ import UniversalMediaPlayer
|
|||||||
import TelegramPresentationData
|
import TelegramPresentationData
|
||||||
import TelegramUniversalVideoContent
|
import TelegramUniversalVideoContent
|
||||||
|
|
||||||
|
private class BlurView: UIVisualEffectView {
|
||||||
|
private func setup() {
|
||||||
|
for subview in self.subviews {
|
||||||
|
if subview.description.contains("VisualEffectSubview") {
|
||||||
|
subview.isHidden = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let sublayer = self.layer.sublayers?[0], let filters = sublayer.filters {
|
||||||
|
sublayer.backgroundColor = nil
|
||||||
|
sublayer.isOpaque = false
|
||||||
|
let allowedKeys: [String] = [
|
||||||
|
"gaussianBlur"
|
||||||
|
]
|
||||||
|
sublayer.filters = filters.filter { filter in
|
||||||
|
guard let filter = filter as? NSObject else {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
let filterName = String(describing: filter)
|
||||||
|
if !allowedKeys.contains(filterName) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override var effect: UIVisualEffect? {
|
||||||
|
get {
|
||||||
|
return super.effect
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
super.effect = newValue
|
||||||
|
self.setup()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override func didAddSubview(_ subview: UIView) {
|
||||||
|
super.didAddSubview(subview)
|
||||||
|
self.setup()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class DrawingStickerEntityView: DrawingEntityView {
|
public class DrawingStickerEntityView: DrawingEntityView {
|
||||||
var stickerEntity: DrawingStickerEntity {
|
var stickerEntity: DrawingStickerEntity {
|
||||||
return self.entity as! DrawingStickerEntity
|
return self.entity as! DrawingStickerEntity
|
||||||
@ -342,15 +385,59 @@ public class DrawingStickerEntityView: DrawingEntityView {
|
|||||||
guard let cameraPreviewView = self.cameraPreviewView else {
|
guard let cameraPreviewView = self.cameraPreviewView else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
Queue.mainQueue().after(0.5, {
|
Queue.mainQueue().after(0.3, {
|
||||||
self.cameraPreviewView = nil
|
self.cameraPreviewView = nil
|
||||||
|
cameraPreviewView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { _ in
|
||||||
cameraPreviewView.removeFromSuperview()
|
cameraPreviewView.removeFromSuperview()
|
||||||
})
|
})
|
||||||
|
})
|
||||||
self.progressLayer.removeFromSuperlayer()
|
self.progressLayer.removeFromSuperlayer()
|
||||||
self.progressLayer.path = nil
|
self.progressLayer.path = nil
|
||||||
self.progressDisposable.set(nil)
|
self.progressDisposable.set(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var cameraBlurView: BlurView?
|
||||||
|
private var cameraSnapshotView: UIView?
|
||||||
|
public func beginCameraSwitch() {
|
||||||
|
guard let cameraPreviewView = self.cameraPreviewView, self.cameraBlurView == nil else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if let snapshot = cameraPreviewView.snapshotView(afterScreenUpdates: false) {
|
||||||
|
self.cameraSnapshotView = snapshot
|
||||||
|
self.addSubview(snapshot)
|
||||||
|
}
|
||||||
|
|
||||||
|
let blurView = BlurView(effect: nil)
|
||||||
|
blurView.clipsToBounds = true
|
||||||
|
blurView.frame = self.bounds
|
||||||
|
blurView.layer.cornerRadius = self.bounds.width / 2.0
|
||||||
|
self.addSubview(blurView)
|
||||||
|
UIView.transition(with: self, duration: 0.4, options: [.transitionFlipFromLeft, .curveEaseOut], animations: {
|
||||||
|
blurView.effect = UIBlurEffect(style: .dark)
|
||||||
|
})
|
||||||
|
self.cameraBlurView = blurView
|
||||||
|
}
|
||||||
|
|
||||||
|
public func commitCameraSwitch() {
|
||||||
|
if let cameraBlurView = self.cameraBlurView {
|
||||||
|
self.cameraBlurView = nil
|
||||||
|
UIView.animate(withDuration: 0.4, animations: {
|
||||||
|
cameraBlurView.effect = nil
|
||||||
|
}, completion: { _ in
|
||||||
|
cameraBlurView.removeFromSuperview()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if let cameraSnapshotView = self.cameraSnapshotView {
|
||||||
|
self.cameraSnapshotView = nil
|
||||||
|
UIView.animate(withDuration: 0.25, animations: {
|
||||||
|
cameraSnapshotView.alpha = 0.0
|
||||||
|
}, completion: { _ in
|
||||||
|
cameraSnapshotView.removeFromSuperview()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private var didApplyVisibility = false
|
private var didApplyVisibility = false
|
||||||
public override func layoutSubviews() {
|
public override func layoutSubviews() {
|
||||||
super.layoutSubviews()
|
super.layoutSubviews()
|
||||||
|
|||||||
@ -14,11 +14,14 @@ public final class EntityVideoRecorder {
|
|||||||
private let camera: Camera
|
private let camera: Camera
|
||||||
private let previewView: CameraSimplePreviewView
|
private let previewView: CameraSimplePreviewView
|
||||||
private let entity: DrawingStickerEntity
|
private let entity: DrawingStickerEntity
|
||||||
|
private weak var entityView: DrawingStickerEntityView?
|
||||||
|
|
||||||
private var recordingDisposable = MetaDisposable()
|
private var recordingDisposable = MetaDisposable()
|
||||||
private let durationPromise = ValuePromise<Double>()
|
private let durationPromise = ValuePromise<Double>()
|
||||||
private let micLevelPromise = Promise<Float>()
|
private let micLevelPromise = Promise<Float>()
|
||||||
|
|
||||||
|
private var changingPositionDisposable: Disposable?
|
||||||
|
|
||||||
public var duration: Signal<Double, NoError> {
|
public var duration: Signal<Double, NoError> {
|
||||||
return self.durationPromise.get()
|
return self.durationPromise.get()
|
||||||
}
|
}
|
||||||
@ -79,10 +82,23 @@ public final class EntityVideoRecorder {
|
|||||||
let start = mediaEditor.values.videoTrimRange?.lowerBound ?? 0.0
|
let start = mediaEditor.values.videoTrimRange?.lowerBound ?? 0.0
|
||||||
mediaEditor.stop()
|
mediaEditor.stop()
|
||||||
mediaEditor.seek(start, andPlay: false)
|
mediaEditor.seek(start, andPlay: false)
|
||||||
|
|
||||||
|
self.changingPositionDisposable = (camera.modeChange
|
||||||
|
|> deliverOnMainQueue).start(next: { [weak self] modeChange in
|
||||||
|
guard let self else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if case .position = modeChange {
|
||||||
|
self.entityView?.beginCameraSwitch()
|
||||||
|
} else {
|
||||||
|
self.entityView?.commitCameraSwitch()
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
self.recordingDisposable.dispose()
|
self.recordingDisposable.dispose()
|
||||||
|
self.changingPositionDisposable?.dispose()
|
||||||
}
|
}
|
||||||
|
|
||||||
public func setup(
|
public func setup(
|
||||||
@ -105,6 +121,8 @@ public final class EntityVideoRecorder {
|
|||||||
)
|
)
|
||||||
self.previewView.resetPlaceholder(front: true)
|
self.previewView.resetPlaceholder(front: true)
|
||||||
entityView.animateInsertion()
|
entityView.animateInsertion()
|
||||||
|
|
||||||
|
self.entityView = entityView
|
||||||
}
|
}
|
||||||
|
|
||||||
self.entitiesView?.selectEntity(nil)
|
self.entitiesView?.selectEntity(nil)
|
||||||
@ -160,7 +178,9 @@ public final class EntityVideoRecorder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let entityView = entitiesView.getView(for: self.entity.uuid) as? DrawingStickerEntityView {
|
if let entityView = entitiesView.getView(for: self.entity.uuid) as? DrawingStickerEntityView {
|
||||||
entityView.invalidateCameraPreviewView()
|
mediaEditor.onFirstAdditionalDisplay = { [weak entityView] in
|
||||||
|
entityView?.invalidateCameraPreviewView()
|
||||||
|
}
|
||||||
|
|
||||||
let entity = self.entity
|
let entity = self.entity
|
||||||
let update = { [weak mediaEditor, weak entity] in
|
let update = { [weak mediaEditor, weak entity] in
|
||||||
|
|||||||
@ -166,17 +166,36 @@ private enum StatsEntry: ItemListNodeEntry {
|
|||||||
}, sectionId: self.section, style: .blocks)
|
}, sectionId: self.section, style: .blocks)
|
||||||
case let .publicForward(_, _, _, _, message):
|
case let .publicForward(_, _, _, _, message):
|
||||||
var views: Int32 = 0
|
var views: Int32 = 0
|
||||||
|
var forwards: Int32 = 0
|
||||||
|
var reactions: Int32 = 0
|
||||||
for attribute in message.attributes {
|
for attribute in message.attributes {
|
||||||
if let viewsAttribute = attribute as? ViewCountMessageAttribute {
|
if let viewsAttribute = attribute as? ViewCountMessageAttribute {
|
||||||
views = Int32(viewsAttribute.count)
|
views = Int32(viewsAttribute.count)
|
||||||
break
|
} else if let forwardsAttribute = attribute as? ForwardCountMessageAttribute {
|
||||||
|
forwards = Int32(forwardsAttribute.count)
|
||||||
|
} else if let reactionsAttribute = attribute as? ReactionsMessageAttribute {
|
||||||
|
reactions = reactionsAttribute.reactions.reduce(0, { partialResult, reaction in
|
||||||
|
return partialResult + reaction.count
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
let peer = message.peers[message.id.peerId]!
|
||||||
let text: String = presentationData.strings.Stats_MessageViews(views)
|
return StatsMessageItem(context: arguments.context, presentationData: presentationData, peer: peer, item: .message(message._asMessage()), views: views, reactions: reactions, forwards: forwards, isPeer: true, sectionId: self.section, style: .blocks, action: {
|
||||||
return ItemListPeerItem(presentationData: presentationData, dateTimeFormat: PresentationDateTimeFormat(), nameDisplayOrder: .firstLast, context: arguments.context, peer: EnginePeer(message.peers[message.id.peerId]!), height: .generic, aliasHandling: .standard, nameColor: .primary, nameStyle: .plain, presence: nil, text: .text(text, .secondary), label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: nil), revealOptions: nil, switchValue: nil, enabled: true, highlighted: false, selectable: true, sectionId: self.section, action: {
|
|
||||||
arguments.openMessage(message.id)
|
arguments.openMessage(message.id)
|
||||||
}, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, toggleUpdated: nil, contextAction: nil)
|
}, openStory: { _ in }, contextAction: nil)
|
||||||
|
// var views: Int32 = 0
|
||||||
|
// for attribute in message.attributes {
|
||||||
|
// if let viewsAttribute = attribute as? ViewCountMessageAttribute {
|
||||||
|
// views = Int32(viewsAttribute.count)
|
||||||
|
// break
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// let text: String = presentationData.strings.Stats_MessageViews(views)
|
||||||
|
// return ItemListPeerItem(presentationData: presentationData, dateTimeFormat: PresentationDateTimeFormat(), nameDisplayOrder: .firstLast, context: arguments.context, peer: EnginePeer(message.peers[message.id.peerId]!), height: .generic, aliasHandling: .standard, nameColor: .primary, nameStyle: .plain, presence: nil, text: .text(text, .secondary), label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: nil), revealOptions: nil, switchValue: nil, enabled: true, highlighted: false, selectable: true, sectionId: self.section, action: {
|
||||||
|
// arguments.openMessage(message.id)
|
||||||
|
// }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, toggleUpdated: nil, contextAction: nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,13 +22,14 @@ public class StatsMessageItem: ListViewItem, ItemListItem {
|
|||||||
let views: Int32
|
let views: Int32
|
||||||
let reactions: Int32
|
let reactions: Int32
|
||||||
let forwards: Int32
|
let forwards: Int32
|
||||||
|
let isPeer: Bool
|
||||||
public let sectionId: ItemListSectionId
|
public let sectionId: ItemListSectionId
|
||||||
let style: ItemListStyle
|
let style: ItemListStyle
|
||||||
let action: (() -> Void)?
|
let action: (() -> Void)?
|
||||||
let openStory: (UIView) -> Void
|
let openStory: (UIView) -> Void
|
||||||
let contextAction: ((ASDisplayNode, ContextGesture?) -> Void)?
|
let contextAction: ((ASDisplayNode, ContextGesture?) -> Void)?
|
||||||
|
|
||||||
init(context: AccountContext, presentationData: ItemListPresentationData, peer: Peer, item: StatsPostItem, views: Int32, reactions: Int32, forwards: Int32, sectionId: ItemListSectionId, style: ItemListStyle, action: (() -> Void)?, openStory: @escaping (UIView) -> Void, contextAction: ((ASDisplayNode, ContextGesture?) -> Void)?) {
|
init(context: AccountContext, presentationData: ItemListPresentationData, peer: Peer, item: StatsPostItem, views: Int32, reactions: Int32, forwards: Int32, isPeer: Bool = false, sectionId: ItemListSectionId, style: ItemListStyle, action: (() -> Void)?, openStory: @escaping (UIView) -> Void, contextAction: ((ASDisplayNode, ContextGesture?) -> Void)?) {
|
||||||
self.context = context
|
self.context = context
|
||||||
self.presentationData = presentationData
|
self.presentationData = presentationData
|
||||||
self.peer = peer
|
self.peer = peer
|
||||||
@ -36,6 +37,7 @@ public class StatsMessageItem: ListViewItem, ItemListItem {
|
|||||||
self.views = views
|
self.views = views
|
||||||
self.reactions = reactions
|
self.reactions = reactions
|
||||||
self.forwards = forwards
|
self.forwards = forwards
|
||||||
|
self.isPeer = isPeer
|
||||||
self.sectionId = sectionId
|
self.sectionId = sectionId
|
||||||
self.style = style
|
self.style = style
|
||||||
self.action = action
|
self.action = action
|
||||||
|
|||||||
@ -261,6 +261,7 @@ public final class MediaEditor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public var onFirstDisplay: () -> Void = {}
|
public var onFirstDisplay: () -> Void = {}
|
||||||
|
public var onFirstAdditionalDisplay: () -> Void = {}
|
||||||
|
|
||||||
public func playerState(framesCount: Int) -> Signal<MediaEditorPlayerState?, NoError> {
|
public func playerState(framesCount: Int) -> Signal<MediaEditorPlayerState?, NoError> {
|
||||||
func artistAndTitleForTrack(_ audioTrack: MediaAudioTrack) -> (artist: String?, title: String?) {
|
func artistAndTitleForTrack(_ audioTrack: MediaAudioTrack) -> (artist: String?, title: String?) {
|
||||||
@ -713,6 +714,10 @@ public final class MediaEditor {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func setOnNextAdditionalDisplay(_ f: @escaping () -> Void) {
|
||||||
|
self.renderer.onNextAdditionalRender = f
|
||||||
|
}
|
||||||
|
|
||||||
private func setupTimeObservers() {
|
private func setupTimeObservers() {
|
||||||
var observedPlayer = self.player
|
var observedPlayer = self.player
|
||||||
if observedPlayer == nil {
|
if observedPlayer == nil {
|
||||||
|
|||||||
@ -106,6 +106,7 @@ final class MediaEditorRenderer {
|
|||||||
var needsDisplay = false
|
var needsDisplay = false
|
||||||
|
|
||||||
var onNextRender: (() -> Void)?
|
var onNextRender: (() -> Void)?
|
||||||
|
var onNextAdditionalRender: (() -> Void)?
|
||||||
|
|
||||||
public init() {
|
public init() {
|
||||||
|
|
||||||
@ -277,6 +278,15 @@ final class MediaEditorRenderer {
|
|||||||
onNextRender()
|
onNextRender()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let onNextAdditionalRender = self.onNextAdditionalRender {
|
||||||
|
if self.currentAdditionalInput != nil {
|
||||||
|
self.onNextAdditionalRender = nil
|
||||||
|
Queue.mainQueue().after(0.016) {
|
||||||
|
onNextAdditionalRender()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1743,7 +1743,7 @@ final class MediaEditorScreenComponent: Component {
|
|||||||
controller.node.recording.togglePosition()
|
controller.node.recording.togglePosition()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)),
|
).withIsExclusive(false)),
|
||||||
environment: {},
|
environment: {},
|
||||||
containerSize: CGSize(width: 48.0, height: 48.0)
|
containerSize: CGSize(width: 48.0, height: 48.0)
|
||||||
)
|
)
|
||||||
|
|||||||
BIN
submodules/TelegramUI/Resources/Animations/BoostReplace.tgs
Normal file
BIN
submodules/TelegramUI/Resources/Animations/BoostReplace.tgs
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user