From 0ce5405eef1a062a8abcdcfebc73d0f6f3216695 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 31 May 2019 14:12:07 +0300 Subject: [PATCH] Show download progress in playback controls. --- Telegram/Resources/langs/lang.strings | 1 + .../media/view/media_view_overlay_widget.cpp | 21 +++++--- .../view/media_view_playback_controls.cpp | 49 +++++++++++++++++-- .../media/view/media_view_playback_controls.h | 6 +++ 4 files changed, 68 insertions(+), 9 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 20eff64d0..e5462d0e1 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1485,6 +1485,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_mediaview_date_time" = "{date} at {time}"; "lng_mediaview_saved" = "Image was saved to your [c]Downloads[/c] folder"; +"lng_mediaview_video_loading" = "Loading - {percent}"; "lng_theme_preview_title" = "Theme Preview"; "lng_theme_preview_generating" = "Generating color theme preview..."; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 20cbea4ba..b9cce6c9f 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -446,12 +446,21 @@ void OverlayWidget::clearLottie() { } void OverlayWidget::documentUpdated(DocumentData *doc) { - if (documentBubbleShown() && _doc && _doc == doc) { - if ((_doc->loading() && _docCancel->isHidden()) || (!_doc->loading() && !_docCancel->isHidden())) { - updateControls(); - } else if (_doc->loading()) { - updateDocSize(); - update(_docRect); + if (_doc && _doc == doc) { + if (documentBubbleShown()) { + if ((_doc->loading() && _docCancel->isHidden()) || (!_doc->loading() && !_docCancel->isHidden())) { + updateControls(); + } else if (_doc->loading()) { + updateDocSize(); + update(_docRect); + } + } else if (_streamed) { + const auto ready = _doc->loaded() + ? _doc->size + : _doc->loading() + ? std::clamp(_doc->loadOffset(), 0, _doc->size) + : 0; + _streamed->controls.setLoadingProgress(ready, _doc->size); } } } diff --git a/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp b/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp index 4bc467716..6284d0232 100644 --- a/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp +++ b/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp @@ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/widgets/continuous_sliders.h" #include "ui/effects/fade_animation.h" #include "ui/widgets/buttons.h" +#include "lang/lang_keys.h" #include "layout.h" #include "styles/style_mediaview.h" @@ -157,6 +158,45 @@ void PlaybackControls::updatePlayback(const Player::TrackState &state) { updateTimeTexts(state); } +void PlaybackControls::setLoadingProgress(int ready, int total) { + if (_loadingReady == ready && _loadingTotal == total) { + return; + } + _loadingReady = ready; + _loadingTotal = total; + if (_loadingReady != 0 && _loadingReady != _loadingTotal) { + if (!_downloadProgress) { + _downloadProgress.create(this, st::mediaviewPlayProgressLabel); + _downloadProgress->setVisible(!_fadeAnimation->animating()); + _loadingPercent = -1; + } + const auto progress = total ? (ready / float64(total)) : 0.; + const auto percent = int(std::round(progress * 100)); + if (_loadingPercent != percent) { + _loadingPercent = percent; + _downloadProgress->setText(lng_mediaview_video_loading( + lt_percent, + QString::number(percent) + '%')); + if (_playbackSlider->width() > _downloadProgress->width()) { + const auto left = (_playbackSlider->width() - _downloadProgress->width()) / 2; + _downloadProgress->move(_playbackSlider->x() + left, st::mediaviewPlayProgressTop); + } + refreshFadeCache(); + } + } else { + _downloadProgress.destroy(); + } +} + +void PlaybackControls::refreshFadeCache() { + if (!_fadeAnimation->animating()) { + return; + } + startFading([&] { + _fadeAnimation->refreshCache(); + }); +} + void PlaybackControls::updatePlayPauseResumeState(const Player::TrackState &state) { auto showPause = ShowPauseIcon(state.state) || (_seekPositionMs >= 0); if (showPause != _showPause) { @@ -207,9 +247,7 @@ void PlaybackControls::refreshTimeTexts() { _toPlayLeft->setText(timeLeft, &leftChanged); if (alreadyChanged || leftChanged) { resizeEvent(nullptr); - startFading([this]() { - _fadeAnimation->refreshCache(); - }); + refreshFadeCache(); } } @@ -238,6 +276,11 @@ void PlaybackControls::resizeEvent(QResizeEvent *e) { _playedAlready->moveToLeft(st::mediaviewPlayPauseLeft + _playPauseResume->width() + playTop, st::mediaviewPlayProgressTop); _toPlayLeft->moveToRight(width() - (st::mediaviewPlayPauseLeft + _playPauseResume->width() + playTop) - playbackWidth, st::mediaviewPlayProgressTop); + + if (_downloadProgress) { + const auto left = (_playbackSlider->width() - _downloadProgress->width()) / 2; + _downloadProgress->move(_playbackSlider->x() + left, st::mediaviewPlayProgressTop); + } } void PlaybackControls::paintEvent(QPaintEvent *e) { diff --git a/Telegram/SourceFiles/media/view/media_view_playback_controls.h b/Telegram/SourceFiles/media/view/media_view_playback_controls.h index a3b47a5af..7f382eacc 100644 --- a/Telegram/SourceFiles/media/view/media_view_playback_controls.h +++ b/Telegram/SourceFiles/media/view/media_view_playback_controls.h @@ -45,6 +45,7 @@ public: void hideAnimated(); void updatePlayback(const Player::TrackState &state); + void setLoadingProgress(int ready, int total); void setInFullScreen(bool inFullScreen); ~PlaybackControls(); @@ -62,6 +63,7 @@ private: void startFading(Callback start); void fadeFinished(); void fadeUpdated(float64 opacity); + void refreshFadeCache(); void updatePlayPauseResumeState(const Player::TrackState &state); void updateTimeTexts(const Player::TrackState &state); @@ -75,6 +77,9 @@ private: QString _timeAlready, _timeLeft; crl::time _seekPositionMs = -1; crl::time _lastDurationMs = 0; + int _loadingReady = 0; + int _loadingTotal = 0; + int _loadingPercent = 0; object_ptr _playPauseResume; object_ptr _playbackSlider; @@ -84,6 +89,7 @@ private: object_ptr _fullScreenToggle; object_ptr _playedAlready; object_ptr _toPlayLeft; + object_ptr _downloadProgress = { nullptr }; std::unique_ptr _fadeAnimation;