#pragma once #include #include #include #include #include #include #include "qobjectdefs.h" #include #include #include #include "libs/Recorder/export.h" class QSplitter; // 移除:UserProfileWidget 前向声明(不再使用) class ChatWindow; class RecorderWidget; // forward declaration for standalone recorder class AVPlayerWidget; // forward declaration for standalone player class PopoverButtonGroup; // 前向声明:在本类中以指针形式使用 class FunctionButton; // 新增:用于指针成员 m_streamButton 的前向声明 class TMainWindow; // 新增:用于无边框自定义标题窗口承载弹窗/悬浮工具栏 // Removed RecorderAudioWidget forward declaration; use QComboBox instead class QComboBox; class WebSocketClient; class StatsWidget; class AudioDeviceSelectorIcon; class AudioDeviceSelectorIconDecoupled; namespace ADS { class DockManager; class DockWidget; } class MainPanel : public QWidget { Q_OBJECT public: explicit MainPanel(QWidget *parent = nullptr); ~MainPanel(); void setRole(const QStringList &roleList); void setPushRoomId(const QString &room); // 新增:独立窗口显示控制 public slots: void showRecorderStandalone(); void showPlayerStandalone(); void showChatStandalone(); void showChatEmbedded(); signals: void logoutClicked(); public slots: private: void setPlayerWidget(QWidget *newPlayer); void handleDebouncedPlay(); // 防抖处理函数 // 新增:推流时浮动工具栏控制 void showFloatingToolbar(); void hideFloatingToolbar(); protected: void resizeEvent(QResizeEvent* event) override; bool eventFilter(QObject *watched, QEvent *event) override; private: QSplitter *splitter = nullptr; QWidget *playerContainer = nullptr; QWidget *playerWidget = nullptr; QWidget *m_rightWidget = nullptr; // 推流时整体隐藏的右侧面板(含聊天容器) // 移除:UserProfileWidget *userProfile = nullptr; ChatWindow *chatView = nullptr; // 统一的聊天窗口实例 // 新增:独立显示的窗口 RecorderWidget *m_recorderStandalone = nullptr; AVPlayerWidget *m_avPlayerStandalone = nullptr; QWidget *m_chatContainer = nullptr; // 聊天窗口的容器(用于嵌入式显示) // 使用 TMainWindow 承载的独立窗口框架 class TMainWindow *m_recorderFrame = nullptr; class TMainWindow *m_playerFrame = nullptr; class TMainWindow *m_chatFrame = nullptr; // 新增:设置窗口的无边框框架 class TMainWindow *m_settingsFrame = nullptr; WebSocketClient *webSocketClient = nullptr; StatsWidget *statsWidget = nullptr; bool m_isStartingPlay = false; QMutex m_playMutex; QWaitCondition m_playCond; QTimer *m_debounceTimer = nullptr; QString m_pendingRoomId; class PopoverButtonGroup *buttonGroup; AudioDeviceSelectorIcon *m_audioDeviceSelector = nullptr; AudioDeviceSelectorIconDecoupled *m_audioDeviceSelectorDecoupled = nullptr; // 音频设备选择弹层中的控件与数据缓存(改为使用基础控件 QComboBox) QComboBox *m_micWidget = nullptr; // 麦克风下拉框 QComboBox *m_speakerWidget = nullptr; // 扬声器下拉框 QVector m_micDevices; // 缓存麦克风设备列表 QVector m_speakerDevices; // 缓存扬声器设备列表 // 新增:视频编码器选择控件与缓存 QComboBox *m_encoderWidget = nullptr; // 视频编码器下拉框 QVector m_encoderList; // 缓存编码器列表 int m_selectedEncoderId = -1; // 当前选择的编码器 id // 新增:录制控制按钮(从RecorderWidget移动过来) QPushButton *m_recordButton = nullptr; // 开始录制按钮 class FunctionButton *m_streamButton = nullptr; // 开始推流按钮(独立FunctionButton) class FunctionButton *m_chatButton = nullptr; // 聊天显示/隐藏/弹出/嵌入切换按钮 QPushButton *m_settingsButton = nullptr; // 设置按钮 QCheckBox *m_drawCursorCheckBox = nullptr; // 绘制鼠标指针选项 QCheckBox *m_syncRecordCheckBox = nullptr; // 推流时同步录制选项 // DockManager 附近 ADS::DockManager *m_dockManager = nullptr; // 推流状态跟踪 bool m_isStreaming = false; // 极简模式与窗口几何缓存 bool m_compactMode = false; QRect m_savedWindowGeometry; // - // 标记 buttonGroup 是否处于悬浮状态 // - bool m_buttonGroupFloating = false; // - // 新增:用于承载“悬浮工具栏”的自定义标题窗口 TMainWindow *m_compactFrame = nullptr; private slots: void initAudioDeviceSelectors(); // 新增:录制控制按钮的槽函数 void onRecordButtonClicked(); void onStreamButtonClicked(); void onSettingsButtonClicked(); void onChatButtonClicked(); // 聊天弹出/嵌入/显示/隐藏按钮槽 // 聊天窗口关闭处理 void onChatWindowCloseRequested(); };