PowerModeler/source/dbBrowser.cpp

425 lines
14 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "dbBrowser.h"
#include "ui_dbBrowser.h"
#include "mainwindow.h"
#include "attributeView.h"
#include <QTabBar>
#include <QRegularExpressionValidator>
#include <QKeyEvent>
DatabaseBrowser::DatabaseBrowser(QWidget *parent)
: QWidget(parent)
, ui(new Ui::DatabaseBrowser)
, m_pMainWindow(nullptr)
{
ui->setupUi(this);
m_previousTabIndex = -1;
//正则表达式,只能输入数字
QRegularExpression regExp("[0-9]+");
QRegularExpressionValidator* validator = new QRegularExpressionValidator(regExp, this);
ui->lineEditPage->setValidator(validator);
ui->lineEditPage->installEventFilter(this);
connect(ui->tabWidget, &QTabWidget::tabCloseRequested, this, &DatabaseBrowser::onTabCloseRequested);
connect(ui->tabWidget, &QTabWidget::currentChanged, this, &DatabaseBrowser::onCurrentTabChanged);
connect(ui->btnSelect, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_selectRecord);
connect(ui->btnAdd, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_addRecord);
connect(ui->btnRemove, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_removeRecord);
connect(ui->btnSave, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_submitChanges);
connect(ui->btnCancle, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_cancleChanges);
connect(ui->btnRefresh, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_refreshData);
connect(ui->btnFirstPage, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_firstPage);
connect(ui->btnPreviousPage, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_previousPage);
connect(ui->btnNextPage, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_nextPage);
connect(ui->btnLastPage, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_lastPage);
//editingFinished在输入的内容为空时不会触发所以改为在eventFilter中实现
connect(ui->lineEditPage, &QLineEdit::editingFinished, this, &DatabaseBrowser::onEditingFinished_page);
}
DatabaseBrowser::~DatabaseBrowser()
{
delete ui;
}
bool DatabaseBrowser::eventFilter(QObject* obj, QEvent* event)
{
if(obj == ui->lineEditPage)
{
if(event->type() == QEvent::KeyPress)
{
QKeyEvent* pKeyEvent = static_cast<QKeyEvent*>(event);
if (pKeyEvent->key() == Qt::Key_Enter || pKeyEvent->key() == Qt::Key_Return)
{
onEditingFinished_page();
}
}
else if(event->type() == QEvent::FocusOut)
onEditingFinished_page();
}
return QWidget::eventFilter(obj, event);
}
void DatabaseBrowser::setMainWindow(MainWindow* window)
{
m_pMainWindow = window;
}
int DatabaseBrowser::tabIndex(const QString& tabText)
{
for(int i = 0; i < ui->tabWidget->count(); i++)
{
if(ui->tabWidget->tabText(i) == tabText)
return i;
}
return -1;
}
void DatabaseBrowser::addTab_attribute(const QString& connection, ModelAttributeGroup& attributeGroup)
{
QString tabText = attributeGroup.strModelName + "/" + attributeGroup.strGroupName;
int index = tabIndex(tabText);
if(index != -1)
{
ui->tabWidget->setCurrentIndex(index);
return;
}
AttributeView* view = new AttributeView(attributeGroup, ui->tabWidget, connection);
connect(view, &AttributeView::showMessage, this, &DatabaseBrowser::onShowMessage);
connect(view->model(), &AttributeTableModel::showMessage, this, &DatabaseBrowser::onShowMessage);
connect(view->model(), &AttributeTableModel::syncDataStatus, this, &DatabaseBrowser::onSyncDataStatus);
connect(view->delegate(), &AttributeTableDelegate::showMessage, this, &DatabaseBrowser::onShowMessage);
index = ui->tabWidget->addTab(view, QIcon(":/img/images/icon_hierarchy.png"), tabText);
if(view->model())
view->model()->refresh();
//添加自定义按钮
/*QPushButton* closeBtn = new QPushButton("");
closeBtn->setProperty("index", index);
connect(closeBtn, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClick_tabCloseBtn);
closeBtn->setFixedSize(12, 12);
closeBtn->setStyleSheet("QPushButton\n"
"{\n"
" border-image: url(:/img/images/btn_close_default.png);\n"
"}\n"
"QPushButton:hover\n"
"{\n"
" border-image: url(:/img/images/btn_close_hover.png);\n"
"}\n"
"QPushButton:pressed\n"
"{\n"
" border-image: url(:/img/images/btn_close_pressed.png);\n"
"}");
QTabBar* tabBar = ui->tabWidget->tabBar();
tabBar->setTabButton(index, QTabBar::RightSide, closeBtn);*/
ui->tabWidget->setCurrentIndex(index);
}
void DatabaseBrowser::closeTab_attribute(ModelAttributeGroup& attributeGroup)
{
if(attributeGroup.groupID == -1) //关闭该模型下所有打开的tab
{
//int tabCount = ui->tabWidget->count();
for(int i = 0; i < ui->tabWidget->count(); i++)
{
if(ui->tabWidget->tabText(i).contains(attributeGroup.strModelName + "/"))
{
onTabCloseRequested(i);
i--;
}
}
}
else //关闭具体的tab
{
QString tabText = attributeGroup.strModelName + "/" + attributeGroup.strGroupName;
int index = tabIndex(tabText);
if(index == -1)
return;
onTabCloseRequested(index);
}
}
void DatabaseBrowser::closeAllTab_attribute()
{
int tabCount = ui->tabWidget->count();
for(int index = 0; index < tabCount; index++)
onTabCloseRequested(0);
}
void DatabaseBrowser::updateTabTextByModelNameChanged(const QString& oldName, const QString& newName)
{
for(int i = 0; i < ui->tabWidget->count(); i++)
{
QStringList textList = ui->tabWidget->tabText(i).split("/");
if(textList.size() == 2 && textList.at(0) == oldName)
{
QString newTabText = newName + "/" + textList.at(1);
ui->tabWidget->setTabText(i, newTabText);
}
}
}
void DatabaseBrowser::onTabCloseRequested(int index)
{
/*QObject* sender = QObject::sender();
QPushButton* button = qobject_cast<QPushButton*>(sender);
if(!button)
return;
int index = button->property("index").toInt();*/
QWidget* widget = ui->tabWidget->widget(index);
ui->tabWidget->removeTab(index);
delete widget;
}
void DatabaseBrowser::onCurrentTabChanged(int index)
{
if(m_previousTabIndex != -1)
{
ui->tabWidget->setTabIcon(m_previousTabIndex, QIcon(":/img/images/icon_hierarchy_unchecked.png"));
}
m_previousTabIndex = index;
if(index == -1) //最后一个tab关闭时会触发
{
ui->btnSelect->setEnabled(false);
ui->btnAdd->setEnabled(false);
ui->btnRemove->setEnabled(false);
ui->btnCancle->setEnabled(false);
ui->btnRefresh->setEnabled(false);
ui->btnSave->setEnabled(false);
ui->btnCancle->setEnabled(false);
ui->btnFirstPage->setEnabled(false);
ui->btnPreviousPage->setEnabled(false);
ui->btnNextPage->setEnabled(false);
ui->btnLastPage->setEnabled(false);
ui->recordInfo->clear();
ui->lineEditPage->setEnabled(false);
ui->lineEditPage->setText("1");
return;
}
ui->tabWidget->setTabIcon(m_previousTabIndex, QIcon(":/img/images/icon_hierarchy.png"));
QWidget* widget = ui->tabWidget->widget(index);
AttributeView* attributeView = qobject_cast<AttributeView*>(widget);
if(attributeView)
{
ui->btnSelect->setEnabled(true);
ui->btnAdd->setEnabled(true);
ui->btnRemove->setEnabled(true);
ui->btnCancle->setEnabled(true);
ui->btnRefresh->setEnabled(true);
ui->btnFirstPage->setEnabled(true);
ui->btnPreviousPage->setEnabled(true);
ui->btnNextPage->setEnabled(true);
ui->btnLastPage->setEnabled(true);
ui->lineEditPage->setEnabled(true);
attributeView->active();
}
}
void DatabaseBrowser::onBtnClicked_selectRecord()
{
emit openAttributeSelector();
}
void DatabaseBrowser::onBtnClicked_addRecord()
{
QWidget* widget = ui->tabWidget->currentWidget();
AttributeView* attributeView = qobject_cast<AttributeView*>(widget);
if(attributeView)
{
QTableView* view = attributeView->view();
AttributeTableModel* model = attributeView->model();
if(view && model)
{
int row = model->rowCount(); //当前插入都是在最后一行
/*QModelIndex currentIndex = view->currentIndex();
if(currentIndex.row() != -1)
row = currentIndex.row();*/
model->insertRecord(row);
ui->btnSave->setEnabled(true);
ui->btnCancle->setEnabled(true);
}
}
}
void DatabaseBrowser::onBtnClicked_removeRecord()
{
QWidget* widget = ui->tabWidget->currentWidget();
AttributeView* attributeView = qobject_cast<AttributeView*>(widget);
if(attributeView)
{
QTableView* view = attributeView->view();
AttributeTableModel* model = attributeView->model();
if(view && model)
{
/*QModelIndex currentIndex = view->currentIndex();
int row = currentIndex.row();
if( row != -1)
{
model->removeRecord(row);
ui->btnSave->setEnabled(true);
ui->btnCancle->setEnabled(true);
}*/
model->removeRecord();
ui->btnSave->setEnabled(true);
ui->btnCancle->setEnabled(true);
}
}
}
void DatabaseBrowser::onBtnClicked_submitChanges()
{
QWidget* widget = ui->tabWidget->currentWidget();
AttributeView* attributeView = qobject_cast<AttributeView*>(widget);
if(attributeView)
{
QTableView* view = attributeView->view();
AttributeTableModel* model = attributeView->model();
if(view && model)
{
model->submitChanges();
attributeView->syncChangeRecord();
}
}
}
void DatabaseBrowser::onBtnClicked_cancleChanges()
{
QWidget* widget = ui->tabWidget->currentWidget();
AttributeView* attributeView = qobject_cast<AttributeView*>(widget);
if(attributeView)
{
QTableView* view = attributeView->view();
AttributeTableModel* model = attributeView->model();
if(view && model)
model->cancleChanges();
}
}
void DatabaseBrowser::onBtnClicked_refreshData()
{
QWidget* widget = ui->tabWidget->currentWidget();
AttributeView* attributeView = qobject_cast<AttributeView*>(widget);
if(attributeView)
{
QTableView* view = attributeView->view();
AttributeTableModel* model = attributeView->model();
if(view && model)
model->refresh();
}
}
void DatabaseBrowser::onBtnClicked_firstPage()
{
QWidget* widget = ui->tabWidget->currentWidget();
AttributeView* attributeView = qobject_cast<AttributeView*>(widget);
if(attributeView)
{
QTableView* view = attributeView->view();
AttributeTableModel* model = attributeView->model();
if(view && model)
model->firstPage();
}
}
void DatabaseBrowser::onBtnClicked_previousPage()
{
QWidget* widget = ui->tabWidget->currentWidget();
AttributeView* attributeView = qobject_cast<AttributeView*>(widget);
if(attributeView)
{
QTableView* view = attributeView->view();
AttributeTableModel* model = attributeView->model();
if(view && model)
model->previousPage();
}
}
void DatabaseBrowser::onBtnClicked_nextPage()
{
QWidget* widget = ui->tabWidget->currentWidget();
AttributeView* attributeView = qobject_cast<AttributeView*>(widget);
if(attributeView)
{
QTableView* view = attributeView->view();
AttributeTableModel* model = attributeView->model();
if(view && model)
model->nextPage();
}
}
void DatabaseBrowser::onBtnClicked_lastPage()
{
QWidget* widget = ui->tabWidget->currentWidget();
AttributeView* attributeView = qobject_cast<AttributeView*>(widget);
if(attributeView)
{
QTableView* view = attributeView->view();
AttributeTableModel* model = attributeView->model();
if(view && model)
model->lastPage();
}
}
void DatabaseBrowser::onEditingFinished_page()
{
QWidget* widget = ui->tabWidget->currentWidget();
AttributeView* attributeView = qobject_cast<AttributeView*>(widget);
if(attributeView)
{
QTableView* view = attributeView->view();
AttributeTableModel* model = attributeView->model();
if(view && model)
{
QString strPage = ui->lineEditPage->text();
bool result = model->setCurrentPage(strPage.toInt());
if(!result)
ui->lineEditPage->setText(QString::number(model->currentPage()));
}
}
}
void DatabaseBrowser::onSyncDataStatus(bool hasModifiedData, const PaginationInfo& paginationInfo)
{
ui->btnSave->setEnabled(hasModifiedData);
ui->btnCancle->setEnabled(hasModifiedData);
QString recordInfo = QString::fromWCharArray(L"共 %1 条记录").arg(paginationInfo.totalEntries);
ui->recordInfo->setText(recordInfo);
ui->lineEditPage->setText(QString::number(paginationInfo.currentPage));
}
void DatabaseBrowser::onShowMessage(MessageDialogType type,const QString& strTitle,const QString& strContent)
{
if(m_pMainWindow)
m_pMainWindow->showMessageDialog(type, strTitle, strContent);
}
void DatabaseBrowser::processAttributeSelectedData(QVector<QVector<QVariant>> datas)
{
QWidget* widget = ui->tabWidget->currentWidget();
AttributeView* attributeView = qobject_cast<AttributeView*>(widget);
if(attributeView)
{
QTableView* view = attributeView->view();
AttributeTableModel* model = attributeView->model();
if(view && model)
{
model->addRecords(datas);
ui->btnSave->setEnabled(true);
ui->btnCancle->setEnabled(true);
}
}
}