diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 41d36cbf4..42b25743a 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -4645,7 +4645,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "ayu_HideNextViewsDescriptionAyu" = "Hide my views forever, until Ghost Mode disabled."; "ayu_EnableGhostModeStories" = "Enable Ghost Mode"; "ayu_GhostModeIsActive" = "Ghost Mode Is Active"; -"ayu_SimpleQuotesAndReplies" = "Simple quotes & replies"; +"ayu_SimpleQuotesAndReplies" = "Disable colorful replies"; +"ayu_DisableSimilarChannels" = "Disable similar channels"; +"ayu_CollapseSimilarChannels" = "Collapse similar channels"; +"ayu_HideSimilarChannelsTab" = "Hide similar channels tab"; "ayu_MainFont" = "Application font"; "ayu_MonospaceFont" = "Monospace font"; "ayu_FontDefault" = "Default"; diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index 2cabaf052..b36ea563a 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -1749,7 +1749,11 @@ void ApiWrap::joinChannel(not_null channel) { using Flag = ChannelDataFlag; chatParticipants().loadSimilarChannels(channel); - channel->setFlags(channel->flags() | Flag::SimilarExpanded); + + const auto settings = &AyuSettings::getInstance(); + if (!settings->collapseSimilarChannels) { + channel->setFlags(channel->flags() | Flag::SimilarExpanded); + } } } diff --git a/Telegram/SourceFiles/ayu/ayu_settings.cpp b/Telegram/SourceFiles/ayu/ayu_settings.cpp index 893b7456e..82b1574b5 100644 --- a/Telegram/SourceFiles/ayu/ayu_settings.cpp +++ b/Telegram/SourceFiles/ayu/ayu_settings.cpp @@ -225,12 +225,12 @@ void AyuGramSettings::set_useScheduledMessages(bool val) useScheduledMessages = val; } -void AyuGramSettings::set_keepDeletedMessages(bool val) +void AyuGramSettings::set_saveDeletedMessages(bool val) { saveDeletedMessages = val; } -void AyuGramSettings::set_keepMessagesHistory(bool val) +void AyuGramSettings::set_saveMessagesHistory(bool val) { saveMessagesHistory = val; } @@ -245,6 +245,16 @@ void AyuGramSettings::set_disableStories(bool val) disableStories = val; } +void AyuGramSettings::set_collapseSimilarChannels(bool val) +{ + collapseSimilarChannels = val; +} + +void AyuGramSettings::set_hideSimilarChannels(bool val) +{ + hideSimilarChannels = val; +} + void AyuGramSettings::set_disableNotificationsDelay(bool val) { disableNotificationsDelay = val; diff --git a/Telegram/SourceFiles/ayu/ayu_settings.h b/Telegram/SourceFiles/ayu/ayu_settings.h index cb1438820..a0dc93795 100644 --- a/Telegram/SourceFiles/ayu/ayu_settings.h +++ b/Telegram/SourceFiles/ayu/ayu_settings.h @@ -54,6 +54,8 @@ public: // ~ QoL toggles disableAds = true; disableStories = false; + collapseSimilarChannels = true; + hideSimilarChannels = false; disableNotificationsDelay = false; localPremium = false; copyUsernameAsLink = true; @@ -105,6 +107,8 @@ public: bool saveMessagesHistory; bool disableAds; bool disableStories; + bool collapseSimilarChannels; + bool hideSimilarChannels; bool disableNotificationsDelay; bool localPremium; bool copyUsernameAsLink; @@ -149,14 +153,18 @@ public: void set_useScheduledMessages(bool val); - void set_keepDeletedMessages(bool val); + void set_saveDeletedMessages(bool val); - void set_keepMessagesHistory(bool val); + void set_saveMessagesHistory(bool val); void set_disableAds(bool val); void set_disableStories(bool val); + void set_collapseSimilarChannels(bool val); + + void set_hideSimilarChannels(bool val); + void set_disableNotificationsDelay(bool val); void set_localPremium(bool val); @@ -217,6 +225,8 @@ NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT( saveMessagesHistory, disableAds, disableStories, + collapseSimilarChannels, + hideSimilarChannels, disableNotificationsDelay, localPremium, copyUsernameAsLink, diff --git a/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp b/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp index 99ed24e6f..9cbca8d98 100644 --- a/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp +++ b/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp @@ -40,9 +40,9 @@ void AddHideMessageAction(not_null menu, HistoryItem *item) { const auto initSaveDeleted = settings->saveDeletedMessages; - settings->set_keepDeletedMessages(false); + settings->set_saveDeletedMessages(false); history->destroyMessage(item); - settings->set_keepDeletedMessages(initSaveDeleted); + settings->set_saveDeletedMessages(initSaveDeleted); }, &st::menuIconClear); } diff --git a/Telegram/SourceFiles/ayu/ui/settings/settings_ayu.cpp b/Telegram/SourceFiles/ayu/ui/settings/settings_ayu.cpp index c48b05d0f..4d26eee7e 100644 --- a/Telegram/SourceFiles/ayu/ui/settings/settings_ayu.cpp +++ b/Telegram/SourceFiles/ayu/ui/settings/settings_ayu.cpp @@ -247,35 +247,18 @@ not_null AddInnerToggle(not_null container return button; } -namespace Settings +struct NestedEntry { + QString checkboxLabel; + bool initial; + std::function callback; +}; -rpl::producer Ayu::title() +void AddCollapsibleToggle(not_null container, + rpl::producer title, + std::vector checkboxes, + bool toggledWhenAll) { - return tr::ayu_AyuPreferences(); -} - -Ayu::Ayu( - QWidget *parent, - not_null controller) - : Section(parent) -{ - setupContent(controller); -} - -void Ayu::SetupGhostModeToggle(not_null container) -{ - auto settings = &AyuSettings::getInstance(); - - const auto widget = object_ptr(this); - - widget->add( - object_ptr( - container, - tr::ayu_GhostEssentialsHeader(), - st::rightsHeaderLabel), - st::rightsHeaderMargin); - const auto addCheckbox = [&]( not_null verticalLayout, const QString &label, @@ -320,12 +303,59 @@ void Ayu::SetupGhostModeToggle(not_null container) return checkView; }; - struct NestedEntry - { - QString checkboxLabel; - bool initial; - std::function callback; - }; + auto wrap = object_ptr>( + container, + object_ptr(container)); + const auto verticalLayout = wrap->entity(); + auto innerChecks = std::vector>(); + for (const auto &entry : checkboxes) { + const auto c = addCheckbox(verticalLayout, entry.checkboxLabel, entry.initial); + c->checkedValue( + ) | start_with_next([=](bool enabled) + { + entry.callback(enabled); + }, container->lifetime()); + innerChecks.push_back(c); + } + + const auto raw = wrap.data(); + raw->hide(anim::type::instant); + AddInnerToggle( + container, + st::powerSavingButtonNoIcon, + innerChecks, + raw, + std::move(title), + toggledWhenAll); + container->add(std::move(wrap)); + container->widthValue( + ) | start_with_next([=](int w) + { + raw->resizeToWidth(w); + }, raw->lifetime()); +} + +namespace Settings +{ + +rpl::producer Ayu::title() +{ + return tr::ayu_AyuPreferences(); +} + +Ayu::Ayu( + QWidget *parent, + not_null controller) + : Section(parent) +{ + setupContent(controller); +} + +void Ayu::SetupGhostModeToggle(not_null container) +{ + auto settings = &AyuSettings::getInstance(); + + AddSubsectionTitle(container, tr::ayu_GhostEssentialsHeader()); std::vector checkboxes{ NestedEntry{ @@ -365,102 +395,13 @@ void Ayu::SetupGhostModeToggle(not_null container) }, }; - auto wrap = object_ptr>( - container, - object_ptr(container)); - const auto verticalLayout = wrap->entity(); - auto innerChecks = std::vector>(); - for (const auto &entry : checkboxes) { - const auto c = addCheckbox(verticalLayout, entry.checkboxLabel, entry.initial); - c->checkedValue( - ) | start_with_next([=](bool enabled) - { - entry.callback(enabled); - }, container->lifetime()); - innerChecks.push_back(c); - } - - const auto raw = wrap.data(); - raw->hide(anim::type::instant); - AddInnerToggle( - container, - st::powerSavingButtonNoIcon, - innerChecks, - raw, - tr::ayu_GhostModeToggle(), - true); - container->add(std::move(wrap)); - container->widthValue( - ) | start_with_next([=](int w) - { - raw->resizeToWidth(w); - }, raw->lifetime()); + AddCollapsibleToggle(container, tr::ayu_GhostEssentialsHeader(), checkboxes, true); } void Ayu::SetupReadAfterActionToggle(not_null container) { auto settings = &AyuSettings::getInstance(); - const auto widget = object_ptr(this); - - widget->add( - object_ptr( - container, - tr::ayu_MarkReadAfterAction(), - st::rightsHeaderLabel), - st::rightsHeaderMargin); - - const auto addCheckbox = [&]( - not_null verticalLayout, - const QString &label, - const bool isCheckedOrig) - { - const auto checkView = [&]() -> not_null - { - const auto checkbox = verticalLayout->add( - object_ptr( - verticalLayout, - label, - isCheckedOrig, - st::settingsCheckbox), - st::powerSavingButton.padding); - const auto button = Ui::CreateChild( - verticalLayout.get(), - st::defaultRippleAnimation); - button->stackUnder(checkbox); - combine( - verticalLayout->widthValue(), - checkbox->geometryValue() - ) | start_with_next([=](int w, const QRect &r) - { - button->setGeometry(0, r.y(), w, r.height()); - }, button->lifetime()); - checkbox->setAttribute(Qt::WA_TransparentForMouseEvents); - const auto checkView = checkbox->checkView(); - button->setClickedCallback([=] - { - checkView->setChecked( - !checkView->checked(), - anim::type::normal); - }); - - return checkView; - }(); - checkView->checkedChanges( - ) | start_with_next([=](bool checked) - { - }, verticalLayout->lifetime()); - - return checkView; - }; - - struct NestedEntry - { - QString checkboxLabel; - bool initial; - std::function callback; - }; - std::vector checkboxes{ NestedEntry{ tr::ayu_MarkReadAfterSend(tr::now), settings->markReadAfterSend, [=](bool enabled) @@ -485,44 +426,13 @@ void Ayu::SetupReadAfterActionToggle(not_null container) }, }; - auto wrap = object_ptr>( - container, - object_ptr(container)); - const auto verticalLayout = wrap->entity(); - auto innerChecks = std::vector>(); - for (const auto &entry : checkboxes) { - const auto c = addCheckbox(verticalLayout, entry.checkboxLabel, entry.initial); - c->checkedValue( - ) | start_with_next([=](bool enabled) - { - entry.callback(enabled); - }, container->lifetime()); - innerChecks.push_back(c); - } - - const auto raw = wrap.data(); - raw->hide(anim::type::instant); - AddInnerToggle( - container, - st::powerSavingButtonNoIcon, - innerChecks, - raw, - tr::ayu_MarkReadAfterAction(), - false); - container->add(std::move(wrap)); - container->widthValue( - ) | start_with_next([=](int w) - { - raw->resizeToWidth(w); - }, raw->lifetime()); + AddCollapsibleToggle(container, tr::ayu_MarkReadAfterAction(), checkboxes, false); } void Ayu::SetupGhostEssentials(not_null container) { auto settings = &AyuSettings::getInstance(); - AddSubsectionTitle(container, tr::ayu_GhostEssentialsHeader()); - SetupGhostModeToggle(container); SetupReadAfterActionToggle(container); @@ -564,7 +474,7 @@ void Ayu::SetupSpyEssentials(not_null container) return (enabled != settings->saveDeletedMessages); }) | start_with_next([=](bool enabled) { - settings->set_keepDeletedMessages(enabled); + settings->set_saveDeletedMessages(enabled); AyuSettings::save(); }, container->lifetime()); @@ -580,7 +490,7 @@ void Ayu::SetupSpyEssentials(not_null container) return (enabled != settings->saveMessagesHistory); }) | start_with_next([=](bool enabled) { - settings->set_keepMessagesHistory(enabled); + settings->set_saveMessagesHistory(enabled); AyuSettings::save(); }, container->lifetime()); } @@ -623,6 +533,45 @@ void Ayu::SetupQoLToggles(not_null container) AyuSettings::save(); }, container->lifetime()); + AddButtonWithIcon( + container, + tr::ayu_SimpleQuotesAndReplies(), + st::settingsButtonNoIcon + )->toggleOn( + rpl::single(settings->simpleQuotesAndReplies) + )->toggledValue( + ) | rpl::filter([=](bool enabled) + { + return (enabled != settings->simpleQuotesAndReplies); + }) | start_with_next([=](bool enabled) + { + settings->set_simpleQuotesAndReplies(enabled); + AyuSettings::save(); + }, container->lifetime()); + + std::vector checkboxes = { + NestedEntry{ + tr::ayu_CollapseSimilarChannels(tr::now), settings->collapseSimilarChannels, [=](bool enabled) + { + settings->set_collapseSimilarChannels(enabled); + AyuSettings::save(); + } + }, + NestedEntry{ + tr::ayu_HideSimilarChannelsTab(tr::now), settings->hideSimilarChannels, [=](bool enabled) + { + settings->set_hideSimilarChannels(enabled); + AyuSettings::save(); + } + } + }; + + AddCollapsibleToggle(container, tr::ayu_DisableSimilarChannels(), checkboxes, true); + + AddSkip(container); + AddDivider(container); + AddSkip(container); + AddButtonWithIcon( container, tr::ayu_DisableNotificationsDelay(), @@ -688,6 +637,9 @@ void Ayu::SetupCustomization(not_null container, SetupAppIcon(container); + AddDivider(container); + AddSkip(container); + auto btn = AddButtonWithLabel( container, tr::ayu_DeletedMarkText(), @@ -740,22 +692,6 @@ void Ayu::SetupCustomization(not_null container, AyuSettings::save(); }, container->lifetime()); - AddButtonWithIcon( - container, - tr::ayu_SimpleQuotesAndReplies(), - st::settingsButtonNoIcon - )->toggleOn( - rpl::single(settings->simpleQuotesAndReplies) - )->toggledValue( - ) | rpl::filter([=](bool enabled) - { - return (enabled != settings->simpleQuotesAndReplies); - }) | start_with_next([=](bool enabled) - { - settings->set_simpleQuotesAndReplies(enabled); - AyuSettings::save(); - }, container->lifetime()); - AddButtonWithIcon( container, tr::ayu_SettingsShowMessageSeconds(), diff --git a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp index e6056857f..16e63613d 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp @@ -44,6 +44,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_info.h" #include "styles/style_boxes.h" +// AyuGram includes +#include "ayu/ayu_settings.h" + + namespace Info { namespace Profile { @@ -155,6 +159,8 @@ object_ptr InnerWidget::setupSharedMedia( using namespace rpl::mappers; using MediaType = Media::Type; + const auto settings = &AyuSettings::getInstance(); + auto content = object_ptr(parent); auto tracker = Ui::MultiSlideTracker(); auto addMediaButton = [&]( @@ -189,6 +195,10 @@ object_ptr InnerWidget::setupSharedMedia( const auto addSimilarChannelsButton = [&]( not_null channel, const style::icon &icon) { + if (settings->hideSimilarChannels) { + return; + } + auto result = Media::AddSimilarChannelsButton( content, _controller,