#include "templatemanager.h" #include "ui_templatemanager.h" #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" 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::NoEditTriggers); //设置选中一行 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); /* 注册事件过滤器 */ 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) { /* 预览 */ } else if(column == 3) { /* 修改 */ modifyTemplate(item); } else if(column == 4) { /* 删除 */ deleteTemplate(item); } /* 强制重新绘制表格 */ ui->tableWidget->repaint(); } /* 显示事件 */ 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) { for(auto it = mapTemplate.begin(), end = mapTemplate.end(); it != end; it++) { createRow(it.value()); } } /* 设置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->setData(m_roleChnID, info.channelInfo.ChannelID); ui->tableWidget->setItem(row, 0, item0); QTableWidgetItem* item1 = new QTableWidgetItem(info.templateName, Qt::EditRole); item1->setData(m_roleTemplateName, info.templateName); ui->tableWidget->setItem(row, 1, item1); /* 添加固定的三个项 */ auto item2 = new QTableWidgetItem("预览"); 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->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->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->getExecPlanData(info.channelInfo.ChannelID, 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); // if(m_fromWebAPI->modifyTemplate(info, newListPlan)) // { // TipWidget::display(TipWidget::OPERATOR_OK, "修改模版成功", this); // }else { // TipWidget::display(TipWidget::OPERATOR_FAIL, "修改模版失败", this); // } } /* 删除模版 */ 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()); /* 删除模版 */ // if(m_fromWebAPI->deleteTemplate(info)) // { // TipWidget::display(TipWidget::OPERATOR_OK, "删除模版成功", this); // }else { // TipWidget::display(TipWidget::OPERATOR_FAIL, "从数据库删除模版失败", this); // } } /* 事件过滤器 */ 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(); }