155 lines
4.1 KiB
C++
155 lines
4.1 KiB
C++
#include "search_dialog.h"
|
|
|
|
#include "base_sql_table_model.h"
|
|
#include "model_manager.h"
|
|
#include "multi_column_filter_proxy_model.h"
|
|
#include <QMessageBox>
|
|
|
|
SearchDialog::SearchDialog(QWidget *parent)
|
|
: QDialog(parent), originalModel_(nullptr) {
|
|
setupUi(this);
|
|
|
|
initializeProxyModel();
|
|
setupTableView(); // After initializing proxy model
|
|
setupConnections();
|
|
}
|
|
|
|
SearchDialog::SearchDialog(const QString &modelTableName,
|
|
const QString &fieldName, QWidget *parent)
|
|
: SearchDialog(parent) {
|
|
if (!setTableName(modelTableName)) {
|
|
qFatal("SearchDialog::SearchDialog: Failed to set table name");
|
|
}
|
|
if (!setFieldName(fieldName)) {
|
|
qFatal("SearchDialog::SearchDialog: Failed to set field name");
|
|
}
|
|
}
|
|
|
|
SearchDialog::~SearchDialog() {
|
|
if (originalModel_ != nullptr) {
|
|
originalModel_->resetFilter();
|
|
}
|
|
}
|
|
|
|
bool SearchDialog::setFieldName(const QString &fieldName) {
|
|
int columnIndex = originalModel_->columnIndex(fieldName);
|
|
if (columnIndex == -1) {
|
|
return false;
|
|
}
|
|
columnIndex_ = columnIndex;
|
|
return true;
|
|
}
|
|
|
|
bool SearchDialog::setTableName(const QString &modelTableName) {
|
|
ModelManager &modelManger = ModelManager::instance();
|
|
|
|
if (originalModel_ != nullptr) {
|
|
originalModel_->resetFilter();
|
|
}
|
|
|
|
modelTableName_ = modelTableName;
|
|
|
|
originalModel_ = modelManger.getModelAs<BaseSqlTableModel>(modelTableName);
|
|
|
|
proxyModel_->setSourceModel(originalModel_);
|
|
|
|
tableView->clearSelection();
|
|
|
|
columnIndex_ = -1;
|
|
|
|
if (originalModel_->isCompleteDatabaseFiltering()) {
|
|
return true;
|
|
}
|
|
|
|
#ifdef NOPTIMIZATION
|
|
while (originalModel_->canFetchMore()) {
|
|
originalModel_->fetchMore();
|
|
}
|
|
#endif
|
|
|
|
return true;
|
|
}
|
|
|
|
void SearchDialog::initializeProxyModel() {
|
|
proxyModel_ = new MultiColumnSortFilterProxyModel(this);
|
|
}
|
|
|
|
void SearchDialog::setupConnections() {
|
|
connect(lineEditSearch, &QLineEdit::textChanged, this,
|
|
&SearchDialog::onLineEditSearchTextChanged);
|
|
|
|
connect(pushButtonSelect, &QPushButton::clicked, this,
|
|
&SearchDialog::onPushButtonSelectClicked);
|
|
}
|
|
|
|
void SearchDialog::setupTableView() {
|
|
QHeaderView *horizontalHeader = tableView->horizontalHeader();
|
|
horizontalHeader->setHighlightSections(false);
|
|
horizontalHeader->setSectionResizeMode(QHeaderView::ResizeToContents);
|
|
|
|
tableView->setAlternatingRowColors(true);
|
|
|
|
tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
|
|
|
tableView->setFocusPolicy(Qt::NoFocus);
|
|
|
|
tableView->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
|
|
|
|
tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
|
|
|
|
tableView->setSelectionMode(QAbstractItemView::SingleSelection);
|
|
|
|
tableView->setSortingEnabled(true);
|
|
|
|
tableView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
|
|
|
|
tableView->sortByColumn(0, Qt::AscendingOrder);
|
|
|
|
tableView->setModel(proxyModel_);
|
|
}
|
|
|
|
void SearchDialog::onLineEditSearchTextChanged(const QString &text) {
|
|
ModelManager &modelManger = ModelManager::instance();
|
|
|
|
#ifdef NOPTIMIZATION
|
|
if (originalModel_->isCompleteDatabaseFiltering()) {
|
|
originalModel_->setMultiColumnFilter(text);
|
|
return;
|
|
}
|
|
|
|
// Model filtering
|
|
QRegularExpression regex(text, QRegularExpression::CaseInsensitiveOption);
|
|
proxyModel_->setFilterRegularExpression(regex);
|
|
#else
|
|
// Database filtering
|
|
originalModel_->setMultiColumnFilter(text);
|
|
#endif
|
|
}
|
|
|
|
void SearchDialog::onPushButtonSelectClicked() {
|
|
if (columnIndex_ == -1) {
|
|
qFatal("SearchDialog::onPushButtonSelectClicked: Column index not set");
|
|
}
|
|
|
|
QModelIndexList selectedIndexes = tableView->selectionModel()->selectedRows();
|
|
if (selectedIndexes.isEmpty()) {
|
|
QMessageBox::warning(this, QMessageBox::tr("Error"),
|
|
QMessageBox::tr("No row selected"));
|
|
return;
|
|
}
|
|
|
|
QModelIndex selectedRowIndex = selectedIndexes.first();
|
|
emit rowSelected(selectedRowIndex.row());
|
|
|
|
QSqlRecord record = originalModel_->record(selectedRowIndex.row());
|
|
emit recordRetrieved(record);
|
|
|
|
if (columnIndex_ != -1) {
|
|
QSqlRecord record = originalModel_->record(selectedRowIndex.row());
|
|
QSqlField field = record.field(columnIndex_);
|
|
emit fieldRetrieved(field);
|
|
}
|
|
|
|
accept();
|
|
}
|