Files
tenmon/databaseview.cpp
T
2022-04-09 18:44:37 +02:00

181 lines
5.4 KiB
C++

#include "databaseview.h"
#include <QVBoxLayout>
#include <QPushButton>
#include <QSettings>
#include <QDialogButtonBox>
#include <QHeaderView>
#include <QSqlError>
#include <QDebug>
const QStringList DEFAULT_COLUMNS = {"EXPTIME", "OBJECT", "RA", "DEC"};
SelectColumnsDialog::SelectColumnsDialog(QWidget *parent) : QDialog(parent)
{
m_listWidget = new QListWidget(this);
m_listWidget->setSelectionMode(QAbstractItemView::MultiSelection);
QVBoxLayout *layout = new QVBoxLayout(this);
setLayout(layout);
layout->addWidget(m_listWidget);
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
layout->addWidget(buttonBox);
setWindowTitle(tr("Select columns"));
}
void SelectColumnsDialog::setColumns(QStringList columns)
{
QSettings settings;
m_listWidget->addItems(columns);
QStringList selected = settings.value("databaseview/selectedColumns", DEFAULT_COLUMNS).toStringList();
for(auto &sel : selected)
{
int i = columns.indexOf(sel);
if(i>=0)
m_listWidget->item(i)->setSelected(true);
}
}
QStringList SelectColumnsDialog::selectedColumns()
{
QStringList ret;
for(auto &sel : m_listWidget->selectedItems())
ret.append(sel->text());
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)
{
QVBoxLayout *layout = new QVBoxLayout(this);
setLayout(layout);
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 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();
layout->addLayout(hlayout);
QPushButton *selectColumnsButton = new QPushButton(tr("Select columns"), this);
hlayout->addWidget(selectColumnsButton);
connect(selectColumnsButton, &QPushButton::pressed, this, &DataBaseView::selectColumns);
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()
{
QSettings settings;
settings.setValue("databaseview/header", m_tableView->horizontalHeader()->saveState());
}
void DataBaseView::selectColumns()
{
SelectColumnsDialog dialog;
QStringList columns = m_database->getFitsKeywords();
dialog.setColumns(columns);
if(dialog.exec() == QDialog::Accepted)
{
QSettings settings;
QStringList columns = dialog.selectedColumns();
settings.setValue("databaseview/selectedColumns", columns);
m_model->setColumns(columns);
}
}
void DataBaseView::loadDatabase()
{
QSettings settings;
m_model->setColumns(settings.value("databaseview/selectedColumns", DEFAULT_COLUMNS).toStringList());
}
void DataBaseView::itemActivated(const QModelIndex &index)
{
emit loadFile(m_model->data(index.siblingAtColumn(0)).toString());
}
void DataBaseView::applyFilter()
{
m_model->setFilter(m_filterKeyword->currentText(), m_search->text());
}