Initial commit
This commit is contained in:
@@ -0,0 +1,154 @@
|
||||
#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();
|
||||
}
|
||||
Reference in New Issue
Block a user