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);
}
void SpeedButton::setSpeed(float64 speed, anim::type animated) {
void SpeedButton::setSpeed(float64 speed) {
_isDefault = EqualSpeeds(speed, 1.);
_layout.setSpeed(speed);
update();
@ -337,4 +337,86 @@ QImage SpeedButton::prepareRippleMask() const {
_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

View file

@ -87,7 +87,7 @@ public:
return _st;
}
void setSpeed(float64 speed, anim::type animated = anim::type::normal);
void setSpeed(float64 speed);
private:
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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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