/* * 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 #include #include #include #include "configuration.h" 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(qApp); Q_CHECK_PTR(browser); Configuration conf; for(const QString &path : Util::files(conf.value("session.path").value(), { "*.json" })) { addItem(path); } ui->listWidget->addItem(tr("Create a new window")); connect(ui->listWidget, &QListWidget::currentItemChanged, this, [this](QListWidgetItem *currentItem, QListWidgetItem *previousItem) { auto *currentWidget = qobject_cast(ui->listWidget->itemWidget(currentItem)); if(currentWidget != nullptr) currentWidget->ui->delete_toolButton->show(); auto *previousWidget = qobject_cast(ui->listWidget->itemWidget(previousItem)); if(previousWidget != nullptr) 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()) { ui->listWidget->setCurrentItem(addItem(filename)); accept(); } }); accepted_connection = connect(this, &SessionDialog::accepted, this, [this, browser]() { auto *currentWidget = qobject_cast(ui->listWidget->itemWidget(ui->listWidget->currentItem())); if(currentWidget != nullptr) this->openSession(currentWidget->ui->label->text()); else browser->createWindow(); }); connect(ui->search, &QLineEdit::textEdited, this, &SessionDialog::search); } SessionDialog::~SessionDialog() { delete ui; } std::optional SessionDialog::pickSession() { disconnect(accepted_connection); if(this->exec() == QDialog::Rejected) { return std::nullopt; } auto *currentWidget = qobject_cast(ui->listWidget->itemWidget(ui->listWidget->currentItem())); if(currentWidget != nullptr) { QFile json(currentWidget->ui->label->text()); if(json.open(QIODevice::ReadOnly | QIODevice::Text)) { auto doc = QJsonDocument::fromJson(json.readAll()); return doc.object(); } } return std::nullopt; } QListWidgetItem *SessionDialog::addItem(const QString &path) { 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); return item; } void SessionDialog::search(const QString &text) { for(int i = 0; i < ui->listWidget->count(); ++i) { auto *item = ui->listWidget->item(i); auto *widget = qobject_cast(ui->listWidget->itemWidget(item)); if(widget == nullptr) item->setHidden(!text.isEmpty()); else item->setHidden(!widget->ui->label->text().contains(text)); } } void SessionDialog::openSession(const QString &filename) { auto *browser = qobject_cast(qApp); Q_CHECK_PTR(browser); QFile json(filename); if(json.open(QIODevice::ReadOnly | QIODevice::Text)) { auto doc = QJsonDocument::fromJson(json.readAll()); Session::restoreSession(doc.object()); json.close(); } }