Add simple filter option
This commit is contained in:
+77
-15
@@ -4,6 +4,8 @@
|
||||
#include <QSettings>
|
||||
#include <QDialogButtonBox>
|
||||
#include <QHeaderView>
|
||||
#include <QSqlError>
|
||||
#include <QDebug>
|
||||
|
||||
const QStringList DEFAULT_COLUMNS = {"EXPTIME", "OBJECT", "RA", "DEC"};
|
||||
|
||||
@@ -44,6 +46,59 @@ QStringList SelectColumnsDialog::selectedColumns()
|
||||
return ret;
|
||||
}
|
||||
|
||||
FITSFileModel::FITSFileModel(QObject *parent) : QSqlQueryModel(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void FITSFileModel::sort(int column, Qt::SortOrder order)
|
||||
{
|
||||
if(column < 0)
|
||||
m_sort.clear();
|
||||
else if(column <= m_columns.size())
|
||||
{
|
||||
if(column == 0)m_sort = " ORDER BY file ";
|
||||
else m_sort = QString(" ORDER BY \"%1\" ").arg(m_columns.at(column-1));
|
||||
m_sort += order == Qt::AscendingOrder ? "ASC" : "DESC";
|
||||
prepareQuery();
|
||||
}
|
||||
}
|
||||
|
||||
void FITSFileModel::setColumns(const QStringList &columns)
|
||||
{
|
||||
m_columns = columns;
|
||||
prepareQuery();
|
||||
}
|
||||
|
||||
void FITSFileModel::setFilter(const QString &key, const QString &value)
|
||||
{
|
||||
if(value.isEmpty())
|
||||
{
|
||||
m_having.clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!m_columns.contains(key))m_columns.append(key);
|
||||
m_having = QString(" HAVING \"%1\" LIKE \"%2\"").arg(key).arg(value);
|
||||
}
|
||||
prepareQuery();
|
||||
}
|
||||
|
||||
void FITSFileModel::prepareQuery()
|
||||
{
|
||||
QString sql = "SELECT file,";
|
||||
for(auto &column : m_columns)
|
||||
{
|
||||
sql += QString("GROUP_CONCAT(CASE WHEN key=\"%1\" THEN value END) AS \"%1\",").arg(column);
|
||||
}
|
||||
sql.chop(1);
|
||||
sql += " FROM fits_files LEFT JOIN fits_headers ON fits_files.id=id_file GROUP BY fits_files.id" + m_having + m_sort;
|
||||
setQuery(sql);
|
||||
qDebug() << sql;
|
||||
if(lastError().type() != QSqlError::NoError)
|
||||
qDebug() << lastError();
|
||||
}
|
||||
|
||||
DataBaseView::DataBaseView(Database *database, QWidget *parent) : QWidget(parent)
|
||||
,m_database(database)
|
||||
{
|
||||
@@ -52,13 +107,16 @@ DataBaseView::DataBaseView(Database *database, QWidget *parent) : QWidget(parent
|
||||
|
||||
m_tableView = new QTableView(this);
|
||||
m_tableView->verticalHeader()->setDefaultSectionSize(1);
|
||||
m_tableView->setSortingEnabled(true);
|
||||
m_tableView->horizontalHeader()->setSortIndicatorShown(true);
|
||||
layout->addWidget(m_tableView);
|
||||
connect(m_tableView, &QTableView::activated, this, &DataBaseView::itemActivated);
|
||||
|
||||
m_model = new QSqlQueryModel(this);
|
||||
m_model = new FITSFileModel(this);
|
||||
|
||||
QSettings settings;
|
||||
m_tableView->setModel(m_model);
|
||||
m_model->setColumns(settings.value("databaseview/selectedColumns", DEFAULT_COLUMNS).toStringList());
|
||||
m_tableView->horizontalHeader()->restoreState(settings.value("databaseview/header").toByteArray());
|
||||
|
||||
QHBoxLayout *hlayout = new QHBoxLayout();
|
||||
@@ -68,9 +126,20 @@ DataBaseView::DataBaseView(Database *database, QWidget *parent) : QWidget(parent
|
||||
hlayout->addWidget(selectColumnsButton);
|
||||
connect(selectColumnsButton, &QPushButton::pressed, this, &DataBaseView::selectColumns);
|
||||
|
||||
QPushButton *loadDatabaseButton = new QPushButton(tr("Load database"), this);
|
||||
hlayout->addWidget(loadDatabaseButton);
|
||||
connect(loadDatabaseButton, &QPushButton::pressed, this, &DataBaseView::loadDatabase);
|
||||
m_filterKeyword = new QComboBox(this);
|
||||
m_filterKeyword->addItem("file");
|
||||
m_filterKeyword->addItems(m_database->getFitsKeywords());
|
||||
|
||||
m_search = new QLineEdit(this);
|
||||
m_search->setPlaceholderText(tr("Text to search, you can % as wildcard"));
|
||||
connect(m_search, &QLineEdit::returnPressed, this, &DataBaseView::applyFilter);
|
||||
|
||||
QPushButton *filterButton = new QPushButton(tr("Filter"), this);
|
||||
connect(filterButton, SIGNAL(pressed()), this, SLOT(applyFilter()));
|
||||
|
||||
hlayout->addWidget(m_filterKeyword);
|
||||
hlayout->addWidget(m_search);
|
||||
hlayout->addWidget(filterButton);
|
||||
}
|
||||
|
||||
DataBaseView::~DataBaseView()
|
||||
@@ -89,14 +158,14 @@ void DataBaseView::selectColumns()
|
||||
QSettings settings;
|
||||
QStringList columns = dialog.selectedColumns();
|
||||
settings.setValue("databaseview/selectedColumns", columns);
|
||||
prepareQuery(columns);
|
||||
m_model->setColumns(columns);
|
||||
}
|
||||
}
|
||||
|
||||
void DataBaseView::loadDatabase()
|
||||
{
|
||||
QSettings settings;
|
||||
prepareQuery(settings.value("databaseview/selectedColumns", DEFAULT_COLUMNS).toStringList());
|
||||
m_model->setColumns(settings.value("databaseview/selectedColumns", DEFAULT_COLUMNS).toStringList());
|
||||
}
|
||||
|
||||
void DataBaseView::itemActivated(const QModelIndex &index)
|
||||
@@ -104,15 +173,8 @@ void DataBaseView::itemActivated(const QModelIndex &index)
|
||||
emit loadFile(m_model->data(index.siblingAtColumn(0)).toString());
|
||||
}
|
||||
|
||||
void DataBaseView::prepareQuery(const QStringList &columns)
|
||||
void DataBaseView::applyFilter()
|
||||
{
|
||||
QString sql = "SELECT file,";
|
||||
for(auto &column : columns)
|
||||
{
|
||||
sql += QString("GROUP_CONCAT(CASE WHEN key=\"%1\" THEN value END) AS \"%1\",").arg(column);
|
||||
}
|
||||
sql.chop(1);
|
||||
sql += " FROM fits_files LEFT JOIN fits_headers ON fits_files.id=id_file GROUP BY fits_files.id";
|
||||
m_model->setQuery(sql);
|
||||
m_model->setFilter(m_filterKeyword->currentText(), m_search->text());
|
||||
}
|
||||
|
||||
|
||||
+21
-3
@@ -6,6 +6,8 @@
|
||||
#include <QSqlQueryModel>
|
||||
#include <QTableView>
|
||||
#include <QListWidget>
|
||||
#include <QComboBox>
|
||||
#include <QLineEdit>
|
||||
#include "database.h"
|
||||
|
||||
class SelectColumnsDialog : public QDialog
|
||||
@@ -18,12 +20,29 @@ public:
|
||||
QStringList selectedColumns();
|
||||
};
|
||||
|
||||
class FITSFileModel : public QSqlQueryModel
|
||||
{
|
||||
Q_OBJECT
|
||||
QStringList m_columns;
|
||||
QString m_sort;
|
||||
QString m_having;
|
||||
public:
|
||||
FITSFileModel(QObject *parent = nullptr);
|
||||
void sort(int column, Qt::SortOrder order);
|
||||
void setColumns(const QStringList &columns);
|
||||
void setFilter(const QString &key, const QString &value);
|
||||
protected:
|
||||
void prepareQuery();
|
||||
};
|
||||
|
||||
class DataBaseView : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
Database *m_database;
|
||||
QTableView *m_tableView;
|
||||
QSqlQueryModel *m_model;
|
||||
FITSFileModel *m_model;
|
||||
QComboBox *m_filterKeyword;
|
||||
QLineEdit *m_search;
|
||||
public:
|
||||
explicit DataBaseView(Database *database, QWidget *parent = nullptr);
|
||||
~DataBaseView();
|
||||
@@ -31,8 +50,7 @@ public slots:
|
||||
void selectColumns();
|
||||
void loadDatabase();
|
||||
void itemActivated(const QModelIndex &index);
|
||||
protected:
|
||||
void prepareQuery(const QStringList &columns);
|
||||
void applyFilter();
|
||||
signals:
|
||||
void loadFile(QString file);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user