diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index c451a2cb5..0bbda64fe 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -369,6 +369,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_settings_section_general" = "General"; "lng_settings_change_lang" = "Change language"; "lng_languages" = "Languages"; +"lng_languages_none" = "No languages found."; "lng_sure_save_language" = "Telegram will restart in order to change language"; "lng_settings_update_automatically" = "Update automatically"; "lng_settings_install_beta" = "Install beta versions"; @@ -1844,6 +1845,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_downloads_delete_sure_one" = "Do you want to delete this file?"; "lng_downloads_delete_sure#one" = "Do you want to delete {count} file?"; "lng_downloads_delete_sure#other" = "Do you want to delete {count} files?"; +"lng_downloads_delete_in_cloud_one" = "It will be deleted from your disk, but will remain accessible in the cloud."; +"lng_downloads_delete_in_cloud" = "They will be deleted from your disk, but will remain accessible in the cloud."; "lng_send_image_empty" = "Could not send an empty file: {name}"; "lng_send_image_too_large" = "Could not send a file, because it is larger than 1500 MB: {name}"; diff --git a/Telegram/SourceFiles/boxes/local_storage_box.cpp b/Telegram/SourceFiles/boxes/local_storage_box.cpp index ffe882ef7..769f5deab 100644 --- a/Telegram/SourceFiles/boxes/local_storage_box.cpp +++ b/Telegram/SourceFiles/boxes/local_storage_box.cpp @@ -167,7 +167,7 @@ LocalStorageBox::Row::Row( sizeText(data), st::localStorageRowSize) , _clear(this, std::move(clear), st::localStorageClear) { - _clear->setTextTransform(RoundButton::TextTransform::NoTransform); + _clear->setTextTransform(Ui::RoundButton::TextTransform::NoTransform); _clear->setVisible(data.count != 0); } diff --git a/Telegram/SourceFiles/data/data_download_manager.cpp b/Telegram/SourceFiles/data/data_download_manager.cpp index 023c1b06d..6e9b166ef 100644 --- a/Telegram/SourceFiles/data/data_download_manager.cpp +++ b/Telegram/SourceFiles/data/data_download_manager.cpp @@ -44,6 +44,10 @@ constexpr auto ByItem = [](const auto &entry) { } }; +constexpr auto ByDocument = [](const auto &entry) { + return entry.object.document; +}; + [[nodiscard]] uint64 PeerAccessHash(not_null peer) { if (const auto user = peer->asUser()) { return user->accessHash(); @@ -66,11 +70,11 @@ void DownloadManager::trackSession(not_null session) { data.downloaded = deserialize(session); data.resolveNeeded = data.downloaded.size(); - session->data().itemRepaintRequest( - ) | rpl::filter([=](not_null item) { - return _loading.contains(item); - }) | rpl::start_with_next([=](not_null item) { - check(item); + session->data().documentLoadProgress( + ) | rpl::filter([=](not_null document) { + return _loadingDocuments.contains(document); + }) | rpl::start_with_next([=](not_null document) { + check(document); }, data.lifetime); session->data().itemLayoutChanged( @@ -141,6 +145,7 @@ void DownloadManager::addLoading(DownloadObject object) { .total = size, }); _loading.emplace(item); + _loadingDocuments.emplace(object.document); _loadingProgress = DownloadProgress{ .ready = _loadingProgress.current().ready, .total = _loadingProgress.current().total + size, @@ -155,9 +160,25 @@ void DownloadManager::check(not_null item) { auto &data = sessionData(item); const auto i = ranges::find(data.downloading, item, ByItem); Assert(i != end(data.downloading)); + check(data, i); +} + +void DownloadManager::check(not_null document) { + auto &data = sessionData(document); + const auto i = ranges::find( + data.downloading, + document.get(), + ByDocument); + Assert(i != end(data.downloading)); + check(data, i); +} + +void DownloadManager::check( + SessionData &data, + std::vector::iterator i) { auto &entry = *i; - const auto media = item->media(); + const auto media = entry.object.item->media(); const auto photo = media ? media->photo() : nullptr; const auto document = media ? media->document() : nullptr; if (entry.object.photo != photo || entry.object.document != document) { @@ -169,7 +190,7 @@ void DownloadManager::check(not_null item) { const auto path = document->filepath(true); if (!path.isEmpty()) { - if (_loading.contains(item)) { + if (_loading.contains(entry.object.item)) { addLoaded(entry.object, path, entry.started); } } else if (!document->loading()) { @@ -224,11 +245,14 @@ void DownloadManager::addLoaded( const auto i = ranges::find(data.downloading, item, ByItem); if (i != end(data.downloading)) { auto &entry = *i; + const auto document = entry.object.document; + if (document) { + _loadingDocuments.remove(document); + } const auto j = _loading.find(entry.object.item); if (j == end(_loading)) { return; } - const auto document = entry.object.document; const auto totalChange = document->size - entry.total; const auto readyChange = document->size - entry.ready; entry.ready += readyChange; @@ -531,6 +555,9 @@ void DownloadManager::remove( }; _loading.remove(i->object.item); _loadingDone.remove(i->object.item); + if (const auto document = i->object.document) { + _loadingDocuments.remove(document); + } data.downloading.erase(i); _loadingListChanges.fire({}); _loadingProgress = now; @@ -672,6 +699,11 @@ DownloadManager::SessionData &DownloadManager::sessionData( return sessionData(&item->history()->session()); } +DownloadManager::SessionData &DownloadManager::sessionData( + not_null document) { + return sessionData(&document->session()); +} + void DownloadManager::writePostponed(not_null session) { session->account().local().updateDownloads(serializator(session)); } diff --git a/Telegram/SourceFiles/data/data_download_manager.h b/Telegram/SourceFiles/data/data_download_manager.h index 3057a1b65..6ab00b081 100644 --- a/Telegram/SourceFiles/data/data_download_manager.h +++ b/Telegram/SourceFiles/data/data_download_manager.h @@ -117,6 +117,10 @@ private: }; void check(not_null item); + void check(not_null document); + void check( + SessionData &data, + std::vector::iterator i); void changed(not_null item); void removed(not_null item); void detach(DownloadedId &id); @@ -134,6 +138,7 @@ private: not_null session) const; [[nodiscard]] SessionData &sessionData( not_null item); + [[nodiscard]] SessionData &sessionData(not_null document); void resolve(not_null session, SessionData &data); void resolveRequestsFinished( @@ -157,6 +162,7 @@ private: base::flat_map, SessionData> _sessions; base::flat_set> _loading; + base::flat_set> _loadingDocuments; base::flat_set> _loadingDone; base::flat_set> _loaded; base::flat_set> _generated; diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index 504a3984d..e76e655a7 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -1281,21 +1281,19 @@ void Session::requestPollViewRepaint(not_null poll) { void Session::documentLoadProgress(not_null document) { requestDocumentViewRepaint(document); - session().documentUpdated.notify(document, true); - - if (document->isAudioFile()) { - ::Media::Player::instance()->documentLoadProgress(document); - } + _documentLoadProgress.fire_copy(document); } void Session::documentLoadDone(not_null document) { notifyDocumentLayoutChanged(document); + _documentLoadProgress.fire_copy(document); } void Session::documentLoadFail( not_null document, bool started) { notifyDocumentLayoutChanged(document); + _documentLoadProgress.fire_copy(document); } void Session::photoLoadProgress(not_null photo) { diff --git a/Telegram/SourceFiles/data/data_session.h b/Telegram/SourceFiles/data/data_session.h index 1cb9d638a..a918edd83 100644 --- a/Telegram/SourceFiles/data/data_session.h +++ b/Telegram/SourceFiles/data/data_session.h @@ -416,6 +416,11 @@ public: void documentLoadDone(not_null document); void documentLoadFail(not_null document, bool started); + [[nodiscard]] auto documentLoadProgress() const + -> rpl::producer> { + return _documentLoadProgress.events(); + } + HistoryItem *addNewMessage( const MTPMessage &data, MessageFlags localFlags, @@ -930,6 +935,7 @@ private: rpl::event_stream> _webpageUpdates; rpl::event_stream> _channelDifferenceTooLong; + rpl::event_stream> _documentLoadProgress; base::flat_set> _suggestToGigagroup; base::flat_multi_map> _pollsClosings; diff --git a/Telegram/SourceFiles/main/main_session.h b/Telegram/SourceFiles/main/main_session.h index eab34d412..49a3037e5 100644 --- a/Telegram/SourceFiles/main/main_session.h +++ b/Telegram/SourceFiles/main/main_session.h @@ -167,11 +167,9 @@ public: return _lifetime; } - base::Observable documentUpdated; - - bool supportMode() const; - Support::Helper &supportHelper() const; - Support::Templates &supportTemplates() const; + [[nodiscard]] bool supportMode() const; + [[nodiscard]] Support::Helper &supportHelper() const; + [[nodiscard]] Support::Templates &supportTemplates() const; private: static constexpr auto kDefaultSaveDelay = crl::time(1000); diff --git a/Telegram/SourceFiles/media/player/media_player_instance.cpp b/Telegram/SourceFiles/media/player/media_player_instance.cpp index 7112298d1..93fb145e7 100644 --- a/Telegram/SourceFiles/media/player/media_player_instance.cpp +++ b/Telegram/SourceFiles/media/player/media_player_instance.cpp @@ -217,23 +217,27 @@ void Instance::setCurrent(const AudioMsgId &audioId) { if (item) { setHistory(data, item->history()); } else { - data->history = nullptr; - data->migrated = nullptr; - data->session = nullptr; + setHistory( + data, + nullptr, + audioId.audio() ? &audioId.audio()->session() : nullptr); } _trackChanged.fire_copy(data->type); refreshPlaylist(data); } } -void Instance::setHistory(not_null data, History *history) { +void Instance::setHistory( + not_null data, + History *history, + Main::Session *sessionFallback) { if (history) { data->history = history->migrateToOrMe(); data->migrated = data->history->migrateFrom(); setSession(data, &history->session()); } else { data->history = data->migrated = nullptr; - setSession(data, nullptr); + setSession(data, sessionFallback); } } @@ -250,6 +254,18 @@ void Instance::setSession(not_null data, Main::Session *session) { ) | rpl::start_with_next([=] { setSession(data, nullptr); }, data->sessionLifetime); + + session->data().documentLoadProgress( + ) | rpl::filter([=](not_null document) { + // Before refactoring it was called only for audio files. + return document->isAudioFile(); + }) | rpl::start_with_next([=](not_null document) { + const auto type = AudioMsgId::Type::Song; + emitUpdate(type, [&](const AudioMsgId &audioId) { + return (audioId.audio() == document); + }); + }, data->sessionLifetime); + session->data().itemRemoved( ) | rpl::filter([=](not_null item) { return (data->current.contextId() == item->fullId()); @@ -1114,15 +1130,6 @@ void Instance::updateVoicePlaybackSpeed() { } } -void Instance::documentLoadProgress(DocumentData *document) { - const auto type = document->isAudioFile() - ? AudioMsgId::Type::Song - : AudioMsgId::Type::Voice; - emitUpdate(type, [&](const AudioMsgId &audioId) { - return (audioId.audio() == document); - }); -} - void Instance::emitUpdate(AudioMsgId::Type type) { emitUpdate(type, [](const AudioMsgId &playing) { return true; }); } diff --git a/Telegram/SourceFiles/media/player/media_player_instance.h b/Telegram/SourceFiles/media/player/media_player_instance.h index f19aa7032..96a4842ab 100644 --- a/Telegram/SourceFiles/media/player/media_player_instance.h +++ b/Telegram/SourceFiles/media/player/media_player_instance.h @@ -165,8 +165,6 @@ public: [[nodiscard]] bool pauseGifByRoundVideo() const; - void documentLoadProgress(DocumentData *document); - private: using SharedMediaType = Storage::SharedMediaType; using SliceKey = SparseIdsMergedSlice::Key; @@ -293,7 +291,10 @@ private: void requestRoundVideoResize() const; void requestRoundVideoRepaint() const; - void setHistory(not_null data, History *history); + void setHistory( + not_null data, + History *history, + Main::Session *sessionFallback = nullptr); void setSession(not_null data, Main::Session *session); Data _songData; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 10fb688c6..4c0ce9a7a 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -679,23 +679,23 @@ void OverlayWidget::clearStreaming(bool savePosition) { _streamed = nullptr; } -void OverlayWidget::documentUpdated(DocumentData *doc) { - if (_document && _document == doc) { - if (documentBubbleShown()) { - if ((_document->loading() && _docCancel->isHidden()) || (!_document->loading() && !_docCancel->isHidden())) { - updateControls(); - } else if (_document->loading()) { - updateDocSize(); - _widget->update(_docRect); - } - } else if (_streamed) { - const auto ready = _documentMedia->loaded() - ? _document->size - : _document->loading() - ? std::clamp(_document->loadOffset(), 0, _document->size) - : 0; - _streamed->controls.setLoadingProgress(ready, _document->size); +void OverlayWidget::documentUpdated(not_null document) { + if (_document != document) { + return; + } else if (documentBubbleShown()) { + if ((_document->loading() && _docCancel->isHidden()) || (!_document->loading() && !_docCancel->isHidden())) { + updateControls(); + } else if (_document->loading()) { + updateDocSize(); + _widget->update(_docRect); } + } else if (_streamed) { + const auto ready = _documentMedia->loaded() + ? _document->size + : _document->loading() + ? std::clamp(_document->loadOffset(), 0, _document->size) + : 0; + _streamed->controls.setLoadingProgress(ready, _document->size); } } @@ -4109,12 +4109,11 @@ void OverlayWidget::setSession(not_null session) { } }, _sessionLifetime); - base::ObservableViewer( - session->documentUpdated - ) | rpl::start_with_next([=](DocumentData *document) { - if (!isHidden()) { - documentUpdated(document); - } + session->data().documentLoadProgress( + ) | rpl::filter([=] { + return !isHidden(); + }) | rpl::start_with_next([=](not_null document) { + documentUpdated(document); }, _sessionLifetime); session->data().itemIdChanged( diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h index 3129ae36b..793c2d421 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h @@ -327,7 +327,7 @@ private: void destroyThemePreview(); void updateThemePreviewGeometry(); - void documentUpdated(DocumentData *doc); + void documentUpdated(not_null document); void changingMsgId(not_null row, MsgId oldId); [[nodiscard]] int finalContentRotation() const;