From 8a071fe1fe7c3ed88c7dd7336fc293f458cfda9e Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 13 Jan 2022 19:39:44 +0300 Subject: [PATCH] Respect reactions_default from appconfig. --- .../data/data_message_reactions.cpp | 18 +++++++++++ .../SourceFiles/data/data_message_reactions.h | 2 ++ .../view/history_view_react_button.cpp | 30 +++++++++++++++---- .../history/view/history_view_react_button.h | 5 +++- Telegram/SourceFiles/main/main_account.cpp | 3 +- Telegram/SourceFiles/main/main_app_config.cpp | 16 ++++++---- Telegram/SourceFiles/main/main_app_config.h | 2 ++ 7 files changed, 63 insertions(+), 13 deletions(-) diff --git a/Telegram/SourceFiles/data/data_message_reactions.cpp b/Telegram/SourceFiles/data/data_message_reactions.cpp index 59b0a2ad9..7b2e84efe 100644 --- a/Telegram/SourceFiles/data/data_message_reactions.cpp +++ b/Telegram/SourceFiles/data/data_message_reactions.cpp @@ -10,6 +10,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history.h" #include "history/history_item.h" #include "main/main_session.h" +#include "main/main_account.h" +#include "main/main_app_config.h" #include "data/data_session.h" #include "data/data_changes.h" #include "data/data_document.h" @@ -47,6 +49,18 @@ Reactions::Reactions(not_null owner) _pollItems.remove(item); _repaintItems.remove(item); }, _lifetime); + + const auto appConfig = &_owner->session().account().appConfig(); + appConfig->value( + ) | rpl::start_with_next([=] { + const auto favorite = appConfig->get( + u"reactions_default"_q, + QString::fromUtf8("\xf0\x9f\x91\x8d")); + if (_favorite != favorite) { + _favorite = favorite; + _updated.fire({}); + } + }, _lifetime); } Reactions::~Reactions() = default; @@ -63,6 +77,10 @@ const std::vector &Reactions::list(Type type) const { Unexpected("Type in Reactions::list."); } +QString Reactions::favorite() const { + return _favorite; +} + rpl::producer<> Reactions::updates() const { return _updated.events(); } diff --git a/Telegram/SourceFiles/data/data_message_reactions.h b/Telegram/SourceFiles/data/data_message_reactions.h index c6ae98caa..2138e2290 100644 --- a/Telegram/SourceFiles/data/data_message_reactions.h +++ b/Telegram/SourceFiles/data/data_message_reactions.h @@ -43,6 +43,7 @@ public: All, }; [[nodiscard]] const std::vector &list(Type type) const; + [[nodiscard]] QString favorite() const; [[nodiscard]] static base::flat_set ParseAllowed( const MTPVector *list); @@ -95,6 +96,7 @@ private: std::vector _active; std::vector _available; + QString _favorite; base::flat_map< not_null, std::shared_ptr> _iconsCache; diff --git a/Telegram/SourceFiles/history/view/history_view_react_button.cpp b/Telegram/SourceFiles/history/view/history_view_react_button.cpp index d285a5d1b..b7e899791 100644 --- a/Telegram/SourceFiles/history/view/history_view_react_button.cpp +++ b/Telegram/SourceFiles/history/view/history_view_react_button.cpp @@ -456,16 +456,25 @@ void Manager::applyListFilters() { && (_buttonAlreadyNotMineCount >= limit); auto icons = std::vector>(); icons.reserve(_list.size()); + auto favoriteIndex = -1; for (auto &icon : _list) { + const auto &emoji = icon.emoji; const auto add = applyUniqueLimit - ? _buttonAlreadyList.contains(icon.emoji) - : (!_filter || _filter->contains(icon.emoji)); + ? _buttonAlreadyList.contains(emoji) + : (!_filter || _filter->contains(emoji)); if (add) { + if (emoji == _favorite) { + favoriteIndex = int(icons.size()); + } icons.push_back(&icon); } else { clearStateForHidden(icon); } } + if (favoriteIndex > 0) { + const auto first = begin(icons); + std::rotate(first, first + favoriteIndex, first + favoriteIndex + 1); + } if (_icons == icons) { return; } @@ -534,14 +543,23 @@ void Manager::showButtonDelayed() { [=]{ updateButton({}); }); } -void Manager::applyList(const std::vector &list) { +void Manager::applyList( + const std::vector &list, + const QString &favorite) { const auto proj = [](const auto &obj) { return std::tie( obj.emoji, obj.appearAnimation, obj.selectAnimation); }; + const auto favoriteChanged = (_favorite != favorite); + if (favoriteChanged) { + _favorite = favorite; + } if (ranges::equal(_list, list, ranges::equal_to(), proj, proj)) { + if (favoriteChanged) { + applyListFilters(); + } return; } const auto selected = _selectedIcon; @@ -1533,13 +1551,15 @@ void SetupManagerList( not_null manager, not_null session, rpl::producer>> filter) { + const auto reactions = &session->data().reactions(); rpl::single( rpl::empty_value() ) | rpl::then( - session->data().reactions().updates() + reactions->updates() ) | rpl::start_with_next([=] { manager->applyList( - session->data().reactions().list(Data::Reactions::Type::Active)); + reactions->list(Data::Reactions::Type::Active), + reactions->favorite()); }, manager->lifetime()); std::move( diff --git a/Telegram/SourceFiles/history/view/history_view_react_button.h b/Telegram/SourceFiles/history/view/history_view_react_button.h index fe6e610b9..22ab6ab56 100644 --- a/Telegram/SourceFiles/history/view/history_view_react_button.h +++ b/Telegram/SourceFiles/history/view/history_view_react_button.h @@ -141,7 +141,9 @@ public: IconFactory iconFactory); ~Manager(); - void applyList(const std::vector &list); + void applyList( + const std::vector &list, + const QString &favorite); void updateAllowedSublist(std::optional> filter); void updateUniqueLimit(not_null item); @@ -296,6 +298,7 @@ private: const IconFactory _iconFactory; rpl::event_stream _chosen; std::vector _list; + QString _favorite; std::optional> _filter; QSize _outer; QRect _inner; diff --git a/Telegram/SourceFiles/main/main_account.cpp b/Telegram/SourceFiles/main/main_account.cpp index 39dc25248..2b3897b13 100644 --- a/Telegram/SourceFiles/main/main_account.cpp +++ b/Telegram/SourceFiles/main/main_account.cpp @@ -78,11 +78,12 @@ std::unique_ptr Account::prepareToStart( } void Account::start(std::unique_ptr config) { + _appConfig = std::make_unique(this); startMtp(config ? std::move(config) : std::make_unique( Core::App().fallbackProductionConfig())); - _appConfig = std::make_unique(this); + _appConfig->start(); watchProxyChanges(); watchSessionChanges(); } diff --git a/Telegram/SourceFiles/main/main_app_config.cpp b/Telegram/SourceFiles/main/main_app_config.cpp index fef8d9702..cf5c4ea42 100644 --- a/Telegram/SourceFiles/main/main_app_config.cpp +++ b/Telegram/SourceFiles/main/main_app_config.cpp @@ -19,12 +19,6 @@ constexpr auto kRefreshTimeout = 3600 * crl::time(1000); } // namespace AppConfig::AppConfig(not_null account) : _account(account) { - account->mtpMainSessionValue( - ) | rpl::start_with_next([=](not_null instance) { - _api.emplace(instance); - refresh(); - }, _lifetime); - account->sessionChanges( ) | rpl::filter([=](Session *session) { return (session != nullptr); @@ -33,6 +27,14 @@ AppConfig::AppConfig(not_null account) : _account(account) { }, _lifetime); } +void AppConfig::start() { + _account->mtpMainSessionValue( + ) | rpl::start_with_next([=](not_null instance) { + _api.emplace(instance); + refresh(); + }, _lifetime); +} + void AppConfig::refresh() { if (_requestId || !_api) { return; @@ -178,6 +180,8 @@ rpl::producer<> AppConfig::suggestionRequested(const QString &key) const { } void AppConfig::dismissSuggestion(const QString &key) { + Expects(_api.has_value()); + if (!_dismissedSuggestions.emplace(key).second) { return; } diff --git a/Telegram/SourceFiles/main/main_app_config.h b/Telegram/SourceFiles/main/main_app_config.h index 1235b7b40..338bd4408 100644 --- a/Telegram/SourceFiles/main/main_app_config.h +++ b/Telegram/SourceFiles/main/main_app_config.h @@ -17,6 +17,8 @@ class AppConfig final { public: explicit AppConfig(not_null account); + void start(); + template [[nodiscard]] Type get(const QString &key, Type fallback) const { if constexpr (std::is_same_v) {