diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 7733927a0..bd5eef6f4 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1592,6 +1592,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_stickers" = "Group stickers"; "lng_group_stickers_description" = "You can choose a sticker set which will be available for every member while in the group chat."; "lng_group_stickers_add" = "Choose sticker set"; +"lng_premium_stickers" = "Premium stickers"; +"lng_premium_unlock_button" = "Unlock Premium Stickers"; +"lng_premium_unlock_about" = "Unlock this sticker and more by subscribing to Telegram Premium."; "lng_group_about_header" = "You have created a group."; "lng_group_about_text" = "Groups can have:"; diff --git a/Telegram/SourceFiles/chat_helpers/chat_helpers.style b/Telegram/SourceFiles/chat_helpers/chat_helpers.style index ebf4ff8c8..90d391476 100644 --- a/Telegram/SourceFiles/chat_helpers/chat_helpers.style +++ b/Telegram/SourceFiles/chat_helpers/chat_helpers.style @@ -96,6 +96,7 @@ stickersTrendingUnread: icon { }; stickersRecent: icon {{ "emoji/stickers_recent", emojiIconFg }}; stickersSearch: icon {{ "emoji/stickers_search", emojiIconFg }}; +stickersPremium: icon {{ "emoji/stickers_search", emojiIconFg }}; stickersSettingsUnreadSize: 6px; stickersSettingsUnreadPosition: point(6px, 10px); diff --git a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp index 06df4c3a2..09c992013 100644 --- a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp @@ -1044,6 +1044,8 @@ void StickersListWidget::Footer::paintSetIcon( return session->data().stickers().featuredSetsUnreadCount() ? &st::stickersTrendingUnread : &st::stickersTrending; + } else if (icon.setId == Data::Stickers::PremiumSetId) { + return &st::stickersPremium; //} else if (setId == Stickers::FavedSetId) { // return &st::stickersFaved; } @@ -2318,6 +2320,15 @@ void StickersListWidget::paintSticker( st::stickerPanDeleteIconFg.paint(p, xPos, width()); p.setOpacity(1.); } + + if (document->isPremiumSticker()) { + const auto point = pos + + QPoint( + _singleSize.width() - st::stickerPanDeleteIconBg.width(), + _singleSize.height() - st::stickerPanDeleteIconBg.height()); + st::stickerPanDeleteIconBg.paint(p, point, width()); + st::stickerPanDeleteIconFg.paint(p, point, width()); + } } int StickersListWidget::stickersRight() const { @@ -2786,13 +2797,28 @@ void StickersListWidget::refreshMySets() { _favedStickersMap.clear(); _mySets.reserve(defaultSetsOrder().size() + 3); + refreshPremiumStickers(); refreshFavedStickers(); refreshRecentStickers(false); refreshMegagroupStickers(GroupStickersPlace::Visible); + + _premiumsIndex = -1; + for (auto i = 0, count = int(_mySets.size()); i != count; ++i) { + if (_mySets[i].id == Data::Stickers::PremiumSetId) { + _premiumsIndex = i; + } + } + for (const auto setId : defaultSetsOrder()) { const auto externalLayout = false; appendSet(_mySets, setId, externalLayout, AppendSkip::Archived); } + + if (_premiumsIndex >= 0 && _mySets[_premiumsIndex].stickers.empty()) { + _mySets.erase(_mySets.begin() + _premiumsIndex); + _premiumsIndex = -1; + } + refreshMegagroupStickers(GroupStickersPlace::Hidden); takeHeavyData(_mySets, wasSets); @@ -2925,6 +2951,15 @@ bool StickersListWidget::appendSet( PrepareStickers((set->stickers.empty() && externalLayout) ? set->covers : set->stickers)); + if (!externalLayout && _premiumsIndex >= 0) { + for (const auto &sticker : to.back().stickers) { + const auto document = sticker.document; + if (document->isPremiumSticker()) { + to[_premiumsIndex].stickers.push_back(Sticker{ document }); + } + ++to[_premiumsIndex].count; + } + } return true; } @@ -3034,6 +3069,25 @@ void StickersListWidget::refreshRecentStickers(bool performResize) { } } +void StickersListWidget::refreshPremiumStickers() { + if (_isMasks) { + return; + } + clearSelection(); + const auto externalLayout = false; + const auto shortName = QString(); + const auto count = 0; + _mySets.insert(_mySets.begin(), Set{ + Data::Stickers::PremiumSetId, + nullptr, + (SetFlag::Official | SetFlag::Special), + tr::lng_premium_stickers(tr::now), + shortName, + count, + externalLayout + }); +} + void StickersListWidget::refreshFavedStickers() { if (_isMasks) { return; @@ -3169,6 +3223,10 @@ std::vector StickersListWidget::fillIcons() { result.emplace_back(Data::Stickers::RecentSetId); } } + if (i != _mySets.size() && _mySets[i].id == Data::Stickers::PremiumSetId) { + ++i; + result.emplace_back(Data::Stickers::PremiumSetId); + } for (auto l = _mySets.size(); i != l; ++i) { if (_mySets[i].id == Data::Stickers::MegagroupSetId) { result.emplace_back(Data::Stickers::MegagroupSetId); diff --git a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.h b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.h index 8c744f650..3fcbee7b4 100644 --- a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.h +++ b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.h @@ -220,6 +220,7 @@ private: bool stickerHasDeleteButton(const Set &set, int index) const; std::vector collectRecentStickers(); void refreshRecentStickers(bool resize = true); + void refreshPremiumStickers(); void refreshFavedStickers(); enum class GroupStickersPlace { Visible, @@ -341,6 +342,7 @@ private: std::vector _mySets; std::vector _officialSets; std::vector _searchSets; + int _premiumsIndex = -1; int _featuredSetsCount = 0; base::flat_set _installedLocallySets; std::vector _custom; diff --git a/Telegram/SourceFiles/data/stickers/data_stickers.h b/Telegram/SourceFiles/data/stickers/data_stickers.h index b381e0b49..2347e895d 100644 --- a/Telegram/SourceFiles/data/stickers/data_stickers.h +++ b/Telegram/SourceFiles/data/stickers/data_stickers.h @@ -38,6 +38,7 @@ public: static constexpr auto RecentSetId = 0xFFFFFFFFFFFFFFFEULL; static constexpr auto NoneSetId = 0xFFFFFFFFFFFFFFFDULL; static constexpr auto FeaturedSetId = 0xFFFFFFFFFFFFFFFBULL; + static constexpr auto PremiumSetId = 0xFFFFFFFFFFFFFFF8ULL; // For cloud-stored recent stickers. static constexpr auto CloudRecentSetId = 0xFFFFFFFFFFFFFFFCULL;