mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-04-14 13:17:08 +02:00
Use new settings icon in the player.
This commit is contained in:
parent
c2afef2bde
commit
6ed25d012f
11 changed files with 157 additions and 21 deletions
BIN
Telegram/Resources/icons/player/player_settings.png
Normal file
BIN
Telegram/Resources/icons/player/player_settings.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 997 B |
BIN
Telegram/Resources/icons/player/player_settings@2x.png
Normal file
BIN
Telegram/Resources/icons/player/player_settings@2x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.6 KiB |
BIN
Telegram/Resources/icons/player/player_settings@3x.png
Normal file
BIN
Telegram/Resources/icons/player/player_settings@3x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.2 KiB |
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue