From fbdaade51ceaea14998c611acf2a09d3198be640 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Fri, 30 Nov 2018 14:08:02 +0100 Subject: pick-session: pass session data to existing instance if any --- src/main.cpp | 14 ++++++++----- src/mainwindow/mainwindow.ui | 29 +++++++++++++++++++++++++- src/session/sessiondialog.cpp | 47 +++++++++++++++++++++++++++++++++---------- src/session/sessiondialog.h | 6 +++++- 4 files changed, 78 insertions(+), 18 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 7cc8757..bb58782 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -237,12 +237,16 @@ int main(int argc, char **argv) }); } - if(pickSession) { - auto *dlg = new SessionDialog(); - dlg->exec(); - } else { + { QJsonObject sessionData; - if(session) { + + if(pickSession) { + auto *dlg = new SessionDialog(); + if(const auto pick = dlg->pickSession()) + sessionData = pick.value(); + else + sessionData = Session::fromCommandLine(profile.value(), urls); + } else if(session) { QFile sessionJson(session.value()); if(sessionJson.open(QIODevice::ReadOnly | QIODevice::Text)) { sessionData = QJsonDocument::fromJson(sessionJson.readAll()).object(); diff --git a/src/mainwindow/mainwindow.ui b/src/mainwindow/mainwindow.ui index 309bfaf..19cecbb 100644 --- a/src/mainwindow/mainwindow.ui +++ b/src/mainwindow/mainwindow.ui @@ -85,11 +85,17 @@ + + + New &Window + + + &About @@ -100,6 +106,9 @@ + + + &Quit @@ -135,16 +144,25 @@ + + + &Save Page + + + &Print Page + + + P&rint to PDF @@ -155,18 +173,27 @@ + + + &Bookmarks + + + &Downloads + + + - Add Plugin + &Add Plugin diff --git a/src/session/sessiondialog.cpp b/src/session/sessiondialog.cpp index 287950d..184c44d 100644 --- a/src/session/sessiondialog.cpp +++ b/src/session/sessiondialog.cpp @@ -28,13 +28,7 @@ SessionDialog::SessionDialog(QWidget *parent) 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); + addItem(path); } ui->listWidget->addItem(tr("Create a new window")); @@ -52,13 +46,12 @@ SessionDialog::SessionDialog(QWidget *parent) 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(); + ui->listWidget->setCurrentItem(addItem(filename)); + accept(); } }); - connect(this, &SessionDialog::accepted, this, [this, browser]() { + accepted_connection = connect(this, &SessionDialog::accepted, this, [this, browser]() { auto *currentWidget = qobject_cast(ui->listWidget->itemWidget(ui->listWidget->currentItem())); if(currentWidget) this->openSession(currentWidget->ui->label->text()); @@ -74,6 +67,38 @@ 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) { + 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) { diff --git a/src/session/sessiondialog.h b/src/session/sessiondialog.h index ff4d3af..9bf8a68 100644 --- a/src/session/sessiondialog.h +++ b/src/session/sessiondialog.h @@ -15,7 +15,7 @@ namespace Ui { class SessionDialog; } - +class QListWidgetItem; class SessionDialog : public QDialog { Q_OBJECT @@ -24,12 +24,16 @@ public: explicit SessionDialog(QWidget *parent = nullptr); ~SessionDialog() override; + std::optional pickSession(); + private slots: + QListWidgetItem *addItem(const QString &path); void search(const QString &text); void openSession(const QString &filename); private: Ui::SessionDialog *ui; + QMetaObject::Connection accepted_connection; }; #endif // SMOLBOTE_SESSIONDIALOG_H -- cgit v1.2.1