platform_overlay_widget.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. namespace Ui {
  9. class RpWindow;
  10. } // namespace Ui
  11. namespace Ui::Platform {
  12. struct SeparateTitleControls;
  13. } // namespace Ui::Platform
  14. namespace Media::View {
  15. inline constexpr auto kMaximizedIconOpacity = 0.6;
  16. inline constexpr auto kNormalIconOpacity = 0.9;
  17. inline constexpr auto kOverBackgroundOpacity = 0.2775;
  18. inline constexpr auto kStoriesNavOpacity = 0.3;
  19. inline constexpr auto kStoriesNavOverOpacity = 0.7;
  20. [[nodiscard]] QColor OverBackgroundColor();
  21. } // namespace Media::View
  22. namespace Platform {
  23. class OverlayWidgetHelper {
  24. public:
  25. virtual ~OverlayWidgetHelper() = default;
  26. virtual void orderWidgets() {
  27. }
  28. [[nodiscard]] virtual bool skipTitleHitTest(QPoint position) {
  29. return false;
  30. }
  31. [[nodiscard]] virtual rpl::producer<> controlsActivations() {
  32. return rpl::never<>();
  33. }
  34. [[nodiscard]] virtual rpl::producer<bool> controlsSideRightValue() {
  35. return rpl::single(true);
  36. }
  37. virtual void beforeShow(bool fullscreen) {
  38. }
  39. virtual void afterShow(bool fullscreen) {
  40. }
  41. virtual void notifyFileDialogShown(bool shown) {
  42. }
  43. virtual void minimize(not_null<Ui::RpWindow*> window);
  44. virtual void clearState() {
  45. }
  46. virtual void setControlsOpacity(float64 opacity) {
  47. }
  48. [[nodiscard]] virtual auto mouseEvents() const
  49. -> rpl::producer<not_null<QMouseEvent*>> {
  50. return rpl::never<not_null<QMouseEvent*>>();
  51. }
  52. [[nodiscard]] virtual rpl::producer<int> topNotchSkipValue() {
  53. return rpl::single(0);
  54. }
  55. };
  56. [[nodiscard]] std::unique_ptr<OverlayWidgetHelper> CreateOverlayWidgetHelper(
  57. not_null<Ui::RpWindow*> window,
  58. Fn<void(bool)> maximize);
  59. class DefaultOverlayWidgetHelper final : public OverlayWidgetHelper {
  60. public:
  61. DefaultOverlayWidgetHelper(
  62. not_null<Ui::RpWindow*> window,
  63. Fn<void(bool)> maximize);
  64. ~DefaultOverlayWidgetHelper();
  65. void orderWidgets() override;
  66. bool skipTitleHitTest(QPoint position) override;
  67. rpl::producer<> controlsActivations() override;
  68. void beforeShow(bool fullscreen) override;
  69. void clearState() override;
  70. void setControlsOpacity(float64 opacity) override;
  71. rpl::producer<bool> controlsSideRightValue() override;
  72. rpl::producer<not_null<QMouseEvent*>> mouseEvents() const override;
  73. private:
  74. class Buttons;
  75. const not_null<Buttons*> _buttons;
  76. const std::unique_ptr<Ui::Platform::SeparateTitleControls> _controls;
  77. };
  78. } // namespace Platform
  79. // Platform dependent implementations.
  80. #ifdef Q_OS_WIN
  81. #include "platform/win/overlay_widget_win.h"
  82. #elif defined Q_OS_MAC // Q_OS_WIN
  83. #include "platform/mac/overlay_widget_mac.h"
  84. #else // Q_OS_WIN || Q_OS_MAC
  85. #include "platform/linux/overlay_widget_linux.h"
  86. #endif // else for Q_OS_WIN || Q_OS_MAC