templatemanager.cpp 15 KB

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