media_view_playback_controls.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #pragma once
  8. #include "ui/rp_widget.h"
  9. #include "base/object_ptr.h"
  10. #include "media/media_common.h"
  11. namespace Ui {
  12. class LabelSimple;
  13. class FadeAnimation;
  14. class IconButton;
  15. class MediaSlider;
  16. class PopupMenu;
  17. } // namespace Ui
  18. namespace Media {
  19. namespace Player {
  20. struct TrackState;
  21. class SettingsButton;
  22. class SpeedController;
  23. } // namespace Player
  24. namespace View {
  25. class PlaybackProgress;
  26. class PlaybackControls : public Ui::RpWidget {
  27. public:
  28. class Delegate {
  29. public:
  30. virtual void playbackControlsPlay() = 0;
  31. virtual void playbackControlsPause() = 0;
  32. virtual void playbackControlsSeekProgress(crl::time position) = 0;
  33. virtual void playbackControlsSeekFinished(crl::time position) = 0;
  34. virtual void playbackControlsVolumeChanged(float64 volume) = 0;
  35. [[nodiscard]] virtual float64 playbackControlsCurrentVolume() = 0;
  36. virtual void playbackControlsVolumeToggled() = 0;
  37. virtual void playbackControlsVolumeChangeFinished() = 0;
  38. virtual void playbackControlsSpeedChanged(float64 speed) = 0;
  39. [[nodiscard]] virtual float64 playbackControlsCurrentSpeed(
  40. bool lastNonDefault) = 0;
  41. [[nodiscard]] virtual auto playbackControlsQualities()
  42. -> std::vector<int> = 0;
  43. [[nodiscard]] virtual auto playbackControlsCurrentQuality()
  44. -> VideoQuality = 0;
  45. virtual void playbackControlsQualityChanged(int quality) = 0;
  46. virtual void playbackControlsToFullScreen() = 0;
  47. virtual void playbackControlsFromFullScreen() = 0;
  48. virtual void playbackControlsToPictureInPicture() = 0;
  49. virtual void playbackControlsRotate() = 0;
  50. };
  51. PlaybackControls(QWidget *parent, not_null<Delegate*> delegate);
  52. ~PlaybackControls();
  53. void showAnimated();
  54. void hideAnimated();
  55. void updatePlayback(const Player::TrackState &state);
  56. void setLoadingProgress(int64 ready, int64 total);
  57. void setInFullScreen(bool inFullScreen);
  58. [[nodiscard]] bool hasMenu() const;
  59. [[nodiscard]] bool dragging() const;
  60. protected:
  61. void resizeEvent(QResizeEvent *e) override;
  62. void paintEvent(QPaintEvent *e) override;
  63. void mousePressEvent(QMouseEvent *e) override;
  64. private:
  65. void handleSeekProgress(float64 progress);
  66. void handleSeekFinished(float64 progress);
  67. template <typename Callback>
  68. void startFading(Callback start);
  69. void fadeFinished();
  70. void fadeUpdated(float64 opacity);
  71. void refreshFadeCache();
  72. [[nodiscard]] float64 countDownloadedTillPercent(
  73. const Player::TrackState &state) const;
  74. void updatePlaybackSpeed(float64 speed);
  75. void updateVolumeToggleIcon();
  76. void updateDownloadProgressPosition();
  77. void updatePlayPauseResumeState(const Player::TrackState &state);
  78. void updateTimeTexts(const Player::TrackState &state);
  79. void refreshTimeTexts();
  80. [[nodiscard]] float64 speedLookup(bool lastNonDefault) const;
  81. void saveSpeed(float64 speed);
  82. void saveQuality(int quality);
  83. void updateSpeedToggleQuality();
  84. const not_null<Delegate*> _delegate;
  85. bool _speedControllable = false;
  86. std::vector<int> _qualitiesList;
  87. bool _inFullScreen = false;
  88. bool _showPause = false;
  89. bool _childrenHidden = false;
  90. QString _timeAlready, _timeLeft;
  91. crl::time _seekPositionMs = -1;
  92. crl::time _lastDurationMs = 0;
  93. int64 _loadingReady = 0;
  94. int64 _loadingTotal = 0;
  95. int _loadingPercent = 0;
  96. object_ptr<Ui::IconButton> _playPauseResume;
  97. object_ptr<Ui::MediaSlider> _playbackSlider;
  98. std::unique_ptr<PlaybackProgress> _playbackProgress;
  99. std::unique_ptr<PlaybackProgress> _receivedTillProgress;
  100. object_ptr<Ui::IconButton> _volumeToggle;
  101. object_ptr<Ui::MediaSlider> _volumeController;
  102. object_ptr<Player::SettingsButton> _speedToggle;
  103. object_ptr<Ui::IconButton> _fullScreenToggle;
  104. object_ptr<Ui::IconButton> _pictureInPicture;
  105. object_ptr<Ui::LabelSimple> _playedAlready;
  106. object_ptr<Ui::LabelSimple> _toPlayLeft;
  107. object_ptr<Ui::LabelSimple> _downloadProgress = { nullptr };
  108. std::unique_ptr<Player::SpeedController> _speedController;
  109. std::unique_ptr<Ui::FadeAnimation> _fadeAnimation;
  110. };
  111. } // namespace View
  112. } // namespace Media