From bf286cf17593367933904ede2a296354b9c19b43 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 18 Jul 2022 17:15:27 +0300 Subject: [PATCH] Show "Unlock emoji" button for premium sets. --- .../SourceFiles/boxes/premium_preview_box.cpp | 50 +++++++++---------- .../SourceFiles/boxes/premium_preview_box.h | 7 +++ .../SourceFiles/boxes/sticker_set_box.cpp | 47 +++++++++++++---- .../SourceFiles/settings/settings_premium.cpp | 1 + 4 files changed, 70 insertions(+), 35 deletions(-) diff --git a/Telegram/SourceFiles/boxes/premium_preview_box.cpp b/Telegram/SourceFiles/boxes/premium_preview_box.cpp index 875c3576d..78c985c0b 100644 --- a/Telegram/SourceFiles/boxes/premium_preview_box.cpp +++ b/Telegram/SourceFiles/boxes/premium_preview_box.cpp @@ -1159,31 +1159,6 @@ void ReactionPreview::paintEffect(QPainter &p) { return CreateGradientButton(parent, Ui::Premium::ButtonGradientStops()); } -[[nodiscard]] object_ptr CreateUnlockButton( - QWidget *parent, - rpl::producer text) { - auto result = CreatePremiumButton(parent); - const auto &st = st::premiumPreviewBox.button; - result->resize(result->width(), st.height); - - const auto label = Ui::CreateChild( - result.data(), - std::move(text), - st::premiumPreviewButtonLabel); - label->setAttribute(Qt::WA_TransparentForMouseEvents); - rpl::combine( - result->widthValue(), - label->widthValue() - ) | rpl::start_with_next([=](int outer, int width) { - label->moveToLeft( - (outer - width) / 2, - st::premiumPreviewBox.button.textTop, - outer); - }, label->lifetime()); - - return result; -} - [[nodiscard]] object_ptr CreateSwitch( not_null parent, not_null*> selected) { @@ -1793,3 +1768,28 @@ void DoubledLimitsPreviewBox( }); Ui::Premium::ShowListBox(box, std::move(entries)); } + +object_ptr CreateUnlockButton( + QWidget *parent, + rpl::producer text) { + auto result = CreatePremiumButton(parent); + const auto &st = st::premiumPreviewBox.button; + result->resize(result->width(), st.height); + + const auto label = Ui::CreateChild( + result.data(), + std::move(text), + st::premiumPreviewButtonLabel); + label->setAttribute(Qt::WA_TransparentForMouseEvents); + rpl::combine( + result->widthValue(), + label->widthValue() + ) | rpl::start_with_next([=](int outer, int width) { + label->moveToLeft( + (outer - width) / 2, + st::premiumPreviewBox.button.textTop, + outer); + }, label->lifetime()); + + return result; +} diff --git a/Telegram/SourceFiles/boxes/premium_preview_box.h b/Telegram/SourceFiles/boxes/premium_preview_box.h index 1c242ebc8..a40bcae99 100644 --- a/Telegram/SourceFiles/boxes/premium_preview_box.h +++ b/Telegram/SourceFiles/boxes/premium_preview_box.h @@ -7,10 +7,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once +#include "base/object_ptr.h" + class DocumentData; namespace Ui { class GenericBox; +class GradientButton; } // namespace Ui namespace Window { @@ -60,3 +63,7 @@ void ShowPremiumPreviewToBuy( Fn hiddenCallback); void PremiumUnavailableBox(not_null box); + +[[nodiscard]] object_ptr CreateUnlockButton( + QWidget *parent, + rpl::producer text); diff --git a/Telegram/SourceFiles/boxes/sticker_set_box.cpp b/Telegram/SourceFiles/boxes/sticker_set_box.cpp index 04b63d665..2675fd017 100644 --- a/Telegram/SourceFiles/boxes/sticker_set_box.cpp +++ b/Telegram/SourceFiles/boxes/sticker_set_box.cpp @@ -15,12 +15,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "menu/menu_send.h" #include "lang/lang_keys.h" #include "ui/boxes/confirm_box.h" +#include "boxes/premium_preview_box.h" #include "core/application.h" #include "mtproto/sender.h" #include "storage/storage_account.h" #include "dialogs/ui/dialogs_layout.h" #include "ui/widgets/buttons.h" #include "ui/widgets/scroll_area.h" +#include "ui/widgets/gradient_round_button.h" #include "ui/image/image.h" #include "ui/image/image_location_factory.h" #include "ui/text/text_utilities.h" @@ -35,6 +37,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "media/clip/media_clip_reader.h" #include "window/window_session_controller.h" #include "window/window_controller.h" +#include "settings/settings_premium.h" #include "base/unixtime.h" #include "main/main_session.h" #include "apiwrap.h" @@ -46,6 +49,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_chat_helpers.h" #include "styles/style_info.h" #include "styles/style_menu_icons.h" +#include "styles/style_premium.h" #include #include @@ -113,9 +117,10 @@ public: not_null controller, const StickerSetIdentifier &set); - bool loaded() const; - bool notInstalled() const; - bool official() const; + [[nodiscard]] bool loaded() const; + [[nodiscard]] bool notInstalled() const; + [[nodiscard]] bool premiumEmojiSet() const; + [[nodiscard]] bool official() const; [[nodiscard]] rpl::producer title() const; [[nodiscard]] QString shortName() const; [[nodiscard]] bool isEmojiSet() const; @@ -379,13 +384,29 @@ void StickerSetBox::updateButtons() { : tr::lng_stickers_copied(tr::now))); }; if (_inner->notInstalled()) { - auto addText = (type == Data::StickersType::Emoji) - ? tr::lng_stickers_add_emoji() - : (type == Data::StickersType::Masks) - ? tr::lng_stickers_add_masks() - : tr::lng_stickers_add_pack(); - addButton(std::move(addText), [=] { addStickers(); }); - addButton(tr::lng_cancel(), [=] { closeBox(); }); + if (!_controller->session().premium() + && _controller->session().premiumPossible() + && _inner->premiumEmojiSet()) { + setStyle(st::premiumPreviewBox); + auto button = CreateUnlockButton( + this, + tr::lng_premium_unlock_emoji()); + button->resizeToWidth(st::boxWideWidth + - st::premiumPreviewBox.buttonPadding.left() + - st::premiumPreviewBox.buttonPadding.left()); + button->setClickedCallback([=] { + Settings::ShowPremium(_controller, u"animated_emoji"_q); + }); + addButton(std::move(button)); + } else { + auto addText = (type == Data::StickersType::Emoji) + ? tr::lng_stickers_add_emoji() + : (type == Data::StickersType::Masks) + ? tr::lng_stickers_add_masks() + : tr::lng_stickers_add_pack(); + addButton(std::move(addText), [=] { addStickers(); }); + addButton(tr::lng_cancel(), [=] { closeBox(); }); + } if (!_inner->shortName().isEmpty()) { const auto top = addTopButton(st::infoTopBarMenu); @@ -1119,6 +1140,12 @@ bool StickerSetBox::Inner::loaded() const { return _loaded && !_pack.isEmpty(); } +bool StickerSetBox::Inner::premiumEmojiSet() const { + return (_setFlags & SetFlag::Emoji) + && !_pack.empty() + && _pack.front()->isPremiumEmoji(); +} + bool StickerSetBox::Inner::notInstalled() const { if (!_loaded) { return false; diff --git a/Telegram/SourceFiles/settings/settings_premium.cpp b/Telegram/SourceFiles/settings/settings_premium.cpp index a172958e2..4bc412e64 100644 --- a/Telegram/SourceFiles/settings/settings_premium.cpp +++ b/Telegram/SourceFiles/settings/settings_premium.cpp @@ -73,6 +73,7 @@ using Order = std::vector; u"no_ads"_q, u"unique_reactions"_q, u"premium_stickers"_q, + u"animated_emoji"_q, u"advanced_chat_management"_q, u"profile_badge"_q, u"animated_userpics"_q,