#ifndef MANAGERPLAN_H #define MANAGERPLAN_H #include #include "PlanData.h" class FromWebAPI; class FromSQLite; namespace Ui { class ManagerPlan; } enum class Enum_Mode { Mode_Add = 0, /* 添加模式 */ Mode_Modify = 1, /* 修改模式 */ Mode_ModifyTemplate = 2, /* 修改模版模式,去掉了保存为模版的按钮 */ }; /** * @brief 即将要执行的计划时间点 * */ struct NearExecutionPlan { bool isExist = false; /* 是否存在 */ enum_WeekDay weekDay = enum_WeekDay::WeekDay_Special; /* 周几 */ QDateTime time; /* 时间 */ }; /** * @brief 管理计划页面 * */ class ManagerPlan : public QDialog { Q_OBJECT public: explicit ManagerPlan(Enum_Mode mode, QDialog *parent = nullptr); ~ManagerPlan(); /* 获取是否点击了OK */ bool isOK() const { return m_isOK; } /* 获取计划信息 */ QMap>& getPlanInfo() { return m_mapPlanInfo; } /* 设置频率信息 */ void setFrequencyID(ChannelInfo& info); /* 设置计划列表,给修改模版使用 */ void setPlanList(QList& listPlan); /* 设置FromWebAPI地址,复用主窗口的WebAPI */ void setFromWebAPI(FromWebAPI* fromWebAPI); /* 设置FromSQLite地址,复用主窗口的SQLite */ void setFromSQLite(FromSQLite* fromSQLite); signals: /* 发送调用回调函数的信号 */ void signal_callBack(int actionID); public slots: /* 修改UI样式 */ void do_setUIStyle(); private: /* 设置显示模式,这个需要最先调用 */ void setMode(Enum_Mode mode); /* 设置时间和日期选择Tab */ void setTabWidget(); /* 设置可选择的周几 */ void setWeekDay(); /* 设置可选频率 */ void setSelectFrequency(); /* 查找本地计划列表,这个频率不存在则添加 */ QList& findPlanList(const int chnID); /* 查找全局计划列表,没有被修改过的计划列表 */ void findGlobalPlanList(const int chnID, QList& list); /* 添加计划,同时添加ui的卡片计划和计划列表 */ void addPlanItem(const int chnID, const PlanInfo& info); /* 修改容器中的计划 */ void modifyPlanItem(const int chnID, const PlanInfo& nowInfo, const PlanInfo& newInfo); /* 判断开机和关机时间是否冲突 */ inline bool checkOnAndOffTime(const PlanInfo& info); /* 比较两个时间点的大小 */ inline bool timeIsGerater(const enum_WeekDay weekDay1, const QDateTime& time1, const enum_WeekDay weekDay2, const QDateTime& time2); /* 判断计划时间和列表中的时间是否冲突 */ bool checkPlanTimeConflict(const int chnID, const PlanInfo& info); /* 判断计划时间和列表中的时间是否冲突,添加排除的计划,用于比较修改的计划 */ bool checkPlanTimeConflict(const int chnID, const PlanInfo& newInfo, const PlanInfo& exInfo); /* 判断新添加的计划是否在即将要执行的计划附近 */ bool checkNewPlanNear(const int chnID, const PlanInfo& newInfo); /* 判断修改的计划是否对即将要执行的计划有影响 */ bool checkModifyPlanNear(const int chnID, const PlanInfo& oldInfo, const PlanInfo& newInfo); /* 判断这个时间点附近有没有即将要执行的计划 */ bool findNearPlan(const int chnID, const QDateTime& nowTime); bool findNearPlan(const int chnID, const QDateTime& nowTime, enum_WeekDay& weekDay, QDateTime& time); /* 判断两个时间点是否在十分钟之内 */ bool isNearTime(const QDateTime& nowTime, const enum_WeekDay weekDay, const QDateTime& time); /* 设置按钮显示或隐藏 */ inline void setButtonVisible(bool isVisible); /* 保存模版 */ void saveTemplateToEQM(); private slots: /* 选择了一个频率 */ void do_selectFrequency(int index); /* 点击了添加按钮 */ void do_addPlanItem(); /* 点击修改按钮 */ void do_modifyPlanItem(); /* 点击了删除按钮 */ void do_deletePlanItem(); /* 点击了保存模版按钮 */ void do_saveTemplate(); /* 点击了OK按钮 */ void do_pBtn_ok(); /* 选中了一项,回显到编辑页面 */ void do_tableView_clicked(PlanInfo& info); protected: /* 鼠标点击事件 */ void mousePressEvent(QMouseEvent *event) override; /* 鼠标移动事件 */ void mouseMoveEvent(QMouseEvent *event) override; /* 鼠标释放事件 */ void mouseReleaseEvent(QMouseEvent *event) override; /* 事件过滤器 */ bool eventFilter(QObject *watched, QEvent *event) override; private: Ui::ManagerPlan *ui; QPoint m_lastPos; /* 鼠标点击的位置 */ bool m_isOK = false; /* 是否点击了OK按钮 */ ChannelInfo m_channelInfo; /* 频率信息 */ Enum_Mode m_mode; /* 显示模式 */ /* 存储计划信息,修改过的频率计划,存储的是这个频率完整的计划 */ QMap> m_mapPlanInfo; NearExecutionPlan m_nearExecPlan; /* 最近要执行的计划 */ FromWebAPI* m_fromWebAPI = nullptr; /* 网络API接口,用于获取和保存数据 */ FromSQLite* m_fromSQLite = nullptr; /* SQLite数据库操作类 */ }; #endif // MANAGERPLAN_H