MainPanel.h 5.2 KB

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