templatemanager.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. #include "templatemanager.h"
  2. #include "ui_templatemanager.h"
  3. #include <QDebug>
  4. #include <QPoint>
  5. #include <QTableWidgetItem>
  6. #include <QFile>
  7. #include <QPainter>
  8. #include <QMouseEvent>
  9. #include "warning/warning.h"
  10. #include "LHQLogAPI.h"
  11. #include "OneShadowEffect.h"
  12. #include "TransmitterSwitchInfo.h"
  13. #include "UIStyleManager.h"
  14. #include "template.h"
  15. #include "managerplan.h"
  16. #include "FromWebAPI.h"
  17. #include "tipwidget.h"
  18. TemplateManager::TemplateManager(QWidget *parent) :
  19. QDialog(parent),
  20. ui(new Ui::TemplateManager)
  21. {
  22. ui->setupUi(this);
  23. /* 设置隐藏边框 */
  24. this->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
  25. /* 设置底层样式表 */
  26. this->setAttribute(Qt::WA_TranslucentBackground);
  27. /* 创建阴影 */
  28. QSize size = this->size();
  29. size.setWidth(size.width() - 40);
  30. size.setHeight(size.height() - 40);
  31. auto pShadow = new OneShadowEffect(this);
  32. this->setGraphicsEffect(pShadow);
  33. /* 设置列数 */
  34. ui->tableWidget->horizontalHeader()->setVisible(true);
  35. ui->tableWidget->setColumnCount(5);
  36. /* 设置列表头 */
  37. QStringList headerList = {"频率名称", "模版名称", "", "", ""};
  38. ui->tableWidget->setHorizontalHeaderLabels(headerList);
  39. ui->tableWidget->horizontalHeader()->setSectionsClickable(false);
  40. ui->tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
  41. /* 设置列表头高度 */
  42. ui->tableWidget->horizontalHeader()->setDefaultSectionSize(40);
  43. /* 设置列宽间距,在显示事件中设置 */
  44. /* 设置列宽度固定 */
  45. ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
  46. ui->tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);
  47. ui->tableWidget->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Fixed);
  48. //设置行高
  49. ui->tableWidget->verticalHeader()->setDefaultSectionSize(40);
  50. //设置不可编辑
  51. ui->tableWidget->setEditTriggers(QTableWidget::NoEditTriggers);
  52. //设置选中一行
  53. ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
  54. //设置只能选中一行
  55. ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
  56. //隐藏横滚动条
  57. ui->tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  58. //隐藏网格线
  59. ui->tableWidget->setShowGrid(false);
  60. //隐藏行号
  61. ui->tableWidget->verticalHeader()->setVisible(false);
  62. //设置不显示选中后的虚线
  63. ui->tableWidget->setFocusPolicy(Qt::NoFocus);
  64. //开启排序功能
  65. // ui->tableWidget->setSortingEnabled(true);
  66. connect(ui->pBtn_close,SIGNAL(clicked()),this,SLOT(close()));
  67. connect(ui->pBtn_cancel,SIGNAL(clicked()),this,SLOT(close()));
  68. connect(ui->pBtn_ok,SIGNAL(clicked()),this,SLOT(do_ok()));
  69. connect(ui->tableWidget, &QTableWidget::cellClicked, this, &TemplateManager::do_clickedItem);
  70. /* 注册事件过滤器 */
  71. ui->pBtn_close->installEventFilter(this);
  72. }
  73. TemplateManager::~TemplateManager()
  74. {
  75. delete ui;
  76. }
  77. void TemplateManager::do_ok()
  78. {
  79. /* 获取已选中的模版列表 */
  80. m_isOk = true;
  81. this->close();
  82. }
  83. /* 点击了一个单元格 */
  84. void TemplateManager::do_clickedItem(int row, int column)
  85. {
  86. // LH_WRITE_LOG_DEBUG(QString("点击了单元格: %1, %2").arg(row).arg(column));
  87. if(column < 2)
  88. {
  89. return;
  90. }
  91. /* 获取此单元格 */
  92. auto item = ui->tableWidget->item(row, column);
  93. if(item == nullptr)
  94. {
  95. return;
  96. }
  97. /* 判断是什么功能的单元格 */
  98. if(column == 2)
  99. {
  100. /* 预览 */
  101. }
  102. else if(column == 3)
  103. {
  104. /* 修改 */
  105. modifyTemplate(item);
  106. }
  107. else if(column == 4)
  108. {
  109. /* 删除 */
  110. deleteTemplate(item);
  111. }
  112. /* 强制重新绘制表格 */
  113. ui->tableWidget->repaint();
  114. }
  115. /* 显示事件 */
  116. void TemplateManager::showEvent(QShowEvent *event)
  117. {
  118. /* 设置列宽度 */
  119. int width = (ui->tableWidget->width() - ( 66 * 3)) / 2;
  120. ui->tableWidget->setColumnWidth(0, width);
  121. ui->tableWidget->setColumnWidth(1, width);
  122. ui->tableWidget->setColumnWidth(2, 66);
  123. ui->tableWidget->setColumnWidth(3, 66);
  124. ui->tableWidget->setColumnWidth(4, 66);
  125. }
  126. /* 设置模版列表 */
  127. void TemplateManager::setTemplateList(const QMultiMap<int, OneTemplateInfo>& mapTemplate)
  128. {
  129. for(auto it = mapTemplate.begin(), end = mapTemplate.end(); it != end; it++)
  130. {
  131. createRow(it.value());
  132. }
  133. }
  134. /* 设置QSS */
  135. void TemplateManager::setQSSPath(const QString& qssPath)
  136. {
  137. if(qssPath.isEmpty())
  138. {
  139. return;
  140. }
  141. QString qssFile = qssPath + "/templatemanager.qss";
  142. QFile file(qssFile);
  143. if(file.open(QFile::ReadOnly))
  144. {
  145. QString styleSheet = file.readAll();
  146. this->setStyleSheet(styleSheet);
  147. file.close();
  148. }else
  149. {
  150. LH_WRITE_ERROR(QString("Open %1 failed").arg(qssFile));
  151. }
  152. // if(EPUIStyle.getUIStyle() == enum_UIStyle::UI_Dark)
  153. // {
  154. // /* 手动设置表头的qss */
  155. // ui->tableWidget->horizontalHeader()->setStyleSheet(m_qssHeaderView_dark);
  156. // }else {
  157. // ui->tableWidget->horizontalHeader()->setStyleSheet(m_qssHeaderView_dark);
  158. // }
  159. }
  160. /* 设置WebAPI指针 */
  161. void TemplateManager::setWebAPI(FromWebAPI* webAPI)
  162. {
  163. if(webAPI == nullptr)
  164. {
  165. LH_WRITE_ERROR("WebAPI is nullptr");
  166. return;
  167. }
  168. m_fromWebAPI = webAPI;
  169. }
  170. /* 添加一行 */
  171. void TemplateManager::createRow(const OneTemplateInfo& info)
  172. {
  173. /* 设置表格的行数 */
  174. int row = ui->tableWidget->rowCount();
  175. ui->tableWidget->setRowCount(row + 1);
  176. /* 设置行高 */
  177. ui->tableWidget->setRowHeight(row, 40);
  178. QTableWidgetItem* item0 = new QTableWidgetItem(info.channelInfo.ChannelName);
  179. item0->setData(m_roleChnID, info.channelInfo.ChannelID);
  180. ui->tableWidget->setItem(row, 0, item0);
  181. QTableWidgetItem* item1 = new QTableWidgetItem(info.templateName, Qt::EditRole);
  182. item1->setData(m_roleTemplateName, info.templateName);
  183. ui->tableWidget->setItem(row, 1, item1);
  184. /* 添加固定的三个项 */
  185. auto item2 = new QTableWidgetItem("预览");
  186. item2->setData(m_roleChnID, info.channelInfo.ChannelID);
  187. item2->setData(m_roleTemplateName, info.templateName);
  188. item2->setForeground(QBrush("#438EFF"));
  189. ui->tableWidget->setItem(row, 2, item2);
  190. auto item3 = new QTableWidgetItem("修改");
  191. item3->setData(m_roleChnID, info.channelInfo.ChannelID);
  192. item3->setData(m_roleTemplateName, info.templateName);
  193. item3->setForeground(QBrush("#438EFF"));
  194. ui->tableWidget->setItem(row, 3, item3);
  195. auto item4 = new QTableWidgetItem("删除");
  196. item4->setData(m_roleChnID, info.channelInfo.ChannelID);
  197. item4->setData(m_roleTemplateName, info.templateName);
  198. item4->setForeground(QBrush("#438EFF"));
  199. ui->tableWidget->setItem(row, 4, item4);
  200. }
  201. /* 修改模版 */
  202. void TemplateManager::modifyTemplate(QTableWidgetItem* item)
  203. {
  204. /* 获取频率 */
  205. OneTemplateInfo info;
  206. info.templateName = item->data(m_roleTemplateName).toString();
  207. /* 获取频率名称 */
  208. info.channelInfo = ChnContainer.getChannel(item->data(m_roleChnID).toInt());
  209. /* 获取模版中的计划 */
  210. QList<OnePlanItemInfo> nowListPlan;
  211. if(!m_fromWebAPI->getExecPlanData(info.channelInfo.ChannelID, nowListPlan))
  212. {
  213. TipWidget::display(TipWidget::OPERATOR_FAIL, "获取模版计划失败", this);
  214. return;
  215. }
  216. LH_WRITE_LOG_DEBUG(QString("获取模版计划成功, 频率ID:%1, 模版名称:%2, 计划数:%3").arg(info.channelInfo.ChannelID).arg(info.templateName).arg(nowListPlan.size()));
  217. /* 弹出修改模版的窗口 */
  218. std::shared_ptr<ManagerPlan> mp = std::make_shared<ManagerPlan>(Enum_Mode::Mode_ModifyTemplate);
  219. mp->setFrequencyID(info.channelInfo);
  220. mp->setPlanList(nowListPlan);
  221. mp->exec();
  222. /* 判断是否点击了OK */
  223. if(!mp->isOK())
  224. {
  225. return;
  226. }
  227. /* 获取计划信息 */
  228. auto& mapPlanInfo = mp->getPlanInfo();
  229. QList<OnePlanItemInfo> newListPlan;
  230. /* 设置该频率的计划 */
  231. for(auto it = mapPlanInfo.begin(), end = mapPlanInfo.end(); it != end; it++)
  232. {
  233. if(it.key() != info.channelInfo.ChannelID)
  234. {
  235. continue;
  236. }
  237. for(auto& it1 : it.value())
  238. {
  239. OnePlanItemInfo tmp;
  240. tmp.ChannelID = info.channelInfo.ChannelID;
  241. tmp.ChannelName = info.channelInfo.ChannelName;
  242. tmp.onWeekDay = it1.onWeekDay;
  243. tmp.onDateTime = it1.onDateTime;
  244. tmp.offWeekDay = it1.offWeekDay;
  245. tmp.offDateTime = it1.offDateTime;
  246. newListPlan.append(tmp);
  247. }
  248. }
  249. m_mapModifyTemplate.insert(info, newListPlan);
  250. // if(m_fromWebAPI->modifyTemplate(info, newListPlan))
  251. // {
  252. // TipWidget::display(TipWidget::OPERATOR_OK, "修改模版成功", this);
  253. // }else {
  254. // TipWidget::display(TipWidget::OPERATOR_FAIL, "修改模版失败", this);
  255. // }
  256. }
  257. /* 删除模版 */
  258. void TemplateManager::deleteTemplate(QTableWidgetItem* item)
  259. {
  260. /* 弹出删除模版的提示框 */
  261. Warning w(this);
  262. w.setQSS(EPUIStyle.getQSSPath());
  263. w.setText("确定删除对应频率开关机计划?");
  264. w.exec();
  265. if(!w.isOk())
  266. {
  267. return;
  268. }
  269. /* 删除 */
  270. OneTemplateInfo info;
  271. info.channelInfo.ChannelID = item->data(m_roleChnID).toInt();
  272. info.templateName = item->data(m_roleTemplateName).toString();
  273. /* 将模版信息添加到删除列表 */
  274. m_listDeleteTemplate.append(info);
  275. /* 删除当前行 */
  276. ui->tableWidget->removeRow(item->row());
  277. /* 删除模版 */
  278. // if(m_fromWebAPI->deleteTemplate(info))
  279. // {
  280. // TipWidget::display(TipWidget::OPERATOR_OK, "删除模版成功", this);
  281. // }else {
  282. // TipWidget::display(TipWidget::OPERATOR_FAIL, "从数据库删除模版失败", this);
  283. // }
  284. }
  285. /* 事件过滤器 */
  286. bool TemplateManager::eventFilter(QObject *watched, QEvent *event)
  287. {
  288. if(watched == ui->pBtn_close)
  289. {
  290. if(event->type() == QEvent::Enter)
  291. {
  292. ui->pBtn_close->setProperty("Hover", true);
  293. ui->pBtn_close->style()->unpolish(ui->pBtn_close);
  294. ui->pBtn_close->style()->polish(ui->pBtn_close);
  295. return true;
  296. }else if(event->type() == QEvent::Leave)
  297. {
  298. ui->pBtn_close->setProperty("Hover", false);
  299. ui->pBtn_close->style()->unpolish(ui->pBtn_close);
  300. ui->pBtn_close->style()->polish(ui->pBtn_close);
  301. return true;
  302. }
  303. }
  304. return QWidget::eventFilter(watched,event);
  305. }
  306. /* 鼠标点击事件 */
  307. void TemplateManager::mousePressEvent(QMouseEvent *event)
  308. {
  309. m_lastPos = event->globalPos();
  310. event->accept();
  311. }
  312. /* 鼠标移动事件 */
  313. void TemplateManager::mouseMoveEvent(QMouseEvent *event)
  314. {
  315. // QRect rect = this->geometry();
  316. // rect.setBottom(rect.top()+50);
  317. auto point = ui->widget_Top->mapToGlobal(QPoint(0, 0));
  318. QRect rect(point, ui->widget_Top->size());
  319. if(!rect.contains(m_lastPos))
  320. {
  321. event->accept();
  322. return;
  323. }
  324. int dx = event->globalX() - m_lastPos.x();
  325. int dy = event->globalY() - m_lastPos.y();
  326. move(x()+dx, y()+dy);
  327. m_lastPos = event->globalPos();
  328. event->accept();
  329. }
  330. /* 鼠标释放事件 */
  331. void TemplateManager::mouseReleaseEvent(QMouseEvent *event)
  332. {
  333. event->accept();
  334. }