From 7e4c7905c9e74d76de2e03413af0dc9e4cb84683 Mon Sep 17 00:00:00 2001 From: ConfuSomu Date: Sat, 10 Jun 2023 18:53:35 -0400 Subject: 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. --- src/command_line.cpp | 28 ++++++++++++++++ src/command_line.h | 20 +++++++++++ src/main.cpp | 13 ++++++-- src/mainwindow.cpp | 93 +++++++++++++++++++++++++++++++++------------------- src/mainwindow.h | 5 ++- 5 files changed, 121 insertions(+), 38 deletions(-) create mode 100644 src/command_line.cpp create mode 100644 src/command_line.h (limited to 'src') 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 +#include + +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 +#include +#include + +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 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 #include #include #include #include +#include +#include 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(), "
" + parser.helpText() + "
"); 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 #include #include -#include #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; -- cgit v1.2.3-54-g00ecf