diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 258a5463e7..83a2c4f30f 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -1118,6 +1118,8 @@ PRIVATE settings/settings_main.h settings/settings_notifications.cpp settings/settings_notifications.h + settings/settings_premium.cpp + settings/settings_premium.h settings/settings_privacy_controllers.cpp settings/settings_privacy_controllers.h settings/settings_privacy_security.cpp diff --git a/Telegram/Resources/icons/settings/premium/channels_off.png b/Telegram/Resources/icons/settings/premium/channels_off.png new file mode 100644 index 0000000000..108a1573f5 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/channels_off.png differ diff --git a/Telegram/Resources/icons/settings/premium/channels_off@2x.png b/Telegram/Resources/icons/settings/premium/channels_off@2x.png new file mode 100644 index 0000000000..18ec1bb770 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/channels_off@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/channels_off@3x.png b/Telegram/Resources/icons/settings/premium/channels_off@3x.png new file mode 100644 index 0000000000..22e083d65a Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/channels_off@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/double.png b/Telegram/Resources/icons/settings/premium/double.png new file mode 100644 index 0000000000..388994de89 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/double.png differ diff --git a/Telegram/Resources/icons/settings/premium/double@2x.png b/Telegram/Resources/icons/settings/premium/double@2x.png new file mode 100644 index 0000000000..62ef97fc85 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/double@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/double@3x.png b/Telegram/Resources/icons/settings/premium/double@3x.png new file mode 100644 index 0000000000..2de7119b26 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/double@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/like.png b/Telegram/Resources/icons/settings/premium/like.png new file mode 100644 index 0000000000..77e9f63a1b Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/like.png differ diff --git a/Telegram/Resources/icons/settings/premium/like@2x.png b/Telegram/Resources/icons/settings/premium/like@2x.png new file mode 100644 index 0000000000..183760ba79 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/like@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/like@3x.png b/Telegram/Resources/icons/settings/premium/like@3x.png new file mode 100644 index 0000000000..0e5e128993 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/like@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/play.png b/Telegram/Resources/icons/settings/premium/play.png new file mode 100644 index 0000000000..0a3d576978 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/play.png differ diff --git a/Telegram/Resources/icons/settings/premium/play@2x.png b/Telegram/Resources/icons/settings/premium/play@2x.png new file mode 100644 index 0000000000..ef9bca6e1c Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/play@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/play@3x.png b/Telegram/Resources/icons/settings/premium/play@3x.png new file mode 100644 index 0000000000..4bc9dcb1c0 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/play@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/speed.png b/Telegram/Resources/icons/settings/premium/speed.png new file mode 100644 index 0000000000..29ab2bb05d Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/speed.png differ diff --git a/Telegram/Resources/icons/settings/premium/speed@2x.png b/Telegram/Resources/icons/settings/premium/speed@2x.png new file mode 100644 index 0000000000..69689a4526 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/speed@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/speed@3x.png b/Telegram/Resources/icons/settings/premium/speed@3x.png new file mode 100644 index 0000000000..f0be41b0b7 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/speed@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/star.png b/Telegram/Resources/icons/settings/premium/star.png new file mode 100644 index 0000000000..82fa9b74c8 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/star.png differ diff --git a/Telegram/Resources/icons/settings/premium/star@2x.png b/Telegram/Resources/icons/settings/premium/star@2x.png new file mode 100644 index 0000000000..24e485e355 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/star@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/star@3x.png b/Telegram/Resources/icons/settings/premium/star@3x.png new file mode 100644 index 0000000000..024947d929 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/star@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/voice.png b/Telegram/Resources/icons/settings/premium/voice.png new file mode 100644 index 0000000000..7d83225f96 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/voice.png differ diff --git a/Telegram/Resources/icons/settings/premium/voice@2x.png b/Telegram/Resources/icons/settings/premium/voice@2x.png new file mode 100644 index 0000000000..650696908c Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/voice@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/voice@3x.png b/Telegram/Resources/icons/settings/premium/voice@3x.png new file mode 100644 index 0000000000..bffe3be39e Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/voice@3x.png differ diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index fbc0f43bdf..70fe4c9235 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1662,6 +1662,32 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_premium" = "Premium"; "lng_premium_free" = "Free"; +"lng_premium_summary_title" = "Telegram Premium"; +"lng_premium_summary_top_about" = "Go **beyond the limits**, get **exclusive features** and support us by subscribing to **Telegram Premium**."; +"lng_premium_summary_subtitle1" = "Doubled Limits"; +"lng_premium_summary_about1" = "Up to 1000 channels, 20 folders, 10 pins, 20 public links, 4 accounts and more."; +"lng_premium_summary_subtitle2" = "4Gb Upload Size"; +"lng_premium_summary_about2" = "Increased upload size from 2Gb to 4Gb to per document, unlimited storage overall."; +"lng_premium_summary_subtitle3" = "Faster Download Speed"; +"lng_premium_summary_about3" = "No more limits on the speed with which media and documents are downloaded."; +"lng_premium_summary_subtitle4" = "Voice-to-Text Conversion"; +"lng_premium_summary_about4" = "Ability to read the transcript of any incoming voice message."; +"lng_premium_summary_subtitle5" = "No Ads"; +"lng_premium_summary_about5" = "No more ads in public channels where Telegram sometimes shows ads."; +"lng_premium_summary_subtitle6" = "Unique Reactions"; +"lng_premium_summary_about6" = "Additional animated reactions on messages available only to the Premium subscribers."; +"lng_premium_summary_subtitle7" = "Premium Stickers"; +"lng_premium_summary_about7" = "Exclusive enlarged stickers featuring additional effects, updated monthly."; +"lng_premium_summary_subtitle8" = "Advanced Chat Management"; +"lng_premium_summary_about8" = "Tools to set default folder, auto-archive and hide new chats from non-contacts."; +"lng_premium_summary_subtitle9" = "Profile Badge"; +"lng_premium_summary_about9" = "A badge next to your name showing that you are helping support Telegram."; +"lng_premium_summary_subtitle10" = "Animated Profile Pictures"; +"lng_premium_summary_about10" = "Video avatars animated in chat lists and chats to allow for additional self-expression."; +"lng_premium_summary_bottom_subtitle" = "About Telegram Premium"; +"lng_premium_summary_bottom_about" = "While the free version of Telegram already gives its users more than any other messaging application, **Telegram Premium** pushes its capabilities even further.\n\n**Telegram Premium** is a paid option, because most Premium Features require additional expenses from Telegram to third parties such as data center providers and server manufacturers. Contributions from **Telegram Premium** users allow us to cover such costs and also help Telegram stay free for everyone."; +"lng_premium_summary_button" = "Subscribe for {cost} per month."; + "lng_group_about_header" = "You have created a group."; "lng_group_about_text" = "Groups can have:"; "lng_group_about1" = "Up to 100,000 members"; diff --git a/Telegram/SourceFiles/settings/settings.style b/Telegram/SourceFiles/settings/settings.style index df137fc425..edc43e1970 100644 --- a/Telegram/SourceFiles/settings/settings.style +++ b/Telegram/SourceFiles/settings/settings.style @@ -93,6 +93,14 @@ settingsIconPin: icon {{ "settings/pin", settingsIconFg }}; settingsIconDownload: icon {{ "settings/download", settingsIconFg }}; settingsIconMention: icon {{ "settings/mention", settingsIconFg }}; +settingsPremiumIconChannelsOff: icon {{ "settings/premium/channels_off", settingsIconFg }}; +settingsPremiumIconDouble: icon {{ "settings/premium/double", settingsIconFg }}; +settingsPremiumIconLike: icon {{ "settings/premium/like", settingsIconFg }}; +settingsPremiumIconPlay: icon {{ "settings/premium/play", settingsIconFg }}; +settingsPremiumIconSpeed: icon {{ "settings/premium/speed", settingsIconFg }}; +settingsPremiumIconStar: icon {{ "settings/premium/star", settingsIconFg }}; +settingsPremiumIconVoice: icon {{ "settings/premium/voice", settingsIconFg }}; + settingsIconAdd: icon {{ "settings/add", windowFgActive }}; settingsIconRemove: icon {{ "settings/remove", windowFgActive }}; @@ -411,3 +419,7 @@ notifyPreviewTitlePosition: point(64px, 9px); notifyPreviewTextPosition: point(64px, 30px); notifyPreviewChecksSkip: 12px; notifyPreviewBottomSkip: 9px; + +settingsPremiumDescriptionSkip: 3px; +settingsPremiumButtonPadding: margins(11px, 11px, 11px, 11px); + diff --git a/Telegram/SourceFiles/settings/settings_main.cpp b/Telegram/SourceFiles/settings/settings_main.cpp index 4a3f9005a6..ce81ff5fcd 100644 --- a/Telegram/SourceFiles/settings/settings_main.cpp +++ b/Telegram/SourceFiles/settings/settings_main.cpp @@ -16,6 +16,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "settings/settings_advanced.h" #include "settings/settings_folders.h" #include "settings/settings_calls.h" +#include "settings/settings_premium.h" #include "boxes/language_box.h" #include "boxes/username_box.h" #include "ui/boxes/confirm_box.h" @@ -330,6 +331,15 @@ void SetupSections( SetupLanguageButton(container); + AddSkip(container); + AddDivider(container); + AddSkip(container); + + addSection( + tr::lng_premium_summary_title(), + PremiumId(), + { &st::settingsIconCalls, kIconGreen }); + AddSkip(container); } diff --git a/Telegram/SourceFiles/settings/settings_premium.cpp b/Telegram/SourceFiles/settings/settings_premium.cpp new file mode 100644 index 0000000000..1f584dfbbf --- /dev/null +++ b/Telegram/SourceFiles/settings/settings_premium.cpp @@ -0,0 +1,254 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "settings/settings_premium.h" + +#include "lang/lang_keys.h" +#include "settings/settings_common.h" +#include "ui/abstract_button.h" +#include "ui/effects/gradient.h" +#include "ui/text/text_utilities.h" +#include "ui/widgets/gradient_round_button.h" +#include "ui/widgets/labels.h" +#include "ui/wrap/padding_wrap.h" +#include "ui/wrap/vertical_layout.h" +#include "window/window_session_controller.h" +#include "styles/style_boxes.h" +#include "styles/style_chat_helpers.h" +#include "styles/style_layers.h" +#include "styles/style_settings.h" + +namespace Settings { +namespace { + +class Premium : public Section { +public: + Premium( + QWidget *parent, + not_null controller); + + [[nodiscard]] rpl::producer title() override; + + [[nodiscard]] QPointer createPinnedToBottom( + not_null parent) override; + +private: + void setupContent(not_null controller); + +}; + +Premium::Premium( + QWidget *parent, + not_null controller) +: Section(parent) { + setupContent(controller); +} + +rpl::producer Premium::title() { + return tr::lng_premium_summary_title(); +} + +void Premium::setupContent(not_null controller) { + const auto content = Ui::CreateChild(this); + + content->add( + object_ptr>( + content, + object_ptr( + content, + tr::lng_premium_summary_title(), + st::changePhoneTitle)), + st::changePhoneTitlePadding); + + const auto wrap = content->add( + object_ptr>( + content, + object_ptr( + content, + tr::lng_premium_summary_top_about(Ui::Text::RichLangValue), + st::changePhoneDescription)), + st::changePhoneDescriptionPadding); + wrap->resize( + wrap->width(), + st::settingLocalPasscodeDescriptionHeight); + + AddSkip(content); + AddDivider(content); + AddSkip(content); + + const auto &st = st::settingsButton; + const auto &stLabel = st::defaultFlatLabel; + const auto iconSize = st::settingsPremiumIconDouble.size(); + + const auto icons = std::array{ { + &st::settingsPremiumIconDouble, + &st::premiumIconFolders, // + &st::settingsPremiumIconSpeed, + &st::settingsPremiumIconVoice, + &st::settingsPremiumIconChannelsOff, + &st::settingsPremiumIconLike, + &st::settingsIconStickers, + &st::settingsIconChat, + &st::settingsPremiumIconStar, + &st::settingsPremiumIconPlay, + } }; + + auto iconContainers = std::vector(); + iconContainers.reserve(int(icons.size())); + + auto titlePadding = st.padding; + titlePadding.setBottom(0); + auto descriptionPadding = st.padding; + descriptionPadding.setTop(0); + const auto addRow = [&]( + rpl::producer &&title, + rpl::producer &&text) { + const auto labelAscent = stLabel.style.font->ascent; + + const auto label = content->add( + object_ptr( + content, + std::move(title) | rpl::map(Ui::Text::Bold), + stLabel), + titlePadding); + AddSkip(content, st::settingsPremiumDescriptionSkip); + content->add( + object_ptr( + content, + std::move(text), + st::boxDividerLabel), + descriptionPadding); + + const auto dummy = Ui::CreateChild(content); + dummy->setAttribute(Qt::WA_TransparentForMouseEvents); + + content->sizeValue( + ) | rpl::start_with_next([=](const QSize &s) { + dummy->resize(s.width(), iconSize.height()); + }, dummy->lifetime()); + + label->geometryValue( + ) | rpl::start_with_next([=](const QRect &r) { + dummy->moveToLeft(0, r.y() + (r.height() - labelAscent)); + }, dummy->lifetime()); + + iconContainers.push_back(dummy); + }; + + using namespace tr; + addRow(lng_premium_summary_subtitle1(), lng_premium_summary_about1()); + addRow(lng_premium_summary_subtitle2(), lng_premium_summary_about2()); + addRow(lng_premium_summary_subtitle3(), lng_premium_summary_about3()); + addRow(lng_premium_summary_subtitle4(), lng_premium_summary_about4()); + addRow(lng_premium_summary_subtitle5(), lng_premium_summary_about5()); + addRow(lng_premium_summary_subtitle6(), lng_premium_summary_about6()); + addRow(lng_premium_summary_subtitle7(), lng_premium_summary_about7()); + addRow(lng_premium_summary_subtitle8(), lng_premium_summary_about8()); + addRow(lng_premium_summary_subtitle9(), lng_premium_summary_about9()); + addRow(lng_premium_summary_subtitle10(), lng_premium_summary_about10()); + + content->resizeToWidth(content->height()); + + // Icons. + Assert(iconContainers.size() > 2); + const auto from = iconContainers.front()->y(); + const auto to = iconContainers.back()->y() + iconSize.height(); + auto gradient = QLinearGradient(0, 0, 0, to - from); + gradient.setColorAt(.0, st::premiumButtonBg3->c); + gradient.setColorAt(.5, st::premiumButtonBg2->c); + gradient.setColorAt(1., st::premiumButtonBg1->c); + for (auto i = 0; i < int(icons.size()); i++) { + const auto &iconContainer = iconContainers[i]; + + const auto pointTop = iconContainer->y() - from; + const auto pointBottom = pointTop + iconContainer->height(); + const auto ratioTop = pointTop / float64(to - from); + const auto ratioBottom = pointBottom / float64(to - from); + + auto resultGradient = QLinearGradient( + QPointF(), + QPointF(0, pointBottom - pointTop)); + + resultGradient.setColorAt( + .0, + anim::gradient_color_at(gradient, ratioTop)); + resultGradient.setColorAt( + .1, + anim::gradient_color_at(gradient, ratioBottom)); + + const auto brush = QBrush(resultGradient); + AddButtonIcon( + iconContainer, + st, + { .icon = icons[i], .backgroundBrush = brush }); + } + + AddSkip(content); + AddDivider(content); + AddSkip(content); + + content->add( + object_ptr( + content, + tr::lng_premium_summary_bottom_subtitle( + ) | rpl::map(Ui::Text::Bold), + stLabel), + st::settingsSubsectionTitlePadding); + content->add( + object_ptr( + content, + tr::lng_premium_summary_bottom_about(Ui::Text::RichLangValue), + st::aboutLabel), + st::boxRowPadding); + AddSkip(content); + + Ui::ResizeFitChild(this, content); + +} + +QPointer Premium::createPinnedToBottom( + not_null parent) { + + const auto content = Ui::CreateChild(parent.get()); + + auto result = object_ptr( + content, + QGradientStops{ + { 0., st::premiumButtonBg1->c }, + { .6, st::premiumButtonBg2->c }, + { 1., st::premiumButtonBg3->c }, + }); + + const auto &st = st::premiumPreviewBox.button; + result->resize(content->width(), st.height); + + const auto label = Ui::CreateChild( + result.data(), + tr::lng_premium_summary_button(tr::now, lt_cost, "$5"), + 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()); + content->add(std::move(result), st::settingsPremiumButtonPadding); + + return Ui::MakeWeak(not_null{ content }); +} + +} // namespace + +Type PremiumId() { + return Premium::Id(); +} + +} // namespace Settings diff --git a/Telegram/SourceFiles/settings/settings_premium.h b/Telegram/SourceFiles/settings/settings_premium.h new file mode 100644 index 0000000000..cdc83c1b30 --- /dev/null +++ b/Telegram/SourceFiles/settings/settings_premium.h @@ -0,0 +1,17 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +#include "settings/settings_type.h" + +namespace Settings { + +Type PremiumId(); + +} // namespace Settings +