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
870488c183
commit
76246efb5d
@ -6,13 +6,15 @@ import AudioWaveform
|
|||||||
|
|
||||||
private final class AudioWaveformNodeParameters: NSObject {
|
private final class AudioWaveformNodeParameters: NSObject {
|
||||||
let waveform: AudioWaveform?
|
let waveform: AudioWaveform?
|
||||||
|
let drawFakeSamplesIfNeeded: Bool
|
||||||
let color: UIColor?
|
let color: UIColor?
|
||||||
let gravity: AudioWaveformNode.Gravity?
|
let gravity: AudioWaveformNode.Gravity?
|
||||||
let progress: CGFloat?
|
let progress: CGFloat?
|
||||||
let trimRange: Range<CGFloat>?
|
let trimRange: Range<CGFloat>?
|
||||||
|
|
||||||
init(waveform: AudioWaveform?, color: UIColor?, gravity: AudioWaveformNode.Gravity?, progress: CGFloat?, trimRange: Range<CGFloat>?) {
|
init(waveform: AudioWaveform?, drawFakeSamplesIfNeeded: Bool, color: UIColor?, gravity: AudioWaveformNode.Gravity?, progress: CGFloat?, trimRange: Range<CGFloat>?) {
|
||||||
self.waveform = waveform
|
self.waveform = waveform
|
||||||
|
self.drawFakeSamplesIfNeeded = drawFakeSamplesIfNeeded
|
||||||
self.color = color
|
self.color = color
|
||||||
self.gravity = gravity
|
self.gravity = gravity
|
||||||
self.progress = progress
|
self.progress = progress
|
||||||
@ -31,6 +33,7 @@ public final class AudioWaveformNode: ASDisplayNode {
|
|||||||
private var waveform: AudioWaveform?
|
private var waveform: AudioWaveform?
|
||||||
private var color: UIColor?
|
private var color: UIColor?
|
||||||
private var gravity: Gravity?
|
private var gravity: Gravity?
|
||||||
|
public var drawFakeSamplesIfNeeded = false
|
||||||
|
|
||||||
public var progress: CGFloat? {
|
public var progress: CGFloat? {
|
||||||
didSet {
|
didSet {
|
||||||
@ -77,7 +80,7 @@ public final class AudioWaveformNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override public func drawParameters(forAsyncLayer layer: _ASDisplayLayer) -> NSObjectProtocol? {
|
override public func drawParameters(forAsyncLayer layer: _ASDisplayLayer) -> NSObjectProtocol? {
|
||||||
return AudioWaveformNodeParameters(waveform: self.waveform, color: self.color, gravity: self.gravity, progress: self.progress, trimRange: self.trimRange)
|
return AudioWaveformNodeParameters(waveform: self.waveform, drawFakeSamplesIfNeeded: self.drawFakeSamplesIfNeeded, color: self.color, gravity: self.gravity, progress: self.progress, trimRange: self.trimRange)
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc override public class func draw(_ bounds: CGRect, withParameters parameters: Any?, isCancelled: () -> Bool, isRasterizing: Bool) {
|
@objc override public class func draw(_ bounds: CGRect, withParameters parameters: Any?, isCancelled: () -> Bool, isRasterizing: Bool) {
|
||||||
@ -117,18 +120,12 @@ public final class AudioWaveformNode: ASDisplayNode {
|
|||||||
|
|
||||||
let numSamples = Int(floor(size.width / (sampleWidth + distance)))
|
let numSamples = Int(floor(size.width / (sampleWidth + distance)))
|
||||||
|
|
||||||
let adjustedSamplesMemory = malloc(numSamples * 2)!
|
var adjustedSamples = Array<UInt16>(repeating: 0, count: numSamples)
|
||||||
let adjustedSamples = adjustedSamplesMemory.assumingMemoryBound(to: UInt16.self)
|
|
||||||
defer {
|
|
||||||
free(adjustedSamplesMemory)
|
|
||||||
}
|
|
||||||
memset(adjustedSamplesMemory, 0, numSamples * 2)
|
|
||||||
|
|
||||||
var generateFakeSamples = false
|
var generateFakeSamples = false
|
||||||
|
|
||||||
var bins: [UInt16: Int] = [:]
|
var bins: [UInt16: Int] = [:]
|
||||||
for i in 0 ..< maxReadSamples {
|
for i in 0 ..< maxReadSamples {
|
||||||
let index = i * numSamples / maxReadSamples
|
let index = min(i * numSamples / max(1, maxReadSamples), numSamples - 1)
|
||||||
let sample = samples[i]
|
let sample = samples[i]
|
||||||
if adjustedSamples[index] < sample {
|
if adjustedSamples[index] < sample {
|
||||||
adjustedSamples[index] = sample
|
adjustedSamples[index] = sample
|
||||||
@ -158,7 +155,7 @@ public final class AudioWaveformNode: ASDisplayNode {
|
|||||||
topCountPercent = Float(topCount) / Float(totalCount)
|
topCountPercent = Float(topCount) / Float(totalCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
if topCountPercent > 0.75 {
|
if parameters.drawFakeSamplesIfNeeded && topCountPercent > 0.75 {
|
||||||
generateFakeSamples = true
|
generateFakeSamples = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1672,20 +1672,43 @@ public class TrimView: UIView {
|
|||||||
self.rightHandleView.addSubview(self.rightCapsuleView)
|
self.rightHandleView.addSubview(self.rightCapsuleView)
|
||||||
self.addSubview(self.borderView)
|
self.addSubview(self.borderView)
|
||||||
|
|
||||||
self.zoneView.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.handleZoneHandlePan(_:))))
|
let zoneHandlePanGesture = UILongPressGestureRecognizer(target: self, action: #selector(self.handleZoneHandlePan(_:)))
|
||||||
self.leftHandleView.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.handleLeftHandlePan(_:))))
|
zoneHandlePanGesture.minimumPressDuration = 0.0
|
||||||
self.rightHandleView.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.handleRightHandlePan(_:))))
|
zoneHandlePanGesture.allowableMovement = .infinity
|
||||||
|
|
||||||
|
let leftHandlePanGesture = UILongPressGestureRecognizer(target: self, action: #selector(self.handleLeftHandlePan(_:)))
|
||||||
|
leftHandlePanGesture.minimumPressDuration = 0.0
|
||||||
|
leftHandlePanGesture.allowableMovement = .infinity
|
||||||
|
|
||||||
|
let rightHandlePanGesture = UILongPressGestureRecognizer(target: self, action: #selector(self.handleRightHandlePan(_:)))
|
||||||
|
rightHandlePanGesture.minimumPressDuration = 0.0
|
||||||
|
rightHandlePanGesture.allowableMovement = .infinity
|
||||||
|
|
||||||
|
self.zoneView.addGestureRecognizer(zoneHandlePanGesture)
|
||||||
|
self.leftHandleView.addGestureRecognizer(leftHandlePanGesture)
|
||||||
|
self.rightHandleView.addGestureRecognizer(rightHandlePanGesture)
|
||||||
}
|
}
|
||||||
|
|
||||||
required init?(coder: NSCoder) {
|
required init?(coder: NSCoder) {
|
||||||
fatalError("init(coder:) has not been implemented")
|
fatalError("init(coder:) has not been implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc private func handleZoneHandlePan(_ gestureRecognizer: UIPanGestureRecognizer) {
|
private var panStartLocation: CGPoint?
|
||||||
|
|
||||||
|
@objc private func handleZoneHandlePan(_ gestureRecognizer: UILongPressGestureRecognizer) {
|
||||||
guard let params = self.params else {
|
guard let params = self.params else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let translation = gestureRecognizer.translation(in: self)
|
|
||||||
|
let location = gestureRecognizer.location(in: self)
|
||||||
|
if case .began = gestureRecognizer.state {
|
||||||
|
self.panStartLocation = location
|
||||||
|
}
|
||||||
|
|
||||||
|
let translation = CGPoint(
|
||||||
|
x: location.x - (self.panStartLocation?.x ?? 0.0),
|
||||||
|
y: location.y - (self.panStartLocation?.y ?? 0.0)
|
||||||
|
)
|
||||||
|
|
||||||
let start = handleWidth / 2.0
|
let start = handleWidth / 2.0
|
||||||
let end = self.frame.width - handleWidth / 2.0
|
let end = self.frame.width - handleWidth / 2.0
|
||||||
@ -1706,6 +1729,7 @@ public class TrimView: UIView {
|
|||||||
transition = .easeInOut(duration: 0.25)
|
transition = .easeInOut(duration: 0.25)
|
||||||
}
|
}
|
||||||
case .ended, .cancelled:
|
case .ended, .cancelled:
|
||||||
|
self.panStartLocation = nil
|
||||||
self.isPanningTrimHandle = false
|
self.isPanningTrimHandle = false
|
||||||
self.trimUpdated(startValue, endValue, false, true)
|
self.trimUpdated(startValue, endValue, false, true)
|
||||||
transition = .easeInOut(duration: 0.25)
|
transition = .easeInOut(duration: 0.25)
|
||||||
@ -1713,15 +1737,15 @@ public class TrimView: UIView {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
gestureRecognizer.setTranslation(.zero, in: self)
|
|
||||||
self.updated(transition)
|
self.updated(transition)
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc private func handleLeftHandlePan(_ gestureRecognizer: UIPanGestureRecognizer) {
|
@objc private func handleLeftHandlePan(_ gestureRecognizer: UILongPressGestureRecognizer) {
|
||||||
guard let params = self.params else {
|
guard let params = self.params else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let location = gestureRecognizer.location(in: self)
|
let location = gestureRecognizer.location(in: self)
|
||||||
|
|
||||||
let start = handleWidth / 2.0
|
let start = handleWidth / 2.0
|
||||||
let end = params.scrubberSize.width - handleWidth / 2.0
|
let end = params.scrubberSize.width - handleWidth / 2.0
|
||||||
let length = end - start
|
let length = end - start
|
||||||
@ -1746,6 +1770,7 @@ public class TrimView: UIView {
|
|||||||
transition = .easeInOut(duration: 0.25)
|
transition = .easeInOut(duration: 0.25)
|
||||||
}
|
}
|
||||||
case .ended, .cancelled:
|
case .ended, .cancelled:
|
||||||
|
self.panStartLocation = nil
|
||||||
self.isPanningTrimHandle = false
|
self.isPanningTrimHandle = false
|
||||||
self.trimUpdated(startValue, endValue, false, true)
|
self.trimUpdated(startValue, endValue, false, true)
|
||||||
transition = .easeInOut(duration: 0.25)
|
transition = .easeInOut(duration: 0.25)
|
||||||
@ -1755,7 +1780,7 @@ public class TrimView: UIView {
|
|||||||
self.updated(transition)
|
self.updated(transition)
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc private func handleRightHandlePan(_ gestureRecognizer: UIPanGestureRecognizer) {
|
@objc private func handleRightHandlePan(_ gestureRecognizer: UILongPressGestureRecognizer) {
|
||||||
guard let params = self.params else {
|
guard let params = self.params else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -1784,6 +1809,7 @@ public class TrimView: UIView {
|
|||||||
transition = .easeInOut(duration: 0.25)
|
transition = .easeInOut(duration: 0.25)
|
||||||
}
|
}
|
||||||
case .ended, .cancelled:
|
case .ended, .cancelled:
|
||||||
|
self.panStartLocation = nil
|
||||||
self.isPanningTrimHandle = false
|
self.isPanningTrimHandle = false
|
||||||
self.trimUpdated(startValue, endValue, true, true)
|
self.trimUpdated(startValue, endValue, true, true)
|
||||||
transition = .easeInOut(duration: 0.25)
|
transition = .easeInOut(duration: 0.25)
|
||||||
|
|||||||
@ -496,6 +496,7 @@ extension ChatControllerImpl {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO:localize
|
||||||
if let recordedMediaPreview = self.presentationInterfaceState.interfaceState.mediaDraftState, case let .audio(audio) = recordedMediaPreview, let _ = audio.trimRange {
|
if let recordedMediaPreview = self.presentationInterfaceState.interfaceState.mediaDraftState, case let .audio(audio) = recordedMediaPreview, let _ = audio.trimRange {
|
||||||
self.present(
|
self.present(
|
||||||
textAlertController(
|
textAlertController(
|
||||||
@ -503,7 +504,7 @@ extension ChatControllerImpl {
|
|||||||
title: "Trim to selected range?",
|
title: "Trim to selected range?",
|
||||||
text: "Audio outside that range will be discarded, and recording will start immediately.",
|
text: "Audio outside that range will be discarded, and recording will start immediately.",
|
||||||
actions: [
|
actions: [
|
||||||
TextAlertAction(type: .genericAction, title: "Cancel", action: {}),
|
TextAlertAction(type: .genericAction, title: self.presentationData.strings.Common_Cancel, action: {}),
|
||||||
TextAlertAction(type: .defaultAction, title: "Proceed", action: {
|
TextAlertAction(type: .defaultAction, title: "Proceed", action: {
|
||||||
proceed()
|
proceed()
|
||||||
})
|
})
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user