| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- #pragma once
- #include <QMutex>
- #include <QStringList>
- #include <QTimer>
- #include <QWaitCondition>
- #include <QWidget>
- #include <QRect>
- #include "qobjectdefs.h"
- #include <QVector>
- #include <QPushButton>
- #include <QCheckBox>
- #include "libs/Recorder/export.h"
- #include "widgets/framelessbase.h" // Use TWidget as base
- 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 TWidget
- {
- 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();
- void applyModeLayout(); // 新增:根据模式与窗口大小自适应布局
- 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<AMRECORDER_DEVICE> m_micDevices; // 缓存麦克风设备列表
- QVector<AMRECORDER_DEVICE> m_speakerDevices; // 缓存扬声器设备列表
- // 新增:视频编码器选择控件与缓存
- QComboBox *m_encoderWidget = nullptr; // 视频编码器下拉框
- QVector<AMRECORDER_ENCODERS> 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 onChatButtonClicked(); // 聊天弹出/嵌入/显示/隐藏按钮槽
-
- // 聊天窗口关闭处理
- void onChatWindowCloseRequested();
- };
|