Merge commit '311d9ac073d8c4ffd8bcea7041000ac9e8d03128'

This commit is contained in:
Peter 2018-09-11 22:21:03 +03:00
commit 4f35f73243
6 changed files with 88 additions and 6 deletions

View File

@ -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: {

View File

@ -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: {

View File

@ -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: {

View File

@ -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()

View File

@ -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;
}

View File

@ -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