From f15af11e4b6ad5dfa1be5107c2db0ddad6480f5b Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Fri, 14 Dec 2018 14:25:04 +0100 Subject: Add SaveSessionDialog --- lib/configuration/configuration.cpp | 3 ++ src/mainwindow/menubar.cpp | 18 ++++---- src/meson.build | 5 ++- src/session/savesessiondialog.cpp | 78 +++++++++++++++++++++++++++++++++ src/session/savesessiondialog.h | 34 +++++++++++++++ src/session/savesessiondialog.ui | 87 +++++++++++++++++++++++++++++++++++++ 6 files changed, 213 insertions(+), 12 deletions(-) create mode 100644 src/session/savesessiondialog.cpp create mode 100644 src/session/savesessiondialog.h create mode 100644 src/session/savesessiondialog.ui diff --git a/lib/configuration/configuration.cpp b/lib/configuration/configuration.cpp index 9b84166..d4f1eae 100644 --- a/lib/configuration/configuration.cpp +++ b/lib/configuration/configuration.cpp @@ -56,6 +56,9 @@ Configuration::Configuration(int argc, char **argv, const std::string &path, QOb ("mainwindow.title", po::value()->default_value(CONFIG_POI_NAME)) // main window shortcuts + ("mainwindow.shortcuts.saveSession", po::value()->default_value("Ctrl+S,S")) + ("mainwindow.shortcuts.openSession", po::value()->default_value("Ctrl+S,O")) + ("mainwindow.shortcuts.newGroup", po::value()->default_value(CONFIG_SHORTCUT_WINDOW_NEWGROUP)) ("mainwindow.shortcuts.newWindow", po::value()->default_value(CONFIG_SHORTCUT_WINDOW_NEWWINDOW)) diff --git a/src/mainwindow/menubar.cpp b/src/mainwindow/menubar.cpp index 0429ffd..84ce24f 100644 --- a/src/mainwindow/menubar.cpp +++ b/src/mainwindow/menubar.cpp @@ -13,6 +13,7 @@ #include "downloadswidget.h" #include "mainwindow.h" #include "profilemanager.h" +#include "session/savesessiondialog.h" #include "session/sessiondialog.h" #include "subwindow/subwindow.h" #include "webengine/webview.h" @@ -69,21 +70,18 @@ MenuBar::MenuBar(const Configuration *config, MainWindow *parent) smolbote->addSeparator(); const QString sessionPath = config->value("browser.session.path").value(); - smolbote->addAction(tr("Save Session"), parent, [parent, sessionPath]() { - const QString filename = QFileDialog::getSaveFileName(parent, tr("Save Session"), sessionPath, tr("JSON (*.json)")); - QFile output(filename); - if(output.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) { - auto *browser = qobject_cast(qApp); - auto data = Session::_session(browser->windows()); - output.write(QJsonDocument(data).toJson()); - output.close(); - } + auto *actionSaveSession = smolbote->addAction(tr("Save Session"), parent, [sessionPath]() { + auto *sessionDialog = new SaveSessionDialog(nullptr); + if(sessionDialog->exec()) + sessionDialog->save(sessionPath); }); + config->setShortcut(actionSaveSession, "mainwindow.shortcuts.saveSession"); - smolbote->addAction(tr("Open Session"), parent, [parent]() { + auto *actionOpenSession = smolbote->addAction(tr("Open Session"), parent, [parent]() { auto *sessionDialog = new SessionDialog(parent); sessionDialog->exec(); }); + config->setShortcut(actionOpenSession, "mainwindow.shortcuts.openSession"); smolbote->addSeparator(); auto *actionBookmarks = smolbote->addAction(tr("Bookmarks"), browser, [browser, parent]() { diff --git a/src/meson.build b/src/meson.build index 7dfba88..1fb4a98 100644 --- a/src/meson.build +++ b/src/meson.build @@ -2,10 +2,10 @@ poi_moc = qt5.preprocess( moc_headers: ['browser.h', 'mainwindow/mainwindow.h', 'mainwindow/menubar.h', 'mainwindow/widgets/dockwidget.h', 'mainwindow/widgets/menusearch.h', 'mainwindow/widgets/navigationbar.h', 'mainwindow/widgets/searchform.h', - 'session/sessiondialog.h', 'session/sessionform.h', + 'session/savesessiondialog.h', 'session/sessiondialog.h', 'session/sessionform.h', 'subwindow/subwindow.h', 'subwindow/tabwidget.h', 'webengine/filter.h', 'webengine/urlinterceptor.h', 'webengine/webpage.h', 'webengine/webview.h'], - ui_files: ['mainwindow/widgets/searchform.ui', 'session/sessiondialog.ui', 'session/sessionform.ui'], + ui_files: ['mainwindow/widgets/searchform.ui', 'session/savesessiondialog.ui', 'session/sessiondialog.ui', 'session/sessionform.ui'], qresources: '../data/resources.qrc', rcc_extra_arguments: ['--format-version=1'], dependencies: dep_qt5 @@ -37,6 +37,7 @@ poi = executable(get_option('poiName'), install: true, 'mainwindow/widgets/searchform.cpp', 'session/session.cpp', + 'session/savesessiondialog.cpp', 'session/sessiondialog.cpp', 'session/sessionform.cpp', diff --git a/src/session/savesessiondialog.cpp b/src/session/savesessiondialog.cpp new file mode 100644 index 0000000..808ba45 --- /dev/null +++ b/src/session/savesessiondialog.cpp @@ -0,0 +1,78 @@ +/* + * 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 "savesessiondialog.h" +#include "browser.h" +#include "mainwindow/mainwindow.h" +#include "profilemanager.h" +#include "subwindow/subwindow.h" +#include "ui_savesessiondialog.h" +#include "webengine/webview.h" +#include +#include +#include + +SaveSessionDialog::SaveSessionDialog(QWidget *parent) + : QDialog(parent) + , ui(new Ui::SaveSessionDialog) +{ + ui->setupUi(this); + + auto *browser = qobject_cast(qApp); + Q_CHECK_PTR(browser); + + for(MainWindow *window : browser->windows()) { + auto *windowItem = new QTreeWidgetItem(ui->treeWidget); + windowItem->setText(0, tr("Main Window")); + windowItem->setData(0, Qt::UserRole, QVariant::fromValue(static_cast(window))); + windowItem->setCheckState(0, Qt::Checked); + ui->treeWidget->expandItem(windowItem); + + for(const SubWindow *subwindow : window->subWindows()) { + auto *subwindowItem = new QTreeWidgetItem(windowItem); + subwindowItem->setText(0, tr("Subwindow")); + subwindowItem->setText(1, browser->getProfileManager()->id(subwindow->profile())); + + ui->treeWidget->expandItem(subwindowItem); + + for(int i = 0; i < subwindow->tabCount(); ++i) { + auto *tabItem = new QTreeWidgetItem(subwindowItem); + auto *view = subwindow->view(i); + tabItem->setText(0, view->title()); + tabItem->setText(1, browser->getProfileManager()->id(view->profile())); + } + } + } +} + +SaveSessionDialog::~SaveSessionDialog() +{ + delete ui; +} + +void SaveSessionDialog::save(const QString &sessionPath) +{ + const QString filename = QFileDialog::getSaveFileName(this, tr("Save Session"), sessionPath, tr("JSON (*.json)")); + QFile output(filename); + + if(output.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) { + QVector windows; + for(int i = 0; i < ui->treeWidget->topLevelItemCount(); ++i) { + QTreeWidgetItem *item = ui->treeWidget->topLevelItem(i); + if(item->checkState(0) == Qt::Checked) { + auto *window = static_cast(item->data(0, Qt::UserRole).value()); + Q_CHECK_PTR(window); + windows.append(window); + } + } + + auto data = Session::_session(windows); + output.write(QJsonDocument(data).toJson()); + output.close(); + } +} diff --git a/src/session/savesessiondialog.h b/src/session/savesessiondialog.h new file mode 100644 index 0000000..ade1d23 --- /dev/null +++ b/src/session/savesessiondialog.h @@ -0,0 +1,34 @@ +/* + * 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 + */ + +#ifndef SMOLBOTE_SAVESESSIONDIALOG_H +#define SMOLBOTE_SAVESESSIONDIALOG_H + +#include + +namespace Ui +{ +class SaveSessionDialog; +} + +class SaveSessionDialog : public QDialog +{ + Q_OBJECT + +public: + explicit SaveSessionDialog(QWidget *parent = nullptr); + ~SaveSessionDialog(); + +public slots: + void save(const QString &sessionPath); + +private: + Ui::SaveSessionDialog *ui; +}; + +#endif // SMOLBOTE_SAVESESSIONDIALOG_H diff --git a/src/session/savesessiondialog.ui b/src/session/savesessiondialog.ui new file mode 100644 index 0000000..120858f --- /dev/null +++ b/src/session/savesessiondialog.ui @@ -0,0 +1,87 @@ + + + SaveSessionDialog + + + + 0 + 0 + 1000 + 600 + + + + Save Session + + + + + + QAbstractItemView::NoEditTriggers + + + 300 + + + 300 + + + + Name + + + + + Profile + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Save + + + + + + + + + buttonBox + accepted() + SaveSessionDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + SaveSessionDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + -- cgit v1.2.1