Add running script as CLI option

This commit is contained in:
2026-04-08 19:37:21 +02:00
parent 3818fd4625
commit 65fca14ac2
7 changed files with 172 additions and 6 deletions
+51 -4
View File
@@ -18,7 +18,6 @@
#include "chartgraph.h"
#ifdef Q_OS_LINUX
#include <QCloseEvent>
#include <QDBusConnection>
#include <QDBusMessage>
#endif
@@ -99,12 +98,12 @@ BatchProcessing::BatchProcessing(Database *database, QWidget *parent) : QDialog(
qWarning() << "Failed to get app data location";
}
connect(_ui->addFilesButton, &QPushButton::released, this, &BatchProcessing::addFiles);
connect(_ui->addDirButton, &QPushButton::released, this, &BatchProcessing::addDir);
connect(_ui->addFilesButton, &QPushButton::released, this, static_cast<void (BatchProcessing::*)()>(&BatchProcessing::addFiles));
connect(_ui->addDirButton, &QPushButton::released, this, static_cast<void (BatchProcessing::*)()>(&BatchProcessing::addDir));
connect(_ui->addMarkedButton, &QPushButton::released, this, &BatchProcessing::addMarked);
connect(_ui->removeButton, &QPushButton::released, this, &BatchProcessing::removePath);
connect(_ui->removeAllButton, &QPushButton::released, this, &BatchProcessing::removeAllPaths);
connect(_ui->startButton, &QPushButton::released, this, &BatchProcessing::runScript);
connect(_ui->startButton, &QPushButton::released, this, static_cast<void (BatchProcessing::*)()>(&BatchProcessing::runScript));
connect(_ui->stopButton, &QPushButton::released, this, &BatchProcessing::stopScript);
connect(_ui->browseButton, &QPushButton::released, this, &BatchProcessing::browse);
connect(_ui->openScriptsButton, &QPushButton::released, this, &BatchProcessing::openScriptDir);
@@ -148,6 +147,17 @@ BatchProcessing::~BatchProcessing()
delete _ui;
}
void BatchProcessing::setOutputDir(const QString &output)
{
_ui->outputPath->setText(output);
}
void BatchProcessing::setPaths(const QStringList &paths)
{
_ui->pathsList->addItems(paths);
refreshPaths();
}
void BatchProcessing::closeEvent(QCloseEvent *event)
{
if(_engineThread)
@@ -266,6 +276,35 @@ void BatchProcessing::runScript()
else
{
QMessageBox::warning(this, tr("Invalid output directory"), tr("Output directory path doesn't exist or is not writable"));
delete _engineThread;
_engineThread = nullptr;
}
}
}
void BatchProcessing::runScript(const QString &script, bool exit)
{
_ui->log->clear();
{
_engineThread = new Script::ScriptEngineThread(_database, this);
connect(_engineThread, &Script::ScriptEngineThread::newMessage, this, &BatchProcessing::newMessage);
connect(_engineThread, &Script::ScriptEngineThread::newMessage, this, &BatchProcessing::newMessageCli);
connect(_engineThread, &Script::ScriptEngineThread::finished, this, &BatchProcessing::scriptFinished);
if(exit)connect(_engineThread, &Script::ScriptEngineThread::finished, this, &BatchProcessing::accept);
QFileInfo outDir(_ui->outputPath->text());
if(outDir.exists() && outDir.isWritable())
{
_engineThread->setParams(script, _paths, _ui->outputPath->text());
_engineThread->start();
_ui->startButton->setEnabled(false);
_ui->stopButton->setEnabled(true);
}
else
{
QMessageBox::warning(this, tr("Invalid output directory"), tr("Output directory path doesn't exist or is not writable"));
delete _engineThread;
_engineThread = nullptr;
}
}
}
@@ -293,6 +332,14 @@ void BatchProcessing::newMessage(const QString &message, bool error)
_ui->log->append(message);
}
void BatchProcessing::newMessageCli(const QString &message, bool error)
{
if(error)
qWarning() << message;
else
qDebug() << message;
}
QJSValue BatchProcessing::getString(const QString &label, const QString &text)
{
bool ok = false;
+4
View File
@@ -30,6 +30,8 @@ private slots:
public:
explicit BatchProcessing(Database *database, QWidget *parent = nullptr);
~BatchProcessing();
void setOutputDir(const QString &output);
void setPaths(const QStringList &paths);
protected:
void closeEvent(QCloseEvent *event);
void refreshPaths();
@@ -42,9 +44,11 @@ public slots:
void browse();
void openScriptDir();
void runScript();
void runScript(const QString &script, bool exit);
void stopScript();
void scriptFinished();
void newMessage(const QString &message, bool error);
void newMessageCli(const QString &message, bool error);
QJSValue getString(const QString &label, const QString &text);
QJSValue getInt(const QString &label, int value);
+17 -2
View File
@@ -35,7 +35,10 @@ int main(int argc, char *argv[])
cmd.addOption({"gles", "Use OpenGL ES. This is default on ARM platform."});
cmd.addOption({{"thumb", "thumbnail"}, "Generate thumbnail and save it to path.", "path"});
cmd.addOption({{"s", "size"}, "Size of the thumbnails in pixels (default: 128)", "size", "128"});
cmd.addPositionalArgument("file", "File to open");
cmd.addPositionalArgument("file", "Files or paths to open");
cmd.addOption({"script", "Execute script", "script"});
cmd.addOption({"outdir", "Output dir for script (default: CWD)", "dir", "."});
cmd.addOption({"noexit", "Do not exit application when script finish"});
cmd.addHelpOption();
QStringList cmdArgs;
for(int i = 0; i < argc; i++)
@@ -107,7 +110,7 @@ int main(int argc, char *argv[])
MainWindow w;
w.show();
if(!cmd.positionalArguments().isEmpty())
if(!cmd.positionalArguments().isEmpty() && !cmd.isSet("script"))
{
QStringList files = cmd.positionalArguments();
QStringList paths;
@@ -124,5 +127,17 @@ int main(int argc, char *argv[])
w.loadFiles(paths);
}
if(cmd.isSet("script"))
{
QStringList paths = cmd.positionalArguments();
QString script = cmd.value("script");
QString outdir = cmd.value("outdir");
if(!QDir::isAbsolutePath(script))script = QDir::currentPath() + "/" + script;
if(!QDir::isAbsolutePath(outdir))outdir = QDir::currentPath() + "/" + outdir;
bool noexit = cmd.isSet("noexit");
if(!noexit)w.hide();
w.runScript(script, outdir, paths, !noexit);
}
return a.exec();
}
+15
View File
@@ -23,6 +23,7 @@
#include <QDesktopServices>
#include <QJsonDocument>
#include <QNetworkReply>
#include <QTimer>
#include "loadrunable.h"
#include "markedfiles.h"
#include "about.h"
@@ -847,6 +848,20 @@ void MainWindow::openFileManager()
#endif
}
void MainWindow::runScript(const QString &script, const QString &outdir, const QStringList &paths, bool exit)
{
BatchProcessing *batchProcessing = new BatchProcessing(m_database, this);
batchProcessing->setOutputDir(outdir);
batchProcessing->setPaths(paths);
if(exit)batchProcessing->hide();
QTimer::singleShot(500, [batchProcessing, script, exit](){
batchProcessing->runScript(script, exit);
batchProcessing->exec();
delete batchProcessing;
if(exit)QCoreApplication::exit();
});
}
void MainWindow::updateWindowTitle()
{
ImagePtr ptr = m_ringList->currentImage();