From dc2a781d3bf275841734c88a320e051c8f048c6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Sun, 4 Feb 2024 00:11:14 +0100 Subject: [PATCH] Add calculating stats with script --- batchprocessing.cpp | 39 +++++++++++++++++++++------------------ mainwindow.cpp | 4 ++-- scriptengine.cpp | 31 +++++++++++++++++++++++++++++++ scriptengine.h | 3 +++ 4 files changed, 57 insertions(+), 20 deletions(-) diff --git a/batchprocessing.cpp b/batchprocessing.cpp index fad976b..5d98cc9 100644 --- a/batchprocessing.cpp +++ b/batchprocessing.cpp @@ -1,5 +1,6 @@ #include "batchprocessing.h" #include "ui_batchprocessing.h" +#include #include #include #include @@ -16,28 +17,30 @@ #include #endif -void scanDirectory(const QString &path, QStringList &files) -{ - QFileInfo info(path); - if(info.isDir()) - { - QDir dir(path); - QStringList entries = dir.entryList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); - for(QString &entry : entries) - scanDirectory(dir.absoluteFilePath(entry), files); - } - else if(info.isFile()) - { - files.append(path); - } -} - QStringList scanDirectories(const QStringList &paths) { QStringList files; + QStringList scannedDirs; + + std::function scanDirectory = [&](const QString &path) + { + QFileInfo info(path); + if(info.isDir() && !scannedDirs.contains(info.canonicalPath())) + { + scannedDirs.append(info.canonicalPath()); + QDir dir(path); + QStringList entries = dir.entryList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); + for(QString &entry : entries) + scanDirectory(dir.absoluteFilePath(entry)); + } + else if(info.isFile()) + { + files.append(path); + } + }; for(const QString &path : paths) - scanDirectory(path, files); + scanDirectory(path); return files; } @@ -205,7 +208,7 @@ void BatchProcessing::scriptFinished() _ui->startButton->setEnabled(true); _ui->stopButton->setEnabled(false); qDebug() << "script finished"; - delete _engineThread; + _engineThread->deleteLater(); _engineThread = nullptr; } diff --git a/mainwindow.cpp b/mainwindow.cpp index 099c04c..492a44a 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -154,11 +154,11 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) fileMenu->addAction(tr("Index directory"), this, SLOT(indexDir())); fileMenu->addAction(tr("Reindex files"), this, SLOT(reindex())); fileMenu->addAction(tr("Export database to CSV"), this, &MainWindow::exportCSV); - /*fileMenu->addAction(tr("Batch processing"), [this](){ + fileMenu->addAction(tr("Batch processing"), [this](){ BatchProcessing *batchProcessing = new BatchProcessing(this); batchProcessing->exec(); delete batchProcessing; - }, Qt::Key_B | Qt::CTRL);*/ + }, Qt::Key_B | Qt::CTRL); fileMenu->addSeparator(); QAction *liveModeAction = fileMenu->addAction(tr("Live mode"), this, SLOT(liveMode(bool))); liveModeAction->setCheckable(true); diff --git a/scriptengine.cpp b/scriptengine.cpp index aa8ce80..53eb359 100644 --- a/scriptengine.cpp +++ b/scriptengine.cpp @@ -3,6 +3,7 @@ #include #include #include "loadrunable.h" +#include "rawimage.h" namespace Script { @@ -63,6 +64,11 @@ bool ScriptEngine::isMarked(const File *file) const return _database->isMarked(file->absoluteFilePath()); } +QJSValue ScriptEngine::newObject() +{ + return _jsEngine->newObject(); +} + void ScriptEngine::run() { QJSValue jsPaths = _jsEngine->newArray(_paths.size()); @@ -73,7 +79,11 @@ void ScriptEngine::run() QFile scriptFile(_scriptPath); if(!scriptFile.open(QIODevice::ReadOnly)) + { + emit newMessage("Failed to open " + _scriptPath, true); + emit finished(); return; + } QTextStream stream(&scriptFile); QString contents = stream.readAll(); @@ -226,6 +236,26 @@ bool File::convertTo(const QString &format) return false; } +QJSValue File::stats() +{ + if(_stats.isUndefined()) + { + ImageInfoData info; + std::shared_ptr rawImage; + loadImage(_path, info, rawImage); + rawImage->calcStats(); + RawImage::Stats stats = rawImage->imageStats(); + _stats = _engine->newObject(); + _stats.setProperty("mean", stats.m_mean[0]); + _stats.setProperty("stddev", stats.m_stdDev[0]); + _stats.setProperty("median", stats.m_median[0]); + _stats.setProperty("min", stats.m_min[0]); + _stats.setProperty("max", stats.m_max[0]); + _stats.setProperty("mad", stats.m_mean[0]); + } + return _stats; +} + ScriptEngineThread::ScriptEngineThread(QObject *parent) : QObject(parent) { _thread = new QThread(); @@ -236,6 +266,7 @@ ScriptEngineThread::ScriptEngineThread(QObject *parent) : QObject(parent) connect(_engine, &ScriptEngine::newMessage, this, &ScriptEngineThread::newMessage); connect(_thread, &QThread::started, _engine, &ScriptEngine::run); connect(_thread, &QThread::finished, _engine, &ScriptEngine::deleteLater); + connect(_engine, &ScriptEngine::destroyed, [this](){ _engine = nullptr; }); connect(_thread, &QThread::finished, _thread, &QThread::deleteLater); connect(_thread, &QThread::finished, this, &ScriptEngineThread::finished); } diff --git a/scriptengine.h b/scriptengine.h index b823406..c366e9d 100644 --- a/scriptengine.h +++ b/scriptengine.h @@ -31,6 +31,7 @@ public: Q_INVOKABLE void mark(File *file); Q_INVOKABLE void unmark(File *file); Q_INVOKABLE bool isMarked(const File *file) const; + QJSValue newObject(); public slots: void run(); signals: @@ -64,6 +65,7 @@ class File : public QObject QMap _fitsKeywords; void loadFitsKeywords(); bool mkpath(const QString &path) const; + QJSValue _stats; public: explicit File(const QString &path, ScriptEngine *engine); Q_INVOKABLE QString fileName() const; @@ -79,6 +81,7 @@ public: Q_INVOKABLE bool copy(const QString &newpath) const; Q_INVOKABLE bool move(const QString &newpath) const; Q_INVOKABLE bool convertTo(const QString &format); + Q_INVOKABLE QJSValue stats(); }; }