#include "groupSelectionDialog.h" #include "./ui_groupSelectionDialog.h" #include "maskLayer.h" #include "mainwindow.h" #include "sqlQueryExecutor.h" #include "textColorPreserveDelegate.h" #include "customBorderContainer.h" #define itemRole_groupID 1 #define itemRole_isPublic 2 #define itemRole_isNewlyAdded 3 GroupSelectionDialog::GroupSelectionDialog(QWidget *parent) : QDialog(parent) , ui(new Ui::GroupSelectionDialog) , m_pMainWindow(nullptr) , m_curModelID(-1) { ui->setupUi(this); if(QSysInfo::kernelType() == "linux") { //Linux下默认的Qt::Dialog即使有父窗口也无法按照子窗口的行为进行展示,并且最大、最小按钮不好关闭,因此需要去掉Dialog属性,随之而来的问题是,模态无法起作用 setWindowFlags(windowFlags() & ~Qt::Dialog); setStyleSheet("QDialog{border: 1px solid rgb(110,110,110);border-radius:5px;background-color:rgb(30,30,30);}"); m_customBorderContainer = new CustomBorderContainer(this); m_customBorderContainer->setOperationOptions(CustomBorderContainer::Movable | CustomBorderContainer::Resizable); } initialize(); } GroupSelectionDialog::~GroupSelectionDialog() { delete ui; } void GroupSelectionDialog::initialize() { m_pMaskLayer = new MaskLayer(this); TextColorPreserveDelegate* delegate = new TextColorPreserveDelegate(this); ui->sourceList->setItemDelegate(delegate); ui->selectedList->setItemDelegate(delegate); connect(ui->btnSave, &QPushButton::clicked, this, &GroupSelectionDialog::onBtnClicked_save); connect(ui->btnCancle, &QPushButton::clicked, this, &GroupSelectionDialog::onBtnClicked_cancle); connect(ui->btnRemoveSelected, &QPushButton::clicked, this, &GroupSelectionDialog::onBtnClicked_removeSelected); connect(ui->sourceList, &QListWidget::itemDoubleClicked, this, &GroupSelectionDialog::onItemDblCliked_sourceList); } void GroupSelectionDialog::setMainWindow(MainWindow* window) { m_pMainWindow = window; ui->sourceList->clear(); ui->selectedList->clear(); if(m_pMainWindow) { QString connection = m_pMainWindow->getCurConnection(); const QVector groups = SqlQueryExecutor::instance().getAttributeGroup(connection); for(const AttributeGroup& group : groups) { QListWidgetItem* sourceItem = new QListWidgetItem(group.name); sourceItem->setFlags(sourceItem->flags() & ~Qt::ItemIsEditable); sourceItem->setData(Qt::UserRole + itemRole_groupID, group.id); sourceItem->setData(Qt::UserRole + itemRole_isPublic, group.isPublic); ui->sourceList->addItem(sourceItem); } } } void GroupSelectionDialog::setModel(int id) { ui->selectedList->clear(); if(!m_pMainWindow || id <= 0) return; m_curModelID = id; QString connection = m_pMainWindow->getCurConnection(); QVector groups = SqlQueryExecutor::instance().getModelGroups(connection, id); for(int groupID : groups) { AttributeGroup group = SqlQueryExecutor::instance().getAttributeGroupData(connection, groupID); if(group.name.isEmpty()) continue; QListWidgetItem* item = new QListWidgetItem(group.name); item->setFlags(item->flags() & ~Qt::ItemIsEditable); item->setData(Qt::UserRole + itemRole_groupID, group.id); item->setData(Qt::UserRole + itemRole_isPublic, group.isPublic); item->setData(Qt::UserRole + itemRole_isNewlyAdded, false); item->setForeground(QBrush(QColor(128,128,128))); ui->selectedList->addItem(item); } } void GroupSelectionDialog::showMask() { m_pMaskLayer->setGeometry(0, 0, this->width(), this->height()); m_pMaskLayer->show(); } void GroupSelectionDialog::hideMask() { m_pMaskLayer->close(); } void GroupSelectionDialog::onBtnClicked_save() { if(!m_pMainWindow) { close(); return; } QVector groups; for(int i = 0; i < ui->selectedList->count(); i++) { QListWidgetItem* item = ui->selectedList->item(i); bool isNewlyAdded = item->data(Qt::UserRole + itemRole_isNewlyAdded).toBool(); if(isNewlyAdded) groups.append(item->data(Qt::UserRole + itemRole_groupID).toInt()); } QString connection = m_pMainWindow->getCurConnection(); bool result = SqlQueryExecutor::instance().addModleGroups(connection, m_curModelID, groups); if(!result) { m_pMainWindow->showMessageDialog(type_warning, QString::fromWCharArray(L"错误"),QString::fromWCharArray(L"信息存储失败,详情可见日志文件")); return; } emit addGroups(m_curModelID, groups); close(); } void GroupSelectionDialog::onBtnClicked_cancle() { close(); } void GroupSelectionDialog::onBtnClicked_removeSelected() { QListWidgetItem* item = ui->selectedList->currentItem(); if(item && !item->data(Qt::UserRole + itemRole_isNewlyAdded).toBool()) { m_pMainWindow->showMessageDialog(type_warning, QString::fromWCharArray(L"错误"),QString::fromWCharArray(L"该组别不是最新添加,不可移除")); return; } int row = ui->selectedList->currentRow(); item = ui->selectedList->takeItem(row); if(item) delete item; } void GroupSelectionDialog::onItemDblCliked_sourceList(QListWidgetItem* item) { if(item->data(Qt::UserRole + itemRole_isPublic).toBool()) return; QList foundItems = ui->selectedList->findItems(item->text(), Qt::MatchFixedString); if(foundItems.isEmpty()) { QListWidgetItem* selectedItem = new QListWidgetItem(*item); selectedItem->setData(Qt::UserRole + itemRole_isNewlyAdded, true); ui->selectedList->addItem(selectedItem); } }