#include "templatemanager.h" #include "previewplan.h" #include "ui_templatemanager.h" #include #include #include #include #include #include #include #include #include #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& 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 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 mp = std::make_shared(Enum_Mode::Mode_ModifyTemplate); mp->setFrequencyID(info.channelInfo); mp->setPlanList(nowListPlan); mp->exec(); /* 判断是否点击了OK */ if(!mp->isOK()) { return; } /* 获取计划信息 */ auto& mapPlanInfo = mp->getPlanInfo(); QList 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 nowListPlan; if(!m_fromWebAPI->getOneTemplateData(info, nowListPlan)) { TipWidget::display(TipWidget::OPERATOR_FAIL, "获取模版计划失败", this); return; } std::shared_ptr pp = std::make_shared(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(); }