Fix menu in case speed isn't controlled.

This commit is contained in:
John Preston 2024-10-28 10:58:30 +04:00
parent cbd2b8f428
commit 4d2cda0692
3 changed files with 43 additions and 21 deletions

View file

@ -740,9 +740,10 @@ SpeedController::SpeedController(
current->otherEnter(); current->otherEnter();
} }
}); });
if (const auto lookup = _lookup) {
setSpeed(_lookup(false)); setSpeed(lookup(false));
_speed = _lookup(true); _speed = lookup(true);
}
} }
rpl::producer<> SpeedController::saved() const { rpl::producer<> SpeedController::saved() const {
@ -778,7 +779,9 @@ void SpeedController::setSpeed(float64 newSpeed) {
} }
void SpeedController::save() { void SpeedController::save() {
_change(speed()); if (const auto change = _change) {
change(speed());
}
_saved.fire({}); _saved.fire({});
} }
@ -788,26 +791,33 @@ void SpeedController::setQuality(int quality) {
} }
void SpeedController::fillMenu(not_null<Ui::DropdownMenu*> menu) { void SpeedController::fillMenu(not_null<Ui::DropdownMenu*> menu) {
FillSpeedMenu( if (_lookup) {
menu->menu(), FillSpeedMenu(
_st.menu, menu->menu(),
_speedChanged.events_starting_with(speed()), _st.menu,
[=](float64 speed) { setSpeed(speed); save(); }, _speedChanged.events_starting_with(speed()),
!_qualities.empty()); [=](float64 speed) { setSpeed(speed); save(); },
!_qualities.empty());
}
if (_qualities.empty()) { if (_qualities.empty()) {
return; return;
} }
_quality = _lookupQuality(); _quality = _lookupQuality();
const auto raw = menu->menu(); const auto raw = menu->menu();
const auto &st = _st.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 add = [&](int quality) {
const auto text = quality ? u"%1p"_q.arg(quality) : u"Original"_q; const auto text = quality ? u"%1p"_q.arg(quality) : u"Original"_q;
auto action = base::make_unique_q<Ui::Menu::Action>( auto action = base::make_unique_q<Ui::Menu::Action>(
raw, raw,
st.qualityMenu, st.qualityMenu,
Ui::Menu::CreateAction(raw, text, [=] { _changeQuality(quality); }), Ui::Menu::CreateAction(
raw,
text,
[=] { _changeQuality(quality); }),
nullptr, nullptr,
nullptr); nullptr);
const auto raw = action.get(); const auto raw = action.get();

View file

@ -29,13 +29,14 @@ PlaybackControls::PlaybackControls(
not_null<Delegate*> delegate) not_null<Delegate*> delegate)
: RpWidget(parent) : RpWidget(parent)
, _delegate(delegate) , _delegate(delegate)
, _speedControllable(Media::Audio::SupportsSpeedControl())
, _qualitiesList(_delegate->playbackControlsQualities())
, _playPauseResume(this, st::mediaviewPlayButton) , _playPauseResume(this, st::mediaviewPlayButton)
, _playbackSlider(this, st::mediaviewPlayback) , _playbackSlider(this, st::mediaviewPlayback)
, _playbackProgress(std::make_unique<PlaybackProgress>()) , _playbackProgress(std::make_unique<PlaybackProgress>())
, _volumeToggle(this, st::mediaviewVolumeToggle) , _volumeToggle(this, st::mediaviewVolumeToggle)
, _volumeController(this, st::mediaviewPlayback) , _volumeController(this, st::mediaviewPlayback)
, _speedToggle((Media::Audio::SupportsSpeedControl() , _speedToggle((_speedControllable || !_qualitiesList.empty())
|| !_delegate->playbackControlsQualities().empty())
? object_ptr<Player::SettingsButton>(this, st::mediaviewSpeedButton) ? object_ptr<Player::SettingsButton>(this, st::mediaviewSpeedButton)
: nullptr) : nullptr)
, _fullScreenToggle(this, st::mediaviewFullScreenButton) , _fullScreenToggle(this, st::mediaviewFullScreenButton)
@ -48,9 +49,15 @@ PlaybackControls::PlaybackControls(
_speedToggle->st(), _speedToggle->st(),
parent, parent,
[=](bool) {}, [=](bool) {},
[=](bool lastNonDefault) { return speedLookup(lastNonDefault); }, (_speedControllable
[=](float64 speed) { saveSpeed(speed); }, ? [=](bool lastNonDefault) {
_delegate->playbackControlsQualities(), return speedLookup(lastNonDefault);
}
: Fn<float64(bool)>()),
(_speedControllable
? [=](float64 speed) { saveSpeed(speed); }
: Fn<void(float64)>()),
_qualitiesList,
[=] { return _delegate->playbackControlsCurrentQuality(); }, [=] { return _delegate->playbackControlsCurrentQuality(); },
[=](int quality) { saveQuality(quality); }) [=](int quality) { saveQuality(quality); })
: nullptr) : nullptr)
@ -63,10 +70,12 @@ PlaybackControls::PlaybackControls(
fadeUpdated(opacity); fadeUpdated(opacity);
}); });
_speedController->menuToggledValue( if (const auto controller = _speedController.get()) {
) | rpl::start_with_next([=](bool toggled) { controller->menuToggledValue(
_speedToggle->setActive(toggled); ) | rpl::start_with_next([=](bool toggled) {
}, _speedToggle->lifetime()); _speedToggle->setActive(toggled);
}, _speedToggle->lifetime());
}
_pictureInPicture->addClickHandler([=] { _pictureInPicture->addClickHandler([=] {
_delegate->playbackControlsToPictureInPicture(); _delegate->playbackControlsToPictureInPicture();

View file

@ -98,6 +98,9 @@ private:
const not_null<Delegate*> _delegate; const not_null<Delegate*> _delegate;
bool _speedControllable = false;
std::vector<int> _qualitiesList;
bool _inFullScreen = false; bool _inFullScreen = false;
bool _showPause = false; bool _showPause = false;
bool _childrenHidden = false; bool _childrenHidden = false;