diff --git a/Telegram/SourceFiles/media/player/media_player_widget.cpp b/Telegram/SourceFiles/media/player/media_player_widget.cpp index f31fa8ae2..fea02545b 100644 --- a/Telegram/SourceFiles/media/player/media_player_widget.cpp +++ b/Telegram/SourceFiles/media/player/media_player_widget.cpp @@ -62,72 +62,38 @@ private: }; -class Widget::SpeedButton : public Ui::IconButton { +class Widget::SpeedController final { public: - SpeedButton(QWidget *parent, const style::IconButton &st); + explicit SpeedController(not_null button); [[nodiscard]] rpl::producer<> saved() const; -protected: - void contextMenuEvent(QContextMenuEvent *e) override; - private: - class SpeedController final { - public: - SpeedController() { - setSpeed(Core::App().settings().voicePlaybackSpeed()); - _speed = Core::App().settings().voicePlaybackSpeed(true); - } - - [[nodiscard]] rpl::producer speedValue() const { - return _speedChanged.events_starting_with(speed()); - } - [[nodiscard]] rpl::producer<> saved() const { - return _saved.events(); - } - [[nodiscard]] float64 speed() const { - return _isDefault ? 1. : _speed; - } - [[nodiscard]] bool isDefault() const { - return _isDefault; - } - [[nodiscard]] float64 lastNonDefaultSpeed() const { - return _speed; - } - void toggleDefault() { - _isDefault = !_isDefault; - _speedChanged.fire(speed()); - } - void setSpeed(float64 newSpeed) { - if (!(_isDefault = (newSpeed == 1.))) { - _speed = newSpeed; - } - _speedChanged.fire(speed()); - } - void save() { - Core::App().settings().setVoicePlaybackSpeed(speed()); - Core::App().saveSettingsDelayed(); - _saved.fire({}); - } - - private: - float64 _speed = 2.; - bool _isDefault = true; - rpl::event_stream _speedChanged; - rpl::event_stream<> _saved; - }; - - SpeedController _speed; + [[nodiscard]] float64 speed() const; + [[nodiscard]] bool isDefault() const; + [[nodiscard]] float64 lastNonDefaultSpeed() const; + void toggleDefault(); + void setSpeed(float64 newSpeed); + void save(); + void showContextMenu(not_null e); + const not_null _button; base::unique_qptr _menu; + float64 _speed = 2.; + bool _isDefault = true; + rpl::event_stream _speedChanged; + rpl::event_stream<> _saved; }; -Widget::SpeedButton::SpeedButton(QWidget *parent, const style::IconButton &st) -: IconButton(parent, st) { - setClickedCallback([=] { - _speed.toggleDefault(); - _speed.save(); +Widget::SpeedController::SpeedController(not_null button) +: _button(button) { + setSpeed(Core::App().settings().voicePlaybackSpeed()); + _speed = Core::App().settings().voicePlaybackSpeed(true); + + button->setClickedCallback([=] { + toggleDefault(); + save(); }); struct Icons { @@ -135,10 +101,11 @@ Widget::SpeedButton::SpeedButton(QWidget *parent, const style::IconButton &st) const style::icon *over = nullptr; }; - _speed.speedValue( + _speedChanged.events_starting_with( + speed() ) | rpl::start_with_next([=](float64 speed) { - const auto isDefaultSpeed = _speed.isDefault(); - const auto nonDefaultSpeed = _speed.lastNonDefaultSpeed(); + const auto isDefaultSpeed = isDefault(); + const auto nonDefaultSpeed = lastNonDefaultSpeed(); const auto icons = [&]() -> Icons { if (nonDefaultSpeed == .5) { @@ -171,24 +138,66 @@ Widget::SpeedButton::SpeedButton(QWidget *parent, const style::IconButton &st) } }(); - setIconOverride(icons.icon, icons.over); - setRippleColorOverride(isDefaultSpeed + button->setIconOverride(icons.icon, icons.over); + button->setRippleColorOverride(isDefaultSpeed ? &st::mediaPlayerSpeedDisabledRippleBg : nullptr); - }, lifetime()); + }, button->lifetime()); + + button->events( + ) | rpl::filter([=](not_null e) { + return (e->type() == QEvent::ContextMenu); + }) | rpl::start_with_next([=](not_null e) { + showContextMenu(static_cast(e.get())); + }, button->lifetime()); } -void Widget::SpeedButton::contextMenuEvent(QContextMenuEvent *e) { +rpl::producer<> Widget::SpeedController::saved() const { + return _saved.events(); +} + +float64 Widget::SpeedController::speed() const { + return _isDefault ? 1. : _speed; +} + +bool Widget::SpeedController::isDefault() const { + return _isDefault; +} + +float64 Widget::SpeedController::lastNonDefaultSpeed() const { + return _speed; +} + +void Widget::SpeedController::toggleDefault() { + _isDefault = !_isDefault; + _speedChanged.fire(speed()); +} + +void Widget::SpeedController::setSpeed(float64 newSpeed) { + if (!(_isDefault = (newSpeed == 1.))) { + _speed = newSpeed; + } + _speedChanged.fire(speed()); +} + +void Widget::SpeedController::save() { + Core::App().settings().setVoicePlaybackSpeed(speed()); + Core::App().saveSettingsDelayed(); + _saved.fire({}); +} + +void Widget::SpeedController::showContextMenu( + not_null e) { _menu = base::make_unique_q( - this, + _button, st::mediaPlayerPopupMenu); const auto setPlaybackSpeed = [=](float64 speed) { - _speed.setSpeed(speed); - _speed.save(); + setSpeed(speed); + save(); }; - const auto currentSpeed = _speed.speed(); + const auto currentSpeed = speed(); const auto addSpeed = [&](float64 speed, QString text = QString()) { if (text.isEmpty()) { text = QString::number(speed); @@ -206,10 +215,6 @@ void Widget::SpeedButton::contextMenuEvent(QContextMenuEvent *e) { _menu->popup(e->globalPos()); } -rpl::producer<> Widget::SpeedButton::saved() const { - return _speed.saved(); -} - Widget::PlayButton::PlayButton(QWidget *parent) : Ui::RippleButton(parent, st::mediaPlayerButton.ripple) , _layout(st::mediaPlayerButton, [this] { update(); }) { resize(st::mediaPlayerButtonSize); @@ -247,7 +252,10 @@ Widget::Widget(QWidget *parent, not_null session) , _close(this, st::mediaPlayerClose) , _shadow(this) , _playbackSlider(this, st::mediaPlayerPlayback) -, _playbackProgress(std::make_unique()) { +, _playbackProgress(std::make_unique()) +, _speedController( + std::make_unique( + _playbackSpeed.data())) { setAttribute(Qt::WA_OpaquePaintEvent); setMouseTracking(true); resize(width(), st::mediaPlayerHeight + st::lineWidth); @@ -318,7 +326,7 @@ Widget::Widget(QWidget *parent, not_null session) Core::App().saveSettingsDelayed(); }); - _playbackSpeed->saved( + _speedController->saved( ) | rpl::start_with_next([=] { instance()->updateVoicePlaybackSpeed(); }, lifetime()); diff --git a/Telegram/SourceFiles/media/player/media_player_widget.h b/Telegram/SourceFiles/media/player/media_player_widget.h index 876edc7a7..84c022dc2 100644 --- a/Telegram/SourceFiles/media/player/media_player_widget.h +++ b/Telegram/SourceFiles/media/player/media_player_widget.h @@ -135,7 +135,7 @@ private: bool _wontBeOver = false; class PlayButton; - class SpeedButton; + class SpeedController; object_ptr _nameLabel; object_ptr> _rightControls; object_ptr _timeLabel; @@ -145,11 +145,12 @@ private: object_ptr _volumeToggle; object_ptr _repeatToggle; object_ptr _orderToggle; - object_ptr _playbackSpeed; + object_ptr _playbackSpeed; object_ptr _close; object_ptr _shadow = { nullptr }; object_ptr _playbackSlider; std::unique_ptr _playbackProgress; + std::unique_ptr _speedController; rpl::lifetime _playlistChangesLifetime;