Use new settings icon in the player.

This commit is contained in:
John Preston 2024-10-26 12:03:44 +04:00
parent c2afef2bde
commit 6ed25d012f
11 changed files with 157 additions and 21 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 997 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -307,7 +307,7 @@ SpeedButton::SpeedButton(QWidget *parent, const style::MediaSpeedButton &st)
resize(_st.size); resize(_st.size);
} }
void SpeedButton::setSpeed(float64 speed, anim::type animated) { void SpeedButton::setSpeed(float64 speed) {
_isDefault = EqualSpeeds(speed, 1.); _isDefault = EqualSpeeds(speed, 1.);
_layout.setSpeed(speed); _layout.setSpeed(speed);
update(); update();
@ -337,4 +337,86 @@ QImage SpeedButton::prepareRippleMask() const {
_st.rippleRadius); _st.rippleRadius);
} }
SettingsButton::SettingsButton(
QWidget *parent,
const style::MediaSpeedButton &st)
: RippleButton(parent, st.ripple)
, _st(st)
, _isDefaultSpeed(true) {
resize(_st.size);
}
void SettingsButton::setSpeed(float64 speed) {
_isDefaultSpeed = EqualSpeeds(speed, 1.);
update();
}
void SettingsButton::setQuality(int quality) {
update();
}
void SettingsButton::setActive(bool active) {
if (_active == active) {
return;
}
_active = active;
_activeAnimation.start([=] {
update();
}, active ? 0. : 1., active ? 1. : 0., crl::time(150));
}
void SettingsButton::paintEvent(QPaintEvent *e) {
auto p = QPainter(this);
paintRipple(
p,
QPoint(_st.padding.left(), _st.padding.top()),
_isDefaultSpeed ? nullptr : &_st.rippleActiveColor->c);
//const auto active = !_isDefaultSpeed;
const auto inner = QRect(
QPoint(),
_st.size
).marginsRemoved(_st.padding);
auto hq = std::optional<PainterHighQualityEnabler>();
const auto active = _activeAnimation.value(_active ? 1. : 0.);
if (active > 0.) {
const auto shift = QRectF(inner).center();
p.save();
p.translate(shift);
p.rotate(active * 60.);
p.translate(-shift);
hq.emplace(p);
}
_st.icon.paintInCenter(p, inner);
if (active > 0.) {
p.restore();
hq.reset();
}
//p.setPen(color);
//p.setFont(_st.font);
//p.drawText(
// QPointF(inner.topLeft()) + QPointF(
// (inner.width() - _textWidth) / 2.,
// (inner.height() - _adjustedHeight) / 2. + _adjustedAscent),
// _text);
}
QPoint SettingsButton::prepareRippleStartPosition() const {
const auto inner = rect().marginsRemoved(_st.padding);
const auto result = mapFromGlobal(QCursor::pos()) - inner.topLeft();
return inner.contains(result)
? result
: DisabledRippleStartPosition();
}
QImage SettingsButton::prepareRippleMask() const {
return Ui::RippleAnimation::RoundRectMask(
rect().marginsRemoved(_st.padding).size(),
_st.rippleRadius);
}
} // namespace Media::Player } // namespace Media::Player

View file

@ -87,7 +87,7 @@ public:
return _st; return _st;
} }
void setSpeed(float64 speed, anim::type animated = anim::type::normal); void setSpeed(float64 speed);
private: private:
void paintEvent(QPaintEvent *e) override; void paintEvent(QPaintEvent *e) override;
@ -101,4 +101,29 @@ private:
}; };
class SettingsButton final : public Ui::RippleButton {
public:
SettingsButton(QWidget *parent, const style::MediaSpeedButton &st);
[[nodiscard]] const style::MediaSpeedButton &st() const {
return _st;
}
void setSpeed(float64 speed);
void setQuality(int quality);
void setActive(bool active);
private:
void paintEvent(QPaintEvent *e) override;
QPoint prepareRippleStartPosition() const override;
QImage prepareRippleMask() const override;
const style::MediaSpeedButton &_st;
Ui::Animations::Simple _activeAnimation;
bool _isDefaultSpeed = false;
bool _active = false;
};
} // namespace Media::Player } // namespace Media::Player

