#include "databaseview.h" #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; } 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); layout->addWidget(m_tableView); m_model = new QSqlQueryModel(this); QSettings settings; m_tableView->setModel(m_model); m_tableView->horizontalHeader()->restoreState(settings.value("databaseview/header").toByteArray()); QHBoxLayout *hlayout = new QHBoxLayout(this); layout->addLayout(hlayout); QPushButton *selectColumnsButton = new QPushButton(tr("Select columns"), this); 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); } 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); prepareQuery(columns); } } void DataBaseView::loadDatabase() { QSettings settings; prepareQuery(settings.value("databaseview/selectedColumns", DEFAULT_COLUMNS).toStringList()); } void DataBaseView::prepareQuery(const QStringList &columns) { 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); }