mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-04 05:26:48 +00:00
Merge commit '311d9ac073d8c4ffd8bcea7041000ac9e8d03128'
This commit is contained in:
commit
4f35f73243
@ -315,7 +315,7 @@ private enum ChannelInfoEntry: ItemListNodeEntry {
|
|||||||
arguments.openChannelTypeSetup()
|
arguments.openChannelTypeSetup()
|
||||||
})
|
})
|
||||||
case let .channelDescriptionSetup(theme, placeholder, value):
|
case let .channelDescriptionSetup(theme, placeholder, value):
|
||||||
return ItemListMultilineInputItem(theme: theme, text: value, placeholder: placeholder, maxLength: 1000, sectionId: self.section, style: .plain, textUpdated: { updatedText in
|
return ItemListMultilineInputItem(theme: theme, text: value, placeholder: placeholder, maxLength: 255, sectionId: self.section, style: .plain, textUpdated: { updatedText in
|
||||||
arguments.updateEditingDescriptionText(updatedText)
|
arguments.updateEditingDescriptionText(updatedText)
|
||||||
}, action: {
|
}, action: {
|
||||||
|
|
||||||
|
|||||||
@ -132,7 +132,7 @@ private enum CreateChannelEntry: ItemListNodeEntry {
|
|||||||
arguments.changeProfilePhoto()
|
arguments.changeProfilePhoto()
|
||||||
})
|
})
|
||||||
case let .descriptionSetup(theme, text, value):
|
case let .descriptionSetup(theme, text, value):
|
||||||
return ItemListMultilineInputItem(theme: theme, text: value, placeholder: text, maxLength: 1000, sectionId: self.section, style: .blocks, textUpdated: { updatedText in
|
return ItemListMultilineInputItem(theme: theme, text: value, placeholder: text, maxLength: 255, sectionId: self.section, style: .blocks, textUpdated: { updatedText in
|
||||||
arguments.updateEditingDescriptionText(updatedText)
|
arguments.updateEditingDescriptionText(updatedText)
|
||||||
}, action: {
|
}, action: {
|
||||||
|
|
||||||
@ -214,7 +214,7 @@ public func createChannelController(account: Account) -> ViewController {
|
|||||||
}, updateEditingDescriptionText: { text in
|
}, updateEditingDescriptionText: { text in
|
||||||
updateState { current in
|
updateState { current in
|
||||||
var current = current
|
var current = current
|
||||||
current.editingDescriptionText = text
|
current.editingDescriptionText = String(text.prefix(255))
|
||||||
return current
|
return current
|
||||||
}
|
}
|
||||||
}, done: {
|
}, done: {
|
||||||
|
|||||||
@ -480,7 +480,7 @@ private enum GroupInfoEntry: ItemListNodeEntry {
|
|||||||
arguments.presentController(channelVisibilityController(account: arguments.account, peerId: arguments.peerId, mode: .generic), ViewControllerPresentationArguments(presentationAnimation: ViewControllerPresentationAnimation.modalSheet))
|
arguments.presentController(channelVisibilityController(account: arguments.account, peerId: arguments.peerId, mode: .generic), ViewControllerPresentationArguments(presentationAnimation: ViewControllerPresentationAnimation.modalSheet))
|
||||||
})
|
})
|
||||||
case let .groupDescriptionSetup(theme, placeholder, text):
|
case let .groupDescriptionSetup(theme, placeholder, text):
|
||||||
return ItemListMultilineInputItem(theme: theme, text: text, placeholder: placeholder, maxLength: 1000, sectionId: self.section, style: .blocks, textUpdated: { updatedText in
|
return ItemListMultilineInputItem(theme: theme, text: text, placeholder: placeholder, maxLength: 255, sectionId: self.section, style: .blocks, textUpdated: { updatedText in
|
||||||
arguments.updateEditingDescriptionText(updatedText)
|
arguments.updateEditingDescriptionText(updatedText)
|
||||||
}, action: {
|
}, action: {
|
||||||
|
|
||||||
|
|||||||
@ -100,6 +100,7 @@ class ItemListMultilineInputItemNode: ListViewItemNode, ASEditableTextNodeDelega
|
|||||||
|
|
||||||
self.textClippingNode.addSubnode(self.textNode)
|
self.textClippingNode.addSubnode(self.textNode)
|
||||||
self.addSubnode(self.textClippingNode)
|
self.addSubnode(self.textClippingNode)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override func didLoad() {
|
override func didLoad() {
|
||||||
@ -290,6 +291,22 @@ class ItemListMultilineInputItemNode: ListViewItemNode, ASEditableTextNodeDelega
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func editableTextNodeShouldPaste(_ editableTextNode: ASEditableTextNode) -> Bool {
|
||||||
|
if let item = self.item {
|
||||||
|
var text: String? = UIPasteboard.general.string
|
||||||
|
if let text = text {
|
||||||
|
if let maxLength = item.maxLength {
|
||||||
|
let string = self.textNode.attributedText?.string ?? ""
|
||||||
|
if string.count + text.count > maxLength {
|
||||||
|
UIPasteboard.general.string = String(text[..<text.index(text.startIndex, offsetBy: maxLength - string.count)])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func focus() {
|
func focus() {
|
||||||
if !self.textNode.textView.isFirstResponder {
|
if !self.textNode.textView.isFirstResponder {
|
||||||
self.textNode.textView.becomeFirstResponder()
|
self.textNode.textView.becomeFirstResponder()
|
||||||
|
|||||||
@ -58,6 +58,9 @@ final class MultiplexedVideoNode: UIScrollView, UIScrollViewDelegate {
|
|||||||
}
|
}
|
||||||
private var displayItems: [VisibleVideoItem] = []
|
private var displayItems: [VisibleVideoItem] = []
|
||||||
private var visibleThumbnailLayers: [MediaId: SoftwareVideoThumbnailLayer] = [:]
|
private var visibleThumbnailLayers: [MediaId: SoftwareVideoThumbnailLayer] = [:]
|
||||||
|
private var visibleProgressNodes: [MediaId: RadialStatusNode] = [:]
|
||||||
|
private var statusDisposable: [MediaId : MetaDisposable] = [:]
|
||||||
|
|
||||||
private var visibleLayers: [MediaId: (SoftwareVideoLayerFrameManager, SampleBufferLayer)] = [:]
|
private var visibleLayers: [MediaId: (SoftwareVideoLayerFrameManager, SampleBufferLayer)] = [:]
|
||||||
|
|
||||||
private var displayLink: CADisplayLink!
|
private var displayLink: CADisplayLink!
|
||||||
@ -139,6 +142,9 @@ final class MultiplexedVideoNode: UIScrollView, UIScrollViewDelegate {
|
|||||||
deinit {
|
deinit {
|
||||||
self.displayLink.invalidate()
|
self.displayLink.invalidate()
|
||||||
self.displayLink.isPaused = true
|
self.displayLink.isPaused = true
|
||||||
|
for(_, disposable) in statusDisposable {
|
||||||
|
disposable.dispose()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func displayLinkEvent() {
|
private func displayLinkEvent() {
|
||||||
@ -210,6 +216,65 @@ final class MultiplexedVideoNode: UIScrollView, UIScrollViewDelegate {
|
|||||||
self.visibleThumbnailLayers[item.fileReference.media.fileId] = thumbnailLayer
|
self.visibleThumbnailLayers[item.fileReference.media.fileId] = thumbnailLayer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let progressFrame = CGRect(origin: CGPoint(x: item.frame.midX - 37 / 2, y: item.frame.midY - 37 / 2), size: CGSize(width: 37, height: 37))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let updatedStatusSignal = account.postbox.mediaBox.resourceStatus(item.fileReference.media.resource)
|
||||||
|
|
||||||
|
let statusDisposable: MetaDisposable
|
||||||
|
if let disposable = self.statusDisposable[item.fileReference.media.fileId] {
|
||||||
|
statusDisposable = disposable
|
||||||
|
} else {
|
||||||
|
statusDisposable = MetaDisposable()
|
||||||
|
self.statusDisposable[item.fileReference.media.fileId] = statusDisposable
|
||||||
|
}
|
||||||
|
|
||||||
|
statusDisposable.set((updatedStatusSignal |> deliverOnMainQueue).start(next: { [weak self] status in
|
||||||
|
displayLinkDispatcher.dispatch {
|
||||||
|
guard let `self` = self else {return}
|
||||||
|
|
||||||
|
let state: RadialStatusNodeState
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
switch status {
|
||||||
|
case let .Fetching(_, progress):
|
||||||
|
state = .progress(color: .white, lineWidth: nil, value: CGFloat(max(progress, 0.2)), cancelEnabled: false)
|
||||||
|
case .Remote:
|
||||||
|
state = .progress(color: .white, lineWidth: nil, value: 0, cancelEnabled: false)
|
||||||
|
case .Local:
|
||||||
|
state = .none
|
||||||
|
}
|
||||||
|
|
||||||
|
if state == .none {
|
||||||
|
if let statusNode = self.visibleProgressNodes[item.fileReference.media.fileId] {
|
||||||
|
self.visibleProgressNodes.removeValue(forKey: item.fileReference.media.fileId)
|
||||||
|
statusNode.transitionToState(state, completion: { [weak statusNode] in
|
||||||
|
statusNode?.removeFromSupernode()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if let visibleProgressNode = self.visibleProgressNodes[item.fileReference.media.fileId] {
|
||||||
|
if ensureFrames {
|
||||||
|
visibleProgressNode.frame = progressFrame
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let visibleProgressNode = RadialStatusNode(backgroundNodeColor: UIColor(white: 0.0, alpha: 0.5))
|
||||||
|
visibleProgressNode.frame = progressFrame
|
||||||
|
self.visibleProgressNodes[item.fileReference.media.fileId] = visibleProgressNode
|
||||||
|
}
|
||||||
|
|
||||||
|
let statusNode = self.visibleProgressNodes[item.fileReference.media.fileId]!
|
||||||
|
statusNode.transitionToState(state, completion: {})
|
||||||
|
self.addSubnode(statusNode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
|
||||||
|
|
||||||
if item.frame.maxY < minVisibleY {
|
if item.frame.maxY < minVisibleY {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,7 +18,7 @@ final class SoftwareVideoThumbnailLayer: CALayer {
|
|||||||
init(account: Account, fileReference: FileMediaReference) {
|
init(account: Account, fileReference: FileMediaReference) {
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
self.backgroundColor = UIColor.black.cgColor
|
self.backgroundColor = UIColor.clear.cgColor
|
||||||
self.contentsGravity = "resizeAspectFill"
|
self.contentsGravity = "resizeAspectFill"
|
||||||
self.masksToBounds = true
|
self.masksToBounds = true
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ final class SoftwareVideoThumbnailLayer: CALayer {
|
|||||||
let imageSize = boundingSize
|
let imageSize = boundingSize
|
||||||
boundingSize.width = min(200.0, boundingSize.width)
|
boundingSize.width = min(200.0, boundingSize.width)
|
||||||
|
|
||||||
if let image = transform(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: boundingSize, intrinsicInsets: UIEdgeInsets()))?.generateImage() {
|
if let image = transform(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: boundingSize, intrinsicInsets: UIEdgeInsets(), resizeMode: .fill(.clear)))?.generateImage() {
|
||||||
Queue.mainQueue().async {
|
Queue.mainQueue().async {
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
strongSelf.contents = image.cgImage
|
strongSelf.contents = image.cgImage
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user