diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 90374064e..9578cf50b 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -34,6 +34,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/text/format_values.h" #include "ui/item_text_options.h" #include "ui/painter.h" +#include "ui/rect.h" #include "ui/power_saving.h" #include "ui/cached_round_corners.h" #include "ui/gl/gl_window.h" @@ -100,7 +101,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include #include #include -#include #include @@ -228,6 +228,73 @@ QWidget *PipDelegate::pipParentWidget() { } // namespace +class OverlayWidget::SponsoredButton : public Ui::RippleButton { +public: + SponsoredButton(QWidget *parent) + : Ui::RippleButton(parent, st::mediaviewSponsoredButton.ripple) { + } + + void setText(QString text) { + _text = Ui::Text::String( + st::mediaviewSponsoredButton.style, + std::move(text), + kDefaultTextOptions, + width()); + resize(width(), _text.minHeight() * 2); + } + void setOpacity(float opacity) { + _opacity = opacity; + } + +protected: + void paintEvent(QPaintEvent *e) override { + auto p = QPainter(this); + const auto &st = st::mediaviewSponsoredButton; + + p.setOpacity(_opacity); + + const auto over = Ui::AbstractButton::isOver(); + const auto down = Ui::AbstractButton::isDown(); + { + auto hq = PainterHighQualityEnabler(p); + p.setPen(Qt::NoPen); + p.setBrush((over || down) ? st.textBgOver : st.textBg); + p.drawRoundedRect( + rect(), + st::mediaviewCaptionRadius, + st::mediaviewCaptionRadius); + } + + Ui::RippleButton::paintRipple(p, 0, 0); + + p.setPen(st.textFg); + p.setBrush(Qt::NoBrush); + _text.draw(p, { + .position = QPoint( + (width() - _text.maxWidth()) / 2, + (height() - _text.minHeight()) / 2), + .outerWidth = width(), + .availableWidth = width(), + }); + } + + QImage prepareRippleMask() const override { + return Ui::RippleAnimation::RoundRectMask( + size(), + st::mediaviewCaptionRadius); + } + QPoint prepareRippleStartPosition() const override { + return mapFromGlobal(QCursor::pos()) + - rect::m::pos::tl(st::mediaviewSponsoredButton.padding); + } + +private: + Ui::Text::String _text; + float64 _opacity = 1.; + +}; + + struct OverlayWidget::SharedMedia { SharedMedia(SharedMediaKey key) : key(key) { } @@ -1812,9 +1879,9 @@ bool OverlayWidget::updateControlsAnimation(crl::time now) { } else { _controlsOpacity.update(dt, anim::linear); } - if (_sponsoredButtonOpacity && _sponsoredButton) { + if (_sponsoredButton) { const auto value = _controlsOpacity.current(); - _sponsoredButtonOpacity->setOpacity(value); + _sponsoredButton->setOpacity(value); _sponsoredButton->setAttribute( Qt::WA_TransparentForMouseEvents, value < 1); @@ -3678,19 +3745,14 @@ void OverlayWidget::initSponsoredButton() { } const auto &component = _session->sponsoredMessages(); const auto details = component.lookupDetails(_message->fullId()); - _sponsoredButton = base::make_unique_q( - _body, - rpl::single(details.buttonText), - st::mediaviewSponsoredButton); + _sponsoredButton = base::make_unique_q(_body); + _sponsoredButton->setText(details.buttonText); + _sponsoredButton->setOpacity(1.0); _sponsoredButton->setClickedCallback([=, link = details.link] { UrlClickHandler::Open(link); hide(); }); - _sponsoredButtonOpacity = base::make_unique_q( - _sponsoredButton.get()); - _sponsoredButtonOpacity->setOpacity(1.0); - _sponsoredButton->setGraphicsEffect(_sponsoredButtonOpacity.get()); } void OverlayWidget::updateThemePreviewGeometry() { @@ -6299,7 +6361,6 @@ void OverlayWidget::clearBeforeHide() { _helper->setControlsOpacity(1.); _groupThumbs = nullptr; _groupThumbsRect = QRect(); - _sponsoredButtonOpacity = nullptr; _sponsoredButton = nullptr; } diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h index 37c0da390..5114b169c 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h @@ -20,8 +20,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "media/view/media_view_open_common.h" #include "media/stories/media_stories_delegate.h" -class QGraphicsOpacityEffect; - class History; namespace anim { @@ -143,6 +141,7 @@ private: class Renderer; class RendererSW; class RendererGL; + class SponsoredButton; // If changing, see paintControls()! enum class Over { @@ -700,8 +699,7 @@ private: object_ptr _dropdown; base::Timer _dropdownShowTimer; - base::unique_qptr _sponsoredButton; - base::unique_qptr _sponsoredButtonOpacity; + base::unique_qptr _sponsoredButton; bool _receiveMouse = true; bool _processingKeyPress = false;