aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorConfuSomu2023-06-10 18:53:35 -0400
committerConfuSomu2023-06-10 18:59:30 -0400
commit7e4c7905c9e74d76de2e03413af0dc9e4cb84683 (patch)
treeca0de8ab135ecc9af006664b5f505c0e2415de5a /src
parentd3d14e07c202f9350f817802777720ded85e4248 (diff)
downloadActorViewer-7e4c7905c9e74d76de2e03413af0dc9e4cb84683.tar
ActorViewer-7e4c7905c9e74d76de2e03413af0dc9e4cb84683.tar.gz
ActorViewer-7e4c7905c9e74d76de2e03413af0dc9e4cb84683.zip
Implement command line options
Implementing a command line argument specifying the data export to open allows iterating faster as the file to open can be specified without navigating through a GUI. In the future, more command line options could be specified to specify the view filters for instance.
Diffstat (limited to 'src')
-rw-r--r--src/command_line.cpp28
-rw-r--r--src/command_line.h20
-rw-r--r--src/main.cpp13
-rw-r--r--src/mainwindow.cpp93
-rw-r--r--src/mainwindow.h5
5 files changed, 121 insertions, 38 deletions
diff --git a/src/command_line.cpp b/src/command_line.cpp
new file mode 100644
index 0000000..d16742a
--- /dev/null
+++ b/src/command_line.cpp
@@ -0,0 +1,28 @@
+#include "src/command_line.h"
+
+#include <QDebug>
+#include <QApplication>
+
+CommandLineParsedOptions parse_command_line(QCommandLineParser &parser, QApplication &app) {
+ QCommandLineOption fileOption({"f", "file"},
+ QCoreApplication::translate("cmdline", "Data export to open."),
+ "file");
+ parser.addOption(fileOption);
+
+ const QCommandLineOption help_option = parser.addHelpOption();
+ const QCommandLineOption version_option = parser.addVersionOption();
+
+ QString outbox_filename;
+
+ if (!parser.parse(app.arguments()))
+ return {CommandLineError, parser.errorText(), outbox_filename};
+
+ if (parser.isSet(help_option) or parser.isSet("help-all"))
+ return {CommandLineHelpRequested, nullptr, outbox_filename};
+ if (parser.isSet(version_option))
+ return {CommandLineVersionRequested, nullptr, outbox_filename};
+
+ outbox_filename = parser.value(fileOption);
+
+ return {CommandLineOk, nullptr, outbox_filename};
+}
diff --git a/src/command_line.h b/src/command_line.h
new file mode 100644
index 0000000..18d4b9f
--- /dev/null
+++ b/src/command_line.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#include <QCommandLineParser>
+#include <QString>
+#include <QApplication>
+
+enum CommandLineParseResult {
+ CommandLineOk,
+ CommandLineError,
+ CommandLineVersionRequested,
+ CommandLineHelpRequested
+};
+
+struct CommandLineParsedOptions {
+ CommandLineParseResult result;
+ QString error_message;
+ QString outbox_filename;
+};
+
+CommandLineParsedOptions parse_command_line(QCommandLineParser &parser, QApplication &app);
diff --git a/src/main.cpp b/src/main.cpp
index fd3e533..81f3024 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,11 +1,18 @@
#include "mainwindow.h"
+#include "command_line.h"
#include <QApplication>
int main(int argc, char *argv[])
{
- QApplication a(argc, argv);
- MainWindow w;
+ QApplication app(argc, argv);
+
+ QCommandLineParser parser;
+ CommandLineParsedOptions result = parse_command_line(parser, app);
+
+ MainWindow w(nullptr);
w.show();
- return a.exec();
+ w.act_command_line(result, parser);
+
+ return app.exec();
}
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 1e961ba..cb02bc9 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -2,12 +2,15 @@
#include "./ui_mainwindow.h"
#include "src/archive_parser.h"
#include "src/list_item.h"
+#include "src/command_line.h"
#include <QFileDialog>
#include <QMessageBox>
#include <QRandomGenerator>
#include <QClipboard>
#include <QMimeData>
+#include <QCommandLineParser>
+#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
@@ -21,47 +24,33 @@ MainWindow::~MainWindow()
delete ui;
}
+void MainWindow::act_command_line(CommandLineParsedOptions &options, QCommandLineParser &parser) {
+ switch (options.result) {
+ case CommandLineError:
+ QMessageBox::critical(this, tr("Command line"), tr("The passed command line is incorrect and will be ignored.\nMore information: %1").arg(options.error_message));
+ break;
+ case CommandLineHelpRequested:
+ QMessageBox::information(this, QGuiApplication::applicationDisplayName(), "<pre>" + parser.helpText() + "</pre>"); exit(0);
+ break;
+ case CommandLineVersionRequested:
+ on_actionAbout_triggered(true); exit(0);
+ break;
+ case CommandLineOk:
+ if (!options.outbox_filename.isEmpty())
+ open_file(options.outbox_filename);
+ break;
+ }
+}
+
void MainWindow::on_actionOpen_triggered(bool checked) {
QFileDialog fileDialog;
fileDialog.setFileMode(QFileDialog::AnyFile);
fileDialog.setNameFilter(tr("Mastodon data export directory (outbox.json)"));
if (fileDialog.exec()) {
QStringList files = fileDialog.selectedFiles();
- outbox_filename = files[0];
- ui->statusInfoText->setText(outbox_filename);
- }
-
- if (data_archive) {
- delete data_archive;
- data_archive = nullptr;
- }
-
- // TODO: Do this in another thread
- QApplication::setOverrideCursor(Qt::WaitCursor);
- data_archive = new Archive(outbox_filename, ArchiveType::MASTODON);
- auto parse_error = data_archive->init();
-
- switch (parse_error) {
- case Archive::FailedOpeningFile:
- QMessageBox::warning(this, tr("Archive Parser"), tr("Failed opening file.")); break;
- case Archive::JsonParseError:
- QMessageBox::warning(this, tr("Archive Parser"), tr("Failed parsing outbox JSON.")); break;
- case Archive::JsonEmpty:
- case Archive::JsonNull:
- case Archive::JsonNotObject:
- case Archive::JsonNotActivityStream:
- QMessageBox::warning(this, tr("Archive Parser"), tr("The outbox JSON is empty or invalid in another way. Not an outbox.json?")); break;
- case Archive::NoError:
- break;
- }
-
- ui->listWidget->clear();
-
- if (parse_error == Archive::NoError) {
- data_archive->update_status_list(view_filters, ui->listWidget);
+ ui->statusInfoText->setText(files[0]);
+ open_file(files[0]);
}
-
- QApplication::restoreOverrideCursor();
}
void MainWindow::on_actionQuit_triggered(bool checked) {
@@ -201,3 +190,39 @@ void MainWindow::on_menuView_aboutToHide() {
if (view_filters_changed)
relist_statuses();
}
+
+void MainWindow::open_file(const QString &filename) {
+ outbox_filename = filename;
+
+ if (data_archive) {
+ delete data_archive;
+ data_archive = nullptr;
+ }
+
+ // TODO: Do this in another thread
+ QApplication::setOverrideCursor(Qt::WaitCursor);
+ data_archive = new Archive(outbox_filename, ArchiveType::MASTODON);
+ auto parse_error = data_archive->init();
+
+ switch (parse_error) {
+ case Archive::FailedOpeningFile:
+ QMessageBox::warning(this, tr("Archive Parser"), tr("Failed opening file %1").arg(filename)); break;
+ case Archive::JsonParseError:
+ QMessageBox::warning(this, tr("Archive Parser"), tr("Failed parsing outbox JSON.")); break;
+ case Archive::JsonEmpty:
+ case Archive::JsonNull:
+ case Archive::JsonNotObject:
+ case Archive::JsonNotActivityStream:
+ QMessageBox::warning(this, tr("Archive Parser"), tr("The outbox JSON is empty or invalid in another way. Not an outbox.json?")); break;
+ case Archive::NoError:
+ break;
+ }
+
+ ui->listWidget->clear();
+
+ if (parse_error == Archive::NoError) {
+ data_archive->update_status_list(view_filters, ui->listWidget);
+ }
+
+ QApplication::restoreOverrideCursor();
+}
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 8bfa3b2..2d05e00 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -3,10 +3,10 @@
#include <QMainWindow>
#include <QListWidgetItem>
#include <QLocale>
-#include <qobjectdefs.h>
#include "archive_parser.h"
#include "types.h"
+#include "command_line.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
@@ -20,6 +20,8 @@ public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
+ void act_command_line(CommandLineParsedOptions &options, QCommandLineParser &parser);
+
private slots:
void on_actionOpen_triggered(bool checked);
void on_actionQuit_triggered(bool checked);
@@ -44,6 +46,7 @@ private slots:
private:
void reset_view_filters();
void relist_statuses();
+ void open_file(const QString &filename);
Ui::MainWindow *ui;