Files

155 lines
4.1 KiB
C++
Raw Permalink Normal View History

2026-07-12 14:34:52 +04:00
#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();
}