diff options
-rw-r--r-- | src/main.cpp | 14 | ||||
-rw-r--r-- | src/mainwindow/mainwindow.ui | 29 | ||||
-rw-r--r-- | src/session/sessiondialog.cpp | 47 | ||||
-rw-r--r-- | 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 @@ </property> </action> <action name="actionNewWindow"> + <property name="icon"> + <iconset theme="window-new"/> + </property> <property name="text"> <string>New &Window</string> </property> </action> <action name="actionAbout"> + <property name="icon"> + <iconset theme="help-about"/> + </property> <property name="text"> <string>&About</string> </property> @@ -100,6 +106,9 @@ </property> </action> <action name="actionQuit"> + <property name="icon"> + <iconset theme="application-exit"/> + </property> <property name="text"> <string>&Quit</string> </property> @@ -135,16 +144,25 @@ </property> </action> <action name="actionSavePage"> + <property name="icon"> + <iconset theme="document-save"/> + </property> <property name="text"> <string>&Save Page</string> </property> </action> <action name="actionPrintPage"> + <property name="icon"> + <iconset theme="document-print"/> + </property> <property name="text"> <string>&Print Page</string> </property> </action> <action name="actionPrintPageToPdf"> + <property name="icon"> + <iconset theme="document-print"/> + </property> <property name="text"> <string>P&rint to PDF</string> </property> @@ -155,18 +173,27 @@ </property> </action> <action name="actionBookmarks"> + <property name="icon"> + <iconset theme="bookmarks"/> + </property> <property name="text"> <string>&Bookmarks</string> </property> </action> <action name="actionDownloads"> + <property name="icon"> + <iconset theme="download"/> + </property> <property name="text"> <string>&Downloads</string> </property> </action> <action name="actionAddPlugin"> + <property name="icon"> + <iconset theme="plugins"/> + </property> <property name="text"> - <string>Add Plugin</string> + <string>&Add Plugin</string> </property> </action> </widget> 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<SessionForm *>(ui->listWidget->itemWidget(ui->listWidget->currentItem())); if(currentWidget) this->openSession(currentWidget->ui->label->text()); @@ -74,6 +67,38 @@ SessionDialog::~SessionDialog() delete ui; } +std::optional<QJsonObject> SessionDialog::pickSession() +{ + disconnect(accepted_connection); + + if(this->exec() == QDialog::Rejected) { + return std::nullopt; + } + + auto *currentWidget = qobject_cast<SessionForm *>(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<QJsonObject> 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 |