aboutsummaryrefslogtreecommitdiff
path: root/src/session/sessiondialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/session/sessiondialog.cpp')
-rw-r--r--src/session/sessiondialog.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/session/sessiondialog.cpp b/src/session/sessiondialog.cpp
new file mode 100644
index 0000000..e31a42f
--- /dev/null
+++ b/src/session/sessiondialog.cpp
@@ -0,0 +1,87 @@
+/*
+ * This file is part of smolbote. It's copyrighted by the contributors recorded
+ * in the version control history of the file, available from its original
+ * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote
+ *
+ * SPDX-License-Identifier: GPL-3.0
+ */
+
+#include "sessiondialog.h"
+#include "../browser.h"
+#include "../util.h"
+#include "sessionform.h"
+#include "ui_sessiondialog.h"
+#include "ui_sessionform.h"
+#include <QFile>
+#include <QFileDialog>
+#include <QToolButton>
+#include <QStyle>
+
+SessionDialog::SessionDialog(QWidget *parent)
+ : QDialog(parent)
+ , ui(new Ui::SessionDialog)
+{
+ ui->setupUi(this);
+ ui->open->setIcon(style()->standardIcon(QStyle::SP_DirOpenIcon));
+
+ auto *browser = qobject_cast<Browser *>(qApp);
+ Q_CHECK_PTR(browser);
+
+ for(const QString &path : Util::files(browser->configuration("browser.session.path"), { "*.json" })) {
+ auto *item = new QListWidgetItem(ui->listWidget);
+ auto *widget = new SessionForm(path, this);
+ connect(widget->ui->delete_toolButton, &QToolButton::clicked, this, [item, widget]() {
+ delete item;
+ delete widget;
+ });
+ ui->listWidget->setItemWidget(item, widget);
+ }
+
+#ifdef QT_DEBUG
+ ui->listWidget->addItem(tr("Start new session"));
+#endif
+
+ connect(ui->listWidget, &QListWidget::currentItemChanged, this, [this](QListWidgetItem *currentItem, QListWidgetItem *previousItem) {
+ auto *currentWidget = qobject_cast<SessionForm *>(ui->listWidget->itemWidget(currentItem));
+ if(currentWidget)
+ currentWidget->ui->delete_toolButton->show();
+
+ auto *previousWidget = qobject_cast<SessionForm *>(ui->listWidget->itemWidget(previousItem));
+ if(previousWidget)
+ previousWidget->ui->delete_toolButton->hide();
+ });
+
+ connect(ui->open, &QPushButton::clicked, this, [this]() {
+ const QString filename = QFileDialog::getOpenFileName(this, tr("Select Session file"), QDir::homePath(), tr("JSON (*.json)"));
+ if(!filename.isEmpty()) {
+ this->openSession(filename);
+ // close the dialog window; reject so it doesn't open another session
+ this->reject();
+ }
+ });
+
+ connect(this, &SessionDialog::accepted, this, [this]() {
+ auto *currentWidget = qobject_cast<SessionForm *>(ui->listWidget->itemWidget(ui->listWidget->currentItem()));
+ if(currentWidget)
+ this->openSession(currentWidget->ui->label->text());
+ });
+}
+
+SessionDialog::~SessionDialog()
+{
+ delete ui;
+}
+
+void SessionDialog::openSession(const QString &filename)
+{
+ auto *browser = qobject_cast<Browser *>(qApp);
+ Q_CHECK_PTR(browser);
+
+ QFile json(filename);
+ if(json.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ auto *browser = qobject_cast<Browser *>(qApp);
+ auto doc = QJsonDocument::fromJson(json.readAll());
+ browser->createSession(doc.object());
+ json.close();
+ }
+}