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)
})))
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 {
return
}
let newValue = normalizeValue(newValue)
strongSelf.updatePlaybackRate(newValue)
if finished {
//dismiss()
}
sliderValuePromise.set(newValue)
}), true))
items.append(.separator)
let theme = strongSelf.presentationData.theme
for (text, _, rate) in strongSelf.speedList(strings: strongSelf.presentationData.strings) {
let isSelected = abs(status.baseRate - rate) < 0.01
items.append(.action(ContextMenuActionItem(text: text, icon: { theme in
if isSelected {
items.append(.action(ContextMenuActionItem(text: text, icon: { _ in return nil }, iconSource: ContextMenuActionItemIconSource(size: CGSize(width: 24.0, height: 24.0), signal: sliderValuePromise.get()
|> map { value in
if isSelected && value == nil {
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Check"), color: theme.contextMenu.primaryColor)
} else {
return nil
}
}, action: { _, f in
}), action: { _, f in
f(.default)
guard let strongSelf = self, let videoNode = strongSelf.videoNode else {
return
}

View File

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

View File

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