diff --git a/Telegram/SourceFiles/boxes/sticker_set_box.cpp b/Telegram/SourceFiles/boxes/sticker_set_box.cpp index bde237aabc..73e54bae09 100644 --- a/Telegram/SourceFiles/boxes/sticker_set_box.cpp +++ b/Telegram/SourceFiles/boxes/sticker_set_box.cpp @@ -56,6 +56,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include #include +#include namespace { @@ -203,7 +204,9 @@ private: not_null getLottiePlayer(); void showPreview(); - const QImage &validatePremiumLock(int index, const QImage &frame) const; + void validatePremiumLock(int index, const QImage &frame) const; + void validatePremiumStar() const; + void updateItems(); void repaintItems(crl::time now = 0); @@ -235,6 +238,7 @@ private: const std::unique_ptr _pathGradient; mutable QImage _premiumLockGray; + mutable QImage _premiumStar; int _visibleTop = 0; int _visibleBottom = 0; @@ -569,6 +573,7 @@ StickerSetBox::Inner::Inner( style::PaletteChanged( ) | rpl::start_with_next([=] { _premiumLockGray = QImage(); + _premiumStar = QImage(); }, lifetime()); setMouseTracking(true); @@ -932,13 +937,16 @@ void StickerSetBox::Inner::showPreview() { } } -const QImage &StickerSetBox::Inner::validatePremiumLock( +void StickerSetBox::Inner::validatePremiumLock( int index, const QImage &frame) const { auto &element = _elements[index]; auto &image = frame.isNull() ? _premiumLockGray : element.premiumLock; ValidatePremiumLockBg(image, frame); - return image; +} + +void StickerSetBox::Inner::validatePremiumStar() const { + ValidatePremiumStarFg(_premiumStar); } not_null StickerSetBox::Inner::getLottiePlayer() { @@ -1167,8 +1175,7 @@ void StickerSetBox::Inner::paintSticker( const auto document = element.document; const auto &media = element.documentMedia; const auto sticker = document->sticker(); - const auto locked = document->isPremiumSticker() - && !_controller->session().premium(); + const auto premium = document->isPremiumSticker(); media->checkStickerSmall(); if (sticker->setType == Data::StickersType::Emoji) { @@ -1220,19 +1227,26 @@ void StickerSetBox::Inner::paintSticker( QRect(ppos, size), _pathGradient.get()); } - if (locked) { + if (premium) { validatePremiumLock(index, lottieFrame); const auto &bg = lottieFrame.isNull() ? _premiumLockGray : element.premiumLock; const auto factor = style::DevicePixelRatio(); const auto radius = st::roundRadiusSmall; + const auto amPremium = _controller->session().premium(); const auto point = position + QPoint( - (_singleSize.width() - (bg.width() / factor)) / 2, + (amPremium + ? (_singleSize.width() - (bg.width() / factor) - radius) + : (_singleSize.width() - (bg.width() / factor)) / 2), _singleSize.height() - (bg.height() / factor) - radius); p.drawImage(point, bg); - - st::stickersPremiumLock.paint(p, point, width()); + if (amPremium) { + validatePremiumStar(); + p.drawImage(point, _premiumStar); + } else { + st::stickersPremiumLock.paint(p, point, width()); + } } } @@ -1346,3 +1360,24 @@ void ValidatePremiumLockBg(QImage &image, const QImage &frame) { image = Images::Circle(std::move(image)); } + +void ValidatePremiumStarFg(QImage &image) { + if (!image.isNull()) { + return; + } + const auto factor = style::DevicePixelRatio(); + const auto size = st::stickersPremiumLock.size(); + image = QImage( + size * factor, + QImage::Format_ARGB32_Premultiplied); + image.setDevicePixelRatio(factor); + image.fill(Qt::transparent); + auto p = QPainter(&image); + auto star = QSvgRenderer(u":/gui/icons/settings/star.svg"_q); + const auto skip = size.width() / 5.; + const auto outer = QRectF(QPointF(), size).marginsRemoved( + { skip, skip, skip, skip }); + p.setBrush(st::premiumButtonFg); + p.setPen(Qt::NoPen); + star.render(&p, outer); +} diff --git a/Telegram/SourceFiles/boxes/sticker_set_box.h b/Telegram/SourceFiles/boxes/sticker_set_box.h index aef99228f7..19e3ff040b 100644 --- a/Telegram/SourceFiles/boxes/sticker_set_box.h +++ b/Telegram/SourceFiles/boxes/sticker_set_box.h @@ -65,3 +65,4 @@ private: }; void ValidatePremiumLockBg(QImage &image, const QImage &frame); +void ValidatePremiumStarFg(QImage &image); diff --git a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp index 959e71a40e..f82fc3f90f 100644 --- a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp @@ -221,6 +221,7 @@ StickersListWidget::StickersListWidget( style::PaletteChanged( ) | rpl::start_with_next([=] { _premiumLockGray = QImage(); + _premiumStar = QImage(); }, lifetime()); Data::AmPremiumValue( @@ -1282,7 +1283,7 @@ void StickersListWidget::paintSticker( return; } - const auto locked = document->isPremiumSticker() && !session().premium(); + const auto premium = document->isPremiumSticker(); const auto isLottie = document->sticker()->isLottie(); const auto isWebm = document->sticker()->isWebm(); if (isLottie @@ -1350,7 +1351,7 @@ void StickersListWidget::paintSticker( sticker.savedFrame = pixmap; sticker.savedFrameFor = _singleSize; } - if (locked) { + if (premium) { lottieFrame = pixmap.toImage().convertToFormat( QImage::Format_ARGB32_Premultiplied); } @@ -1373,30 +1374,40 @@ void StickersListWidget::paintSticker( p.setOpacity(1.); } - if (locked) { + if (premium) { validatePremiumLock(set, index, lottieFrame); const auto &bg = lottieFrame.isNull() ? _premiumLockGray : sticker.premiumLock; const auto factor = style::DevicePixelRatio(); const auto radius = st::roundRadiusSmall; + const auto amPremium = session().premium(); const auto point = pos + QPoint( - (_singleSize.width() - (bg.width() / factor)) / 2, + (amPremium + ? (_singleSize.width() - (bg.width() / factor) - radius) + : (_singleSize.width() - (bg.width() / factor)) / 2), _singleSize.height() - (bg.height() / factor) - radius); p.drawImage(point, bg); - - st::stickersPremiumLock.paint(p, point, width()); + if (amPremium) { + validatePremiumStar(); + p.drawImage(point, _premiumStar); + } else { + st::stickersPremiumLock.paint(p, point, width()); + } } } -const QImage &StickersListWidget::validatePremiumLock( +void StickersListWidget::validatePremiumLock( Set &set, int index, const QImage &frame) { auto &sticker = set.stickers[index]; auto &image = frame.isNull() ? _premiumLockGray : sticker.premiumLock; ValidatePremiumLockBg(image, frame); - return image; +} + +void StickersListWidget::validatePremiumStar() { + ValidatePremiumStarFg(_premiumStar); } int StickersListWidget::stickersRight() const { diff --git a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.h b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.h index 5b12772917..73269ab6ce 100644 --- a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.h +++ b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.h @@ -317,10 +317,8 @@ private: void addSearchRow(not_null set); void showPreview(); - const QImage &validatePremiumLock( - Set &set, - int index, - const QImage &frame); + void validatePremiumLock(Set &set, int index, const QImage &frame); + void validatePremiumStar(); Ui::MessageSendingAnimationFrom messageSentAnimationInfo( int section, @@ -357,6 +355,7 @@ private: int _rowsLeft = 0; int _columnCount = 1; QSize _singleSize; + QImage _premiumStar; OverState _selected; OverState _pressed;