media_player_volume_controller.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. #include "media/player/media_player_volume_controller.h"
  8. #include "media/audio/media_audio.h"
  9. #include "media/player/media_player_dropdown.h"
  10. #include "ui/widgets/buttons.h"
  11. #include "ui/widgets/shadow.h"
  12. #include "ui/widgets/continuous_sliders.h"
  13. #include "ui/ui_utility.h"
  14. #include "ui/cached_round_corners.h"
  15. #include "mainwindow.h"
  16. #include "main/main_session.h"
  17. #include "window/window_session_controller.h"
  18. #include "core/application.h"
  19. #include "core/core_settings.h"
  20. #include "styles/style_media_player.h"
  21. #include "styles/style_widgets.h"
  22. #include <QtGui/QGuiApplication>
  23. namespace Media::Player {
  24. VolumeController::VolumeController(
  25. QWidget *parent,
  26. not_null<Window::SessionController*> controller)
  27. : RpWidget(parent)
  28. , _slider(this, st::mediaPlayerPanelPlayback) {
  29. _slider->setMoveByWheel(true);
  30. _slider->setChangeProgressCallback([=](float64 volume) {
  31. applyVolumeChange(volume);
  32. });
  33. _slider->setChangeFinishedCallback([=](float64 volume) {
  34. if (volume > 0) {
  35. Core::App().settings().setRememberedSongVolume(volume);
  36. }
  37. applyVolumeChange(volume);
  38. Core::App().saveSettingsDelayed();
  39. });
  40. Core::App().settings().songVolumeChanges(
  41. ) | rpl::start_with_next([=](float64 volume) {
  42. if (!_slider->isChanging()) {
  43. _slider->setValue(volume);
  44. }
  45. }, lifetime());
  46. setVolume(Core::App().settings().songVolume());
  47. resize(st::mediaPlayerPanelVolumeWidth, 2 * st::mediaPlayerPanelPlaybackPadding + st::mediaPlayerPanelPlayback.width);
  48. }
  49. void VolumeController::setIsVertical(bool vertical) {
  50. using Direction = Ui::MediaSlider::Direction;
  51. _slider->setDirection(vertical ? Direction::Vertical : Direction::Horizontal);
  52. _slider->setAlwaysDisplayMarker(vertical);
  53. }
  54. void VolumeController::outerWheelEvent(not_null<QWheelEvent*> e) {
  55. QGuiApplication::sendEvent(_slider.data(), e);
  56. }
  57. void VolumeController::resizeEvent(QResizeEvent *e) {
  58. _slider->setGeometry(rect());
  59. }
  60. void VolumeController::setVolume(float64 volume) {
  61. _slider->setValue(volume);
  62. if (volume > 0) {
  63. Core::App().settings().setRememberedSongVolume(volume);
  64. }
  65. applyVolumeChange(volume);
  66. }
  67. void VolumeController::applyVolumeChange(float64 volume) {
  68. if (volume != Core::App().settings().songVolume()) {
  69. mixer()->setSongVolume(volume);
  70. Core::App().settings().setSongVolume(volume);
  71. }
  72. }
  73. void PrepareVolumeDropdown(
  74. not_null<Dropdown*> dropdown,
  75. not_null<Window::SessionController*> controller,
  76. rpl::producer<not_null<QWheelEvent*>> outerWheelEvents) {
  77. const auto volume = Ui::CreateChild<VolumeController>(
  78. dropdown.get(),
  79. controller);
  80. volume->show();
  81. volume->setIsVertical(true);
  82. dropdown->sizeValue(
  83. ) | rpl::start_with_next([=](QSize size) {
  84. const auto rect = QRect(QPoint(), size);
  85. const auto inner = rect.marginsRemoved(dropdown->getMargin());
  86. volume->setGeometry(
  87. inner.x(),
  88. inner.y() - st::lineWidth,
  89. inner.width(),
  90. (inner.height()
  91. + st::lineWidth
  92. - ((st::mediaPlayerVolumeSize.width()
  93. - st::mediaPlayerPanelPlayback.width) / 2)));
  94. }, volume->lifetime());
  95. std::move(
  96. outerWheelEvents
  97. ) | rpl::start_with_next([=](not_null<QWheelEvent*> e) {
  98. volume->outerWheelEvent(e);
  99. }, volume->lifetime());
  100. }
  101. } // namespace Media::Player