Added ministars to button in service messages for gifts.

This commit is contained in:
23rd 2024-10-18 06:33:55 +03:00 committed by John Preston
parent a8a1b08127
commit 7f20cf59d1
6 changed files with 52 additions and 2 deletions

View file

@ -151,6 +151,10 @@ rpl::producer<QString> PremiumGift::button() {
: tr::lng_prize_open(); : tr::lng_prize_open();
} }
bool PremiumGift::buttonMinistars() {
return true;
}
ClickHandlerPtr PremiumGift::createViewLink() { ClickHandlerPtr PremiumGift::createViewLink() {
if (starGift() && outgoingGift()) { if (starGift() && outgoingGift()) {
return nullptr; return nullptr;

View file

@ -29,6 +29,7 @@ public:
QString title() override; QString title() override;
TextWithEntities subtitle() override; TextWithEntities subtitle() override;
rpl::producer<QString> button() override; rpl::producer<QString> button() override;
bool buttonMinistars() override;
QString cornerTagText() override; QString cornerTagText() override;
int buttonSkip() override; int buttonSkip() override;
void draw( void draw(

View file

@ -16,9 +16,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "lang/lang_keys.h" #include "lang/lang_keys.h"
#include "ui/chat/chat_style.h" #include "ui/chat/chat_style.h"
#include "ui/effects/animation_value.h" #include "ui/effects/animation_value.h"
#include "ui/effects/premium_stars_colored.h"
#include "ui/effects/ripple_animation.h" #include "ui/effects/ripple_animation.h"
#include "ui/text/text_utilities.h" #include "ui/text/text_utilities.h"
#include "ui/painter.h" #include "ui/painter.h"
#include "ui/rect.h"
#include "ui/power_saving.h" #include "ui/power_saving.h"
#include "styles/style_chat.h" #include "styles/style_chat.h"
#include "styles/style_premium.h" #include "styles/style_premium.h"
@ -98,6 +100,12 @@ ServiceBox::ServiceBox(
} }
}, _lifetime); }, _lifetime);
} }
if (_content->buttonMinistars()) {
_button.stars = std::make_unique<Ui::Premium::ColoredMiniStars>(
[=](const QRect &) { repaint(); },
Ui::Premium::MiniStars::Type::SlowStars);
_button.lastFg = std::make_unique<QColor>();
}
} }
ServiceBox::~ServiceBox() = default; ServiceBox::~ServiceBox() = default;
@ -117,7 +125,21 @@ void ServiceBox::draw(Painter &p, const PaintContext &context) const {
const auto radius = st::msgServiceGiftBoxRadius; const auto radius = st::msgServiceGiftBoxRadius;
p.setPen(Qt::NoPen); p.setPen(Qt::NoPen);
p.setBrush(context.st->msgServiceBg()); p.setBrush(context.st->msgServiceBg());
p.drawRoundedRect(QRect(QPoint(), _innerSize), radius, radius); p.drawRoundedRect(Rect(_innerSize), radius, radius);
if (_button.stars) {
const auto &c = context.st->msgServiceFg()->c;
if ((*_button.lastFg) != c) {
_button.lastFg->setRgb(c.red(), c.green(), c.blue());
const auto padding = _button.size.height() / 2;
_button.stars->setColorOverride(QGradientStops{
{ 0., anim::with_alpha(c, .3) },
{ 1., c },
});
_button.stars->setCenter(
Rect(_button.size) - QMargins(padding, 0, padding, 0));
}
}
const auto content = contentRect(); const auto content = contentRect();
auto top = content.top() + content.height(); auto top = content.top() + content.height();
@ -340,7 +362,15 @@ bool ServiceBox::Button::empty() const {
void ServiceBox::Button::drawBg(QPainter &p) const { void ServiceBox::Button::drawBg(QPainter &p) const {
const auto radius = size.height() / 2.; const auto radius = size.height() / 2.;
p.drawRoundedRect(0, 0, size.width(), size.height(), radius, radius); const auto r = Rect(size);
p.drawRoundedRect(r, radius, radius);
if (stars) {
auto clipPath = QPainterPath();
clipPath.addRoundedRect(r, radius, radius);
p.setClipPath(clipPath);
stars->paint(p);
p.setClipping(false);
}
} }
} // namespace HistoryView } // namespace HistoryView

View file

@ -11,6 +11,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
namespace Ui { namespace Ui {
class RippleAnimation; class RippleAnimation;
namespace Premium {
class ColoredMiniStars;
} // namespace Premium
} // namespace Ui } // namespace Ui
namespace HistoryView { namespace HistoryView {
@ -28,6 +31,9 @@ public:
return top(); return top();
} }
[[nodiscard]] virtual rpl::producer<QString> button() = 0; [[nodiscard]] virtual rpl::producer<QString> button() = 0;
[[nodiscard]] virtual bool buttonMinistars() {
return false;
}
[[nodiscard]] virtual QString cornerTagText() { [[nodiscard]] virtual QString cornerTagText() {
return {}; return {};
} }
@ -106,6 +112,8 @@ private:
ClickHandlerPtr link; ClickHandlerPtr link;
std::unique_ptr<Ui::RippleAnimation> ripple; std::unique_ptr<Ui::RippleAnimation> ripple;
std::unique_ptr<Ui::Premium::ColoredMiniStars> stars;
std::unique_ptr<QColor> lastFg;
mutable QPoint lastPoint; mutable QPoint lastPoint;
} _button; } _button;

View file

@ -27,6 +27,12 @@ ColoredMiniStars::ColoredMiniStars(
type) { type) {
} }
ColoredMiniStars::ColoredMiniStars(
Fn<void(const QRect &)> update,
MiniStars::Type type)
: _ministars(update, true, type) {
}
void ColoredMiniStars::setSize(const QSize &size) { void ColoredMiniStars::setSize(const QSize &size) {
_frame = QImage( _frame = QImage(
size * style::DevicePixelRatio(), size * style::DevicePixelRatio(),

View file

@ -21,6 +21,7 @@ public:
not_null<Ui::RpWidget*> parent, not_null<Ui::RpWidget*> parent,
bool optimizeUpdate, bool optimizeUpdate,
MiniStars::Type type = MiniStars::Type::MonoStars); MiniStars::Type type = MiniStars::Type::MonoStars);
ColoredMiniStars(Fn<void(const QRect &)> update, MiniStars::Type type);
void setSize(const QSize &size); void setSize(const QSize &size);
void setPosition(QPoint position); void setPosition(QPoint position);