View file

@ -558,6 +558,10 @@ void WithDropdownController::updateDropdownGeometry() {
_menu->move(position); _menu->move(position);
} }
rpl::producer<bool> WithDropdownController::menuToggledValue() const {
return _menuToggled.value();
}
void WithDropdownController::hideTemporarily() { void WithDropdownController::hideTemporarily() {
if (_menu && !_menu->isHidden()) { if (_menu && !_menu->isHidden()) {
_temporarilyHidden = true; _temporarilyHidden = true;
@ -590,10 +594,20 @@ void WithDropdownController::showMenu() {
} }
}, _menu->lifetime()); }, _menu->lifetime());
_menu->setHiddenCallback([=]{ _menu->setHiddenCallback([=]{
if (_menu.get() == raw) {
_menuToggled = false;
}
Ui::PostponeCall(raw, [this] { Ui::PostponeCall(raw, [this] {
_menu = nullptr; _menu = nullptr;
_menuToggled = false;
}); });
}); });
_menu->setShowStartCallback([=] {
_menuToggled = true;
});
_menu->setHideStartCallback([=] {
_menuToggled = false;
});
_button->installEventFilter(raw); _button->installEventFilter(raw);
fillMenu(raw); fillMenu(raw);
updateDropdownGeometry(); updateDropdownGeometry();
@ -608,6 +622,7 @@ void WithDropdownController::showMenu() {
Unexpected("Menu align value."); Unexpected("Menu align value.");
}(); }();
_menu->showAnimated(origin); _menu->showAnimated(origin);
_menuToggled = true;
} }
OrderController::OrderController( OrderController::OrderController(
@ -695,7 +710,8 @@ void OrderController::updateIcon() {
} }
SpeedController::SpeedController( SpeedController::SpeedController(
not_null<SpeedButton*> button, not_null<Ui::AbstractButton*> button,
const style::MediaSpeedButton &st,
not_null<QWidget*> menuParent, not_null<QWidget*> menuParent,
Fn<void(bool)> menuOverCallback, Fn<void(bool)> menuOverCallback,
Fn<float64(bool lastNonDefault)> value, Fn<float64(bool lastNonDefault)> value,
@ -706,10 +722,10 @@ SpeedController::SpeedController(
: WithDropdownController( : WithDropdownController(
button, button,
menuParent, menuParent,
button->st().menu.dropdown, st.menu.dropdown,
button->st().menuAlign, st.menuAlign,
std::move(menuOverCallback)) std::move(menuOverCallback))
, _st(button->st()) , _st(st)
, _lookup(std::move(value)) , _lookup(std::move(value))
, _change(std::move(change)) , _change(std::move(change))
, _qualities(std::move(qualities)) , _qualities(std::move(qualities))
@ -727,20 +743,16 @@ SpeedController::SpeedController(
setSpeed(_lookup(false)); setSpeed(_lookup(false));
_speed = _lookup(true); _speed = _lookup(true);
button->setSpeed(_speed, anim::type::instant);
_speedChanged.events_starting_with(
speed()
) | rpl::start_with_next([=](float64 speed) {
button->setSpeed(speed);
}, button->lifetime());
} }
rpl::producer<> SpeedController::saved() const { rpl::producer<> SpeedController::saved() const {
return _saved.events(); return _saved.events();
} }
rpl::producer<float64> SpeedController::realtimeValue() const {
return _speedChanged.events_starting_with(speed());
}
float64 SpeedController::speed() const { float64 SpeedController::speed() const {
return _isDefault ? 1. : _speed; return _isDefault ? 1. : _speed;
} }

View file

@ -30,8 +30,6 @@ class Menu;
namespace Media::Player { namespace Media::Player {
class SpeedButton;
class Dropdown final : public Ui::RpWidget { class Dropdown final : public Ui::RpWidget {
public: public:
explicit Dropdown(QWidget *parent); explicit Dropdown(QWidget *parent);
@ -82,6 +80,7 @@ public:
Ui::DropdownMenu *menu() const; Ui::DropdownMenu *menu() const;
void updateDropdownGeometry(); void updateDropdownGeometry();
[[nodiscard]] rpl::producer<bool> menuToggledValue() const;
void hideTemporarily(); void hideTemporarily();
void showBack(); void showBack();
@ -98,6 +97,7 @@ private:
const Qt::Alignment _menuAlign = Qt::AlignTop | Qt::AlignRight; const Qt::Alignment _menuAlign = Qt::AlignTop | Qt::AlignRight;
const Fn<void(bool)> _menuOverCallback; const Fn<void(bool)> _menuOverCallback;
base::unique_qptr<Ui::DropdownMenu> _menu; base::unique_qptr<Ui::DropdownMenu> _menu;
rpl::variable<bool> _menuToggled;
bool _temporarilyHidden = false; bool _temporarilyHidden = false;
bool _overButton = false; bool _overButton = false;
@ -125,7 +125,8 @@ private:
class SpeedController final : public WithDropdownController { class SpeedController final : public WithDropdownController {
public: public:
SpeedController( SpeedController(
not_null<SpeedButton*> button, not_null<Ui::AbstractButton*> button,
const style::MediaSpeedButton &st,
not_null<QWidget*> menuParent, not_null<QWidget*> menuParent,
Fn<void(bool)> menuOverCallback, Fn<void(bool)> menuOverCallback,
Fn<float64(bool lastNonDefault)> value, Fn<float64(bool lastNonDefault)> value,
@ -135,6 +136,7 @@ public:
Fn<void(int)> changeQuality = nullptr); Fn<void(int)> changeQuality = nullptr);
[[nodiscard]] rpl::producer<> saved() const; [[nodiscard]] rpl::producer<> saved() const;
[[nodiscard]] rpl::producer<float64> realtimeValue() const;
private: private:
void fillMenu(not_null<Ui::DropdownMenu*> menu) override; void fillMenu(not_null<Ui::DropdownMenu*> menu) override;

View file

@ -73,10 +73,17 @@ Widget::Widget(
, _speedController( , _speedController(
std::make_unique<SpeedController>( std::make_unique<SpeedController>(
_speedToggle.data(), _speedToggle.data(),
_speedToggle->st(),
dropdownsParent, dropdownsParent,
[=](bool over) { markOver(over); }, [=](bool over) { markOver(over); },
[=](bool lastNonDefault) { return speedLookup(lastNonDefault); }, [=](bool lastNonDefault) { return speedLookup(lastNonDefault); },
[=](float64 speed) { saveSpeed(speed); })) { [=](float64 speed) { saveSpeed(speed); })) {
_speedController->realtimeValue(
) | rpl::start_with_next([=](float64 speed) {
_speedToggle->setSpeed(speed);
}, _speedToggle->lifetime());
_speedToggle->finishAnimating();
setAttribute(Qt::WA_OpaquePaintEvent); setAttribute(Qt::WA_OpaquePaintEvent);
setMouseTracking(true); setMouseTracking(true);
resize(width(), st::mediaPlayerHeight + st::lineWidth); resize(width(), st::mediaPlayerHeight + st::lineWidth);

View file

@ -354,7 +354,7 @@ mediaviewSpeedButton: MediaSpeedButton(mediaPlayerSpeedButton) {
fg: mediaviewPlaybackIconFg; fg: mediaviewPlaybackIconFg;
overFg: mediaviewPlaybackIconFgOver; overFg: mediaviewPlaybackIconFgOver;
activeFg: mediaviewTextLinkFg; activeFg: mediaviewTextLinkFg;
icon: icon{{ "player/player_speed", mediaviewPlaybackIconFg }}; icon: icon{{ "player/player_settings", mediaviewPlaybackIconFg }};
ripple: RippleAnimation(defaultRippleAnimation) { ripple: RippleAnimation(defaultRippleAnimation) {
color: mediaviewPlaybackIconRipple; color: mediaviewPlaybackIconRipple;
} }

View file

@ -36,7 +36,7 @@ PlaybackControls::PlaybackControls(
, _volumeController(this, st::mediaviewPlayback) , _volumeController(this, st::mediaviewPlayback)
, _speedToggle((Media::Audio::SupportsSpeedControl() , _speedToggle((Media::Audio::SupportsSpeedControl()
|| !_delegate->playbackControlsQualities().empty()) || !_delegate->playbackControlsQualities().empty())
? object_ptr<Player::SpeedButton>(this, st::mediaviewSpeedButton) ? object_ptr<Player::SettingsButton>(this, st::mediaviewSpeedButton)
: nullptr) : nullptr)
, _fullScreenToggle(this, st::mediaviewFullScreenButton) , _fullScreenToggle(this, st::mediaviewFullScreenButton)
, _pictureInPicture(this, st::mediaviewPipButton) , _pictureInPicture(this, st::mediaviewPipButton)
@ -45,6 +45,7 @@ PlaybackControls::PlaybackControls(
, _speedController(_speedToggle , _speedController(_speedToggle
? std::make_unique<Player::SpeedController>( ? std::make_unique<Player::SpeedController>(
_speedToggle.data(), _speedToggle.data(),
_speedToggle->st(),
parent, parent,
[=](bool) {}, [=](bool) {},
[=](bool lastNonDefault) { return speedLookup(lastNonDefault); }, [=](bool lastNonDefault) { return speedLookup(lastNonDefault); },
@ -62,6 +63,11 @@ PlaybackControls::PlaybackControls(
fadeUpdated(opacity); fadeUpdated(opacity);
}); });
_speedController->menuToggledValue(
) | rpl::start_with_next([=](bool toggled) {
_speedToggle->setActive(toggled);
}, _speedToggle->lifetime());
_pictureInPicture->addClickHandler([=] { _pictureInPicture->addClickHandler([=] {
_delegate->playbackControlsToPictureInPicture(); _delegate->playbackControlsToPictureInPicture();
}); });
@ -193,10 +199,12 @@ float64 PlaybackControls::speedLookup(bool lastNonDefault) const {
} }
void PlaybackControls::saveSpeed(float64 speed) { void PlaybackControls::saveSpeed(float64 speed) {
_speedToggle->setSpeed(speed);
_delegate->playbackControlsSpeedChanged(speed); _delegate->playbackControlsSpeedChanged(speed);
} }
void PlaybackControls::saveQuality(int quality) { void PlaybackControls::saveQuality(int quality) {
_speedToggle->setQuality(quality);
_delegate->playbackControlsQualityChanged(quality); _delegate->playbackControlsQualityChanged(quality);
} }

View file

@ -21,7 +21,7 @@ class PopupMenu;
namespace Media { namespace Media {
namespace Player { namespace Player {
struct TrackState; struct TrackState;
class SpeedButton; class SettingsButton;
class SpeedController; class SpeedController;
} // namespace Player } // namespace Player
@ -114,7 +114,7 @@ private:
std::unique_ptr<PlaybackProgress> _receivedTillProgress; std::unique_ptr<PlaybackProgress> _receivedTillProgress;
object_ptr<Ui::IconButton> _volumeToggle; object_ptr<Ui::IconButton> _volumeToggle;
object_ptr<Ui::MediaSlider> _volumeController; object_ptr<Ui::MediaSlider> _volumeController;
object_ptr<Player::SpeedButton> _speedToggle; object_ptr<Player::SettingsButton> _speedToggle;
object_ptr<Ui::IconButton> _fullScreenToggle; object_ptr<Ui::IconButton> _fullScreenToggle;
object_ptr<Ui::IconButton> _pictureInPicture; object_ptr<Ui::IconButton> _pictureInPicture;
object_ptr<Ui::LabelSimple> _playedAlready; object_ptr<Ui::LabelSimple> _playedAlready;