MainPanel.h 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. #pragma once
  2. // Qt Core
  3. #include <QMutex>
  4. #include <QStringList>
  5. #include <QTimer>
  6. #include <QWaitCondition>
  7. #include <QWidget>
  8. #include <QRect>
  9. #include <QVector>
  10. #include "qobjectdefs.h"
  11. // Qt Widgets
  12. #include <QPushButton>
  13. #include <QCheckBox>
  14. // Project includes
  15. #include "libs/Recorder/export.h"
  16. #include "widgets/framelessbase.h" // Use TWidget as base
  17. class QSplitter;
  18. // 移除:UserProfileWidget 前向声明(不再使用)
  19. class ChatWindow;
  20. class RecorderWidget; // forward declaration for standalone recorder
  21. class AVPlayerWidget; // forward declaration for standalone player
  22. class PopoverButtonGroup; // 前向声明:在本类中以指针形式使用
  23. class FunctionButton; // 新增:用于指针成员 m_streamButton 的前向声明
  24. class TMainWindow; // 新增:用于无边框自定义标题窗口承载弹窗/悬浮工具栏
  25. // Removed RecorderAudioWidget forward declaration; use QComboBox instead
  26. class QComboBox;
  27. class WebSocketClient;
  28. class StatsWidget;
  29. class AudioDeviceSelectorIcon;
  30. class AudioDeviceSelectorIconDecoupled;
  31. namespace ADS {
  32. class DockManager;
  33. class DockWidget;
  34. }
  35. /**
  36. * @brief MainPanel 主面板类
  37. *
  38. * MainPanel是应用程序的核心界面组件,负责管理和协调各个功能模块:
  39. * - 播放器组件的显示和控制
  40. * - 聊天窗口的嵌入式和独立显示
  41. * - 录制和推流功能的控制
  42. * - 音频设备的选择和管理
  43. * - 用户界面的布局和模式切换
  44. *
  45. * 该类支持多种显示模式:
  46. * - 正常模式:分割器布局,左侧播放器,右侧聊天
  47. * - 推流模式:隐藏聊天面板,专注于推流控制
  48. * - 独立窗口模式:各组件可以独立弹出显示
  49. *
  50. * @author 开发团队
  51. * @date 2024
  52. */
  53. class MainPanel : public TWidget
  54. {
  55. Q_OBJECT
  56. public:
  57. // ========== 构造与析构 ==========
  58. /**
  59. * @brief 构造函数
  60. * @param parent 父窗口指针
  61. */
  62. explicit MainPanel(QWidget *parent = nullptr);
  63. /**
  64. * @brief 析构函数
  65. */
  66. ~MainPanel();
  67. // ========== 配置接口 ==========
  68. /**
  69. * @brief 设置用户角色列表
  70. * @param roleList 角色列表,用于权限控制
  71. */
  72. void setRole(const QStringList &roleList);
  73. /**
  74. * @brief 设置推流房间ID
  75. * @param room 房间ID字符串
  76. */
  77. void setPushRoomId(const QString &room);
  78. /**
  79. * @brief 设置播放器组件
  80. * @param newPlayer 新的播放器组件指针
  81. */
  82. void setPlayerWidget(QWidget *newPlayer);
  83. public slots:
  84. // ========== 窗口显示控制 ==========
  85. /**
  86. * @brief 显示独立的录制窗口
  87. */
  88. void showRecorderStandalone();
  89. /**
  90. * @brief 显示独立的播放器窗口
  91. */
  92. void showPlayerStandalone();
  93. /**
  94. * @brief 显示独立的聊天窗口
  95. */
  96. void showChatStandalone();
  97. /**
  98. * @brief 显示嵌入式聊天窗口
  99. */
  100. void showChatEmbedded();
  101. // ========== 测试功能 ==========
  102. /**
  103. * @brief 开始推流拉流测试
  104. * @param roomId 房间ID,用于推流和拉流的标识
  105. * @param enableRecording 是否同时启用录制功能
  106. */
  107. void startStreamingTest(const QString &roomId = "0198da3f-5900-78e3-8160-2b7a149cc772",
  108. bool enableRecording = true);
  109. /**
  110. * @brief 停止推流拉流测试
  111. */
  112. void stopStreamingTest();
  113. signals:
  114. // ========== 信号 ==========
  115. /**
  116. * @brief 用户点击退出按钮时发出的信号
  117. */
  118. void logoutClicked();
  119. private:
  120. // ========== 播放控制 ==========
  121. void handleDebouncedPlay();
  122. // ========== 界面布局控制 ==========
  123. void showFloatingToolbar();
  124. void hideFloatingToolbar();
  125. void applyModeLayout();
  126. protected:
  127. void resizeEvent(QResizeEvent* event) override;
  128. bool eventFilter(QObject *watched, QEvent *event) override;
  129. private:
  130. // ========== 核心布局组件 ==========
  131. QSplitter *splitter = nullptr;
  132. QWidget *playerContainer = nullptr;
  133. QWidget *playerWidget = nullptr;
  134. QWidget *m_rightWidget = nullptr; // 推流时整体隐藏的右侧面板(含聊天容器)
  135. // ========== 聊天相关组件 ==========
  136. ChatWindow *chatView = nullptr; // 统一的聊天窗口实例
  137. QWidget *m_chatContainer = nullptr; // 聊天窗口的容器(用于嵌入式显示)
  138. WebSocketClient *webSocketClient = nullptr;
  139. // ========== 独立窗口组件 ==========
  140. RecorderWidget *m_recorderStandalone = nullptr;
  141. AVPlayerWidget *m_avPlayerStandalone = nullptr;
  142. // ========== 窗口框架 ==========
  143. class TMainWindow *m_recorderFrame = nullptr;
  144. class TMainWindow *m_playerFrame = nullptr;
  145. class TMainWindow *m_chatFrame = nullptr;
  146. class TMainWindow *m_settingsFrame = nullptr;
  147. TMainWindow *m_compactFrame = nullptr; // 用于承载"悬浮工具栏"的自定义标题窗口
  148. // ========== 功能按钮组件 ==========
  149. class PopoverButtonGroup *buttonGroup = nullptr;
  150. QPushButton *m_recordButton = nullptr; // 开始录制按钮
  151. class FunctionButton *m_streamButton = nullptr; // 开始推流按钮
  152. class FunctionButton *m_chatButton = nullptr; // 聊天显示/隐藏/弹出/嵌入切换按钮
  153. QPushButton *m_settingsButton = nullptr; // 设置按钮
  154. QCheckBox *m_drawCursorCheckBox = nullptr; // 绘制鼠标指针选项
  155. QCheckBox *m_syncRecordCheckBox = nullptr; // 推流时同步录制选项
  156. // ========== 音频设备相关 ==========
  157. AudioDeviceSelectorIcon *m_audioDeviceSelector = nullptr;
  158. AudioDeviceSelectorIconDecoupled *m_audioDeviceSelectorDecoupled = nullptr;
  159. QComboBox *m_micWidget = nullptr; // 麦克风下拉框
  160. QComboBox *m_speakerWidget = nullptr; // 扬声器下拉框
  161. QVector<AMRECORDER_DEVICE> m_micDevices; // 缓存麦克风设备列表
  162. QVector<AMRECORDER_DEVICE> m_speakerDevices; // 缓存扬声器设备列表
  163. // ========== 视频编码器相关 ==========
  164. QComboBox *m_encoderWidget = nullptr; // 视频编码器下拉框
  165. QVector<AMRECORDER_ENCODERS> m_encoderList; // 缓存编码器列表
  166. int m_selectedEncoderId = -1; // 当前选择的编码器 id
  167. // ========== 播放控制相关 ==========
  168. bool m_isStartingPlay = false;
  169. QMutex m_playMutex;
  170. QWaitCondition m_playCond;
  171. QTimer *m_debounceTimer = nullptr;
  172. QString m_pendingRoomId;
  173. // ========== 状态管理 ==========
  174. bool m_isStreaming = false; // 推流状态跟踪
  175. bool m_compactMode = false; // 极简模式
  176. QRect m_savedWindowGeometry; // 窗口几何缓存
  177. // ========== 其他组件 ==========
  178. StatsWidget *statsWidget = nullptr;
  179. ADS::DockManager *m_dockManager = nullptr;
  180. private:
  181. // ========== 初始化函数 ==========
  182. void initPlaybackControls();
  183. void initChatComponents();
  184. void initLayoutComponents();
  185. void initFunctionButtons();
  186. void connectSignals();
  187. void initAudioDeviceSelectors();
  188. private slots:
  189. // 录制控制按钮的槽函数
  190. void onRecordButtonClicked();
  191. void onStreamButtonClicked();
  192. void onChatButtonClicked(); // 聊天弹出/嵌入/显示/隐藏按钮槽
  193. // 聊天窗口关闭处理
  194. void onChatWindowCloseRequested();
  195. };