KonvergoWindow.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #ifndef KONVERGOWINDOW_H
  2. #define KONVERGOWINDOW_H
  3. #include <QQuickWindow>
  4. #include <QEvent>
  5. #include <settings/SettingsComponent.h>
  6. // This controls how big the web view will zoom using semantic zoom
  7. // over a specific number of pixels and we run out of space for on screen
  8. // tiles in chromium. This only happens on OSX since on other platforms
  9. // we can use the GPU to transfer tiles directly but we set the limit on all platforms
  10. // to keep it consistent.
  11. //
  12. // See more discussion in: https://github.com/plexinc/plex-media-player/issues/10
  13. // The number of pixels here are REAL pixels, the code in webview.qml will compensate
  14. // for a higher DevicePixelRatio
  15. //
  16. #define WEBUI_MAX_HEIGHT 1440.0
  17. #define WEBUI_SIZE QSize(1280, 720)
  18. #define WINDOWW_MIN_SIZE QSize(213, 120)
  19. ///////////////////////////////////////////////////////////////////////////////////////////////////
  20. class KonvergoWindow : public QQuickWindow
  21. {
  22. Q_OBJECT
  23. Q_PROPERTY(bool fullScreen READ isFullScreen WRITE setFullScreen NOTIFY fullScreenSwitched)
  24. Q_PROPERTY(bool showDebugLayer MEMBER m_debugLayer NOTIFY debugLayerChanged)
  25. Q_PROPERTY(QString debugInfo MEMBER m_debugInfo NOTIFY debugInfoChanged)
  26. Q_PROPERTY(QString videoInfo MEMBER m_videoInfo NOTIFY debugInfoChanged)
  27. Q_PROPERTY(QSize windowMinSize READ windowMinSize CONSTANT)
  28. Q_PROPERTY(bool alwaysOnTop READ isAlwaysOnTop WRITE setAlwaysOnTop)
  29. Q_PROPERTY(bool webDesktopMode MEMBER m_webDesktopMode NOTIFY webDesktopModeChanged)
  30. Q_PROPERTY(QString webUrl READ webUrl NOTIFY webUrlChanged)
  31. public:
  32. static void RegisterClass();
  33. explicit KonvergoWindow(QWindow* parent = nullptr);
  34. ~KonvergoWindow() override;
  35. bool isFullScreen()
  36. {
  37. return ((flags() & Qt::FramelessWindowHint) || (visibility() == QWindow::FullScreen));
  38. }
  39. Q_INVOKABLE void setFullScreen(bool enable);
  40. bool isAlwaysOnTop()
  41. {
  42. Qt::WindowFlags forceOnTopFlags = Qt::WindowStaysOnTopHint;
  43. #ifdef Q_OS_LINUX
  44. forceOnTopFlags = forceOnTopFlags | Qt::X11BypassWindowManagerHint;
  45. #endif
  46. return (flags() & forceOnTopFlags);
  47. }
  48. void setAlwaysOnTop(bool enable);
  49. Q_SLOT void otherAppFocus()
  50. {
  51. setWindowState((Qt::WindowState)((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive));
  52. raise();
  53. }
  54. Q_SLOT void toggleDebug();
  55. Q_SLOT void toggleFullscreen() { setFullScreen(!isFullScreen()); }
  56. Q_SLOT void toggleWebMode();
  57. Q_SLOT void toggleAlwaysOnTop()
  58. {
  59. setAlwaysOnTop(!isAlwaysOnTop());
  60. }
  61. Q_SLOT void reloadWeb()
  62. {
  63. emit reloadWebClient();
  64. }
  65. Q_INVOKABLE Q_SLOT void minimizeWindow()
  66. {
  67. if (!isFullScreen())
  68. setVisibility(QWindow::Minimized);
  69. }
  70. QSize windowMinSize() { return WINDOWW_MIN_SIZE; }
  71. QString webUrl();
  72. Q_SIGNALS:
  73. void fullScreenSwitched();
  74. void enableVideoWindowSignal();
  75. void debugLayerChanged();
  76. void debugInfoChanged();
  77. void reloadWebClient();
  78. void webDesktopModeChanged();
  79. void webUrlChanged();
  80. protected:
  81. void focusOutEvent(QFocusEvent* ev) override;
  82. void resizeEvent(QResizeEvent* event) override;
  83. private slots:
  84. void closingWindow();
  85. void enableVideoWindow();
  86. void onVisibilityChanged(QWindow::Visibility visibility);
  87. void updateMainSectionSettings(const QVariantMap& values);
  88. void updateWindowState(bool saveGeo = true);
  89. void updateDebugInfo();
  90. void playerWindowVisible(bool visible);
  91. void onScreenAdded(QScreen *screen);
  92. void onScreenRemoved(QScreen *screen);
  93. void updateCurrentScreen();
  94. private:
  95. void saveGeometry();
  96. QRect loadGeometry();
  97. QRect loadGeometryRect();
  98. bool fitsInScreens(const QRect& rc);
  99. QScreen* loadLastScreen();
  100. void updateScreens();
  101. void updateForcedScreen();
  102. QScreen* findCurrentScreen();
  103. bool m_debugLayer;
  104. QTimer* m_infoTimer;
  105. QString m_debugInfo, m_systemDebugInfo, m_videoInfo;
  106. int m_ignoreFullscreenSettingsChange;
  107. bool m_webDesktopMode;
  108. bool m_showedUpdateDialog;
  109. unsigned long m_osxPresentationOptions;
  110. QString m_currentScreenName;
  111. void setWebMode(bool newDesktopMode, bool fullscreen);
  112. };
  113. #endif // KONVERGOWINDOW_H