#include "search_dialog.h" #include "base_sql_table_model.h" #include "model_manager.h" #include "multi_column_filter_proxy_model.h" #include 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(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(); }