/** * @file LeftPanelStyleManager.h * @brief 左侧设备管理面板专用样式管理器 * @details 专门管理左侧面板的视觉样式和交互效果 * @author UBEES Development Team * @date 2024 */ #ifndef LEFTPANELSTYLEMANAGER_H #define LEFTPANELSTYLEMANAGER_H #include #include #include #include #include #include #include #include #include #include #include // 前向声明 class DeviceListPanel; class DeviceCard; /** * @class LeftPanelStyleManager * @brief 左侧面板样式管理器 * @details 专门负责左侧设备管理面板的样式应用和动画效果 */ class LeftPanelStyleManager : public QObject { Q_OBJECT public: /** * @brief 获取样式管理器单例实例 * @return LeftPanelStyleManager* 单例指针 */ static LeftPanelStyleManager* getInstance(); /** * @brief 应用左侧面板样式 * @param panel 设备列表面板指针 * @return bool 成功返回true,失败返回false */ bool applyLeftPanelStyle(DeviceListPanel* panel); /** * @brief 应用设备卡片样式 * @param card 设备卡片指针 * @return bool 成功返回true,失败返回false */ bool applyDeviceCardStyle(DeviceCard* card); /** * @brief 设置按钮样式类型 * @param button 按钮指针 * @param buttonType 按钮类型 ("add", "delete", "refresh", "control", "details", "location") */ void setButtonStyleType(QPushButton* button, const QString& buttonType); /** * @brief 设置状态指示器样式 * @param indicator 状态指示器标签 * @param status 状态类型 ("online", "offline", "warning", "maintenance") */ void setStatusIndicatorStyle(QLabel* indicator, const QString& status); /** * @brief 设置设备状态标签样式 * @param statusLabel 状态标签 * @param status 状态类型 */ void setDeviceStatusLabelStyle(QLabel* statusLabel, const QString& status); /** * @brief 创建按钮悬停动画 * @param button 目标按钮 * @return QPropertyAnimation* 动画对象指针 */ QPropertyAnimation* createButtonHoverAnimation(QPushButton* button); /** * @brief 创建卡片选择动画 * @param card 目标卡片 * @return QPropertyAnimation* 动画对象指针 */ QPropertyAnimation* createCardSelectionAnimation(DeviceCard* card); /** * @brief 创建状态变化动画 * @param widget 目标控件 * @param fromStatus 原状态 * @param toStatus 新状态 * @return QPropertyAnimation* 动画对象指针 */ QPropertyAnimation* createStatusChangeAnimation(QWidget* widget, const QString& fromStatus, const QString& toStatus); /** * @brief 应用加载动画 * @param widget 目标控件 * @param isLoading 是否显示加载状态 */ void applyLoadingAnimation(QWidget* widget, bool isLoading); /** * @brief 设置面板标题样式 * @param titleLabel 标题标签 * @param level 标题级别 (1=主标题, 2=副标题, 3=小标题) */ void setPanelTitleStyle(QLabel* titleLabel, int level = 1); /** * @brief 设置设备计数标签样式 * @param countLabel 计数标签 * @param totalCount 总数 * @param onlineCount 在线数 */ void setDeviceCountStyle(QLabel* countLabel, int totalCount, int onlineCount); /** * @brief 应用空列表提示样式 * @param emptyLabel 空列表提示标签 */ void applyEmptyListStyle(QLabel* emptyLabel); /** * @brief 刷新所有样式 * @return bool 成功返回true,失败返回false */ bool refreshAllStyles(); /** * @brief 设备卡片动画类型枚举 */ enum class CardAnimation { None, ///< 无动画 FadeIn, ///< 淡入 SlideIn, ///< 滑入 ScaleIn, ///< 缩放进入 Bounce ///< 弹跳 }; /** * @brief 播放设备卡片动画 * @param card 目标卡片 * @param animation 动画类型 * @param duration 动画时长(毫秒) */ void playCardAnimation(DeviceCard* card, CardAnimation animation, int duration = 300); /** * @brief 按钮状态枚举 */ enum class ButtonState { Normal, ///< 正常状态 Hover, ///< 悬停状态 Pressed, ///< 按下状态 Disabled ///< 禁用状态 }; /** * @brief 更新按钮状态样式 * @param button 目标按钮 * @param state 按钮状态 */ void updateButtonState(QPushButton* button, ButtonState state); private: /** * @brief 私有构造函数(单例模式) */ explicit LeftPanelStyleManager(QObject *parent = nullptr); /** * @brief 析构函数 */ ~LeftPanelStyleManager() = default; /** * @brief 禁用拷贝构造函数 */ LeftPanelStyleManager(const LeftPanelStyleManager&) = delete; /** * @brief 禁用赋值操作符 */ LeftPanelStyleManager& operator=(const LeftPanelStyleManager&) = delete; /** * @brief 加载左侧面板样式文件 * @return bool 成功返回true,失败返回false */ bool loadLeftPanelStyleSheet(); /** * @brief 加载后备样式(当样式文件无法加载时使用) */ void loadFallbackStyles(); /** * @brief 初始化样式映射表 */ void initializeStyleMaps(); /** * @brief 创建阴影效果 * @param widget 目标控件 * @param blurRadius 模糊半径 * @param color 阴影颜色 * @param offset 偏移量 * @return QGraphicsDropShadowEffect* 阴影效果指针 */ QGraphicsDropShadowEffect* createShadowEffect(QWidget* widget, int blurRadius = 10, const QColor& color = QColor(74, 144, 226, 100), const QPointF& offset = QPointF(0, 2)); /** * @brief 应用渐变背景 * @param widget 目标控件 * @param startColor 起始颜色 * @param endColor 结束颜色 * @param direction 渐变方向 (0=垂直, 1=水平, 2=对角线) */ void applyGradientBackground(QWidget* widget, const QColor& startColor, const QColor& endColor, int direction = 0); private: static LeftPanelStyleManager* m_instance; ///< 单例实例 QString m_leftPanelStyleSheet; ///< 左侧面板样式表 QMap m_buttonStyleMap; ///< 按钮样式映射 QMap m_statusColorMap; ///< 状态颜色映射 QMap m_animations; ///< 动画映射表 QTimer* m_animationTimer; ///< 动画定时器 signals: /** * @brief 样式应用完成信号 * @param widget 应用样式的控件 * @param success 是否成功 */ void styleApplied(QWidget* widget, bool success); /** * @brief 动画播放完成信号 * @param widget 播放动画的控件 * @param animationType 动画类型 */ void animationFinished(QWidget* widget, const QString& animationType); public slots: /** * @brief 刷新样式槽函数 */ void refreshStyles(); /** * @brief 停止所有动画 */ void stopAllAnimations(); /** * @brief 清理动画资源 */ void cleanupAnimations(); }; /** * @brief 左侧面板样式工具类 * @details 提供便捷的左侧面板样式操作静态方法 */ class LeftPanelStyleUtils { public: /** * @brief 快速应用左侧面板样式 * @param panel 设备列表面板 * @return bool 成功返回true,失败返回false */ static bool applyLeftPanelStyle(DeviceListPanel* panel); /** * @brief 快速设置添加按钮样式 * @param button 目标按钮 */ static void setAddButton(QPushButton* button); /** * @brief 快速设置删除按钮样式 * @param button 目标按钮 */ static void setDeleteButton(QPushButton* button); /** * @brief 快速设置刷新按钮样式 * @param button 目标按钮 */ static void setRefreshButton(QPushButton* button); /** * @brief 快速设置在线状态指示器 * @param indicator 状态指示器 */ static void setOnlineIndicator(QLabel* indicator); /** * @brief 快速设置离线状态指示器 * @param indicator 状态指示器 */ static void setOfflineIndicator(QLabel* indicator); /** * @brief 快速设置警告状态指示器 * @param indicator 状态指示器 */ static void setWarningIndicator(QLabel* indicator); /** * @brief 快速播放卡片添加动画 * @param card 设备卡片 */ static void playCardAddAnimation(DeviceCard* card); /** * @brief 快速播放卡片删除动画 * @param card 设备卡片 */ static void playCardRemoveAnimation(DeviceCard* card); /** * @brief 快速播放状态变化动画 * @param card 设备卡片 * @param newStatus 新状态 */ static void playStatusChangeAnimation(DeviceCard* card, const QString& newStatus); }; #endif // LEFTPANELSTYLEMANAGER_H