You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

395 lines
11 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* @file DeviceCard.h
* @brief 设备卡片组件定义
* @author CasualtySightPlus Team
* @date 2024-12-01
* @version 1.0
*
* 设备卡片组件,用于显示单个设备的详细信息,包括:
* - 设备基本信息名称、类型、IP地址
* - 设备状态显示(在线/离线、信号强度、电量)
* - 设备位置信息(经纬度坐标)
* - 设备操作按钮(详情、控制、定位)
*
* @note 依赖Qt GUI模块
* @since 1.0
*/
#ifndef DEVICECARD_H
#define DEVICECARD_H
// Qt核心头文件
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QProgressBar>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QTimer>
#include <QDateTime>
#include <QPropertyAnimation>
#include <QGraphicsEffect>
#include <QGraphicsDropShadowEffect>
/**
* @brief 设备状态枚举
*/
enum class DeviceStatus
{
Online, ///< 在线状态 - 绿色
Warning, ///< 警告状态 - 黄色
Offline, ///< 离线状态 - 红色
Unknown ///< 未知状态 - 灰色
};
/**
* @brief 设备信息结构体
*
* 包含设备的完整信息,用于设备卡片显示和数据库交互
*/
struct DeviceInfo
{
QString id; ///< 设备唯一标识符
QString name; ///< 设备名称
QString type; ///< 设备类型 ("uav" 或 "dog")
QString ipAddress; ///< IP地址
int port; ///< 端口号
double longitude; ///< 经度坐标
double latitude; ///< 纬度坐标
DeviceStatus status; ///< 设备状态
int signalStrength; ///< 信号强度 (0-100)
int batteryLevel; ///< 电量水平 (0-100)
QDateTime lastHeartbeat; ///< 最后心跳时间
QDateTime createdAt; ///< 创建时间
QDateTime updatedAt; ///< 更新时间
/**
* @brief 默认构造函数
*/
DeviceInfo()
: port(0)
, longitude(0.0)
, latitude(0.0)
, status(DeviceStatus::Unknown)
, signalStrength(0)
, batteryLevel(0)
, lastHeartbeat(QDateTime::currentDateTime())
, createdAt(QDateTime::currentDateTime())
, updatedAt(QDateTime::currentDateTime())
{
}
/**
* @brief 检查设备是否在线
* @return 是否在线
*/
bool isOnline() const
{
return status == DeviceStatus::Online || status == DeviceStatus::Warning;
}
/**
* @brief 获取设备类型显示名称
* @return 设备类型中文名称
*/
QString getTypeDisplayName() const
{
if (type == "uav") return "无人机";
else if (type == "dog") return "机器狗";
else return "未知设备";
}
/**
* @brief 获取设备类型图标路径
* @return 图标资源路径
*/
QString getTypeIconPath() const
{
if (type == "uav") return ":/image/res/image/uav.png";
else if (type == "dog") return ":/image/res/image/robot.png";
else return ":/image/res/image/info.png";
}
};
/**
* @class DeviceCard
* @brief 设备卡片组件
*
* 显示单个设备的完整信息和操作控制的卡片组件。
* 采用现代化的卡片式设计,包含设备状态指示、信息显示和操作按钮。
*
* 主要功能:
* - 设备信息展示:名称、类型、网络地址、位置坐标
* - 实时状态显示:在线状态、信号强度、电量水平
* - 交互操作:设备详情查看、远程控制、位置定位
* - 视觉反馈:状态颜色编码、悬停效果、点击反馈
*
* @note 遵循军用风格设计,使用深蓝灰色系配色
* @warning 需要定期更新设备状态以保持界面同步
* @see DeviceInfo, DeviceStatus
* @since 1.0
*/
class DeviceCard : public QWidget
{
Q_OBJECT
public:
/**
* @brief 构造函数
* @param device 设备信息结构体
* @param parent 父窗口指针默认为nullptr
*/
explicit DeviceCard(const DeviceInfo &device, QWidget *parent = nullptr);
/**
* @brief 析构函数
*/
~DeviceCard();
/**
* @brief 获取设备ID
* @return 设备唯一标识符
*/
QString getDeviceId() const { return m_deviceInfo.id; }
/**
* @brief 获取设备信息
* @return 完整的设备信息结构体
*/
const DeviceInfo& getDeviceInfo() const { return m_deviceInfo; }
/**
* @brief 更新设备基本信息
* @param device 新的设备信息
*/
void updateDeviceInfo(const DeviceInfo &device);
/**
* @brief 更新设备状态
* @param status 新的设备状态
*/
void updateDeviceStatus(DeviceStatus status);
/**
* @brief 更新位置坐标
* @param longitude 经度
* @param latitude 纬度
*/
void updateLocation(double longitude, double latitude);
/**
* @brief 设置卡片选中状态
* @param selected 是否选中
*/
void setSelected(bool selected);
/**
* @brief 获取卡片选中状态
* @return 是否选中
*/
bool isSelected() const { return m_isSelected; }
signals:
/**
* @brief 设备被选中信号
* @param deviceId 设备ID
*/
void deviceSelected(const QString &deviceId);
/**
* @brief 设备控制请求信号
* @param deviceId 设备ID
*/
void deviceControlRequested(const QString &deviceId);
/**
* @brief 设备定位请求信号
* @param deviceId 设备ID
*/
void deviceLocationRequested(const QString &deviceId);
/**
* @brief 设备详情请求信号
* @param deviceId 设备ID
*/
void deviceDetailsRequested(const QString &deviceId);
/**
* @brief 设备状态变化信号
* @param deviceId 设备ID
* @param status 新状态
*/
void deviceStatusChanged(const QString &deviceId, DeviceStatus status);
public slots:
/**
* @brief 刷新设备状态
*
* 从数据库重新加载设备状态信息并更新显示
*/
void refreshStatus();
protected:
/**
* @brief 鼠标按下事件
* @param event 鼠标事件
*/
void mousePressEvent(QMouseEvent *event) override;
/**
* @brief 进入事件(鼠标悬停)
* @param event 进入事件
*/
void enterEvent(QEvent *event) override;
/**
* @brief 离开事件(鼠标离开)
* @param event 离开事件
*/
void leaveEvent(QEvent *event) override;
/**
* @brief 绘制事件
* @param event 绘制事件
*/
void paintEvent(QPaintEvent *event) override;
private slots:
/**
* @brief 详情按钮点击槽函数
*/
void onDetailsClicked();
/**
* @brief 控制按钮点击槽函数
*/
void onControlClicked();
/**
* @brief 定位按钮点击槽函数
*/
void onLocationClicked();
private:
/**
* @brief 初始化UI界面
*/
void setupUI();
/**
* @brief 连接信号和槽
*/
void connectSignals();
/**
* @brief 设置样式
*/
void setupStyle();
/**
* @brief 设置动画效果
*/
void setupAnimations();
/**
* @brief 状态变化动画
* @param oldStatus 旧状态
* @param newStatus 新状态
*/
void animateStatusChange(DeviceStatus oldStatus, DeviceStatus newStatus);
/**
* @brief 更新状态颜色
*/
void updateStatusColor();
/**
* @brief 更新设备类型图标
*/
void updateDeviceIcon();
/**
* @brief 获取状态显示文本
* @param status 设备状态
* @return 状态文本
*/
QString getStatusText(DeviceStatus status) const;
/**
* @brief 获取状态颜色
* @param status 设备状态
* @return 状态颜色字符串
*/
QString getStatusColor(DeviceStatus status) const;
/**
* @brief 格式化坐标显示
* @param longitude 经度
* @param latitude 纬度
* @return 格式化的坐标字符串
*/
QString formatCoordinates(double longitude, double latitude) const;
/**
* @brief 获取连接按钮文本
* @return 按钮文本("连接"或"断开"
*/
QString getConnectionButtonText() const;
/**
* @brief 获取连接按钮提示文本
* @return 按钮提示文本
*/
QString getConnectionButtonTooltip() const;
/**
* @brief 更新数据库中的设备状态
* @param status 新的设备状态
* @return 是否更新成功
*/
bool updateDeviceStatusInDatabase(DeviceStatus status);
private:
// 设备信息
DeviceInfo m_deviceInfo; ///< 设备信息
DeviceStatus m_currentStatus; ///< 当前设备状态
bool m_isSelected; ///< 是否被选中
bool m_isHovered; ///< 是否被悬停
// UI组件 - 头部区域
QLabel *m_deviceIconLabel; ///< 设备类型图标
QLabel *m_deviceNameLabel; ///< 设备名称标签
QLabel *m_statusLabel; ///< 状态指示标签
QLabel *m_statusIndicator; ///< 状态指示器(圆点)
// UI组件 - 信息区域
QLabel *m_locationLabel; ///< 位置信息标签
QLabel *m_networkLabel; ///< 网络地址标签
// UI组件 - 操作按钮
QPushButton *m_detailsButton; ///< 详情按钮
QPushButton *m_controlButton; ///< 控制按钮
QPushButton *m_locationButton; ///< 定位按钮
// 布局管理器
QVBoxLayout *m_mainLayout; ///< 主布局
QHBoxLayout *m_headerLayout; ///< 头部布局
QGridLayout *m_infoLayout; ///< 信息区域布局
QVBoxLayout *m_buttonLayout; ///< 按钮区域布局(垂直排列)
// 动画效果组件
QPropertyAnimation *m_hoverAnimation; ///< 悬停动画
QPropertyAnimation *m_scaleAnimation; ///< 缩放动画
QGraphicsDropShadowEffect *m_shadowEffect; ///< 阴影效果
// 样式和配置 - 优化的卡片尺寸
static const int CARD_WIDTH = 320; ///< 卡片宽度 (再次增加)
static const int CARD_HEIGHT = 240; ///< 卡片高度 (增加以显示完整信息)
static const int BORDER_RADIUS = 8; ///< 圆角半径
static const int PADDING = 15; ///< 内边距 (增加)
static const int MARGIN = 8; ///< 外边距 (增加)
};
#endif // DEVICECARD_H