mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-03 13:13:55 +00:00
Merge commit '311d9ac073d8c4ffd8bcea7041000ac9e8d03128'
This commit is contained in:
commit
4f35f73243
@ -315,7 +315,7 @@ private enum ChannelInfoEntry: ItemListNodeEntry {
|
||||
arguments.openChannelTypeSetup()
|
||||
})
|
||||
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)
|
||||
}, action: {
|
||||
|
||||
|
||||
@ -132,7 +132,7 @@ private enum CreateChannelEntry: ItemListNodeEntry {
|
||||
arguments.changeProfilePhoto()
|
||||
})
|
||||
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)
|
||||
}, action: {
|
||||
|
||||
@ -214,7 +214,7 @@ public func createChannelController(account: Account) -> ViewController {
|
||||
}, updateEditingDescriptionText: { text in
|
||||
updateState { current in
|
||||
var current = current
|
||||
current.editingDescriptionText = text
|
||||
current.editingDescriptionText = String(text.prefix(255))
|
||||
return current
|
||||
}
|
||||
}, done: {
|
||||
|
||||
@ -480,7 +480,7 @@ private enum GroupInfoEntry: ItemListNodeEntry {
|
||||
arguments.presentController(channelVisibilityController(account: arguments.account, peerId: arguments.peerId, mode: .generic), ViewControllerPresentationArguments(presentationAnimation: ViewControllerPresentationAnimation.modalSheet))
|
||||
})
|
||||
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)
|
||||
}, action: {
|
||||
|
||||
|
||||
@ -100,6 +100,7 @@ class ItemListMultilineInputItemNode: ListViewItemNode, ASEditableTextNodeDelega
|
||||
|
||||
self.textClippingNode.addSubnode(self.textNode)
|
||||
self.addSubnode(self.textClippingNode)
|
||||
|
||||
}
|
||||
|
||||
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() {
|
||||
if !self.textNode.textView.isFirstResponder {
|
||||
self.textNode.textView.becomeFirstResponder()
|
||||
|
||||
@ -58,6 +58,9 @@ final class MultiplexedVideoNode: UIScrollView, UIScrollViewDelegate {
|
||||
}
|
||||
private var displayItems: [VisibleVideoItem] = []
|
||||
private var visibleThumbnailLayers: [MediaId: SoftwareVideoThumbnailLayer] = [:]
|
||||
private var visibleProgressNodes: [MediaId: RadialStatusNode] = [:]
|
||||
private var statusDisposable: [MediaId : MetaDisposable] = [:]
|
||||
|
||||
private var visibleLayers: [MediaId: (SoftwareVideoLayerFrameManager, SampleBufferLayer)] = [:]
|
||||
|
||||
private var displayLink: CADisplayLink!
|
||||
@ -139,6 +142,9 @@ final class MultiplexedVideoNode: UIScrollView, UIScrollViewDelegate {
|
||||
deinit {
|
||||
self.displayLink.invalidate()
|
||||
self.displayLink.isPaused = true
|
||||
for(_, disposable) in statusDisposable {
|
||||
disposable.dispose()
|
||||
}
|
||||
}
|
||||
|
||||
private func displayLinkEvent() {
|
||||
@ -210,6 +216,65 @@ final class MultiplexedVideoNode: UIScrollView, UIScrollViewDelegate {
|
||||
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 {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -18,7 +18,7 @@ final class SoftwareVideoThumbnailLayer: CALayer {
|
||||
init(account: Account, fileReference: FileMediaReference) {
|
||||
super.init()
|
||||
|
||||
self.backgroundColor = UIColor.black.cgColor
|
||||
self.backgroundColor = UIColor.clear.cgColor
|
||||
self.contentsGravity = "resizeAspectFill"
|
||||
self.masksToBounds = true
|
||||
|
||||
@ -28,7 +28,7 @@ final class SoftwareVideoThumbnailLayer: CALayer {
|
||||
let imageSize = boundingSize
|
||||
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 {
|
||||
if let strongSelf = self {
|
||||
strongSelf.contents = image.cgImage
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user