123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465 |
- #include "templatemanager.h"
- #include "previewplan.h"
- #include "ui_templatemanager.h"
- #include <QDebug>
- #include <QPoint>
- #include <QTableWidgetItem>
- #include <QFile>
- #include <QPainter>
- #include <QMouseEvent>
- #include <memory>
- #include <qchar.h>
- #include <qnamespace.h>
- #include "warning/warning.h"
- #include "LHQLogAPI.h"
- #include "OneShadowEffect.h"
- #include "TransmitterSwitchInfo.h"
- #include "UIStyleManager.h"
- #include "template.h"
- #include "managerplan.h"
- #include "FromWebAPI.h"
- #include "tipwidget.h"
- #include "previewplan.h"
- TemplateManager::TemplateManager(QWidget *parent) :
- QDialog(parent),
- ui(new Ui::TemplateManager)
- {
- ui->setupUi(this);
- /* 设置隐藏边框 */
- this->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
- /* 设置底层样式表 */
- this->setAttribute(Qt::WA_TranslucentBackground);
- /* 创建阴影 */
- QSize size = this->size();
- size.setWidth(size.width() - 40);
- size.setHeight(size.height() - 40);
- auto pShadow = new OneShadowEffect(this);
- this->setGraphicsEffect(pShadow);
- /* 设置列数 */
- ui->tableWidget->horizontalHeader()->setVisible(true);
- ui->tableWidget->setColumnCount(5);
- /* 设置列表头 */
- QStringList headerList = {"频率名称", "模版名称", "", "", ""};
- ui->tableWidget->setHorizontalHeaderLabels(headerList);
- ui->tableWidget->horizontalHeader()->setSectionsClickable(false);
- ui->tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
- /* 设置列表头高度 */
- ui->tableWidget->horizontalHeader()->setDefaultSectionSize(40);
- /* 设置列宽间距,在显示事件中设置 */
- /* 设置列宽度固定 */
- ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
- ui->tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);
- ui->tableWidget->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Fixed);
- //设置行高
- ui->tableWidget->verticalHeader()->setDefaultSectionSize(40);
-
- /* 设置可编辑,后续创建的时候,单独设置不可编辑 */
- ui->tableWidget->setEditTriggers(QTableWidget::DoubleClicked);
- //设置选中一行
- ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
- //设置只能选中一行
- ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
- //隐藏横滚动条
- ui->tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- //隐藏网格线
- ui->tableWidget->setShowGrid(false);
- //隐藏行号
- ui->tableWidget->verticalHeader()->setVisible(false);
- //设置不显示选中后的虚线
- ui->tableWidget->setFocusPolicy(Qt::NoFocus);
- //开启排序功能
- // ui->tableWidget->setSortingEnabled(true);
- connect(ui->pBtn_close,SIGNAL(clicked()),this,SLOT(close()));
- connect(ui->pBtn_cancel,SIGNAL(clicked()),this,SLOT(close()));
- connect(ui->pBtn_ok,SIGNAL(clicked()),this,SLOT(do_ok()));
- connect(ui->tableWidget, &QTableWidget::cellClicked, this, &TemplateManager::do_clickedItem);
- connect(ui->tableWidget, &QTableWidget::itemChanged, this, &TemplateManager::do_itemChanged);
- /* 注册事件过滤器 */
- ui->pBtn_close->installEventFilter(this);
- }
- TemplateManager::~TemplateManager()
- {
- delete ui;
- }
- void TemplateManager::do_ok()
- {
- /* 获取已选中的模版列表 */
- m_isOk = true;
- this->close();
- }
- /* 点击了一个单元格 */
- void TemplateManager::do_clickedItem(int row, int column)
- {
- // LH_WRITE_LOG_DEBUG(QString("点击了单元格: %1, %2").arg(row).arg(column));
- if(column < 2)
- {
- return;
- }
- /* 获取此单元格 */
- auto item = ui->tableWidget->item(row, column);
- if(item == nullptr)
- {
- return;
- }
- /* 判断是什么功能的单元格 */
- if(column == 2)
- {
- /* 预览 */
- previewTemplate(item);
- }
- else if(column == 3)
- {
- /* 修改 */
- modifyTemplate(item);
- }
- else if(column == 4)
- {
- /* 删除 */
- deleteTemplate(item);
- }
- /* 强制重新绘制表格 */
- ui->tableWidget->repaint();
- }
- /* 单元格内容改变了 */
- void TemplateManager::do_itemChanged(QTableWidgetItem* item)
- {
- /* 获取新模版名称 */
- QString newName = item->text();
- /* 获取旧模版名称 */
- OneTemplateInfo info;
- info.templateName = item->data(m_roleTemplateName).toString();
- info.channelInfo.ChannelID = item->data(m_roleChnID).toInt();
- /* 判断是否修改了模版名称 */
- if(newName == info.templateName)
- {
- return;
- }
- /* 判断同频率下的模板名称是否冲突 */
- int rowCount = ui->tableWidget->rowCount();
- for(int i = 0; i < rowCount; i++)
- {
- /* 排除当前项 */
- if(i == item->row())
- {
- continue;
- }
- /* 获取当前项显示的名称 */
- auto itemTmp = ui->tableWidget->item(i, 1);
- if(itemTmp == nullptr)
- {
- continue;
- }
- /* 获取当前项的模版名称 */
- QString strName = itemTmp->text();
- /* 获取当前项的模版频率 */
- int chnID = itemTmp->data(m_roleChnID).toInt();
- /* 判断是否冲突 */
- if(chnID == info.channelInfo.ChannelID && strName == newName)
- {
- /* 已经存在相同的模版名称 */
- LH_WRITE_ERROR(QString("模版名称冲突:%1").arg(newName));
- TipWidget::display(TipWidget::OPERATOR_FAIL, "模版名称冲突", this);
- item->setText(info.templateName);
- return;
- }
- }
- /* 修改模版名称 */
- m_mapModifyTemplateName.insert(info, newName);
- }
- /* 显示事件 */
- void TemplateManager::showEvent(QShowEvent *event)
- {
- /* 设置列宽度 */
- int width = (ui->tableWidget->width() - ( 66 * 3)) / 2;
- ui->tableWidget->setColumnWidth(0, width);
- ui->tableWidget->setColumnWidth(1, width);
- ui->tableWidget->setColumnWidth(2, 66);
- ui->tableWidget->setColumnWidth(3, 66);
- ui->tableWidget->setColumnWidth(4, 66);
- }
- /* 设置模版列表 */
- void TemplateManager::setTemplateList(const QMultiMap<int, OneTemplateInfo>& mapTemplate)
- {
- // 暂时阻止 itemChanged 信号
- ui->tableWidget->blockSignals(true);
- for(auto it = mapTemplate.begin(), end = mapTemplate.end(); it != end; it++)
- {
- createRow(it.value());
- m_listTemplate.append(it.value());
- }
- // 恢复信号
- ui->tableWidget->blockSignals(false);
- }
- /* 设置QSS */
- void TemplateManager::setQSSPath(const QString& qssPath)
- {
- if(qssPath.isEmpty())
- {
- return;
- }
- QString qssFile = qssPath + "/templatemanager.qss";
- QFile file(qssFile);
- if(file.open(QFile::ReadOnly))
- {
- QString styleSheet = file.readAll();
- this->setStyleSheet(styleSheet);
- file.close();
- }else
- {
- LH_WRITE_ERROR(QString("Open %1 failed").arg(qssFile));
- }
- // if(EPUIStyle.getUIStyle() == enum_UIStyle::UI_Dark)
- // {
- // /* 手动设置表头的qss */
- // ui->tableWidget->horizontalHeader()->setStyleSheet(m_qssHeaderView_dark);
- // }else {
- // ui->tableWidget->horizontalHeader()->setStyleSheet(m_qssHeaderView_dark);
- // }
- }
- /* 设置WebAPI指针 */
- void TemplateManager::setWebAPI(FromWebAPI* webAPI)
- {
- if(webAPI == nullptr)
- {
- LH_WRITE_ERROR("WebAPI is nullptr");
- return;
- }
- m_fromWebAPI = webAPI;
- }
- /* 添加一行 */
- void TemplateManager::createRow(const OneTemplateInfo& info)
- {
- /* 设置表格的行数 */
- int row = ui->tableWidget->rowCount();
- ui->tableWidget->setRowCount(row + 1);
- /* 设置行高 */
- ui->tableWidget->setRowHeight(row, 40);
- /* 频率名称 */
- QTableWidgetItem* item0 = new QTableWidgetItem(info.channelInfo.ChannelName);
- item0->setFlags(item0->flags() & ~Qt::ItemIsEditable);
- item0->setData(m_roleChnID, info.channelInfo.ChannelID);
- ui->tableWidget->setItem(row, 0, item0);
- /* 模板名称,需要可编辑 */
- QTableWidgetItem* item1 = new QTableWidgetItem(info.templateName, Qt::EditRole);
- item1->setFlags(item1->flags() | Qt::ItemIsEditable);
- item1->setData(m_roleChnID, info.channelInfo.ChannelID);
- item1->setData(m_roleTemplateName, info.templateName);
- ui->tableWidget->setItem(row, 1, item1);
- /* 添加固定的三个项 */
- auto item2 = new QTableWidgetItem("预览");
- item2->setFlags(item0->flags() & ~Qt::ItemIsEditable);
- item2->setData(m_roleChnID, info.channelInfo.ChannelID);
- item2->setData(m_roleTemplateName, info.templateName);
- item2->setForeground(QBrush("#438EFF"));
- ui->tableWidget->setItem(row, 2, item2);
- auto item3 = new QTableWidgetItem("修改");
- item3->setFlags(item0->flags() & ~Qt::ItemIsEditable);
- item3->setData(m_roleChnID, info.channelInfo.ChannelID);
- item3->setData(m_roleTemplateName, info.templateName);
- item3->setForeground(QBrush("#438EFF"));
- ui->tableWidget->setItem(row, 3, item3);
- auto item4 = new QTableWidgetItem("删除");
- item4->setFlags(item0->flags() & ~Qt::ItemIsEditable);
- item4->setData(m_roleChnID, info.channelInfo.ChannelID);
- item4->setData(m_roleTemplateName, info.templateName);
- item4->setForeground(QBrush("#438EFF"));
- ui->tableWidget->setItem(row, 4, item4);
- }
- /* 修改模版 */
- void TemplateManager::modifyTemplate(QTableWidgetItem* item)
- {
- /* 获取频率 */
- OneTemplateInfo info;
- info.templateName = item->data(m_roleTemplateName).toString();
- /* 获取频率名称 */
- info.channelInfo = ChnContainer.getChannel(item->data(m_roleChnID).toInt());
- /* 获取模版中的计划 */
- QList<OnePlanItemInfo> nowListPlan;
- if(!m_fromWebAPI->getOneTemplateData(info, nowListPlan))
- {
- TipWidget::display(TipWidget::OPERATOR_FAIL, "获取模版计划失败", this);
- return;
- }
- LH_WRITE_LOG_DEBUG(QString("获取模版计划成功, 频率ID:%1, 模版名称:%2, 计划数:%3").arg(info.channelInfo.ChannelID).arg(info.templateName).arg(nowListPlan.size()));
- /* 弹出修改模版的窗口 */
- std::shared_ptr<ManagerPlan> mp = std::make_shared<ManagerPlan>(Enum_Mode::Mode_ModifyTemplate);
- mp->setFrequencyID(info.channelInfo);
- mp->setPlanList(nowListPlan);
- mp->exec();
- /* 判断是否点击了OK */
- if(!mp->isOK())
- {
- return;
- }
- /* 获取计划信息 */
- auto& mapPlanInfo = mp->getPlanInfo();
- QList<OnePlanItemInfo> newListPlan;
- /* 设置该频率的计划 */
- for(auto it = mapPlanInfo.begin(), end = mapPlanInfo.end(); it != end; it++)
- {
- if(it.key() != info.channelInfo.ChannelID)
- {
- continue;
- }
- for(auto& it1 : it.value())
- {
- OnePlanItemInfo tmp;
- tmp.ChannelID = info.channelInfo.ChannelID;
- tmp.ChannelName = info.channelInfo.ChannelName;
- tmp.onWeekDay = it1.onWeekDay;
- tmp.onDateTime = it1.onDateTime;
- tmp.offWeekDay = it1.offWeekDay;
- tmp.offDateTime = it1.offDateTime;
- newListPlan.append(tmp);
- }
- }
- m_mapModifyTemplate.insert(info, newListPlan);
- }
- /* 删除模版 */
- void TemplateManager::deleteTemplate(QTableWidgetItem* item)
- {
- /* 弹出删除模版的提示框 */
- Warning w(this);
- w.setQSS(EPUIStyle.getQSSPath());
- w.setText("确定删除对应频率开关机计划?");
- w.exec();
- if(!w.isOk())
- {
- return;
- }
- /* 删除 */
- OneTemplateInfo info;
- info.channelInfo.ChannelID = item->data(m_roleChnID).toInt();
- info.templateName = item->data(m_roleTemplateName).toString();
- /* 将模版信息添加到删除列表 */
- m_listDeleteTemplate.append(info);
- /* 删除当前行 */
- ui->tableWidget->removeRow(item->row());
- m_listTemplate.removeOne(info);
- }
- /* 预览 */
- void TemplateManager::previewTemplate(QTableWidgetItem* item)
- {
- /* 获取频率 */
- OneTemplateInfo info;
- info.templateName = item->data(m_roleTemplateName).toString();
- /* 获取频率名称 */
- info.channelInfo = ChnContainer.getChannel(item->data(m_roleChnID).toInt());
- /* 获取模版中的计划 */
- QList<OnePlanItemInfo> nowListPlan;
- if(!m_fromWebAPI->getExecPlanData(info.channelInfo.ChannelID, nowListPlan))
- {
- TipWidget::display(TipWidget::OPERATOR_FAIL, "获取模版计划失败", this);
- return;
- }
- std::shared_ptr<PreviewPlan> pp = std::make_shared<PreviewPlan>(this);
- pp->setQSSPath(EPUIStyle.getQSSPath());
- pp->setFrequencyInfo(info.channelInfo);
- pp->setTemplateList(nowListPlan);
- pp->exec();
- }
- /* 事件过滤器 */
- bool TemplateManager::eventFilter(QObject *watched, QEvent *event)
- {
- if(watched == ui->pBtn_close)
- {
- if(event->type() == QEvent::Enter)
- {
- ui->pBtn_close->setProperty("Hover", true);
- ui->pBtn_close->style()->unpolish(ui->pBtn_close);
- ui->pBtn_close->style()->polish(ui->pBtn_close);
- return true;
- }else if(event->type() == QEvent::Leave)
- {
- ui->pBtn_close->setProperty("Hover", false);
- ui->pBtn_close->style()->unpolish(ui->pBtn_close);
- ui->pBtn_close->style()->polish(ui->pBtn_close);
- return true;
- }
- }
- return QWidget::eventFilter(watched,event);
- }
- /* 鼠标点击事件 */
- void TemplateManager::mousePressEvent(QMouseEvent *event)
- {
- m_lastPos = event->globalPos();
- event->accept();
- }
- /* 鼠标移动事件 */
- void TemplateManager::mouseMoveEvent(QMouseEvent *event)
- {
- // QRect rect = this->geometry();
- // rect.setBottom(rect.top()+50);
- auto point = ui->widget_Top->mapToGlobal(QPoint(0, 0));
- QRect rect(point, ui->widget_Top->size());
- if(!rect.contains(m_lastPos))
- {
- event->accept();
- return;
- }
- int dx = event->globalX() - m_lastPos.x();
- int dy = event->globalY() - m_lastPos.y();
- move(x()+dx, y()+dy);
- m_lastPos = event->globalPos();
- event->accept();
- }
- /* 鼠标释放事件 */
- void TemplateManager::mouseReleaseEvent(QMouseEvent *event)
- {
- event->accept();
- }
|