#ifndef ONLINEUSERSWIDGET_H #define ONLINEUSERSWIDGET_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "api/roomapi.h" struct OnlineUser { QString userId; QString username; QString status; // "在线", "离开", "忙碌" QDateTime lastSeen; QString avatar; // 头像URL或路径 bool isAdmin; // 消息统计数据 (对应0-6类型) int messageStats[7]; // 索引0-6对应消息类型0-6的统计 OnlineUser() : isAdmin(false) { // 初始化统计数据 for (int i = 0; i < 7; ++i) { messageStats[i] = 0; } } OnlineUser(const QString &id, const QString &name, const QString &stat = "在线") : userId(id), username(name), status(stat), isAdmin(false), lastSeen(QDateTime::currentDateTime()) { // 初始化统计数据 for (int i = 0; i < 7; ++i) { messageStats[i] = 0; } } }; class OnlineUsersWidget : public QWidget { Q_OBJECT public: explicit OnlineUsersWidget(QWidget *parent = nullptr); ~OnlineUsersWidget(); // 用户管理 void addUser(const OnlineUser &user); void removeUser(const QString &userId); void updateUserStatus(const QString &userId, const QString &status); void updateUserList(const QJsonArray &users); void updateUserListFromRoomUsers(const QList &roomUsers); void clearUsers(); // 房间用户管理 void setCurrentRoomId(const QString &roomId); void refreshRoomUsers(); // 获取用户信息 QList getAllUsers() const; OnlineUser getUser(const QString &userId) const; int getUserCount() const; // 搜索功能 void setSearchVisible(bool visible); void filterUsers(const QString &keyword); // 统计功能 (从 StatsWidget 迁移) void updateStats(const QJsonObject& statsData); void updateUserStats(const QString &userId, const QJsonObject& userStats); signals: // 用户交互信号 void userDoubleClicked(const QString &userId, const QString &username); void userRightClicked(const QString &userId, const QString &username, const QPoint &position); void privateMessageRequested(const QString &userId, const QString &username); void userProfileRequested(const QString &userId, const QString &username); private slots: void onTableDoubleClicked(int row, int column); void onTableContextMenu(const QPoint &position); void onSearchTextChanged(const QString &text); void onRefreshClicked(); void updateUserCountLabel(); public slots: void onUserListUpdate(const QString& roomId, const QJsonArray& userList); private: void setupUI(); void setupTable(); void setupContextMenu(); void applyStyles(); void updateTableRow(int row, const OnlineUser &user); int findUserRow(const QString &userId) const; QString getStatusIcon(const QString &status) const; void updateEmptyState(); // 更新空状态显示 // UI组件 QVBoxLayout *m_mainLayout; QHBoxLayout *m_headerLayout; QLabel *m_titleLabel; QLabel *m_countLabel; QPushButton *m_refreshButton; QLineEdit *m_searchEdit; QTableWidget *m_usersTable; QLabel *m_emptyStateLabel; // 空状态提示标签 // 右键菜单 QMenu *m_contextMenu; QAction *m_privateMessageAction; QAction *m_viewProfileAction; QAction *m_kickUserAction; // 仅管理员可见 // 数据 QList m_users; QString m_currentFilter; QString m_currentRoomId; // 统计数据 (从 StatsWidget 迁移) int m_totalCount; int m_globalStats[7]; // 全局统计数据 (对应0-6类型) QDateTime m_lastStatsUpdate; // 当前选中的用户 QString m_selectedUserId; QString m_selectedUsername; }; #endif // ONLINEUSERSWIDGET_H