diff --git a/Telegram/SourceFiles/ayu/ayu_settings.cpp b/Telegram/SourceFiles/ayu/ayu_settings.cpp index 85cf8b57fc..6595ad42c5 100644 --- a/Telegram/SourceFiles/ayu/ayu_settings.cpp +++ b/Telegram/SourceFiles/ayu/ayu_settings.cpp @@ -460,11 +460,7 @@ void AyuSettings::validate() { validateEnum(_showRepeatMessageInContextMenu, defaults._showRepeatMessageInContextMenu); validateEnum(_showAddFilterInContextMenu, defaults._showAddFilterInContextMenu); - const auto &provider = _translationProvider.current(); - if (provider != "telegram" && provider != "google" && provider != "yandex") { - _translationProvider = defaults._translationProvider.current(); - modified = true; - } + validateEnum(_translationProvider, defaults._translationProvider); validateRange(_wideMultiplier, 0.5, 4.0, defaults._wideMultiplier); validateRange(_recentStickersCount, 1, 200, defaults._recentStickersCount); @@ -916,7 +912,7 @@ void AyuSettings::setVoiceConfirmation(bool val) { save(); } -void AyuSettings::setTranslationProvider(const QString &val) { +void AyuSettings::setTranslationProvider(TranslationProvider val) { if (_translationProvider.current() == val) return; _translationProvider = val; Ayu::Translator::TranslateManager::currentInstance()->resetCache(); diff --git a/Telegram/SourceFiles/ayu/ayu_settings.h b/Telegram/SourceFiles/ayu/ayu_settings.h index 49bac43461..be404240c7 100644 --- a/Telegram/SourceFiles/ayu/ayu_settings.h +++ b/Telegram/SourceFiles/ayu/ayu_settings.h @@ -38,6 +38,12 @@ enum class ContextMenuVisibility { VisibleWithModifier = 2, }; +enum class TranslationProvider { + Telegram = 0, + Google = 1, + Yandex = 2, +}; + NLOHMANN_JSON_SERIALIZE_ENUM(PeerIdDisplay, { {PeerIdDisplay::Hidden, 0}, {PeerIdDisplay::TelegramApi, 1}, @@ -56,6 +62,12 @@ NLOHMANN_JSON_SERIALIZE_ENUM(ContextMenuVisibility, { {ContextMenuVisibility::VisibleWithModifier, 2}, }) +NLOHMANN_JSON_SERIALIZE_ENUM(TranslationProvider, { + {TranslationProvider::Telegram, "telegram"}, + {TranslationProvider::Google, "google"}, + {TranslationProvider::Yandex, "yandex"}, +}) + class GhostModeAccountSettings { public: GhostModeAccountSettings(); @@ -285,7 +297,7 @@ public: [[nodiscard]] bool stickerConfirmation() const { return _stickerConfirmation.current(); } [[nodiscard]] bool gifConfirmation() const { return _gifConfirmation.current(); } [[nodiscard]] bool voiceConfirmation() const { return _voiceConfirmation.current(); } - [[nodiscard]] const QString &translationProvider() const { return _translationProvider.current(); } + [[nodiscard]] TranslationProvider translationProvider() const { return _translationProvider.current(); } [[nodiscard]] bool adaptiveCoverColor() const { return _adaptiveCoverColor.current(); } [[nodiscard]] bool improveLinkPreviews() const { return _improveLinkPreviews.current(); } [[nodiscard]] bool crashReporting() const { return _crashReporting.current(); } @@ -361,7 +373,7 @@ public: void setStickerConfirmation(bool val); void setGifConfirmation(bool val); void setVoiceConfirmation(bool val); - void setTranslationProvider(const QString &val); + void setTranslationProvider(TranslationProvider val); void setAdaptiveCoverColor(bool val); void setImproveLinkPreviews(bool val); void setCrashReporting(bool val); @@ -438,7 +450,7 @@ public: [[nodiscard]] rpl::producer stickerConfirmationChanges() const { return _stickerConfirmation.value(); } [[nodiscard]] rpl::producer gifConfirmationChanges() const { return _gifConfirmation.value(); } [[nodiscard]] rpl::producer voiceConfirmationChanges() const { return _voiceConfirmation.value(); } - [[nodiscard]] rpl::producer translationProviderChanges() const { return _translationProvider.value(); } + [[nodiscard]] rpl::producer translationProviderChanges() const { return _translationProvider.value(); } [[nodiscard]] rpl::producer adaptiveCoverColorChanges() const { return _adaptiveCoverColor.value(); } [[nodiscard]] rpl::producer improveLinkPreviewsChanges() const { return _improveLinkPreviews.value(); } [[nodiscard]] rpl::producer crashReportingChanges() const { return _crashReporting.value(); } @@ -523,7 +535,7 @@ private: rpl::variable _stickerConfirmation = false; rpl::variable _gifConfirmation = false; rpl::variable _voiceConfirmation = false; - rpl::variable _translationProvider = QString("telegram"); + rpl::variable _translationProvider = TranslationProvider::Telegram; rpl::variable _adaptiveCoverColor = true; rpl::variable _improveLinkPreviews = false; rpl::variable _crashReporting = true; diff --git a/Telegram/SourceFiles/ayu/features/translator/ayu_translator.cpp b/Telegram/SourceFiles/ayu/features/translator/ayu_translator.cpp index 719a6d647a..40a5d7f58f 100644 --- a/Telegram/SourceFiles/ayu/features/translator/ayu_translator.cpp +++ b/Telegram/SourceFiles/ayu/features/translator/ayu_translator.cpp @@ -24,6 +24,21 @@ // todo: expose available languages from current translator and use in `ChooseTranslateToBox` namespace Ayu::Translator { +namespace { + +BaseTranslator &translatorForProvider(TranslationProvider provider) { + switch (provider) { + case TranslationProvider::Telegram: + return TelegramTranslator::instance(); + case TranslationProvider::Yandex: + return YandexTranslator::instance(); + case TranslationProvider::Google: + return GoogleTranslator::instance(); + } + return GoogleTranslator::instance(); +} + +} // namespace TranslateManager::Builder::Builder( TranslateManager &manager, @@ -228,13 +243,7 @@ mtpRequestId TranslateManager::performTranslation(Builder &req) { if (const auto it = _pending.find(id); it != _pending.end()) { const auto &settings = AyuSettings::getInstance(); - if (settings.translationProvider() == "telegram") { - it->second.cancel = TelegramTranslator::instance().startTranslation(args); - } else if (settings.translationProvider() == "yandex") { - it->second.cancel = YandexTranslator::instance().startTranslation(args); - } else { - it->second.cancel = GoogleTranslator::instance().startTranslation(args); - } + it->second.cancel = translatorForProvider(settings.translationProvider()).startTranslation(args); } return id; diff --git a/Telegram/SourceFiles/ayu/ui/settings/settings_general.cpp b/Telegram/SourceFiles/ayu/ui/settings/settings_general.cpp index 5c55f1ff3c..3fd7d35533 100644 --- a/Telegram/SourceFiles/ayu/ui/settings/settings_general.cpp +++ b/Telegram/SourceFiles/ayu/ui/settings/settings_general.cpp @@ -41,11 +41,8 @@ void BuildTranslator(SectionBuilder &builder, AyuSectionBuilder &ayu) { QString("Yandex") }; - const auto getIndex = [=](const QString &val) { - if (val == "telegram") return 0; - if (val == "google") return 1; - if (val == "yandex") return 2; - return 0; + const auto getIndex = [=](TranslationProvider val) { + return static_cast(val); }; auto currentVal = AyuSettings::getInstance().translationProviderChanges() @@ -62,10 +59,8 @@ void BuildTranslator(SectionBuilder &builder, AyuSectionBuilder &ayu) { controller->show(Box( [=](not_null box) { const auto save = [=](int index) { - const auto provider = (index == 0) - ? "telegram" - : (index == 1) ? "google" : "yandex"; - AyuSettings::getInstance().setTranslationProvider(provider); + AyuSettings::getInstance().setTranslationProvider( + static_cast(index)); }; SingleChoiceBox(box, { .title = tr::ayu_TranslationProvider(), diff --git a/Telegram/SourceFiles/boxes/language_box.cpp b/Telegram/SourceFiles/boxes/language_box.cpp index 965548afac..253d30c74a 100644 --- a/Telegram/SourceFiles/boxes/language_box.cpp +++ b/Telegram/SourceFiles/boxes/language_box.cpp @@ -1225,7 +1225,7 @@ void LanguageBox::setupTop(not_null container) { auto premium = Data::AmPremiumValue(&_controller->session()) | rpl::map([=](bool val) { // const auto &settings = AyuSettings::getInstance(); - // if (settings.translationProvider != "telegram") { + // if (settings.translationProvider() != TranslationProvider::Telegram) { // return true; // } // return val; diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index 034f780cb6..1e98f4f2ff 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -7773,3 +7773,7 @@ void HistoryItem::overrideMedia(std::unique_ptr media) { _media = std::move(media); } + +void HistoryItem::removeTranslationBit() { + RemoveComponents(HistoryMessageTranslation::Bit()); +} diff --git a/Telegram/SourceFiles/history/history_item.h b/Telegram/SourceFiles/history/history_item.h index c825e7aae4..cbf71ba551 100644 --- a/Telegram/SourceFiles/history/history_item.h +++ b/Telegram/SourceFiles/history/history_item.h @@ -611,6 +611,7 @@ public: [[nodiscard]] int unsupportedTTL() const { return _unsupportedTTL; } + void removeTranslationBit(); [[nodiscard]] int boostsApplied() const { return _boostsApplied; diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index fad0b286bd..c4d1a9be85 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -834,6 +834,21 @@ HistoryWidget::HistoryWidget( this->update(); }, lifetime()); + AyuSettings::getInstance().translationProviderChanges( + ) | rpl::on_next([=](TranslationProvider) { + if (_history) { + for (const auto &block : _history->blocks) { + for (const auto &view : block->messages) { + const auto item = view->data(); + if (item->Has()) { + item->removeTranslationBit(); + _history->owner().requestItemTextRefresh(item); + } + } + } + } + }, lifetime()); + using MessageUpdateFlag = Data::MessageUpdate::Flag; session().changes().messageUpdates( MessageUpdateFlag::Destroyed diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp index b4aea09682..02b640a208 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp @@ -105,6 +105,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL // AyuGram includes #include "ayu/ayu_settings.h" +#include "history/history_item_components.h" namespace HistoryView { @@ -2205,6 +2206,21 @@ void ComposeControls::init() { orderControls(); }, _wrap->lifetime()); + AyuSettings::getInstance().translationProviderChanges( + ) | rpl::on_next([=](TranslationProvider) { + if (_history) { + for (const auto &block : _history->blocks) { + for (const auto &view : block->messages) { + const auto item = view->data(); + if (item->Has()) { + item->removeTranslationBit(); + _history->owner().requestItemTextRefresh(item); + } + } + } + } + }, _wrap->lifetime()); + orderControls(); } diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp index 94c8a01467..dce5d25e62 100644 --- a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp @@ -467,7 +467,7 @@ void BottomInfo::layoutDateText() { : _data.scheduleRepeatPeriod ? (SchedulePeriodText(_data.scheduleRepeatPeriod) + ' ') : QString(); - const auto author = _data.author; + const auto author = settings.filterZalgo() ? filterZalgo(_data.author) : _data.author; const auto prefix = !author.isEmpty() ? u", "_q : QString(); const auto date = edited + ((_data.flags & Data::Flag::ForwardedDate) ? Ui::FormatDateTimeSavedFrom(_data.date) @@ -534,7 +534,7 @@ void BottomInfo::layoutDateText() { edited = TextWithEntities{ SchedulePeriodText(_data.scheduleRepeatPeriod) + ' ' }; } - const auto author = _data.author; + const auto author = settings.filterZalgo() ? filterZalgo(_data.author) : _data.author; const auto prefix = !author.isEmpty() ? (_data.flags & Data::Flag::Edited ? u" "_q : u", "_q) : QString(); const auto dateStr = (_data.flags & Data::Flag::ForwardedDate) diff --git a/Telegram/SourceFiles/history/view/history_view_reply.cpp b/Telegram/SourceFiles/history/view/history_view_reply.cpp index 0954693897..c585488da0 100644 --- a/Telegram/SourceFiles/history/view/history_view_reply.cpp +++ b/Telegram/SourceFiles/history/view/history_view_reply.cpp @@ -251,6 +251,7 @@ void FillBackgroundEmoji( bool quote, const Ui::BackgroundEmojiCache &cache, const QImage &firstGiftFrame) { + const auto was = p.opacity(); // for semi-transparent deleted messages p.setClipRect(rect); const auto &frames = cache.frames; @@ -264,7 +265,7 @@ void FillBackgroundEmoji( if (y >= rect.height()) { return; } - p.setOpacity(opacity); + p.setOpacity(was * opacity); p.drawImage( right - style::ConvertScale(x + (quote ? 12 : 0)), rect.y() + y, @@ -296,7 +297,7 @@ void FillBackgroundEmoji( } p.setClipping(false); - p.setOpacity(1.); + p.setOpacity(was); } Reply::Reply() diff --git a/Telegram/SourceFiles/history/view/history_view_translate_bar.cpp b/Telegram/SourceFiles/history/view/history_view_translate_bar.cpp index 3ebe9dacb2..a4808887f6 100644 --- a/Telegram/SourceFiles/history/view/history_view_translate_bar.cpp +++ b/Telegram/SourceFiles/history/view/history_view_translate_bar.cpp @@ -491,7 +491,7 @@ void TranslateBar::showMenu(base::unique_qptr menu) { &st::menuIconCancel); const auto &settings = AyuSettings::getInstance(); - if (settings.translationProvider() == "telegram") { + if (settings.translationProvider() == TranslationProvider::Telegram) { _menu->addSeparator(); const auto cocoon = ChatHelpers::GenerateLocalTgsSticker( &_history->session(),