#include "databaseview.h" #include #include #include #include #include #include #include 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) && key != "file")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()); }