Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 974d482d5b | |||
| d45bf37e50 | |||
| 56a8a0e789 | |||
| 27afb2ea5f | |||
| 28016ada8d | |||
| 885a5b4c6d | |||
| 63149745ed |
+5
-2
@@ -123,8 +123,11 @@ This example filters for files where: "Bias" is in the file name, the OBJECT pro
|
||||
</p>
|
||||
|
||||
<h3>Database tree</h3>
|
||||
<p>This is another view that show indexed database as tree. You can add or remove tree filter that construct a tree structure from FITS keywords. Each level of tree
|
||||
will be based on this filter. You can specify one keywords multiple times.</p>
|
||||
<p>This is another view that show indexed database as tree. You can add or remove tree grouping that construct a tree structure from FITS keywords. Each level of tree
|
||||
will be based on this grouping. You can specify one keywords multiple times. When adding a grouping you can also specify aggregation function that is applied to last level.
|
||||
SUM will add up all numbers in that group usefull for example for EXPTIME. COUNT will show how many files are in that group. AVG will show average value, MIN,MAX,MEDIAN will calculate
|
||||
minimum, maximum and media value in that group. So if you select CCD-TEMP as last with AVG it will calculate average temperature. Double click on file in tree view will open
|
||||
that file.</p>
|
||||
|
||||
<h3>Plate Solving</h3>
|
||||
<p>This module can plate solve images and update FITS header with solution for FITS and XISF images.
|
||||
|
||||
+5
-2
@@ -103,8 +103,11 @@ Cet exemple filtre les fichiers où : "Bias" figure dans le nom de fichier, la p
|
||||
</p>
|
||||
|
||||
<h3>Database tree</h3>
|
||||
<p>This is another view that show indexed database as tree. You can add or remove tree filter that construct a tree structure from FITS keywords. Each level of tree
|
||||
will be based on this filter. You can specify one keywords multiple times.</p>
|
||||
<p>This is another view that show indexed database as tree. You can add or remove tree grouping that construct a tree structure from FITS keywords. Each level of tree
|
||||
will be based on this grouping. You can specify one keywords multiple times. When adding a grouping you can also specify aggregation function that is applied to last level.
|
||||
SUM will add up all numbers in that group usefull for example for EXPTIME. COUNT will show how many files are in that group. AVG will show average value, MIN,MAX,MEDIAN will calculate
|
||||
minimum, maximum and media value in that group. So if you select CCD-TEMP as last with AVG it will calculate average temperature. Double click on file in tree view will open
|
||||
that file.</p>
|
||||
|
||||
<h3>Plate Solving</h3>
|
||||
<p>This module can plate solve images and update FITS header with solution for FITS and XISF images.
|
||||
|
||||
+5
-2
@@ -106,8 +106,11 @@ zástupný znak za hocijaký reťazec znakov aj žiadny. Znak _ je tiež zástup
|
||||
Bez použitia zástupných znakov sa vyhľadá iba presný výskyt.</p>
|
||||
|
||||
<h3>Database tree</h3>
|
||||
<p>This is another view that show indexed database as tree. You can add or remove tree filter that construct a tree structure from FITS keywords. Each level of tree
|
||||
will be based on this filter. You can specify one keywords multiple times.</p>
|
||||
<p>This is another view that show indexed database as tree. You can add or remove tree grouping that construct a tree structure from FITS keywords. Each level of tree
|
||||
will be based on this grouping. You can specify one keywords multiple times. When adding a grouping you can also specify aggregation function that is applied to last level.
|
||||
SUM will add up all numbers in that group usefull for example for EXPTIME. COUNT will show how many files are in that group. AVG will show average value, MIN,MAX,MEDIAN will calculate
|
||||
minimum, maximum and media value in that group. So if you select CCD-TEMP as last with AVG it will calculate average temperature. Double click on file in tree view will open
|
||||
that file.</p>
|
||||
|
||||
<h3>Plate Solving</h3>
|
||||
<p>Tento modul umožnuje vyriešiť obrázok a určiť RA, DEC koordináty a aktualizovať FITS a XISF súbory s WCS dátami.
|
||||
|
||||
@@ -60,6 +60,17 @@
|
||||
</screenshots>
|
||||
<content_rating type="oars-1.1"/>
|
||||
<releases>
|
||||
<release version="20260412" date="2026-04-12">
|
||||
<description>
|
||||
<ul>
|
||||
<li>Add database tree to show database entries grouped in tree structure</li>
|
||||
<li>Add database summary table. This can show total exposure time for OBJECT and FILTER for example</li>
|
||||
<li>Copy files to clipboard from database view</li>
|
||||
<li>Copy to clipboard text from database tables so they can be pasted to Excel</li>
|
||||
<li>Add CLI option to run scripts and generate thumbnails</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="20260217" date="2026-02-17">
|
||||
<description>
|
||||
<ul>
|
||||
|
||||
+9
-7
@@ -15,11 +15,13 @@ About::About(QWidget *parent) : QDialog(parent)
|
||||
QLabel *label = new QLabel(this);
|
||||
|
||||
QFile tenmonText(":/about/tenmon");
|
||||
tenmonText.open(QIODevice::ReadOnly);
|
||||
QByteArray text = tenmonText.readAll();
|
||||
text.replace("@GITVERSION@", GITVERSION);
|
||||
label->setText(text);
|
||||
label->setOpenExternalLinks(true);
|
||||
if(tenmonText.open(QIODevice::ReadOnly))
|
||||
{
|
||||
QByteArray text = tenmonText.readAll();
|
||||
text.replace("@GITVERSION@", GITVERSION);
|
||||
label->setText(text);
|
||||
label->setOpenExternalLinks(true);
|
||||
}
|
||||
|
||||
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok);
|
||||
connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
|
||||
@@ -41,8 +43,8 @@ HelpDialog::HelpDialog(QWidget *parent) : QDialog(parent)
|
||||
layout->addWidget(helpText);
|
||||
|
||||
QFile tenmonText(":/help");
|
||||
tenmonText.open(QIODevice::ReadOnly);
|
||||
helpText->setHtml(tenmonText.readAll());
|
||||
if(tenmonText.open(QIODevice::ReadOnly))
|
||||
helpText->setHtml(tenmonText.readAll());
|
||||
}
|
||||
|
||||
QString getVersion()
|
||||
|
||||
+9
-9
@@ -35,7 +35,7 @@ bool Database::init(const QLatin1String &connectionName)
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "Could not open NGC database";
|
||||
qWarning() << "Could not open NGC database";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ bool Database::init(const QLatin1String &connectionName)
|
||||
}
|
||||
if(version > 2)
|
||||
{
|
||||
qDebug() << "Database version is too new";
|
||||
qWarning() << "Database version is too new";
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -100,16 +100,16 @@ bool Database::init(const QLatin1String &connectionName)
|
||||
m_deleteFile.prepare("DELETE FROM fits_files WHERE id=?");
|
||||
return true;
|
||||
}
|
||||
qDebug() << error.text();
|
||||
qWarning() << error.text();
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "Failed to open database" << connectionName;
|
||||
qWarning() << "Failed to open database" << connectionName;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "Database is invalid";
|
||||
qWarning() << "Database is invalid";
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -175,7 +175,7 @@ bool Database::checkError(QSqlQuery &query)
|
||||
return true;
|
||||
else
|
||||
{
|
||||
qDebug() << error.text();
|
||||
qWarning() << error.text();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -383,7 +383,7 @@ bool Database::indexFile(const QFileInfo &file)
|
||||
m_insertFileWcs.bindValue(7, crVal2);
|
||||
if(!m_insertFileWcs.exec())
|
||||
{
|
||||
qDebug() << "Database error" << m_insertFileWcs.lastError();
|
||||
qWarning() << "Database error" << m_insertFileWcs.lastError();
|
||||
return false;
|
||||
}
|
||||
last_id = m_insertFileWcs.lastInsertId().toLongLong();
|
||||
@@ -394,7 +394,7 @@ bool Database::indexFile(const QFileInfo &file)
|
||||
m_insertFile.bindValue(1, mtime);
|
||||
if(!m_insertFile.exec())
|
||||
{
|
||||
qDebug() << "Database error" << m_insertFile.lastError();
|
||||
qWarning() << "Database error" << m_insertFile.lastError();
|
||||
return false;
|
||||
}
|
||||
last_id = m_insertFile.lastInsertId().toLongLong();
|
||||
@@ -415,7 +415,7 @@ bool Database::indexFile(const QFileInfo &file)
|
||||
m_insertFitsHeader.bindValue(3, comments);
|
||||
if(!m_insertFitsHeader.execBatch())
|
||||
{
|
||||
qDebug() << "Database error" << m_insertFitsHeader.lastError();
|
||||
qWarning() << "Database error" << m_insertFitsHeader.lastError();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
+188
-25
@@ -1,20 +1,31 @@
|
||||
#include "databasetree.h"
|
||||
|
||||
#include "database.h"
|
||||
#include "databaseview.h"
|
||||
#include <QComboBox>
|
||||
#include <QDialogButtonBox>
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
#include <QSettings>
|
||||
#include <QSqlError>
|
||||
#include <QStackedWidget>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
DatabaseTreeSettings::DatabaseTreeSettings(const QString &filter, const QStringList &keywords, QWidget *parent) : QDialog(parent)
|
||||
DatabaseTreeSettings::DatabaseTreeSettings(const QStringList &data, QStringList keywords, QWidget *parent) : QDialog(parent)
|
||||
{
|
||||
setWindowTitle(tr("Add tree filter"));
|
||||
setWindowTitle(tr("Add tree grouping"));
|
||||
QVBoxLayout *vlayout = new QVBoxLayout(this);
|
||||
setLayout(vlayout);
|
||||
|
||||
QStringList key = filter.split('/');
|
||||
QStringList key = data[0].split('/');
|
||||
|
||||
qsizetype dateobsindex = keywords.indexOf("DATE-OBS");
|
||||
if(dateobsindex != -1)
|
||||
{
|
||||
keywords.insert(dateobsindex + 1, "DATE-OBS_YEAR-MONTH-DAY");
|
||||
keywords.insert(dateobsindex + 1, "DATE-OBS_YEAR-MONTH");
|
||||
keywords.insert(dateobsindex + 1, "DATE-OBS_YEAR");
|
||||
}
|
||||
|
||||
for(int i = 0; i < 10; i++)
|
||||
{
|
||||
@@ -27,8 +38,15 @@ DatabaseTreeSettings::DatabaseTreeSettings(const QString &filter, const QStringL
|
||||
comboxBox->setCurrentText(key[i]);
|
||||
}
|
||||
|
||||
vlayout->addWidget(new QLabel(tr("Aggregate function"), this));
|
||||
_aggregateFunction = new QComboBox(this);
|
||||
_aggregateFunction->addItems({"", "SUM", "COUNT", "AVG", "MIN", "MAX", "MEDIAN"});
|
||||
vlayout->addWidget(_aggregateFunction);
|
||||
_aggregateFunction->setToolTip(tr("This aggregate function will be applied to last level of grouping"));
|
||||
_aggregateFunction->setCurrentText(data[1]);
|
||||
|
||||
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
|
||||
connect(buttonBox, &QDialogButtonBox::accepted, this, &DatabaseTreeSettings::accept);
|
||||
connect(buttonBox, &QDialogButtonBox::accepted, this, &DatabaseTreeSettings::acceptButton);
|
||||
connect(buttonBox, &QDialogButtonBox::rejected, this, &DatabaseTreeSettings::reject);
|
||||
vlayout->addWidget(buttonBox);
|
||||
}
|
||||
@@ -44,6 +62,24 @@ QString DatabaseTreeSettings::keywords() const
|
||||
return keywords.join('/');
|
||||
}
|
||||
|
||||
QString DatabaseTreeSettings::aggregrationFunc() const
|
||||
{
|
||||
return _aggregateFunction->currentText();
|
||||
}
|
||||
|
||||
void DatabaseTreeSettings::acceptButton()
|
||||
{
|
||||
for(QComboBox *box : _keywordsSelect)
|
||||
{
|
||||
if(box->currentIndex() > 0)
|
||||
{
|
||||
QDialog::accept();
|
||||
return;
|
||||
}
|
||||
}
|
||||
QDialog::reject();
|
||||
}
|
||||
|
||||
class TreeNode
|
||||
{
|
||||
public:
|
||||
@@ -130,6 +166,11 @@ void DatabaseTree::setKeys(const QStringList &keys)
|
||||
endResetModel();
|
||||
}
|
||||
|
||||
QStringList DatabaseTree::keys() const
|
||||
{
|
||||
return _keys;
|
||||
}
|
||||
|
||||
QModelIndex DatabaseTree::index(int row, int column, const QModelIndex &parent) const
|
||||
{
|
||||
if(!hasIndex(row, column, parent))
|
||||
@@ -262,6 +303,54 @@ void DatabaseTree::load()
|
||||
}
|
||||
}
|
||||
|
||||
QSqlQuery DatabaseTree::getGroupQuery(const QString &aggregateFunc) const
|
||||
{
|
||||
QStringList cols;
|
||||
QString join;
|
||||
QString sum;
|
||||
|
||||
for(int i = 0; i < _keys.size(); i++)
|
||||
{
|
||||
join += QString(" LEFT JOIN fits_headers AS h%1 ON f.id = h%1.id_file AND h%1.key = ?").arg(i);
|
||||
if(_keys[i] == "DATE-OBS_YEAR")
|
||||
cols.append(QString("STRFTIME('%Y', h%1.value)").arg(i));
|
||||
else if(_keys[i] == "DATE-OBS_YEAR-MONTH")
|
||||
cols.append(QString("STRFTIME('%Y-%m', h%1.value)").arg(i));
|
||||
else if(_keys[i] == "DATE-OBS_YEAR-MONTH-DAY")
|
||||
cols.append(QString("STRFTIME('%Y-%m-%d', h%1.value)").arg(i));
|
||||
else
|
||||
cols.append(QString("h%1.value").arg(i));
|
||||
|
||||
if(i == _keys.size() - 1)
|
||||
{
|
||||
QString tmp = aggregateFunc + "(" + cols.last() + ")";
|
||||
if(aggregateFunc == "COUNT")
|
||||
cols.append("COUNT(*)");
|
||||
else
|
||||
cols.last() = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
QStringList group = cols;
|
||||
group.removeLast();
|
||||
QString sql = "SELECT " + cols.join(',') + " FROM fits_files AS f" + join + " GROUP BY " + group.join(',') + " ORDER BY " + cols.join(" NULLS LAST,") + " NULLS LAST";
|
||||
|
||||
QSqlQuery query(sql, _database->db());
|
||||
for(auto &val : _keys)
|
||||
{
|
||||
if(val.startsWith("DATE-OBS_"))
|
||||
query.addBindValue("DATE-OBS");
|
||||
else
|
||||
query.addBindValue(val);
|
||||
}
|
||||
|
||||
qDebug() << "Group query" << sql;
|
||||
if(!query.exec())
|
||||
qWarning() << "Group query failed" << query.lastError();
|
||||
|
||||
return query;
|
||||
}
|
||||
|
||||
void DatabaseTree::prepareQueries()
|
||||
{
|
||||
if(!_loaded)return;
|
||||
@@ -276,22 +365,42 @@ void DatabaseTree::prepareQueries()
|
||||
|
||||
for(int i = 0; i < _keys.size(); i++)
|
||||
{
|
||||
QString sql = QString("SELECT h%1.value FROM fits_files AS f").arg(i) + join + where + QString(" GROUP BY h%1.value ORDER BY h%1.value").arg(i);
|
||||
qDebug() << _keys[i] << sql;
|
||||
QString sql;
|
||||
QString col = QString("h%1.value").arg(i);
|
||||
if(_keys[i] == "DATE-OBS_YEAR")
|
||||
col = QString("STRFTIME('%Y', h%1.value)").arg(i);
|
||||
else if(_keys[i] == "DATE-OBS_YEAR-MONTH")
|
||||
col = QString("STRFTIME('%Y-%m', h%1.value)").arg(i);
|
||||
else if(_keys[i] == "DATE-OBS_YEAR-MONTH-DAY")
|
||||
col = QString("STRFTIME('%Y-%m-%d', h%1.value)").arg(i);
|
||||
|
||||
sql = QString("SELECT %1 FROM fits_files AS f").arg(col) + join + where + QString(" GROUP BY %1 ORDER BY %1 NULLS LAST").arg(col);
|
||||
|
||||
qDebug() << "Tree query for" << _keys[i] << sql;
|
||||
QSqlQuery query(sql, _database->db());
|
||||
for(auto &val : _keys)
|
||||
query.addBindValue(val);
|
||||
{
|
||||
if(val.startsWith("DATE-OBS_"))
|
||||
query.addBindValue("DATE-OBS");
|
||||
else
|
||||
query.addBindValue(val);
|
||||
}
|
||||
|
||||
if(where.isEmpty())
|
||||
where += QString(" WHERE h%1.value IS ?").arg(i);
|
||||
where += QString(" WHERE %1 IS ?").arg(col);
|
||||
else
|
||||
where += QString(" AND h%1.value IS ?").arg(i);
|
||||
where += QString(" AND %1 IS ?").arg(col);
|
||||
_queries.append(std::move(query));
|
||||
}
|
||||
|
||||
QSqlQuery files("SELECT f.file FROM fits_files AS f " + join + where + " GROUP BY f.id ORDER BY f.file", _database->db());
|
||||
QSqlQuery files("SELECT f.file FROM fits_files AS f" + join + where + " GROUP BY f.id ORDER BY f.file", _database->db());
|
||||
for(auto &val : _keys)
|
||||
files.addBindValue(val);
|
||||
{
|
||||
if(val.startsWith("DATE-OBS_"))
|
||||
files.addBindValue("DATE-OBS");
|
||||
else
|
||||
files.addBindValue(val);
|
||||
}
|
||||
qDebug() << files.lastQuery();
|
||||
_queries.append(std::move(files));
|
||||
}
|
||||
@@ -322,7 +431,7 @@ void DatabaseTree::fillNode(TreeNode *node)
|
||||
q.bindValue(i + _keys.size(), vals[i]);
|
||||
if(!q.exec())
|
||||
{
|
||||
qWarning() << "Failed to execute query" << q.lastError();
|
||||
qWarning() << "Failed to execute query" << q.lastError() << q.lastQuery() << q.boundValues();
|
||||
node->fill({});
|
||||
return;
|
||||
}
|
||||
@@ -345,25 +454,44 @@ DatabaseTreeView::DatabaseTreeView(Database *database, QWidget *parent) : QWidge
|
||||
_treeView->setModel(_model);
|
||||
_treeView->setHeaderHidden(true);
|
||||
|
||||
_tableView = new CopyTableView(this);
|
||||
_sqlModel = new QSqlQueryModel(this);
|
||||
_tableView->setModel(_sqlModel);
|
||||
|
||||
QSettings settings;
|
||||
QStringList filters = settings.value("databasetreeview/filters", QStringList{"OBJECT", "OBJECT/IMAGETYP", "OBJECT/IMAGETYP/FILTER", "OBJECT/IMAGETYP/FILTER/EXPTIME", "IMAGETYP/OBJECT/IMAGETYP/FILTER/EXPTIME"}).toStringList();
|
||||
QStringList filters = settings.value("databasetreeview/filters", QStringList{"OBJECT", "OBJECT/IMAGETYP", "OBJECT/IMAGETYP/FILTER", "OBJECT/IMAGETYP/FILTER/EXPTIME",
|
||||
"IMAGETYP/OBJECT/IMAGETYP/FILTER/EXPTIME", "IMAGETYP/DATE-OBS_YEAR/EXPTIME"}).toStringList();
|
||||
QStringList aggrFuncs = settings.value("databasetreeview/aggrFuncs", QStringList{"", "", "", "SUM", "SUM", "SUM"}).toStringList();
|
||||
int selectedFilter = settings.value("databasetreeview/selectedFilter", 2).toInt();
|
||||
|
||||
_filters = new QComboBox(this);
|
||||
_filters->addItems(filters);
|
||||
for(int i = 0; i < std::min(filters.size(), aggrFuncs.size()); i++)
|
||||
{
|
||||
_filters->addItem(filters[i] + " " + aggrFuncs[i], QStringList{filters[i], aggrFuncs[i]});
|
||||
}
|
||||
_filters->setCurrentIndex(selectedFilter);
|
||||
connect(_filters, &QComboBox::currentTextChanged, this, &DatabaseTreeView::filterChanged);
|
||||
filterChanged(_filters->currentText());
|
||||
connect(_filters, &QComboBox::currentIndexChanged, this, &DatabaseTreeView::filterChanged);
|
||||
filterChanged(_filters->currentIndex());
|
||||
|
||||
QStackedWidget *stackedWidget = new QStackedWidget;
|
||||
stackedWidget->addWidget(_treeView);
|
||||
stackedWidget->addWidget(_tableView);
|
||||
|
||||
QPushButton *addButton = new QPushButton(tr("Add"), this);
|
||||
QPushButton *removeButton = new QPushButton(tr("Remove"), this);
|
||||
QPushButton *treeTableButton = new QPushButton(tr("Tree/Table"), this);
|
||||
treeTableButton->setCheckable(true);
|
||||
connect(treeTableButton, &QPushButton::clicked, [stackedWidget](bool checked){
|
||||
stackedWidget->setCurrentIndex(checked ? 1 : 0);
|
||||
});
|
||||
|
||||
hlayout->addWidget(_filters, 1);
|
||||
hlayout->addWidget(addButton);
|
||||
hlayout->addWidget(removeButton);
|
||||
hlayout->addWidget(treeTableButton);
|
||||
|
||||
vlayout->addLayout(hlayout);
|
||||
vlayout->addWidget(_treeView);
|
||||
vlayout->addWidget(stackedWidget);
|
||||
|
||||
connect(_treeView, &QTreeView::activated, [this](const QModelIndex &index){
|
||||
if(!_model->hasChildren(index))
|
||||
@@ -380,27 +508,36 @@ DatabaseTreeView::DatabaseTreeView(Database *database, QWidget *parent) : QWidge
|
||||
DatabaseTreeView::~DatabaseTreeView()
|
||||
{
|
||||
QStringList filters;
|
||||
QStringList aggrFuncs;
|
||||
for(int i = 0; i < _filters->count(); i++)
|
||||
filters.append(_filters->itemText(i));
|
||||
{
|
||||
QStringList data = _filters->itemData(i).toStringList();
|
||||
filters.append(data[0]);
|
||||
aggrFuncs.append(data[1]);
|
||||
}
|
||||
|
||||
QSettings settings;
|
||||
settings.setValue("databasetreeview/filters", filters);
|
||||
settings.setValue("databasetreeview/aggrFuncs", aggrFuncs);
|
||||
settings.setValue("databasetreeview/selectedFilter", _filters->currentIndex());
|
||||
}
|
||||
|
||||
void DatabaseTreeView::addFilter()
|
||||
{
|
||||
QStringList keywords = _database->getFitsKeywords();
|
||||
DatabaseTreeSettings settings(_filters->currentText(), keywords, this);
|
||||
QStringList data = _filters->currentData().toStringList();
|
||||
DatabaseTreeSettings settings(data, keywords, this);
|
||||
int result = settings.exec();
|
||||
if(result == QDialog::Accepted)
|
||||
{
|
||||
QString keywords = settings.keywords();
|
||||
int idx = _filters->findText(keywords);
|
||||
QString aggrFunc = settings.aggregrationFunc();
|
||||
QString text = keywords + " " + aggrFunc;
|
||||
int idx = _filters->findText(text);
|
||||
if(idx == -1)
|
||||
{
|
||||
_filters->addItem(keywords);
|
||||
_filters->setCurrentText(keywords);
|
||||
_filters->addItem(text, QStringList{keywords, aggrFunc});
|
||||
_filters->setCurrentText(text);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -415,14 +552,40 @@ void DatabaseTreeView::removeFilter()
|
||||
_filters->removeItem(_filters->currentIndex());
|
||||
}
|
||||
|
||||
void DatabaseTreeView::filterChanged(const QString &filter)
|
||||
void DatabaseTreeView::filterChanged(int index)
|
||||
{
|
||||
QStringList keys = filter.split('/');
|
||||
QStringList data = _filters->itemData(index).toStringList();
|
||||
QStringList keys = data[0].split('/');
|
||||
_model->setKeys(keys);
|
||||
setQuery(data[1]);
|
||||
}
|
||||
|
||||
void DatabaseTreeView::visible(bool visible)
|
||||
{
|
||||
if(visible)
|
||||
if(visible && !_loaded)
|
||||
{
|
||||
_loaded = true;
|
||||
_model->load();
|
||||
QStringList data = _filters->currentData().toStringList();
|
||||
setQuery(data[1]);
|
||||
}
|
||||
}
|
||||
|
||||
void DatabaseTreeView::setQuery(const QString &func)
|
||||
{
|
||||
QStringList keys = _model->keys();
|
||||
int i = 0;
|
||||
_sqlModel->setQuery(_model->getGroupQuery(func));
|
||||
if(!func.isEmpty())
|
||||
{
|
||||
QString tmp = func + "(" + keys.last() + ")";
|
||||
if(func == "COUNT")
|
||||
keys.append("COUNT");
|
||||
else
|
||||
keys.last() = tmp;
|
||||
}
|
||||
for(auto &key : keys)
|
||||
_sqlModel->setHeaderData(i++, Qt::Horizontal, key);
|
||||
|
||||
_tableView->resizeColumnsToContents();
|
||||
}
|
||||
|
||||
+20
-6
@@ -2,11 +2,13 @@
|
||||
#define DATABASETREE_H
|
||||
|
||||
#include <QAbstractItemModel>
|
||||
#include <QTreeView>
|
||||
#include <QSqlQuery>
|
||||
#include <QFont>
|
||||
#include <QDialog>
|
||||
#include <QComboBox>
|
||||
#include <QDialog>
|
||||
#include <QFont>
|
||||
#include <QSqlQuery>
|
||||
#include <QSqlQueryModel>
|
||||
#include <QTableView>
|
||||
#include <QTreeView>
|
||||
#include <memory>
|
||||
|
||||
class Database;
|
||||
@@ -14,11 +16,16 @@ class TreeNode;
|
||||
|
||||
class DatabaseTreeSettings : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit DatabaseTreeSettings(const QString &filter, const QStringList &keywords, QWidget *parent = nullptr);
|
||||
explicit DatabaseTreeSettings(const QStringList &data, QStringList keywords, QWidget *parent = nullptr);
|
||||
QString keywords() const;
|
||||
QString aggregrationFunc() const;
|
||||
public slots:
|
||||
void acceptButton();
|
||||
private:
|
||||
QVector<QComboBox*> _keywordsSelect;
|
||||
QComboBox *_aggregateFunction;
|
||||
};
|
||||
|
||||
class DatabaseTree : public QAbstractItemModel
|
||||
@@ -26,6 +33,7 @@ class DatabaseTree : public QAbstractItemModel
|
||||
public:
|
||||
explicit DatabaseTree(Database *database, QObject *parent = nullptr);
|
||||
void setKeys(const QStringList &keys);
|
||||
QStringList keys() const;
|
||||
QModelIndex index(int row, int column, const QModelIndex &parent) const override;
|
||||
QModelIndex parent(const QModelIndex &index) const override;
|
||||
int rowCount(const QModelIndex &index) const override;
|
||||
@@ -35,6 +43,7 @@ public:
|
||||
void fetchMore(const QModelIndex &parent) override;
|
||||
QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
|
||||
void load();
|
||||
QSqlQuery getGroupQuery(const QString &aggregateFunc) const;
|
||||
private:
|
||||
void prepareQueries();
|
||||
void fillNode(TreeNode *node);
|
||||
@@ -55,15 +64,20 @@ public:
|
||||
public slots:
|
||||
void addFilter();
|
||||
void removeFilter();
|
||||
void filterChanged(const QString &filter);
|
||||
void filterChanged(int index);
|
||||
void visible(bool visible);
|
||||
private:
|
||||
void setQuery(const QString &func);
|
||||
signals:
|
||||
void loadFile(const QString &file);
|
||||
private:
|
||||
QComboBox *_filters = nullptr;
|
||||
QTreeView *_treeView = nullptr;
|
||||
QTableView *_tableView = nullptr;
|
||||
DatabaseTree *_model = nullptr;
|
||||
QSqlQueryModel *_sqlModel = nullptr;
|
||||
Database *_database = nullptr;
|
||||
bool _loaded = false;
|
||||
};
|
||||
|
||||
#endif // DATABASETREE_H
|
||||
|
||||
+37
-2
@@ -239,7 +239,8 @@ void FITSFileModel::prepareQuery()
|
||||
|
||||
if(!query.exec())
|
||||
qWarning() << "Failed to exectute query" << query.lastQuery() << bindValuesJoin << bindValues;
|
||||
setQuery(std::move(query));
|
||||
else
|
||||
setQuery(std::move(query));
|
||||
|
||||
setHeaderData(0, Qt::Horizontal, tr("File name"));
|
||||
i = 1;
|
||||
@@ -255,7 +256,7 @@ void FITSFileModel::prepareQuery()
|
||||
m_markedFiles = QSet<QString>(list.begin(), list.end());
|
||||
}
|
||||
|
||||
DatabaseTableView::DatabaseTableView(QWidget *parent) : QTableView(parent)
|
||||
DatabaseTableView::DatabaseTableView(QWidget *parent) : CopyTableView(parent)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -498,3 +499,37 @@ void DataBaseView::visible(bool visible)
|
||||
{
|
||||
if(visible)m_model->load();
|
||||
}
|
||||
|
||||
CopyTableView::CopyTableView(QWidget *parent) : QTableView(parent)
|
||||
{
|
||||
}
|
||||
|
||||
void CopyTableView::keyPressEvent(QKeyEvent *event)
|
||||
{
|
||||
if(event->matches(QKeySequence::Copy))
|
||||
{
|
||||
QModelIndexList list = selectedIndexes();
|
||||
QString table;
|
||||
if(list.size() == 0)return;
|
||||
|
||||
int row = list.first().row();
|
||||
int col = list.first().column();
|
||||
for(auto &index : list)
|
||||
{
|
||||
if(row != index.row())
|
||||
table.append('\n');
|
||||
else if(col != index.column())
|
||||
table.append('\t');
|
||||
|
||||
table.append(index.data().toString());
|
||||
row = index.row();
|
||||
col = index.column();
|
||||
}
|
||||
qApp->clipboard()->setText(table);
|
||||
event->accept();
|
||||
}
|
||||
else
|
||||
{
|
||||
QTableView::keyPressEvent(event);
|
||||
}
|
||||
}
|
||||
|
||||
+9
-1
@@ -44,7 +44,15 @@ protected:
|
||||
void prepareQuery();
|
||||
};
|
||||
|
||||
class DatabaseTableView : public QTableView
|
||||
class CopyTableView : public QTableView
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit CopyTableView(QWidget *parent = nullptr);
|
||||
void keyPressEvent(QKeyEvent *event);
|
||||
};
|
||||
|
||||
class DatabaseTableView : public CopyTableView
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
||||
+10
-6
@@ -345,18 +345,22 @@ Download::Download(QNetworkReply *reply, const QString indexPath, QObject *paren
|
||||
filename.remove(QRegularExpression("\\.zst$"));
|
||||
|
||||
_fw.setFileName(indexPath + "/" + filename);
|
||||
_fw.open(QIODevice::WriteOnly | QIODevice::Truncate);
|
||||
if(_fw.isOpen())
|
||||
if(_fw.open(QIODevice::WriteOnly | QIODevice::Truncate))
|
||||
{
|
||||
qDebug() << "open file" << _fw.fileName();
|
||||
_dstream = ZSTD_createDStream();
|
||||
}
|
||||
else
|
||||
{
|
||||
qWarning() << "Failed to open file" << _fw.fileName();
|
||||
abort();
|
||||
}
|
||||
|
||||
_dstream = ZSTD_createDStream();
|
||||
}
|
||||
|
||||
Download::~Download()
|
||||
{
|
||||
ZSTD_freeDStream(_dstream);
|
||||
if(_dstream)
|
||||
ZSTD_freeDStream(_dstream);
|
||||
}
|
||||
|
||||
void Download::abort()
|
||||
@@ -402,7 +406,7 @@ void Download::finished()
|
||||
|
||||
void Download::decompress(QByteArray &data)
|
||||
{
|
||||
if(data.isEmpty())return;
|
||||
if(data.isEmpty() || _dstream == nullptr)return;
|
||||
|
||||
_hash.addData(data);
|
||||
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
class Download : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
QNetworkReply *_reply;
|
||||
ZSTD_DStream *_dstream;
|
||||
QNetworkReply *_reply = nullptr;
|
||||
ZSTD_DStream *_dstream = nullptr;
|
||||
QFile _fw;
|
||||
QCryptographicHash _hash;
|
||||
public:
|
||||
|
||||
+6
-6
@@ -154,7 +154,7 @@ void ImageWidgetGL::setImage(std::shared_ptr<RawImage> image, int index)
|
||||
m_image->bind();
|
||||
f->glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
|
||||
f->glGenerateMipmap(GL_TEXTURE_2D);
|
||||
qDebug() << "setImage" << timer.elapsed();
|
||||
qDebug() << "ImageWidgetGL::setImage" << timer.elapsed() << "ms";
|
||||
m_swPaint = f->glGetError() != GL_NO_ERROR;
|
||||
}
|
||||
|
||||
@@ -721,19 +721,19 @@ void ImageWidgetGL::initializeGL()
|
||||
logger->startLogging();
|
||||
connect(logger, &QOpenGLDebugLogger::messageLogged, [](const QOpenGLDebugMessage &message)
|
||||
{
|
||||
qDebug() << message;
|
||||
qDebug() << "OpenGL debug" << message;
|
||||
});
|
||||
|
||||
qDebug() << "Vendor:" << (char*)f->glGetString(GL_VENDOR);
|
||||
qDebug() << "Renderer:" << (char*)f->glGetString(GL_RENDERER);
|
||||
qDebug() << "Version:" << (char*)f->glGetString(GL_VERSION);
|
||||
qDebug() << "OpenGL Vendor:" << (char*)f->glGetString(GL_VENDOR);
|
||||
qDebug() << "OpenGL Renderer:" << (char*)f->glGetString(GL_RENDERER);
|
||||
qDebug() << "OpenGL Version:" << (char*)f->glGetString(GL_VERSION);
|
||||
f->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &m_maxTextureSize);
|
||||
f->glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &m_maxArrayLayers);
|
||||
qDebug() << "Max texture size:" << m_maxTextureSize << "max layers:" << m_maxArrayLayers;
|
||||
|
||||
//MANUAL_MIPMAP_GEN = QString((const char*)f->glGetString(GL_VENDOR)).startsWith("ATI Technologies Inc", Qt::CaseInsensitive);
|
||||
|
||||
qDebug() << context()->format();
|
||||
qDebug() << "OpenGL context format" << context()->format();
|
||||
|
||||
// each vertex is x,y 2D position and s,t texture coordinates
|
||||
float vertexs[] = {-1.0f, -1.0f, 0.0f, 1.0f,
|
||||
|
||||
+7
-7
@@ -95,7 +95,7 @@ bool loadFITS(const QString path, ImageInfoData &info, std::shared_ptr<RawImage>
|
||||
char err[100];
|
||||
fits_get_errstatus(status, err);
|
||||
info.info.append({QObject::tr("Error"), QString(err)});
|
||||
qDebug() << "Failed to load FITS file" << err;
|
||||
qWarning() << "Failed to load FITS file" << err;
|
||||
return false;
|
||||
};
|
||||
|
||||
@@ -335,7 +335,7 @@ bool loadXISF(const QString &path, ImageInfoData &info, std::shared_ptr<RawImage
|
||||
catch (LibXISF::Error &err)
|
||||
{
|
||||
info.info.append(QPair<QString, QString>("Error", err.what()));
|
||||
qDebug() << "Failed to load XISF" << err.what();
|
||||
qWarning() << "Failed to load XISF" << err.what();
|
||||
return false;
|
||||
}
|
||||
info.info.append({QObject::tr("Error"), QObject::tr("Unsupported sample format")});
|
||||
@@ -382,7 +382,7 @@ bool readXISFHeader(const QString &path, ImageInfoData &info)
|
||||
}
|
||||
catch (LibXISF::Error &err)
|
||||
{
|
||||
qDebug() << err.what();
|
||||
qWarning() << "LibXISF error" << err.what();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -455,17 +455,17 @@ bool loadImage(const QString &path, ImageInfoData &info, std::shared_ptr<RawImag
|
||||
if(path.endsWith(".CR2", Qt::CaseInsensitive) || path.endsWith(".CR3", Qt::CaseInsensitive) || path.endsWith(".NEF", Qt::CaseInsensitive) || path.endsWith(".DNG", Qt::CaseInsensitive))
|
||||
{
|
||||
ret = loadRAW(path, info, rawImage);
|
||||
qDebug() << "LoadRAW" << timer.elapsed();
|
||||
qDebug() << "LoadRAW" << timer.elapsed() << "ms";
|
||||
}
|
||||
else if(isFITS(fileInfo.suffix()))
|
||||
{
|
||||
ret = loadFITS(path, info, rawImage, planar, index);
|
||||
qDebug() << "LoadFITS" << timer.elapsed();
|
||||
qDebug() << "LoadFITS" << timer.elapsed() << "ms";
|
||||
}
|
||||
else if(isXISF(fileInfo.suffix()))
|
||||
{
|
||||
ret = loadXISF(path, info, rawImage, planar, index);
|
||||
qDebug() << "LoadXISF" << timer.elapsed();
|
||||
qDebug() << "LoadXISF" << timer.elapsed() << "ms";
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -481,7 +481,7 @@ bool loadImage(const QString &path, ImageInfoData &info, std::shared_ptr<RawImag
|
||||
exif_data_free(exif);
|
||||
}
|
||||
rawImage = std::make_shared<RawImage>(img);
|
||||
qDebug() << "LoadQImage" << timer.elapsed();
|
||||
qDebug() << "LoadQImage" << timer.elapsed() << "ms";
|
||||
ret = !img.isNull();
|
||||
}
|
||||
return ret;
|
||||
|
||||
+1
-1
@@ -835,7 +835,7 @@ void MainWindow::checkNewVersion()
|
||||
if(QMessageBox::question(this, tr("Update check"), tr("New version %1 is available. Do you want to download it now?").arg(tag)) == QMessageBox::Yes)
|
||||
{
|
||||
QUrl url(json.object().value("html_url").toString());
|
||||
qDebug() << url;
|
||||
qDebug() << "Opening url" << url;
|
||||
if(url.host() == "gitea.nouspiro.space")
|
||||
QDesktopServices::openUrl(url);
|
||||
}
|
||||
|
||||
Binary file not shown.
+33
-14
@@ -174,17 +174,17 @@
|
||||
<context>
|
||||
<name>DataBaseView</name>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="327"/>
|
||||
<location filename="../src/databaseview.cpp" line="328"/>
|
||||
<source>Select columns</source>
|
||||
<translation>Select columns</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="378"/>
|
||||
<location filename="../src/databaseview.cpp" line="379"/>
|
||||
<source>Text to search, you can % as wildcard</source>
|
||||
<translation>Text to search, you can % as wildcard</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="394"/>
|
||||
<location filename="../src/databaseview.cpp" line="395"/>
|
||||
<source>Filter</source>
|
||||
<translation>Filter</translation>
|
||||
</message>
|
||||
@@ -192,27 +192,27 @@
|
||||
<context>
|
||||
<name>DatabaseTableView</name>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="265"/>
|
||||
<location filename="../src/databaseview.cpp" line="266"/>
|
||||
<source>Mark</source>
|
||||
<translation>Mark</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="266"/>
|
||||
<location filename="../src/databaseview.cpp" line="267"/>
|
||||
<source>Unmark</source>
|
||||
<translation>Unmark</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="267"/>
|
||||
<location filename="../src/databaseview.cpp" line="268"/>
|
||||
<source>Open</source>
|
||||
<translation>Open</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="268"/>
|
||||
<location filename="../src/databaseview.cpp" line="269"/>
|
||||
<source>Open file location</source>
|
||||
<translation>Open file location</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="269"/>
|
||||
<location filename="../src/databaseview.cpp" line="270"/>
|
||||
<source>Copy files</source>
|
||||
<translation>Copy files</translation>
|
||||
</message>
|
||||
@@ -220,23 +220,42 @@
|
||||
<context>
|
||||
<name>DatabaseTreeSettings</name>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="13"/>
|
||||
<source>Add tree filter</source>
|
||||
<translation>Add tree filter</translation>
|
||||
<translation type="vanished">Add tree filter</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="16"/>
|
||||
<source>Add tree grouping</source>
|
||||
<translation>Add tree grouping</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="41"/>
|
||||
<source>Aggregate function</source>
|
||||
<translation>Aggregate function</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="45"/>
|
||||
<source>This aggregate function will be applied to last level of grouping</source>
|
||||
<translation>This aggregate function will be applied to last level of grouping</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DatabaseTreeView</name>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="358"/>
|
||||
<location filename="../src/databasetree.cpp" line="480"/>
|
||||
<source>Add</source>
|
||||
<translation>Add</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="359"/>
|
||||
<location filename="../src/databasetree.cpp" line="481"/>
|
||||
<source>Remove</source>
|
||||
<translation>Remove</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="482"/>
|
||||
<source>Tree/Table</source>
|
||||
<translation>Tree/Table</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Dialog</name>
|
||||
@@ -249,7 +268,7 @@
|
||||
<context>
|
||||
<name>FITSFileModel</name>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="244"/>
|
||||
<location filename="../src/databaseview.cpp" line="245"/>
|
||||
<source>File name</source>
|
||||
<translation>File name</translation>
|
||||
</message>
|
||||
@@ -431,7 +450,7 @@
|
||||
<context>
|
||||
<name>HelpDialog</name>
|
||||
<message>
|
||||
<location filename="../src/about.cpp" line="33"/>
|
||||
<location filename="../src/about.cpp" line="35"/>
|
||||
<source>Help</source>
|
||||
<translation>Help</translation>
|
||||
</message>
|
||||
|
||||
Binary file not shown.
+29
-14
@@ -174,17 +174,17 @@
|
||||
<context>
|
||||
<name>DataBaseView</name>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="327"/>
|
||||
<location filename="../src/databaseview.cpp" line="328"/>
|
||||
<source>Select columns</source>
|
||||
<translation>Choix des colonnes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="378"/>
|
||||
<location filename="../src/databaseview.cpp" line="379"/>
|
||||
<source>Text to search, you can % as wildcard</source>
|
||||
<translation>Texte à chercher, utilisez % comme caractère générique</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="394"/>
|
||||
<location filename="../src/databaseview.cpp" line="395"/>
|
||||
<source>Filter</source>
|
||||
<translation>Filtre</translation>
|
||||
</message>
|
||||
@@ -192,27 +192,27 @@
|
||||
<context>
|
||||
<name>DatabaseTableView</name>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="265"/>
|
||||
<location filename="../src/databaseview.cpp" line="266"/>
|
||||
<source>Mark</source>
|
||||
<translation>Marquer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="266"/>
|
||||
<location filename="../src/databaseview.cpp" line="267"/>
|
||||
<source>Unmark</source>
|
||||
<translation>Décocher</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="267"/>
|
||||
<location filename="../src/databaseview.cpp" line="268"/>
|
||||
<source>Open</source>
|
||||
<translation type="unfinished">Ouvrir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="268"/>
|
||||
<location filename="../src/databaseview.cpp" line="269"/>
|
||||
<source>Open file location</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="269"/>
|
||||
<location filename="../src/databaseview.cpp" line="270"/>
|
||||
<source>Copy files</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -220,23 +220,38 @@
|
||||
<context>
|
||||
<name>DatabaseTreeSettings</name>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="13"/>
|
||||
<source>Add tree filter</source>
|
||||
<location filename="../src/databasetree.cpp" line="16"/>
|
||||
<source>Add tree grouping</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="41"/>
|
||||
<source>Aggregate function</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="45"/>
|
||||
<source>This aggregate function will be applied to last level of grouping</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DatabaseTreeView</name>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="358"/>
|
||||
<location filename="../src/databasetree.cpp" line="480"/>
|
||||
<source>Add</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="359"/>
|
||||
<location filename="../src/databasetree.cpp" line="481"/>
|
||||
<source>Remove</source>
|
||||
<translation type="unfinished">Supprimer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="482"/>
|
||||
<source>Tree/Table</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Dialog</name>
|
||||
@@ -249,7 +264,7 @@
|
||||
<context>
|
||||
<name>FITSFileModel</name>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="244"/>
|
||||
<location filename="../src/databaseview.cpp" line="245"/>
|
||||
<source>File name</source>
|
||||
<translation>Nom de fichier</translation>
|
||||
</message>
|
||||
@@ -431,7 +446,7 @@
|
||||
<context>
|
||||
<name>HelpDialog</name>
|
||||
<message>
|
||||
<location filename="../src/about.cpp" line="33"/>
|
||||
<location filename="../src/about.cpp" line="35"/>
|
||||
<source>Help</source>
|
||||
<translation>Aide</translation>
|
||||
</message>
|
||||
|
||||
Binary file not shown.
@@ -175,17 +175,17 @@
|
||||
<context>
|
||||
<name>DataBaseView</name>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="327"/>
|
||||
<location filename="../src/databaseview.cpp" line="328"/>
|
||||
<source>Select columns</source>
|
||||
<translation>Selecionar colunas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="378"/>
|
||||
<location filename="../src/databaseview.cpp" line="379"/>
|
||||
<source>Text to search, you can % as wildcard</source>
|
||||
<translation>Texto a ser pesquisado, você pode % como curinga</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="394"/>
|
||||
<location filename="../src/databaseview.cpp" line="395"/>
|
||||
<source>Filter</source>
|
||||
<translation>Filtro</translation>
|
||||
</message>
|
||||
@@ -193,27 +193,27 @@
|
||||
<context>
|
||||
<name>DatabaseTableView</name>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="265"/>
|
||||
<location filename="../src/databaseview.cpp" line="266"/>
|
||||
<source>Mark</source>
|
||||
<translation>Assinalar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="266"/>
|
||||
<location filename="../src/databaseview.cpp" line="267"/>
|
||||
<source>Unmark</source>
|
||||
<translation>Desmarcar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="267"/>
|
||||
<location filename="../src/databaseview.cpp" line="268"/>
|
||||
<source>Open</source>
|
||||
<translation type="unfinished">Abrir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="268"/>
|
||||
<location filename="../src/databaseview.cpp" line="269"/>
|
||||
<source>Open file location</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="269"/>
|
||||
<location filename="../src/databaseview.cpp" line="270"/>
|
||||
<source>Copy files</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -221,23 +221,38 @@
|
||||
<context>
|
||||
<name>DatabaseTreeSettings</name>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="13"/>
|
||||
<source>Add tree filter</source>
|
||||
<location filename="../src/databasetree.cpp" line="16"/>
|
||||
<source>Add tree grouping</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="41"/>
|
||||
<source>Aggregate function</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="45"/>
|
||||
<source>This aggregate function will be applied to last level of grouping</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DatabaseTreeView</name>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="358"/>
|
||||
<location filename="../src/databasetree.cpp" line="480"/>
|
||||
<source>Add</source>
|
||||
<translation type="unfinished">Add</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="359"/>
|
||||
<location filename="../src/databasetree.cpp" line="481"/>
|
||||
<source>Remove</source>
|
||||
<translation type="unfinished">Retirar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="482"/>
|
||||
<source>Tree/Table</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Dialog</name>
|
||||
@@ -250,7 +265,7 @@
|
||||
<context>
|
||||
<name>FITSFileModel</name>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="244"/>
|
||||
<location filename="../src/databaseview.cpp" line="245"/>
|
||||
<source>File name</source>
|
||||
<translation>Nome do arquivo</translation>
|
||||
</message>
|
||||
@@ -265,7 +280,7 @@
|
||||
<message>
|
||||
<location filename="../src/fitskeyword.ui" line="41"/>
|
||||
<source>Add</source>
|
||||
<translation type="unfinished">Add</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/fitskeyword.ui" line="48"/>
|
||||
@@ -432,7 +447,7 @@
|
||||
<context>
|
||||
<name>HelpDialog</name>
|
||||
<message>
|
||||
<location filename="../src/about.cpp" line="33"/>
|
||||
<location filename="../src/about.cpp" line="35"/>
|
||||
<source>Help</source>
|
||||
<translation>Ajuda</translation>
|
||||
</message>
|
||||
|
||||
Binary file not shown.
+33
-14
@@ -174,17 +174,17 @@
|
||||
<context>
|
||||
<name>DataBaseView</name>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="327"/>
|
||||
<location filename="../src/databaseview.cpp" line="328"/>
|
||||
<source>Select columns</source>
|
||||
<translation>Vyber stĺpce</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="378"/>
|
||||
<location filename="../src/databaseview.cpp" line="379"/>
|
||||
<source>Text to search, you can % as wildcard</source>
|
||||
<translation>Text na vyhľadanie, môžete použit % ako zástupný znak</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="394"/>
|
||||
<location filename="../src/databaseview.cpp" line="395"/>
|
||||
<source>Filter</source>
|
||||
<translatorcomment>Meno súboru</translatorcomment>
|
||||
<translation>Filter</translation>
|
||||
@@ -193,27 +193,27 @@
|
||||
<context>
|
||||
<name>DatabaseTableView</name>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="265"/>
|
||||
<location filename="../src/databaseview.cpp" line="266"/>
|
||||
<source>Mark</source>
|
||||
<translation>Označiť</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="266"/>
|
||||
<location filename="../src/databaseview.cpp" line="267"/>
|
||||
<source>Unmark</source>
|
||||
<translation>Odznačiť</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="267"/>
|
||||
<location filename="../src/databaseview.cpp" line="268"/>
|
||||
<source>Open</source>
|
||||
<translation>Otvoriť</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="268"/>
|
||||
<location filename="../src/databaseview.cpp" line="269"/>
|
||||
<source>Open file location</source>
|
||||
<translation>Otvoriť umiestnenie súboru</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="269"/>
|
||||
<location filename="../src/databaseview.cpp" line="270"/>
|
||||
<source>Copy files</source>
|
||||
<translation>Skopírovať súbory</translation>
|
||||
</message>
|
||||
@@ -221,23 +221,42 @@
|
||||
<context>
|
||||
<name>DatabaseTreeSettings</name>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="13"/>
|
||||
<source>Add tree filter</source>
|
||||
<translation>Pridať stromový filter</translation>
|
||||
<translation type="vanished">Pridať stromový filter</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="16"/>
|
||||
<source>Add tree grouping</source>
|
||||
<translation>Pridaj stromové zoskupovanie</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="41"/>
|
||||
<source>Aggregate function</source>
|
||||
<translation>Agregačná funkcia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="45"/>
|
||||
<source>This aggregate function will be applied to last level of grouping</source>
|
||||
<translation>Táto agregáčná funkcia bude použitá na poslednú úroveň zoskupovania</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DatabaseTreeView</name>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="358"/>
|
||||
<location filename="../src/databasetree.cpp" line="480"/>
|
||||
<source>Add</source>
|
||||
<translation>Pridať</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="359"/>
|
||||
<location filename="../src/databasetree.cpp" line="481"/>
|
||||
<source>Remove</source>
|
||||
<translation>Odstrániť</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/databasetree.cpp" line="482"/>
|
||||
<source>Tree/Table</source>
|
||||
<translation>Strom/Tabuľka</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Dialog</name>
|
||||
@@ -250,7 +269,7 @@
|
||||
<context>
|
||||
<name>FITSFileModel</name>
|
||||
<message>
|
||||
<location filename="../src/databaseview.cpp" line="244"/>
|
||||
<location filename="../src/databaseview.cpp" line="245"/>
|
||||
<source>File name</source>
|
||||
<translation>Meno súboru</translation>
|
||||
</message>
|
||||
@@ -432,7 +451,7 @@
|
||||
<context>
|
||||
<name>HelpDialog</name>
|
||||
<message>
|
||||
<location filename="../src/about.cpp" line="33"/>
|
||||
<location filename="../src/about.cpp" line="35"/>
|
||||
<source>Help</source>
|
||||
<translation>Pomoc</translation>
|
||||
</message>
|
||||
|
||||
Reference in New Issue
Block a user