diff --git a/Telegram/SourceFiles/boxes/premium_preview_box.cpp b/Telegram/SourceFiles/boxes/premium_preview_box.cpp index 5d086001e..3f73ad166 100644 --- a/Telegram/SourceFiles/boxes/premium_preview_box.cpp +++ b/Telegram/SourceFiles/boxes/premium_preview_box.cpp @@ -52,7 +52,6 @@ namespace { constexpr auto kPremiumShift = 21. / 240; constexpr auto kReactionsPerRow = 5; constexpr auto kDisabledOpacity = 0.5; -constexpr auto kPreviewsCount = int(PremiumPreview::kCount); constexpr auto kToggleStickerTimeout = 2 * crl::time(1000); constexpr auto kStarOpacityOff = 0.1; constexpr auto kStarOpacityOn = 1.; @@ -744,19 +743,21 @@ struct VideoPreviewDocument { [[nodiscard]] object_ptr CreateSwitch( not_null parent, - not_null*> selected) { + not_null*> selected, + std::vector order) { const auto padding = st::premiumDotPadding; const auto width = padding.left() + st::premiumDot + padding.right(); const auto height = padding.top() + st::premiumDot + padding.bottom(); const auto stops = Ui::Premium::ButtonGradientStops(); auto result = object_ptr(parent.get(), height); const auto raw = result.data(); - for (auto i = 0; i != kPreviewsCount; ++i) { - const auto section = PremiumPreview(i); + const auto count = order.size(); + for (auto i = 0; i != count; ++i) { + const auto section = order[i]; const auto button = Ui::CreateChild(raw); parent->widthValue( ) | rpl::start_with_next([=](int outer) { - const auto full = width * kPreviewsCount; + const auto full = width * count; const auto left = (outer - full) / 2 + (i * width); button->setGeometry(left, 0, width, height); }, button->lifetime()); @@ -770,7 +771,7 @@ struct VideoPreviewDocument { p.setBrush((selected->current() == section) ? anim::gradient_color_at( stops, - float64(i) / (kPreviewsCount - 1)) + float64(i) / (count - 1)) : st::windowBgRipple->c); p.setPen(Qt::NoPen); p.drawEllipse( @@ -815,15 +816,23 @@ void PreviewBox( Fn preload; std::vector hiding; rpl::variable selected; + std::vector order; }; const auto state = outer->lifetime().make_state(); state->selected = descriptor.section; + state->order = Settings::PremiumPreviewOrder(&controller->session()); + + const auto index = [=](PremiumPreview section) { + const auto it = ranges::find(state->order, section); + return (it == end(state->order)) + ? 0 + : std::distance(begin(state->order), it); + }; const auto move = [=](int delta) { - using Type = PremiumPreview; - const auto count = int(Type::kCount); + const auto count = int(state->order.size()); const auto now = state->selected.current(); - state->selected = Type((int(now) + count + delta) % count); + state->selected = state->order[(index(now) + count + delta) % count]; }; const auto buttonsParent = box->verticalLayout().get(); @@ -912,7 +921,7 @@ void PreviewBox( } }; animationCallback(); - const auto toLeft = int(now) > int(was); + const auto toLeft = index(now) > index(was); auto start = state->content->x() + (toLeft ? single : -single); for (const auto &hiding : state->hiding) { const auto left = hiding.widget->x(); @@ -955,14 +964,10 @@ void PreviewBox( }, outer->lifetime()); auto title = state->selected.value( - ) | rpl::map([=](PremiumPreview section) { - return SectionTitle(section); - }) | rpl::flatten_latest(); + ) | rpl::map(SectionTitle) | rpl::flatten_latest(); auto text = state->selected.value( - ) | rpl::map([=](PremiumPreview section) { - return SectionAbout(section); - }) | rpl::flatten_latest(); + ) | rpl::map(SectionAbout) | rpl::flatten_latest(); const auto padding = st::premiumPreviewAboutPadding; const auto available = size.width() - padding.left() - padding.right(); @@ -985,7 +990,7 @@ void PreviewBox( object_ptr>(box, std::move(textLabel)), padding); box->addRow( - CreateSwitch(box->verticalLayout(), &state->selected), + CreateSwitch(box->verticalLayout(), &state->selected, state->order), st::premiumDotsMargin); const auto showFinished = [=] { state->showFinished = true; diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index a5a235b02..f24843524 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -3910,7 +3910,8 @@ void HistoryItem::setServiceMessageByAction(const MTPmessageAction &action) { return result; }; - auto prepareAttachMenuBotAllowed = [this](const MTPDmessageActionAttachMenuBotAllowed &action) { + auto prepareAttachMenuBotAllowed = []( + const MTPDmessageActionAttachMenuBotAllowed &action) { return PreparedServiceText{ { tr::lng_action_attach_menu_bot_allowed(tr::now) } }; diff --git a/Telegram/SourceFiles/settings/settings_premium.cpp b/Telegram/SourceFiles/settings/settings_premium.cpp index 5b5469ebd..694f5a9a4 100644 --- a/Telegram/SourceFiles/settings/settings_premium.cpp +++ b/Telegram/SourceFiles/settings/settings_premium.cpp @@ -1840,4 +1840,41 @@ not_null CreateSubscribeButton( return result; } +[[nodiscard]] std::vector PremiumPreviewOrder( + not_null session) { + const auto mtpOrder = session->account().appConfig().get( + "premium_promo_order", + FallbackOrder()); + return ranges::views::all( + mtpOrder + ) | ranges::views::transform([](const QString &s) { + if (s == u"more_upload"_q) { + return PremiumPreview::MoreUpload; + } else if (s == u"faster_download"_q) { + return PremiumPreview::FasterDownload; + } else if (s == u"voice_to_text"_q) { + return PremiumPreview::VoiceToText; + } else if (s == u"no_ads"_q) { + return PremiumPreview::NoAds; + } else if (s == u"emoji_status"_q) { + return PremiumPreview::EmojiStatus; + } else if (s == u"infinite_reactions"_q) { + return PremiumPreview::InfiniteReactions; + } else if (s == u"premium_stickers"_q) { + return PremiumPreview::Stickers; + } else if (s == u"animated_emoji"_q) { + return PremiumPreview::AnimatedEmoji; + } else if (s == u"advanced_chat_management"_q) { + return PremiumPreview::AdvancedChatManagement; + } else if (s == u"profile_badge"_q) { + return PremiumPreview::ProfileBadge; + } else if (s == u"animated_userpics"_q) { + return PremiumPreview::AnimatedUserpics; + } + return PremiumPreview::kCount; + }) | ranges::views::filter([](PremiumPreview type) { + return (type != PremiumPreview::kCount); + }) | ranges::to_vector; +} + } // namespace Settings diff --git a/Telegram/SourceFiles/settings/settings_premium.h b/Telegram/SourceFiles/settings/settings_premium.h index e66c294f4..2ce4aba67 100644 --- a/Telegram/SourceFiles/settings/settings_premium.h +++ b/Telegram/SourceFiles/settings/settings_premium.h @@ -59,6 +59,9 @@ struct SubscribeButtonArgs final { [[nodiscard]] not_null CreateSubscribeButton( SubscribeButtonArgs &&args); +[[nodiscard]] std::vector PremiumPreviewOrder( + not_null<::Main::Session*> session); + } // namespace Settings diff --git a/Telegram/SourceFiles/ui/effects/premium_graphics.cpp b/Telegram/SourceFiles/ui/effects/premium_graphics.cpp index 104c2166c..077b8cec6 100644 --- a/Telegram/SourceFiles/ui/effects/premium_graphics.cpp +++ b/Telegram/SourceFiles/ui/effects/premium_graphics.cpp @@ -921,7 +921,8 @@ QGradientStops FullHeightGradientStops() { { 0.0, st::premiumIconBg1->c }, { .28, st::premiumIconBg2->c }, { .55, st::premiumButtonBg2->c }, - { 1.0, st::premiumButtonBg1->c }, + { .75, st::premiumButtonBg1->c }, + { 1.0, st::premiumIconBg3->c }, }; } diff --git a/Telegram/lib_ui b/Telegram/lib_ui index 9f5ddf3d8..fbdc6ed5a 160000 --- a/Telegram/lib_ui +++ b/Telegram/lib_ui @@ -1 +1 @@ -Subproject commit 9f5ddf3d8aaa95e0c32c187f7e8b6c3239953991 +Subproject commit fbdc6ed5ac791890d87ca7f22b668ceca47d7684