diff --git a/Telegram/SourceFiles/api/api_transcribes.cpp b/Telegram/SourceFiles/api/api_transcribes.cpp index b19d6ad7d4..cd16314532 100644 --- a/Telegram/SourceFiles/api/api_transcribes.cpp +++ b/Telegram/SourceFiles/api/api_transcribes.cpp @@ -104,7 +104,6 @@ void Transcribes::toggle(not_null item) { auto i = _map.find(id); if (i == _map.end()) { load(item); - //_session->data().requestItemRepaint(item); _session->data().requestItemResize(item); } else if (!i->second.requestId) { i->second.shown = !i->second.shown; @@ -120,7 +119,6 @@ void Transcribes::toggleSummary(not_null item) { auto i = _summaries.find(id); if (i == _summaries.end()) { summarize(item); - _session->data().requestItemResize(item); } else if (!i->second.loading) { i->second.shown = !i->second.shown; _session->data().requestItemResize(item); @@ -137,8 +135,8 @@ const Transcribes::Entry &Transcribes::entry( return (i != _map.end()) ? i->second : empty; } -const Transcribes::SummaryEntry &Transcribes::summary( - not_null item) const { +const SummaryEntry &Transcribes::summary( + not_null item) const { static const auto empty = SummaryEntry(); const auto i = _summaries.find(item->fullId()); return (i != _summaries.end()) ? i->second : empty; @@ -235,6 +233,7 @@ void Transcribes::summarize(not_null item) { if (!item->isHistoryEntry() || item->isLocal()) { return; } + const auto id = item->fullId(); const auto requestId = _api.request(MTPmessages_TranslateText( MTP_flags(MTPmessages_TranslateText::Flag::f_peer @@ -266,13 +265,14 @@ void Transcribes::summarize(not_null item) { _session->data().requestItemResize(item); } }).send(); + auto &entry = _summaries.emplace(id).first->second; entry.requestId = requestId; entry.shown = true; entry.loading = true; - if (const auto item = _session->data().message(id)) { - _session->data().requestItemResize(item); - } + + item->setHasSummaryEntry(); + _session->data().requestItemResize(item); } } // namespace Api diff --git a/Telegram/SourceFiles/api/api_transcribes.h b/Telegram/SourceFiles/api/api_transcribes.h index f77c34c72f..65e62777ac 100644 --- a/Telegram/SourceFiles/api/api_transcribes.h +++ b/Telegram/SourceFiles/api/api_transcribes.h @@ -17,6 +17,13 @@ class Session; namespace Api { +struct SummaryEntry { + TextWithEntities result; + bool shown = false; + bool loading = false; + mtpRequestId requestId = 0; +}; + class Transcribes final { public: explicit Transcribes(not_null api); @@ -31,19 +38,12 @@ public: mtpRequestId requestId = 0; }; - struct SummaryEntry { - TextWithEntities result; - bool shown = false; - bool loading = false; - mtpRequestId requestId = 0; - }; - void toggle(not_null item); [[nodiscard]] const Entry &entry(not_null item) const; void toggleSummary(not_null item); [[nodiscard]] const SummaryEntry &summary( - not_null item) const; + not_null item) const; void apply(const MTPDupdateTranscribedAudio &update); diff --git a/Telegram/SourceFiles/data/data_types.h b/Telegram/SourceFiles/data/data_types.h index f9c67856cc..a5e14940cb 100644 --- a/Telegram/SourceFiles/data/data_types.h +++ b/Telegram/SourceFiles/data/data_types.h @@ -361,6 +361,7 @@ enum class MessageFlag : uint64 { SavedMusicItem = (1ULL << 55), HasHiddenLinks = (1ULL << 56), + HasSummaryEntry = (1ULL << 57), }; inline constexpr bool is_flag_type(MessageFlag) { return true; } using MessageFlags = base::flags; diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index 908d8582e9..2e9fd720c6 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_premium.h" #include "api/api_sensitive_content.h" +#include "api/api_transcribes.h" #include "lang/lang_keys.h" #include "calls/calls_instance.h" // Core::App().calls().joinGroupCall. #include "history/view/history_view_item_preview.h" @@ -1825,6 +1826,18 @@ TextWithEntities HistoryItem::factcheckText() const { return {}; } +const Api::SummaryEntry &HistoryItem::summaryEntry() const { + if (!(_flags & MessageFlag::HasSummaryEntry)) { + static const auto empty = Api::SummaryEntry(); + return empty; + } + return history()->session().api().transcribes().summary(this); +} + +void HistoryItem::setHasSummaryEntry() { + _flags |= MessageFlag::HasSummaryEntry; +} + PeerData *HistoryItem::specialNotificationPeer() const { return (mentionsMe() && !_history->peer->isUser()) ? from().get() diff --git a/Telegram/SourceFiles/history/history_item.h b/Telegram/SourceFiles/history/history_item.h index b350a34506..d7ded94ea9 100644 --- a/Telegram/SourceFiles/history/history_item.h +++ b/Telegram/SourceFiles/history/history_item.h @@ -32,6 +32,10 @@ class ReplyKeyboard; struct LanguageId; enum class SuggestionActions : uchar; +namespace Api { +struct SummaryEntry; +} // namespace Api + namespace base { template class enum_mask; @@ -212,6 +216,8 @@ public: void setFactcheck(MessageFactcheck info); [[nodiscard]] bool hasUnrequestedFactcheck() const; [[nodiscard]] TextWithEntities factcheckText() const; + [[nodiscard]] const Api::SummaryEntry &summaryEntry() const; + void setHasSummaryEntry(); [[nodiscard]] not_null notificationThread() const; [[nodiscard]] Data::Thread *maybeNotificationThread() const; diff --git a/Telegram/SourceFiles/history/view/history_view_element.cpp b/Telegram/SourceFiles/history/view/history_view_element.cpp index 03a369e038..ca8d8806b7 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.cpp +++ b/Telegram/SourceFiles/history/view/history_view_element.cpp @@ -1670,9 +1670,8 @@ void Element::validateText() { return; } } + const auto &summary = item->summaryEntry(); const auto summaryShownWas = (_flags & Flag::SummaryShown) != 0; - const auto transcribes = &history()->session().api().transcribes(); - const auto &summary = transcribes->summary(item); const auto summaryShownNow = !summary.result.empty() && summary.shown; const auto summaryShownChanged = (summaryShownWas != summaryShownNow); if (summaryShownNow) { diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index 0a19876c6b..3576b6c7ea 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -7,8 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "history/view/history_view_message.h" -#include "api/api_transcribes.h" #include "api/api_suggest_post.h" +#include "api/api_transcribes.h" #include "base/qt/qt_key_modifiers.h" #include "base/unixtime.h" #include "core/click_handler_types.h" // ClickHandlerContext @@ -469,8 +469,7 @@ QSize Message::performCountOptimalSize() { const auto item = data(); const auto replyData = item->Get(); - const auto &transcribes = item->history()->session().api().transcribes(); - const auto &summary = transcribes.summary(item); + const auto &summary = item->summaryEntry(); const auto showSummaryReply = !summary.result.empty() && summary.shown; if ((replyData && !_hideReply) || showSummaryReply) { @@ -518,8 +517,7 @@ QSize Message::performCountOptimalSize() { }; const auto oldKey = reactionsKey(); if (_summarize) { - const auto &summary - = history()->session().api().transcribes().summary(item); + const auto &summary = item->summaryEntry(); if (_summarize->loading() != summary.loading) { _summarize->setLoading(summary.loading, [this] { repaint(); }); }