MainPanel.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #pragma once
  2. #include <QMutex>
  3. #include <QStringList>
  4. #include <QTimer>
  5. #include <QWaitCondition>
  6. #include <QWidget>
  7. #include <QRect>
  8. #include "qobjectdefs.h"
  9. #include <QVector>
  10. #include <QPushButton>
  11. #include <QCheckBox>
  12. #include "libs/Recorder/export.h"
  13. #include "widgets/framelessbase.h" // Use TWidget as base
  14. class QSplitter;
  15. // 移除:UserProfileWidget 前向声明(不再使用)
  16. class ChatWindow;
  17. class RecorderWidget; // forward declaration for standalone recorder
  18. class AVPlayerWidget; // forward declaration for standalone player
  19. class PopoverButtonGroup; // 前向声明:在本类中以指针形式使用
  20. class FunctionButton; // 新增:用于指针成员 m_streamButton 的前向声明
  21. class TMainWindow; // 新增:用于无边框自定义标题窗口承载弹窗/悬浮工具栏
  22. // Removed RecorderAudioWidget forward declaration; use QComboBox instead
  23. class QComboBox;
  24. class WebSocketClient;
  25. class StatsWidget;
  26. class AudioDeviceSelectorIcon;
  27. class AudioDeviceSelectorIconDecoupled;
  28. namespace ADS {
  29. class DockManager;
  30. class DockWidget;
  31. }
  32. class MainPanel : public TWidget
  33. {
  34. Q_OBJECT
  35. public:
  36. explicit MainPanel(QWidget *parent = nullptr);
  37. ~MainPanel();
  38. void setRole(const QStringList &roleList);
  39. void setPushRoomId(const QString &room);
  40. // 新增:独立窗口显示控制
  41. public slots:
  42. void showRecorderStandalone();
  43. void showPlayerStandalone();
  44. void showChatStandalone();
  45. void showChatEmbedded();
  46. signals:
  47. void logoutClicked();
  48. public slots:
  49. private:
  50. void setPlayerWidget(QWidget *newPlayer);
  51. void handleDebouncedPlay(); // 防抖处理函数
  52. // 新增:推流时浮动工具栏控制
  53. void showFloatingToolbar();
  54. void hideFloatingToolbar();
  55. void applyModeLayout(); // 新增:根据模式与窗口大小自适应布局
  56. protected:
  57. void resizeEvent(QResizeEvent* event) override;
  58. bool eventFilter(QObject *watched, QEvent *event) override;
  59. private:
  60. QSplitter *splitter = nullptr;
  61. QWidget *playerContainer = nullptr;
  62. QWidget *playerWidget = nullptr;
  63. QWidget *m_rightWidget = nullptr; // 推流时整体隐藏的右侧面板(含聊天容器)
  64. // 移除:UserProfileWidget *userProfile = nullptr;
  65. ChatWindow *chatView = nullptr; // 统一的聊天窗口实例
  66. // 新增:独立显示的窗口
  67. RecorderWidget *m_recorderStandalone = nullptr;
  68. AVPlayerWidget *m_avPlayerStandalone = nullptr;
  69. QWidget *m_chatContainer = nullptr; // 聊天窗口的容器(用于嵌入式显示)
  70. // 使用 TMainWindow 承载的独立窗口框架
  71. class TMainWindow *m_recorderFrame = nullptr;
  72. class TMainWindow *m_playerFrame = nullptr;
  73. class TMainWindow *m_chatFrame = nullptr;
  74. // 新增:设置窗口的无边框框架
  75. class TMainWindow *m_settingsFrame = nullptr;
  76. WebSocketClient *webSocketClient = nullptr;
  77. StatsWidget *statsWidget = nullptr;
  78. bool m_isStartingPlay = false;
  79. QMutex m_playMutex;
  80. QWaitCondition m_playCond;
  81. QTimer *m_debounceTimer = nullptr;
  82. QString m_pendingRoomId;
  83. class PopoverButtonGroup *buttonGroup;
  84. AudioDeviceSelectorIcon *m_audioDeviceSelector = nullptr;
  85. AudioDeviceSelectorIconDecoupled *m_audioDeviceSelectorDecoupled = nullptr;
  86. // 音频设备选择弹层中的控件与数据缓存(改为使用基础控件 QComboBox)
  87. QComboBox *m_micWidget = nullptr; // 麦克风下拉框
  88. QComboBox *m_speakerWidget = nullptr; // 扬声器下拉框
  89. QVector<AMRECORDER_DEVICE> m_micDevices; // 缓存麦克风设备列表
  90. QVector<AMRECORDER_DEVICE> m_speakerDevices; // 缓存扬声器设备列表
  91. // 新增:视频编码器选择控件与缓存
  92. QComboBox *m_encoderWidget = nullptr; // 视频编码器下拉框
  93. QVector<AMRECORDER_ENCODERS> m_encoderList; // 缓存编码器列表
  94. int m_selectedEncoderId = -1; // 当前选择的编码器 id
  95. // 新增:录制控制按钮(从RecorderWidget移动过来)
  96. QPushButton *m_recordButton = nullptr; // 开始录制按钮
  97. class FunctionButton *m_streamButton = nullptr; // 开始推流按钮(独立FunctionButton)
  98. class FunctionButton *m_chatButton = nullptr; // 聊天显示/隐藏/弹出/嵌入切换按钮
  99. QPushButton *m_settingsButton = nullptr; // 设置按钮
  100. QCheckBox *m_drawCursorCheckBox = nullptr; // 绘制鼠标指针选项
  101. QCheckBox *m_syncRecordCheckBox = nullptr; // 推流时同步录制选项
  102. // DockManager 附近
  103. ADS::DockManager *m_dockManager = nullptr;
  104. // 推流状态跟踪
  105. bool m_isStreaming = false;
  106. // 极简模式与窗口几何缓存
  107. bool m_compactMode = false;
  108. QRect m_savedWindowGeometry;
  109. // - // 标记 buttonGroup 是否处于悬浮状态
  110. // - bool m_buttonGroupFloating = false;
  111. // -
  112. // 新增:用于承载“悬浮工具栏”的自定义标题窗口
  113. TMainWindow *m_compactFrame = nullptr;
  114. private slots:
  115. void initAudioDeviceSelectors();
  116. // 新增:录制控制按钮的槽函数
  117. void onRecordButtonClicked();
  118. void onStreamButtonClicked();
  119. void onChatButtonClicked(); // 聊天弹出/嵌入/显示/隐藏按钮槽
  120. // 聊天窗口关闭处理
  121. void onChatWindowCloseRequested();
  122. };