273 lines
8.5 KiB
C++
273 lines
8.5 KiB
C++
#include <QMenu>
|
|
#include <QMessageBox>
|
|
#include "diagramEditor/diagramEditorWizard.h"
|
|
#include "diagramEditor/wizardBusTableDelegate.h"
|
|
#include "ui_diagramEditorWizard.h"
|
|
|
|
DiagramEditorWizard::DiagramEditorWizard(QWidget *parent)
|
|
: QDialog(parent)
|
|
, ui(new Ui::diagramEditorWizard)
|
|
{
|
|
ui->setupUi(this);
|
|
_busPageChanged = false;
|
|
this->setWindowFlags(Qt::FramelessWindowHint | windowFlags());
|
|
initial();
|
|
}
|
|
|
|
DiagramEditorWizard::~DiagramEditorWizard()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void DiagramEditorWizard::initial()
|
|
{
|
|
ui->tabWidget->tabBar()->setEnabled(false);
|
|
connect(ui->btn_ok,&QPushButton::clicked,this,&DiagramEditorWizard::onOkClicked);
|
|
connect(ui->btn_cancel,&QPushButton::clicked,this,&DiagramEditorWizard::onCancelClicked);
|
|
connect(ui->btn_last,&QPushButton::clicked,this,&DiagramEditorWizard::onLastClicked);
|
|
connect(ui->btn_next,&QPushButton::clicked,this,&DiagramEditorWizard::onNextClicked);
|
|
connect(ui->btn_addBus,&QPushButton::clicked,this,&DiagramEditorWizard::onAddBusClicked);
|
|
connect(ui->btn_addBay,&QPushButton::clicked,this,&DiagramEditorWizard::onAddBayClicked);
|
|
connect(ui->btn_addTrans,&QPushButton::clicked,this,&DiagramEditorWizard::onAddTransClicked);
|
|
|
|
QStringList headerText;
|
|
headerText<<"层级"<<"电压等级"<<"主接线"<<"分段方式"<<"接线方式";
|
|
ui->tableWidget_bus->setContextMenuPolicy(Qt::CustomContextMenu);
|
|
ui->tableWidget_bus->setSelectionMode(QAbstractItemView::SingleSelection);
|
|
ui->tableWidget_bus->setSelectionBehavior(QAbstractItemView::SelectRows);
|
|
ui->tableWidget_bus->setColumnCount(headerText.count());
|
|
ui->tableWidget_bus->setHorizontalHeaderLabels(headerText);
|
|
ui->tableWidget_bus->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
|
|
|
|
WizardBusTableDelegate* delegate = new WizardBusTableDelegate(this);
|
|
ui->tableWidget_bus->setItemDelegate(delegate);
|
|
|
|
connect(delegate,&WizardBusTableDelegate::editingFinished,this,&DiagramEditorWizard::onDelegateFinishEdit);
|
|
connect(ui->tableWidget_bus, &QTableWidget::customContextMenuRequested, this, &DiagramEditorWizard::onBusIndexRbtnClicked);
|
|
}
|
|
|
|
void DiagramEditorWizard::reOrderBus()
|
|
{
|
|
reindexQMap(_mapBus);
|
|
|
|
for(int row = 0 ;row < ui->tableWidget_bus->rowCount();++row)
|
|
{
|
|
QTableWidgetItem* pItem = ui->tableWidget_bus->item(row,0);
|
|
pItem->setText("第"+QString::number(row+1)+"层");
|
|
pItem->setData(Qt::UserRole,row);
|
|
}
|
|
}
|
|
|
|
void DiagramEditorWizard::generateBayPage()
|
|
{
|
|
for(auto& busInfo:_mapBus)
|
|
{
|
|
QListWidgetItem* item = new QListWidgetItem("第"+QString::number(busInfo.nIndex+1)+"层");
|
|
item->setData(Qt::UserRole,busInfo.nIndex);
|
|
ui->listWidget_bay->addItem(item);
|
|
|
|
}
|
|
}
|
|
|
|
template <typename T> void DiagramEditorWizard::reindexQMap(QMap<int, T> &map) {
|
|
if (map.isEmpty())
|
|
return;
|
|
|
|
// 保存原数据的值(按原键升序排列)
|
|
QVector<T> values;
|
|
values.reserve(map.size());
|
|
for (auto it = map.begin(); it != map.end(); ++it) {
|
|
values.append(std::move(it.value())); // 使用移动语义
|
|
}
|
|
|
|
// 清空原map并重新插入连续键
|
|
map.clear();
|
|
for (int newKey = 0; newKey < values.size(); ++newKey) {
|
|
map.insert(newKey, std::move(values[newKey])); // 再次移动
|
|
}
|
|
}
|
|
|
|
void DiagramEditorWizard::onOkClicked()
|
|
{
|
|
DiagramEditorWizardInfo info;
|
|
|
|
emit wizardFinish(info);
|
|
hide();
|
|
}
|
|
|
|
void DiagramEditorWizard::onCancelClicked()
|
|
{
|
|
hide();
|
|
}
|
|
|
|
void DiagramEditorWizard::onLastClicked()
|
|
{
|
|
if(ui->tabWidget->currentIndex() == 2){
|
|
ui->tabWidget->setCurrentIndex(1);
|
|
ui->stackedWidget_last->setCurrentIndex(1);
|
|
ui->stackedWidget_next->setCurrentIndex(0);
|
|
}
|
|
else if(ui->tabWidget->currentIndex() == 1){
|
|
ui->tabWidget->setCurrentIndex(0);
|
|
ui->stackedWidget_last->setCurrentIndex(0);
|
|
ui->stackedWidget_next->setCurrentIndex(0);
|
|
}
|
|
}
|
|
|
|
void DiagramEditorWizard::onNextClicked()
|
|
{
|
|
if(ui->tabWidget->currentIndex() == 0){
|
|
ui->tabWidget->setCurrentIndex(1);
|
|
ui->stackedWidget_last->setCurrentIndex(1);
|
|
ui->stackedWidget_next->setCurrentIndex(0);
|
|
|
|
|
|
}
|
|
else if(ui->tabWidget->currentIndex() == 1){
|
|
ui->tabWidget->setCurrentIndex(2);
|
|
ui->stackedWidget_last->setCurrentIndex(1);
|
|
ui->stackedWidget_next->setCurrentIndex(1);
|
|
}
|
|
}
|
|
|
|
void DiagramEditorWizard::onAddBusClicked()
|
|
{
|
|
int row = ui->tableWidget_bus->rowCount();
|
|
ui->tableWidget_bus->insertRow(row);
|
|
|
|
// 层级
|
|
QTableWidgetItem* levelItem = new QTableWidgetItem("第"+QString::number(row)+"层");
|
|
ui->tableWidget_bus->setItem(row, 0, levelItem);
|
|
levelItem->setData(Qt::UserRole,row);
|
|
|
|
// 电压等级
|
|
QTableWidgetItem* voltageItem = new QTableWidgetItem("未设置");
|
|
ui->tableWidget_bus->setItem(row, 1, voltageItem);
|
|
|
|
// 主接线
|
|
QTableWidgetItem* typeItem = new QTableWidgetItem("未设置");
|
|
ui->tableWidget_bus->setItem(row, 2, typeItem);
|
|
|
|
// 分段方式
|
|
QTableWidgetItem* divideItem = new QTableWidgetItem("未设置");
|
|
ui->tableWidget_bus->setItem(row, 3, divideItem);
|
|
|
|
// 接线方式
|
|
QTableWidgetItem* connectItem = new QTableWidgetItem("未选择");
|
|
ui->tableWidget_bus->setItem(row, 4, connectItem);
|
|
|
|
DiagramEditorBusInfo info;
|
|
info.nIndex = row;
|
|
_mapBus.insert(row,info);
|
|
}
|
|
|
|
void DiagramEditorWizard::onAddBayClicked()
|
|
{
|
|
|
|
}
|
|
|
|
void DiagramEditorWizard::onAddTransClicked()
|
|
{
|
|
|
|
}
|
|
|
|
void DiagramEditorWizard::onDelegateFinishEdit(const QModelIndex &index, const QString &value)
|
|
{
|
|
int row = index.row();
|
|
int col = index.column();
|
|
if(_mapBus.contains(row)){
|
|
if(col == 1){
|
|
_mapBus[row].dVoltage = value.toDouble();
|
|
}
|
|
else if(col == 2){
|
|
_mapBus[row].nLineType = value.toInt();
|
|
QTableWidgetItem *divideItem = ui->tableWidget_bus->item(row, 3);
|
|
divideItem->setText("未设置");
|
|
divideItem->setData(Qt::UserRole,0);
|
|
}
|
|
else if(col == 3){
|
|
_mapBus[row].mapDivide.clear();
|
|
QStringList lst = value.split(",");
|
|
if(lst.size() > 1) //双母
|
|
{
|
|
_mapBus[row].mapDivide[0] = lst[0].toInt();
|
|
_mapBus[row].mapDivide[1] = lst[1].toInt();
|
|
}
|
|
else{ //单母
|
|
_mapBus[row].mapDivide[0] = lst[0].toInt();
|
|
}
|
|
}
|
|
else if(col == 4){
|
|
_mapBus[row].connectType = value.toInt();
|
|
}
|
|
_busPageChanged = true;
|
|
//qDebug() << row<<","<<col<<":"<<value;
|
|
}
|
|
}
|
|
|
|
void DiagramEditorWizard::onBusDeleteClicked()
|
|
{
|
|
// 获取当前选中的索引
|
|
QMessageBox msgBox;
|
|
msgBox.setText(QString::fromWCharArray(L"提示"));
|
|
msgBox.setInformativeText(QString::fromWCharArray(L"确认删除?"));
|
|
msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
|
|
msgBox.setDefaultButton(QMessageBox::Cancel);
|
|
int ret = msgBox.exec();
|
|
switch (ret) {
|
|
case QMessageBox::Ok:
|
|
{
|
|
QModelIndexList selectedIndexes = ui->tableWidget_bus->selectionModel()->selectedRows();
|
|
if (selectedIndexes.isEmpty()) {
|
|
return; // 没有选中任何行
|
|
}
|
|
|
|
// 获取当前选中的第一项索引
|
|
QModelIndex index = selectedIndexes.first();
|
|
if (!index.isValid()) {
|
|
return;
|
|
}
|
|
|
|
QModelIndex indexName = index.sibling(index.row(),0);
|
|
int nIndex = indexName.data(Qt::UserRole).toInt();
|
|
if(_mapBus.contains(nIndex)){
|
|
DiagramEditorBusInfo info = _mapBus.take(nIndex);
|
|
}
|
|
|
|
int currentRow = ui->tableWidget_bus->currentRow();
|
|
if (currentRow == -1) {
|
|
return; // 没有选中行
|
|
}
|
|
|
|
ui->tableWidget_bus->removeRow(currentRow);
|
|
reOrderBus();
|
|
}
|
|
break;
|
|
case QMessageBox::Cancel:
|
|
// Cancel was clicked
|
|
break;
|
|
default:
|
|
// should never be reached
|
|
break;
|
|
}
|
|
}
|
|
|
|
void DiagramEditorWizard::onBusIndexRbtnClicked(const QPoint &pos)
|
|
{
|
|
// 获取当前点击的位置对应的索引
|
|
QModelIndex index = ui->tableWidget_bus->indexAt(pos);
|
|
if (!index.isValid()) {
|
|
return; // 如果点击的是空白区域,直接返回
|
|
}
|
|
|
|
QMenu menu;
|
|
QAction *deleteAction = new QAction("删除本层", this);
|
|
menu.addAction(deleteAction);
|
|
|
|
// 连接删除菜单项的触发信号与槽函数
|
|
connect(deleteAction, &QAction::triggered, this, &DiagramEditorWizard::onBusDeleteClicked);
|
|
|
|
// 在点击位置显示菜单
|
|
menu.exec(ui->tableWidget_bus->mapToGlobal(pos));
|
|
}
|