DiagramDesigner/diagramCavas/source/diagramEditor/diagramEditorBayDetailSetti...

335 lines
11 KiB
C++

#include <QMessageBox>
#include <QMenu>
#include "diagramEditor/diagramEditorBayDetailSettingDlg.h"
#include "diagramEditor/diagramEditorBayDetailAddDlg.h"
#include "diagramEditor/diagramEditorBayPreviewDlg.h"
#include "diagramEditor/diagramEditorWizard.h"
#include "ui_diagramEditorBayDetailSettingDlg.h"
#include "diagramEditor/diagramEditorBaseBlock.h"
#include "graphicsDataModel/diagramEditorModel.h"
#include "topologyManager.h"
DiagramEditorBayDetailSettingDlg::DiagramEditorBayDetailSettingDlg(QWidget *parent)
: QDialog(parent)
, ui(new Ui::diagramEditorBayDetailSettingDlg)
,_pAddDlg(nullptr)
,_curOperateObj(nullptr)
,_compoModel(nullptr)
,_routeModel(nullptr)
,_pPreviewDlg(nullptr)
,_pModel(nullptr)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint | windowFlags());
this->setWindowModality(Qt::WindowModal);
setStyleSheet("background-color: white;");
initial();
}
DiagramEditorBayDetailSettingDlg::~DiagramEditorBayDetailSettingDlg()
{
delete ui;
}
void DiagramEditorBayDetailSettingDlg::initial()
{
_compoModel = new QStandardItemModel(this);
_routeModel = new QStandardItemModel(this);
_routeModel->setHorizontalHeaderLabels({"线路名", "包含设备"});
ui->tableView->setModel(_routeModel);
connect(ui->btn_add,&QPushButton::clicked,this,&DiagramEditorBayDetailSettingDlg::onAddClicked);
connect(ui->btn_ok,&QPushButton::clicked,this,&DiagramEditorBayDetailSettingDlg::onOkClicked);
connect(ui->btn_cancel,&QPushButton::clicked,this,&DiagramEditorBayDetailSettingDlg::onCancelClicked);
connect(ui->btn_preview,&QPushButton::clicked,this,&DiagramEditorBayDetailSettingDlg::onPreviewClicked);
connect(ui->tableView, &QTableView::customContextMenuRequested, this, &DiagramEditorBayDetailSettingDlg::onRouteRbtnClicked);
ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu);
ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->tableView->verticalHeader()->setVisible(false);
}
void DiagramEditorBayDetailSettingDlg::refreshModel()
{
if(_curOperateObj){
_compoModel->clear();
_compoModel->setColumnCount(5);
_compoModel->setHorizontalHeaderLabels({"分类", "名称", "类型", "关联对象", "引用线路"});
auto mapComponent = _curOperateObj->getComponentMap();
for(auto& comp:mapComponent){
DiagramEditorComponentInfo info = comp;
QStandardItem *itemCate = new QStandardItem();
QStandardItem *itemName = new QStandardItem();
QStandardItem *itemType = new QStandardItem();
QStandardItem *itemObj = new QStandardItem();
QStandardItem *itemRoute = new QStandardItem();
QString sCategory;
if(info.nCategory == 0){
sCategory = "设备";
}
else if(info.nCategory == 1){
sCategory = "连接关系";
}
QString sType;
if(info.nType == 1)
{
sType = "母线";
}
else if(info.nType == 2)
{
sType = "异步电动机";
}
else if(info.nType == 3)
{
sType = "断路器";
}
else if(info.nType == 4)
{
sType = "电缆";
}
else if(info.nType == 5)
{
sType = "电流互感器";
}
else if(info.nType == 6)
{
sType = "电压互感器";
}
else if(info.nType == 7)
{
sType = "隔离开关";
}
else if(info.nType == 8)
{
sType = "接地开关";
}
else if(info.nType == 9)
{
sType = "快速接地开关";
}
else if(info.nType == 10)
{
sType = "双掷接地隔离开关";
}
else if(info.nType == 11)
{
sType = "带电指示器";
}
else if(info.nType == 12)
{
sType = "避雷器";
}
else if(info.nType == 13)
{
sType = "电缆出线套筒";
}
else if(info.nType == 14)
{
sType = "电缆端";
}
itemCate->setText(sCategory);
itemName->setText(info.sName);
itemType->setText(sType);
itemObj->setText(info.sBindObj);
itemRoute->setText(info.sUsedRoute.join(""));
QList<QStandardItem*> lstItems;
lstItems<<itemCate<<itemName<<itemType<<itemObj<<itemRoute;
_compoModel->appendRow(lstItems);
}
_routeModel->clear();
_routeModel->setColumnCount(2);
_routeModel->setHorizontalHeaderLabels({"线路名", "包含设备"});
auto mapRoute = _curOperateObj->getRouteInfoMap();
setRouteMap(mapRoute); //更新路径数据到本界面
for(auto& route:mapRoute){
QString sRoute = route.sRouteName;
QStringList lstComp;
for(auto& comp:route.lstCompo){
lstComp.append(comp.sName);
}
QStandardItem *itemRoute = new QStandardItem();
QStandardItem *itemComponents = new QStandardItem();
itemRoute->setText(sRoute);
itemComponents->setText(lstComp.join(","));
QList<QStandardItem*> lstItems;
lstItems<<itemRoute<<itemComponents;
_routeModel->appendRow(lstItems);
}
}
}
void DiagramEditorBayDetailSettingDlg::showDlg(DiagramEditorBayBlock* p)
{
show();
_curOperateObj = p;
refreshModel();
}
void DiagramEditorBayDetailSettingDlg::onAddClicked()
{
if(_pAddDlg == nullptr){
_pAddDlg = new DiagramEditorBayDetailAddDlg(this);
_pAddDlg->setParent(this);
}
_pAddDlg->showDlg();
}
void DiagramEditorBayDetailSettingDlg::onOkClicked()
{
//将ui设置的参数更新到对应block
if(_curOperateObj){
_curOperateObj->setRouteInfoMap(_mapRouteInfo);
QMap<QString,DiagramEditorComponentInfo> mapComponents;
int nRowCount = _compoModel->rowCount();
for(int i = 0;i < nRowCount;++i){
QStandardItem *itemCate = _compoModel->item(i, 0);
QStandardItem *itemName = _compoModel->item(i, 1);
QStandardItem *itemType = _compoModel->item(i, 2);
QStandardItem *itemBind = _compoModel->item(i, 3);
QStandardItem *itemRoute = _compoModel->item(i, 4);
int nDir = itemName->data(Qt::UserRole+1).toInt(); //连接方向
QPoint deltaPos = itemName->data(Qt::UserRole+2).toPoint(); //相对位置
QUuid uid = itemName->data(Qt::UserRole+3).toUuid(); //uid
int nVal = itemName->data(Qt::UserRole+4).toInt(); //标志
int nRotate = itemName->data(Qt::UserRole+5).toInt(); //旋转角度
DiagramEditorComponentInfo compoInfo;
if(itemCate->text() == "电气设备"){
compoInfo.nCategory = 0;
}
else if(itemCate->text() == "连接关系"){
compoInfo.nCategory = 1;
}
compoInfo.sName = itemName->text();
compoInfo.nType = itemType->data().toInt();
compoInfo.sBindObj = itemBind->text();
compoInfo.sUsedRoute = itemRoute->text().split(",");
compoInfo.nUsedDirection = nDir;
compoInfo.deltaPos = deltaPos;
compoInfo.uid = uid;
compoInfo.nFlag = nVal;
compoInfo.nRotate = nRotate;
mapComponents.insert(compoInfo.sName,compoInfo);
}
_curOperateObj->setComponentMap(mapComponents);
TopologyManager::instance().clearGlobalBlockData(_curOperateObj->getName());
TopologyManager::instance().moveTempBlockData();
_curOperateObj = nullptr;
}
hide();
_pModel->clearCurPreview(); //关闭时清除预览Item
//todo:清除mainPanel中的对应item(如果存在)
}
void DiagramEditorBayDetailSettingDlg::onCancelClicked()
{
hide();
}
void DiagramEditorBayDetailSettingDlg::onRouteDeleteClicked()
{
// 获取当前选中的索引
QModelIndexList selectedIndexes = ui->tableView->selectionModel()->selectedRows();
if (selectedIndexes.isEmpty()) {
return; // 没有选中任何行
}
// 获取行号并排序(从大到小删除避免索引变化)
QList<int> rowsToRemove;
foreach (const QModelIndex &index, selectedIndexes) {
rowsToRemove.append(index.row());
}
// 获取当前选中的第一项索引
QModelIndex index = selectedIndexes.first();
if (!index.isValid()) {
return;
}
QModelIndex indexName = index.sibling(index.row(),0);
QString sName = indexName.data().toString();
// 移除行
foreach (int row, rowsToRemove) {
QList<QStandardItem*> rowItems;
for (int col = 0; col < _routeModel->columnCount(); ++col) {
QStandardItem *item = _routeModel->takeItem(row, col);
rowItems.append(item);
}
qDeleteAll(rowItems); //take的item不释放
_routeModel->removeRow(row);
}
_mapRouteInfo.remove(sName); //同步移除数据
}
void DiagramEditorBayDetailSettingDlg::onRouteRbtnClicked(const QPoint &pos)
{
QModelIndex index = ui->tableView->indexAt(pos);
if (!index.isValid()) {
return; // 如果点击的是空白区域,直接返回
}
QMenu menu;
QAction *deleteAction = new QAction("删除", this);
QAction *modifyAction = new QAction("修改", this);
menu.addAction(deleteAction);
menu.addAction(modifyAction);
// 连接删除菜单项的触发信号与槽函数
connect(deleteAction, &QAction::triggered, this, &DiagramEditorBayDetailSettingDlg::onRouteDeleteClicked);
//连接修改
connect(modifyAction, &QAction::triggered, this, &DiagramEditorBayDetailSettingDlg::onRouteEditClicked);
// 在点击位置显示菜单
menu.exec(ui->tableView->mapToGlobal(pos));
}
void DiagramEditorBayDetailSettingDlg::onRouteEditClicked()
{
if(_pAddDlg == nullptr){
_pAddDlg = new DiagramEditorBayDetailAddDlg(this);
_pAddDlg->setParent(this);
}
// 获取当前选中的索引
QModelIndexList selectedIndexes = ui->tableView->selectionModel()->selectedRows();
if (selectedIndexes.isEmpty()) {
return; // 没有选中任何行
}
// 获取当前选中的第一项索引
QModelIndex index = selectedIndexes.first();
if (!index.isValid()) {
return;
}
QModelIndex indexName = index.sibling(index.row(),0);
QString sName = indexName.data().toString();
auto routeInfo = _mapRouteInfo.value(sName);
_pAddDlg->showDlg(routeInfo);
}
void DiagramEditorBayDetailSettingDlg::onPreviewClicked()
{
if(_pPreviewDlg == nullptr){
_pPreviewDlg = new DiagramEditorBayPreviewDlg(this);
_pPreviewDlg->setParent(this);
_pModel->setCurBayComponentModel(_compoModel);
_pModel->setCurBayRouteModel(_routeModel);
}
if(!_pPreviewDlg->isVisible()){
_pPreviewDlg->showDlg();
_pModel->generateTempBay();
}
else
_pPreviewDlg->hide();
}