Mark premium stickers with a star.
This commit is contained in:
parent
b42f2784ab
commit
0ce7e402ed
|
@ -56,6 +56,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
|
|
||||||
#include <QtWidgets/QApplication>
|
#include <QtWidgets/QApplication>
|
||||||
#include <QtGui/QClipboard>
|
#include <QtGui/QClipboard>
|
||||||
|
#include <QtSvg/QSvgRenderer>
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
@ -203,7 +204,9 @@ private:
|
||||||
not_null<Lottie::MultiPlayer*> getLottiePlayer();
|
not_null<Lottie::MultiPlayer*> getLottiePlayer();
|
||||||
|
|
||||||
void showPreview();
|
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 updateItems();
|
||||||
void repaintItems(crl::time now = 0);
|
void repaintItems(crl::time now = 0);
|
||||||
|
|
||||||
|
@ -235,6 +238,7 @@ private:
|
||||||
|
|
||||||
const std::unique_ptr<Ui::PathShiftGradient> _pathGradient;
|
const std::unique_ptr<Ui::PathShiftGradient> _pathGradient;
|
||||||
mutable QImage _premiumLockGray;
|
mutable QImage _premiumLockGray;
|
||||||
|
mutable QImage _premiumStar;
|
||||||
|
|
||||||
int _visibleTop = 0;
|
int _visibleTop = 0;
|
||||||
int _visibleBottom = 0;
|
int _visibleBottom = 0;
|
||||||
|
@ -569,6 +573,7 @@ StickerSetBox::Inner::Inner(
|
||||||
style::PaletteChanged(
|
style::PaletteChanged(
|
||||||
) | rpl::start_with_next([=] {
|
) | rpl::start_with_next([=] {
|
||||||
_premiumLockGray = QImage();
|
_premiumLockGray = QImage();
|
||||||
|
_premiumStar = QImage();
|
||||||
}, lifetime());
|
}, lifetime());
|
||||||
|
|
||||||
setMouseTracking(true);
|
setMouseTracking(true);
|
||||||
|
@ -932,13 +937,16 @@ void StickerSetBox::Inner::showPreview() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const QImage &StickerSetBox::Inner::validatePremiumLock(
|
void StickerSetBox::Inner::validatePremiumLock(
|
||||||
int index,
|
int index,
|
||||||
const QImage &frame) const {
|
const QImage &frame) const {
|
||||||
auto &element = _elements[index];
|
auto &element = _elements[index];
|
||||||
auto &image = frame.isNull() ? _premiumLockGray : element.premiumLock;
|
auto &image = frame.isNull() ? _premiumLockGray : element.premiumLock;
|
||||||
ValidatePremiumLockBg(image, frame);
|
ValidatePremiumLockBg(image, frame);
|
||||||
return image;
|
}
|
||||||
|
|
||||||
|
void StickerSetBox::Inner::validatePremiumStar() const {
|
||||||
|
ValidatePremiumStarFg(_premiumStar);
|
||||||
}
|
}
|
||||||
|
|
||||||
not_null<Lottie::MultiPlayer*> StickerSetBox::Inner::getLottiePlayer() {
|
not_null<Lottie::MultiPlayer*> StickerSetBox::Inner::getLottiePlayer() {
|
||||||
|
@ -1167,8 +1175,7 @@ void StickerSetBox::Inner::paintSticker(
|
||||||
const auto document = element.document;
|
const auto document = element.document;
|
||||||
const auto &media = element.documentMedia;
|
const auto &media = element.documentMedia;
|
||||||
const auto sticker = document->sticker();
|
const auto sticker = document->sticker();
|
||||||
const auto locked = document->isPremiumSticker()
|
const auto premium = document->isPremiumSticker();
|
||||||
&& !_controller->session().premium();
|
|
||||||
media->checkStickerSmall();
|
media->checkStickerSmall();
|
||||||
|
|
||||||
if (sticker->setType == Data::StickersType::Emoji) {
|
if (sticker->setType == Data::StickersType::Emoji) {
|
||||||
|
@ -1220,19 +1227,26 @@ void StickerSetBox::Inner::paintSticker(
|
||||||
QRect(ppos, size),
|
QRect(ppos, size),
|
||||||
_pathGradient.get());
|
_pathGradient.get());
|
||||||
}
|
}
|
||||||
if (locked) {
|
if (premium) {
|
||||||
validatePremiumLock(index, lottieFrame);
|
validatePremiumLock(index, lottieFrame);
|
||||||
const auto &bg = lottieFrame.isNull()
|
const auto &bg = lottieFrame.isNull()
|
||||||
? _premiumLockGray
|
? _premiumLockGray
|
||||||
: element.premiumLock;
|
: element.premiumLock;
|
||||||
const auto factor = style::DevicePixelRatio();
|
const auto factor = style::DevicePixelRatio();
|
||||||
const auto radius = st::roundRadiusSmall;
|
const auto radius = st::roundRadiusSmall;
|
||||||
|
const auto amPremium = _controller->session().premium();
|
||||||
const auto point = position + QPoint(
|
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);
|
_singleSize.height() - (bg.height() / factor) - radius);
|
||||||
p.drawImage(point, bg);
|
p.drawImage(point, bg);
|
||||||
|
if (amPremium) {
|
||||||
st::stickersPremiumLock.paint(p, point, width());
|
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));
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -65,3 +65,4 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
void ValidatePremiumLockBg(QImage &image, const QImage &frame);
|
void ValidatePremiumLockBg(QImage &image, const QImage &frame);
|
||||||
|
void ValidatePremiumStarFg(QImage &image);
|
||||||
|
|
|
@ -221,6 +221,7 @@ StickersListWidget::StickersListWidget(
|
||||||
style::PaletteChanged(
|
style::PaletteChanged(
|
||||||
) | rpl::start_with_next([=] {
|
) | rpl::start_with_next([=] {
|
||||||
_premiumLockGray = QImage();
|
_premiumLockGray = QImage();
|
||||||
|
_premiumStar = QImage();
|
||||||
}, lifetime());
|
}, lifetime());
|
||||||
|
|
||||||
Data::AmPremiumValue(
|
Data::AmPremiumValue(
|
||||||
|
@ -1282,7 +1283,7 @@ void StickersListWidget::paintSticker(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto locked = document->isPremiumSticker() && !session().premium();
|
const auto premium = document->isPremiumSticker();
|
||||||
const auto isLottie = document->sticker()->isLottie();
|
const auto isLottie = document->sticker()->isLottie();
|
||||||
const auto isWebm = document->sticker()->isWebm();
|
const auto isWebm = document->sticker()->isWebm();
|
||||||
if (isLottie
|
if (isLottie
|
||||||
|
@ -1350,7 +1351,7 @@ void StickersListWidget::paintSticker(
|
||||||
sticker.savedFrame = pixmap;
|
sticker.savedFrame = pixmap;
|
||||||
sticker.savedFrameFor = _singleSize;
|
sticker.savedFrameFor = _singleSize;
|
||||||
}
|
}
|
||||||
if (locked) {
|
if (premium) {
|
||||||
lottieFrame = pixmap.toImage().convertToFormat(
|
lottieFrame = pixmap.toImage().convertToFormat(
|
||||||
QImage::Format_ARGB32_Premultiplied);
|
QImage::Format_ARGB32_Premultiplied);
|
||||||
}
|
}
|
||||||
|
@ -1373,30 +1374,40 @@ void StickersListWidget::paintSticker(
|
||||||
p.setOpacity(1.);
|
p.setOpacity(1.);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (locked) {
|
if (premium) {
|
||||||
validatePremiumLock(set, index, lottieFrame);
|
validatePremiumLock(set, index, lottieFrame);
|
||||||
const auto &bg = lottieFrame.isNull()
|
const auto &bg = lottieFrame.isNull()
|
||||||
? _premiumLockGray
|
? _premiumLockGray
|
||||||
: sticker.premiumLock;
|
: sticker.premiumLock;
|
||||||
const auto factor = style::DevicePixelRatio();
|
const auto factor = style::DevicePixelRatio();
|
||||||
const auto radius = st::roundRadiusSmall;
|
const auto radius = st::roundRadiusSmall;
|
||||||
|
const auto amPremium = session().premium();
|
||||||
const auto point = pos + QPoint(
|
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);
|
_singleSize.height() - (bg.height() / factor) - radius);
|
||||||
p.drawImage(point, bg);
|
p.drawImage(point, bg);
|
||||||
|
if (amPremium) {
|
||||||
st::stickersPremiumLock.paint(p, point, width());
|
validatePremiumStar();
|
||||||
|
p.drawImage(point, _premiumStar);
|
||||||
|
} else {
|
||||||
|
st::stickersPremiumLock.paint(p, point, width());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const QImage &StickersListWidget::validatePremiumLock(
|
void StickersListWidget::validatePremiumLock(
|
||||||
Set &set,
|
Set &set,
|
||||||
int index,
|
int index,
|
||||||
const QImage &frame) {
|
const QImage &frame) {
|
||||||
auto &sticker = set.stickers[index];
|
auto &sticker = set.stickers[index];
|
||||||
auto &image = frame.isNull() ? _premiumLockGray : sticker.premiumLock;
|
auto &image = frame.isNull() ? _premiumLockGray : sticker.premiumLock;
|
||||||
ValidatePremiumLockBg(image, frame);
|
ValidatePremiumLockBg(image, frame);
|
||||||
return image;
|
}
|
||||||
|
|
||||||
|
void StickersListWidget::validatePremiumStar() {
|
||||||
|
ValidatePremiumStarFg(_premiumStar);
|
||||||
}
|
}
|
||||||
|
|
||||||
int StickersListWidget::stickersRight() const {
|
int StickersListWidget::stickersRight() const {
|
||||||
|
|
|
@ -317,10 +317,8 @@ private:
|
||||||
void addSearchRow(not_null<Data::StickersSet*> set);
|
void addSearchRow(not_null<Data::StickersSet*> set);
|
||||||
|
|
||||||
void showPreview();
|
void showPreview();
|
||||||
const QImage &validatePremiumLock(
|
void validatePremiumLock(Set &set, int index, const QImage &frame);
|
||||||
Set &set,
|
void validatePremiumStar();
|
||||||
int index,
|
|
||||||
const QImage &frame);
|
|
||||||
|
|
||||||
Ui::MessageSendingAnimationFrom messageSentAnimationInfo(
|
Ui::MessageSendingAnimationFrom messageSentAnimationInfo(
|
||||||
int section,
|
int section,
|
||||||
|
@ -357,6 +355,7 @@ private:
|
||||||
int _rowsLeft = 0;
|
int _rowsLeft = 0;
|
||||||
int _columnCount = 1;
|
int _columnCount = 1;
|
||||||
QSize _singleSize;
|
QSize _singleSize;
|
||||||
|
QImage _premiumStar;
|
||||||
|
|
||||||
OverState _selected;
|
OverState _selected;
|
||||||
OverState _pressed;
|
OverState _pressed;
|
||||||
|
|
Loading…
Reference in New Issue