Various fixes

This commit is contained in:
Ilya Laktyushin 2023-03-02 19:57:26 +04:00
parent ce3753c35a
commit c8ac1832a1
3 changed files with 58 additions and 25 deletions

View File

@ -2625,30 +2625,31 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
c.setItems(strongSelf.contextMenuMainItems(dismiss: dismiss) |> map { ContextController.Items(content: .list($0)) }, minHeight: nil) c.setItems(strongSelf.contextMenuMainItems(dismiss: dismiss) |> map { ContextController.Items(content: .list($0)) }, minHeight: nil)
}))) })))
items.append(.custom(SliderContextItem(minValue: 0.2, maxValue: 2.5, value: status.baseRate, valueChanged: { [weak self] newValue, finished in let sliderValuePromise = ValuePromise<Double?>(nil)
items.append(.custom(SliderContextItem(minValue: 0.2, maxValue: 2.5, value: status.baseRate, valueChanged: { [weak self] newValue, _ in
guard let strongSelf = self else { guard let strongSelf = self else {
return return
} }
let newValue = normalizeValue(newValue) let newValue = normalizeValue(newValue)
strongSelf.updatePlaybackRate(newValue) strongSelf.updatePlaybackRate(newValue)
if finished { sliderValuePromise.set(newValue)
//dismiss()
}
}), true)) }), true))
items.append(.separator) items.append(.separator)
let theme = strongSelf.presentationData.theme
for (text, _, rate) in strongSelf.speedList(strings: strongSelf.presentationData.strings) { for (text, _, rate) in strongSelf.speedList(strings: strongSelf.presentationData.strings) {
let isSelected = abs(status.baseRate - rate) < 0.01 let isSelected = abs(status.baseRate - rate) < 0.01
items.append(.action(ContextMenuActionItem(text: text, icon: { theme in items.append(.action(ContextMenuActionItem(text: text, icon: { _ in return nil }, iconSource: ContextMenuActionItemIconSource(size: CGSize(width: 24.0, height: 24.0), signal: sliderValuePromise.get()
if isSelected { |> map { value in
if isSelected && value == nil {
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Check"), color: theme.contextMenu.primaryColor) return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Check"), color: theme.contextMenu.primaryColor)
} else { } else {
return nil return nil
} }
}, action: { _, f in }), action: { _, f in
f(.default) f(.default)
guard let strongSelf = self, let videoNode = strongSelf.videoNode else { guard let strongSelf = self, let videoNode = strongSelf.videoNode else {
return return
} }

View File

@ -493,15 +493,27 @@ public final class MediaNavigationAccessoryHeaderNode: ASDisplayNode, UIScrollVi
let nextRate: AudioPlaybackRate let nextRate: AudioPlaybackRate
if let rate = self.playbackBaseRate { if let rate = self.playbackBaseRate {
switch rate { switch rate {
case .x0_5, .x2:
nextRate = .x1
case .x1: case .x1:
nextRate = .x1_5 nextRate = .x1_5
case .x1_5: case .x1_5:
nextRate = .x2 nextRate = .x2
default: default:
nextRate = .x1 if rate.doubleValue < 0.5 {
nextRate = .x0_5
} else if rate.doubleValue < 1.0 {
nextRate = .x1
} else if rate.doubleValue < 1.5 {
nextRate = .x1_5
} else if rate.doubleValue < 2.0 {
nextRate = .x2
} else {
nextRate = .x1
}
} }
} else { } else {
nextRate = .x2 nextRate = .x1_5
} }
self.setRate?(nextRate, .preset) self.setRate?(nextRate, .preset)
@ -531,23 +543,27 @@ public final class MediaNavigationAccessoryHeaderNode: ASDisplayNode, UIScrollVi
var presetItems: [ContextMenuItem] = [] var presetItems: [ContextMenuItem] = []
let previousValue = self.playbackBaseRate?.doubleValue ?? 1.0 let previousValue = self.playbackBaseRate?.doubleValue ?? 1.0
let sliderValuePromise = ValuePromise<Double?>(nil)
let sliderItem: ContextMenuItem = .custom(SliderContextItem(minValue: 0.2, maxValue: 2.5, value: previousValue, valueChanged: { [weak self] newValue, finished in let sliderItem: ContextMenuItem = .custom(SliderContextItem(minValue: 0.2, maxValue: 2.5, value: previousValue, valueChanged: { [weak self] newValue, finished in
let newValue = normalizeValue(newValue) let newValue = normalizeValue(newValue)
self?.setRate?(AudioPlaybackRate(newValue), .sliderChange) self?.setRate?(AudioPlaybackRate(newValue), .sliderChange)
sliderValuePromise.set(newValue)
if finished { if finished {
scheduleTooltip(.sliderCommit(previousValue, newValue)) scheduleTooltip(.sliderCommit(previousValue, newValue))
} }
}), true) }), true)
let theme = self.context.sharedContext.currentPresentationData.with { $0 }.theme
for (text, _, rate) in self.speedList(strings: self.strings) { for (text, _, rate) in self.speedList(strings: self.strings) {
let isSelected = self.playbackBaseRate == rate let isSelected = self.playbackBaseRate == rate
presetItems.append(.action(ContextMenuActionItem(text: text, icon: { theme in presetItems.append(.action(ContextMenuActionItem(text: text, icon: { _ in return nil }, iconSource: ContextMenuActionItemIconSource(size: CGSize(width: 24.0, height: 24.0), signal: sliderValuePromise.get()
if isSelected { |> map { value in
if isSelected && value == nil {
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Check"), color: theme.contextMenu.primaryColor) return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Check"), color: theme.contextMenu.primaryColor)
} else { } else {
return nil return nil
} }
}, action: { [weak self] _, f in }), action: { [weak self] _, f in
scheduleTooltip(nil) scheduleTooltip(nil)
f(.default) f(.default)

View File

@ -1005,14 +1005,26 @@ final class OverlayPlayerControlsNode: ASDisplayNode {
@objc func rateButtonPressed() { @objc func rateButtonPressed() {
var nextRate: AudioPlaybackRate var nextRate: AudioPlaybackRate
if let currentRate = self.currentRate { if let rate = self.currentRate {
switch currentRate { switch rate {
case .x1: case .x0_5, .x2:
nextRate = .x1_5 nextRate = .x1
case .x1_5: case .x1:
nextRate = .x2 nextRate = .x1_5
default: case .x1_5:
nextRate = .x2
default:
if rate.doubleValue < 0.5 {
nextRate = .x0_5
} else if rate.doubleValue < 1.0 {
nextRate = .x1 nextRate = .x1
} else if rate.doubleValue < 1.5 {
nextRate = .x1_5
} else if rate.doubleValue < 2.0 {
nextRate = .x2
} else {
nextRate = .x1
}
} }
} else { } else {
nextRate = .x1_5 nextRate = .x1_5
@ -1032,25 +1044,29 @@ final class OverlayPlayerControlsNode: ASDisplayNode {
private func contextMenuSpeedItems(scheduleTooltip: @escaping (MediaNavigationAccessoryPanel.ChangeType?) -> Void) -> Signal<ContextController.Items, NoError> { private func contextMenuSpeedItems(scheduleTooltip: @escaping (MediaNavigationAccessoryPanel.ChangeType?) -> Void) -> Signal<ContextController.Items, NoError> {
var presetItems: [ContextMenuItem] = [] var presetItems: [ContextMenuItem] = []
let previousValue = self.currentRate?.doubleValue ?? 1.0 let previousValue = self.currentRate?.doubleValue ?? 1.0
let sliderValuePromise = ValuePromise<Double?>(nil)
let sliderItem: ContextMenuItem = .custom(SliderContextItem(minValue: 0.2, maxValue: 2.5, value: previousValue, valueChanged: { [weak self] newValue, finished in let sliderItem: ContextMenuItem = .custom(SliderContextItem(minValue: 0.2, maxValue: 2.5, value: previousValue, valueChanged: { [weak self] newValue, finished in
let newValue = normalizeValue(newValue) let newValue = normalizeValue(newValue)
self?.control?(.setBaseRate(AudioPlaybackRate(newValue))) self?.control?(.setBaseRate(AudioPlaybackRate(newValue)))
sliderValuePromise.set(newValue)
if finished { if finished {
scheduleTooltip(.sliderCommit(previousValue, newValue)) scheduleTooltip(.sliderCommit(previousValue, newValue))
} }
}), true) }), true)
let theme = self.presentationData.theme
for (text, _, rate) in self.speedList(strings: self.presentationData.strings) { for (text, _, rate) in self.speedList(strings: self.presentationData.strings) {
let isSelected = self.currentRate == rate let isSelected = self.currentRate == rate
presetItems.append(.action(ContextMenuActionItem(text: text, icon: { theme in presetItems.append(.action(ContextMenuActionItem(text: text, icon: { _ in return nil }, iconSource: ContextMenuActionItemIconSource(size: CGSize(width: 24.0, height: 24.0), signal: sliderValuePromise.get()
if isSelected { |> map { value in
if isSelected && value == nil {
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Check"), color: theme.contextMenu.primaryColor) return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Check"), color: theme.contextMenu.primaryColor)
} else { } else {
return nil return nil
} }
}, action: { [weak self] _, f in }), action: { [weak self] _, f in
scheduleTooltip(nil) scheduleTooltip(nil)
f(.default) f(.default)