window-projector.hpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #pragma once
  2. #include <obs.hpp>
  3. #include "qt-display.hpp"
  4. enum class ProjectorType {
  5. Source,
  6. Scene,
  7. Preview,
  8. StudioProgram,
  9. Multiview,
  10. };
  11. class QMouseEvent;
  12. enum class MultiviewLayout : uint8_t {
  13. HORIZONTAL_TOP_8_SCENES = 0,
  14. HORIZONTAL_BOTTOM_8_SCENES = 1,
  15. VERTICAL_LEFT_8_SCENES = 2,
  16. VERTICAL_RIGHT_8_SCENES = 3,
  17. HORIZONTAL_TOP_24_SCENES = 4,
  18. HORIZONTAL_TOP_18_SCENES = 5,
  19. SCENES_ONLY_4_SCENES = 6,
  20. SCENES_ONLY_9_SCENES = 7,
  21. SCENES_ONLY_16_SCENES = 8,
  22. SCENES_ONLY_25_SCENES = 9,
  23. };
  24. class OBSProjector : public OBSQTDisplay {
  25. Q_OBJECT
  26. private:
  27. OBSSource source;
  28. OBSSignal removedSignal;
  29. static void OBSRenderMultiview(void *data, uint32_t cx, uint32_t cy);
  30. static void OBSRender(void *data, uint32_t cx, uint32_t cy);
  31. static void OBSSourceRemoved(void *data, calldata_t *params);
  32. void mousePressEvent(QMouseEvent *event) override;
  33. void mouseDoubleClickEvent(QMouseEvent *event) override;
  34. void closeEvent(QCloseEvent *event) override;
  35. bool isAlwaysOnTop;
  36. bool isAlwaysOnTopOverridden = false;
  37. int savedMonitor = -1;
  38. ProjectorType type = ProjectorType::Source;
  39. std::vector<OBSWeakSource> multiviewScenes;
  40. std::vector<OBSSource> multiviewLabels;
  41. gs_vertbuffer_t *actionSafeMargin = nullptr;
  42. gs_vertbuffer_t *graphicsSafeMargin = nullptr;
  43. gs_vertbuffer_t *fourByThreeSafeMargin = nullptr;
  44. gs_vertbuffer_t *leftLine = nullptr;
  45. gs_vertbuffer_t *topLine = nullptr;
  46. gs_vertbuffer_t *rightLine = nullptr;
  47. // Multiview position helpers
  48. float thickness = 4;
  49. float offset, thicknessx2 = thickness * 2, pvwprgCX, pvwprgCY, sourceX,
  50. sourceY, labelX, labelY, scenesCX, scenesCY, ppiCX, ppiCY,
  51. siX, siY, siCX, siCY, ppiScaleX, ppiScaleY, siScaleX,
  52. siScaleY, fw, fh, ratio;
  53. bool ready = false;
  54. // argb colors
  55. static const uint32_t outerColor = 0xFFD0D0D0;
  56. static const uint32_t labelColor = 0xD91F1F1F;
  57. static const uint32_t backgroundColor = 0xFF000000;
  58. static const uint32_t previewColor = 0xFF00D000;
  59. static const uint32_t programColor = 0xFFD00000;
  60. void UpdateMultiview();
  61. void UpdateProjectorTitle(QString name);
  62. QRect prevGeometry;
  63. void SetMonitor(int monitor);
  64. QScreen *screen = nullptr;
  65. private slots:
  66. void EscapeTriggered();
  67. void OpenFullScreenProjector();
  68. void ResizeToContent();
  69. void OpenWindowedProjector();
  70. void AlwaysOnTopToggled(bool alwaysOnTop);
  71. void ScreenRemoved(QScreen *screen_);
  72. public:
  73. OBSProjector(QWidget *widget, obs_source_t *source_, int monitor,
  74. ProjectorType type_);
  75. ~OBSProjector();
  76. OBSSource GetSource();
  77. ProjectorType GetProjectorType();
  78. int GetMonitor();
  79. static void UpdateMultiviewProjectors();
  80. void RenameProjector(QString oldName, QString newName);
  81. void SetHideCursor();
  82. bool IsAlwaysOnTop() const;
  83. bool IsAlwaysOnTopOverridden() const;
  84. void SetIsAlwaysOnTop(bool isAlwaysOnTop, bool isOverridden);
  85. };