diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 77f3ead60d..db20a2dded 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1245,6 +1245,18 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_quick_dialog_action_toast_archive_success" = "The chat has been archived."; "lng_quick_dialog_action_toast_unarchive_success" = "The chat has been unarchived."; +"lng_archive_hint_title" = "This is your Archive"; +"lng_archive_hint_about" = "Archived chats will remain in the Archive when you receive a new message. {link}"; +"lng_archive_hint_about_unmuted" = "When you receive a new message, muted chats will remain in the Archive, while unmuted chats will be moved to Chats. {link}"; +"lng_archive_hint_about_link" = "Tap to change {emoji}"; +"lng_archive_hint_section_1" = "Archived Chats"; +"lng_archive_hint_section_1_info" = "Move any chat into your Archive and back by swiping on it."; +"lng_archive_hint_section_2" = "Hiding Archive"; +"lng_archive_hint_section_2_info" = "Hide the Archive from your Main screen by swiping on it."; +"lng_archive_hint_section_3" = "Stories"; +"lng_archive_hint_section_3_info" = "Archive Stories from your contacts separately from chats with them."; +"lng_archive_hint_button" = "Got it"; + "lng_settings_generic_subscribe" = "Subscribe to {link} to use this setting."; "lng_settings_generic_subscribe_link" = "Telegram Premium"; @@ -4299,6 +4311,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_context_archive_to_list" = "Move to chat list"; "lng_context_archive_to_menu_info" = "Archive moved to the main menu!\nRight click the archive button to return the Archive to your chat list."; "lng_context_archive_settings" = "Archive settings"; +"lng_context_archive_how_does_it_work" = "How does it work?"; "lng_context_mute" = "Mute notifications"; "lng_context_unmute" = "Unmute"; diff --git a/Telegram/SourceFiles/boxes/about_box.cpp b/Telegram/SourceFiles/boxes/about_box.cpp index 129d59d076..4f8b666671 100644 --- a/Telegram/SourceFiles/boxes/about_box.cpp +++ b/Telegram/SourceFiles/boxes/about_box.cpp @@ -13,12 +13,20 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "core/update_checker.h" #include "lang/lang_keys.h" #include "ui/boxes/confirm_box.h" +#include "ui/painter.h" +#include "ui/rect.h" #include "ui/text/text_utilities.h" #include "ui/vertical_list.h" #include "ui/widgets/buttons.h" #include "ui/wrap/vertical_layout.h" #include "styles/style_layers.h" #include "styles/style_boxes.h" +#include "styles/style_channel_earn.h" +#include "styles/style_chat.h" +#include "styles/style_dialogs.h" +#include "styles/style_menu_icons.h" +#include "styles/style_premium.h" +#include "styles/style_settings.h" #include #include @@ -158,3 +166,153 @@ QString currentVersionText() { #endif return result; } + +void ArchiveHintBox( + not_null box, + bool unarchiveOnNewMessage, + Fn onUnarchive) { + box->setNoContentMargin(true); + + const auto content = box->verticalLayout().get(); + + Ui::AddSkip(content); + Ui::AddSkip(content); + Ui::AddSkip(content); + { + const auto &icon = st::dialogsArchiveUserpic; + const auto rect = Rect(icon.size() * 2); + auto owned = object_ptr(content); + owned->resize(rect.size()); + const auto widget = box->addRow( + object_ptr>( + content, + std::move(owned)))->entity(); + widget->paintRequest( + ) | rpl::start_with_next([=] { + auto p = Painter(widget); + auto hq = PainterHighQualityEnabler(p); + p.setPen(Qt::NoPen); + p.setBrush(st::activeButtonBg); + p.drawEllipse(rect); + icon.paintInCenter(p, rect); + }, widget->lifetime()); + } + Ui::AddSkip(content); + Ui::AddSkip(content); + box->addRow(object_ptr>( + content, + object_ptr( + content, + tr::lng_archive_hint_title(), + st::boxTitle))); + Ui::AddSkip(content); + Ui::AddSkip(content); + { + const auto label = box->addRow( + object_ptr( + content, + (unarchiveOnNewMessage + ? tr::lng_archive_hint_about_unmuted + : tr::lng_archive_hint_about)( + lt_link, + tr::lng_archive_hint_about_link( + lt_emoji, + rpl::single( + Ui::Text::IconEmoji(&st::textMoreIconEmoji)), + Ui::Text::RichLangValue + ) | rpl::map([](TextWithEntities text) { + return Ui::Text::Link(std::move(text), 1); + }), + Ui::Text::RichLangValue), + st::channelEarnHistoryRecipientLabel)); + label->resizeToWidth(box->width() + - rect::m::sum::h(st::boxRowPadding)); + label->setLink( + 1, + std::make_shared([=](ClickContext context) { + if (context.button == Qt::LeftButton) { + onUnarchive(); + } + })); + } + Ui::AddSkip(content); + Ui::AddSkip(content); + Ui::AddSkip(content); + Ui::AddSkip(content); + { + const auto padding = QMargins( + st::settingsButton.padding.left(), + st::boxRowPadding.top(), + st::boxRowPadding.right(), + st::boxRowPadding.bottom()); + const auto addEntry = [&]( + rpl::producer title, + rpl::producer about, + const style::icon &icon) { + const auto top = content->add( + object_ptr( + content, + std::move(title), + st::channelEarnSemiboldLabel), + padding); + Ui::AddSkip(content, st::channelEarnHistoryThreeSkip); + content->add( + object_ptr( + content, + std::move(about), + st::channelEarnHistoryRecipientLabel), + padding); + const auto left = Ui::CreateChild( + box->verticalLayout().get()); + left->paintRequest( + ) | rpl::start_with_next([=] { + auto p = Painter(left); + icon.paint(p, 0, 0, left->width()); + }, left->lifetime()); + left->resize(icon.size()); + top->geometryValue( + ) | rpl::start_with_next([=](const QRect &g) { + left->moveToLeft( + (g.left() - left->width()) / 2, + g.top() + st::channelEarnHistoryThreeSkip); + }, left->lifetime()); + }; + addEntry( + tr::lng_archive_hint_section_1(), + tr::lng_archive_hint_section_1_info(), + st::menuIconArchive); + Ui::AddSkip(content); + Ui::AddSkip(content); + addEntry( + tr::lng_archive_hint_section_2(), + tr::lng_archive_hint_section_2_info(), + st::menuIconStealth); + Ui::AddSkip(content); + Ui::AddSkip(content); + addEntry( + tr::lng_archive_hint_section_3(), + tr::lng_archive_hint_section_3_info(), + st::menuIconStoriesSavedSection); + Ui::AddSkip(content); + Ui::AddSkip(content); + } + Ui::AddSkip(content); + Ui::AddSkip(content); + Ui::AddSkip(content); + { + const auto &st = st::premiumPreviewDoubledLimitsBox; + box->setStyle(st); + auto button = object_ptr( + box, + tr::lng_archive_hint_button(), + st::defaultActiveButton); + button->setTextTransform( + Ui::RoundButton::TextTransform::NoTransform); + button->resizeToWidth(box->width() + - st.buttonPadding.left() + - st.buttonPadding.left()); + button->setClickedCallback([=] { box->closeBox(); }); + box->addButton(std::move(button)); + } +} + diff --git a/Telegram/SourceFiles/boxes/about_box.h b/Telegram/SourceFiles/boxes/about_box.h index 61cb3fe83f..60953aafd0 100644 --- a/Telegram/SourceFiles/boxes/about_box.h +++ b/Telegram/SourceFiles/boxes/about_box.h @@ -10,6 +10,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/layers/generic_box.h" void AboutBox(not_null box); +void ArchiveHintBox( + not_null box, + bool unarchiveOnNewMessage, + Fn onUnarchive); QString telegramFaqLink(); QString currentVersionText(); diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index c9204a1c4e..a5db87a14c 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/call_delayed.h" #include "menu/menu_check_item.h" +#include "boxes/about_box.h" #include "boxes/share_box.h" #include "boxes/star_gift_box.h" #include "chat_helpers/compose/compose_show.h" @@ -18,6 +19,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/wrap/slide_wrap.h" #include "ui/widgets/fields/input_field.h" #include "api/api_chat_participants.h" +#include "api/api_global_privacy.h" #include "lang/lang_keys.h" #include "ui/boxes/confirm_box.h" #include "base/random.h" @@ -1646,9 +1648,23 @@ void Filler::fillArchiveActions() { _addAction({ .isSeparator = true }); Settings::PreloadArchiveSettings(&controller->session()); - _addAction(tr::lng_context_archive_settings(tr::now), [=] { + const auto openSettings = [=] { controller->show(Box(Settings::ArchiveSettingsBox, controller)); - }, &st::menuIconManage); + }; + _addAction( + tr::lng_context_archive_settings(tr::now), + openSettings, + &st::menuIconManage); + _addAction(tr::lng_context_archive_how_does_it_work(tr::now), [=] { + const auto unarchiveOnNewMessage = controller->session().api( + ).globalPrivacy().unarchiveOnNewMessageCurrent(); + controller->show( + Box( + ArchiveHintBox, + unarchiveOnNewMessage != Api::UnarchiveOnNewMessage::None, + openSettings), + Ui::LayerOption::CloseOther); + }, &st::menuIconFaq); } void Filler::fillSavedSublistActions() {