From 4d2cda0692ecab04cb3e6dddc34fef4bed992941 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 28 Oct 2024 10:58:30 +0400 Subject: [PATCH] Fix menu in case speed isn't controlled. --- .../media/player/media_player_dropdown.cpp | 34 ++++++++++++------- .../view/media_view_playback_controls.cpp | 27 ++++++++++----- .../media/view/media_view_playback_controls.h | 3 ++ 3 files changed, 43 insertions(+), 21 deletions(-) diff --git a/Telegram/SourceFiles/media/player/media_player_dropdown.cpp b/Telegram/SourceFiles/media/player/media_player_dropdown.cpp index 45e4e2c04..97ec184ce 100644 --- a/Telegram/SourceFiles/media/player/media_player_dropdown.cpp +++ b/Telegram/SourceFiles/media/player/media_player_dropdown.cpp @@ -740,9 +740,10 @@ SpeedController::SpeedController( current->otherEnter(); } }); - - setSpeed(_lookup(false)); - _speed = _lookup(true); + if (const auto lookup = _lookup) { + setSpeed(lookup(false)); + _speed = lookup(true); + } } rpl::producer<> SpeedController::saved() const { @@ -778,7 +779,9 @@ void SpeedController::setSpeed(float64 newSpeed) { } void SpeedController::save() { - _change(speed()); + if (const auto change = _change) { + change(speed()); + } _saved.fire({}); } @@ -788,26 +791,33 @@ void SpeedController::setQuality(int quality) { } void SpeedController::fillMenu(not_null menu) { - FillSpeedMenu( - menu->menu(), - _st.menu, - _speedChanged.events_starting_with(speed()), - [=](float64 speed) { setSpeed(speed); save(); }, - !_qualities.empty()); + if (_lookup) { + FillSpeedMenu( + menu->menu(), + _st.menu, + _speedChanged.events_starting_with(speed()), + [=](float64 speed) { setSpeed(speed); save(); }, + !_qualities.empty()); + } if (_qualities.empty()) { return; } _quality = _lookupQuality(); const auto raw = menu->menu(); const auto &st = _st.menu; - raw->addSeparator(&st.dropdown.menu.separator); + if (_lookup) { + raw->addSeparator(&st.dropdown.menu.separator); + } const auto add = [&](int quality) { const auto text = quality ? u"%1p"_q.arg(quality) : u"Original"_q; auto action = base::make_unique_q( raw, st.qualityMenu, - Ui::Menu::CreateAction(raw, text, [=] { _changeQuality(quality); }), + Ui::Menu::CreateAction( + raw, + text, + [=] { _changeQuality(quality); }), nullptr, nullptr); const auto raw = action.get(); diff --git a/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp b/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp index ac46c78db..a5aba77d1 100644 --- a/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp +++ b/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp @@ -29,13 +29,14 @@ PlaybackControls::PlaybackControls( not_null delegate) : RpWidget(parent) , _delegate(delegate) +, _speedControllable(Media::Audio::SupportsSpeedControl()) +, _qualitiesList(_delegate->playbackControlsQualities()) , _playPauseResume(this, st::mediaviewPlayButton) , _playbackSlider(this, st::mediaviewPlayback) , _playbackProgress(std::make_unique()) , _volumeToggle(this, st::mediaviewVolumeToggle) , _volumeController(this, st::mediaviewPlayback) -, _speedToggle((Media::Audio::SupportsSpeedControl() - || !_delegate->playbackControlsQualities().empty()) +, _speedToggle((_speedControllable || !_qualitiesList.empty()) ? object_ptr(this, st::mediaviewSpeedButton) : nullptr) , _fullScreenToggle(this, st::mediaviewFullScreenButton) @@ -48,9 +49,15 @@ PlaybackControls::PlaybackControls( _speedToggle->st(), parent, [=](bool) {}, - [=](bool lastNonDefault) { return speedLookup(lastNonDefault); }, - [=](float64 speed) { saveSpeed(speed); }, - _delegate->playbackControlsQualities(), + (_speedControllable + ? [=](bool lastNonDefault) { + return speedLookup(lastNonDefault); + } + : Fn()), + (_speedControllable + ? [=](float64 speed) { saveSpeed(speed); } + : Fn()), + _qualitiesList, [=] { return _delegate->playbackControlsCurrentQuality(); }, [=](int quality) { saveQuality(quality); }) : nullptr) @@ -63,10 +70,12 @@ PlaybackControls::PlaybackControls( fadeUpdated(opacity); }); - _speedController->menuToggledValue( - ) | rpl::start_with_next([=](bool toggled) { - _speedToggle->setActive(toggled); - }, _speedToggle->lifetime()); + if (const auto controller = _speedController.get()) { + controller->menuToggledValue( + ) | rpl::start_with_next([=](bool toggled) { + _speedToggle->setActive(toggled); + }, _speedToggle->lifetime()); + } _pictureInPicture->addClickHandler([=] { _delegate->playbackControlsToPictureInPicture(); diff --git a/Telegram/SourceFiles/media/view/media_view_playback_controls.h b/Telegram/SourceFiles/media/view/media_view_playback_controls.h index 5357fb2fe..0ba2cf973 100644 --- a/Telegram/SourceFiles/media/view/media_view_playback_controls.h +++ b/Telegram/SourceFiles/media/view/media_view_playback_controls.h @@ -98,6 +98,9 @@ private: const not_null _delegate; + bool _speedControllable = false; + std::vector _qualitiesList; + bool _inFullScreen = false; bool _showPause = false; bool _childrenHidden = false;