From 696743557de6a6b82303618d8f60f08f8978e650 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Mon, 26 Nov 2018 00:58:19 +0100 Subject: Add Session::view and Session::restoreView --- src/browser.h | 2 +- src/main.cpp | 2 +- src/mainwindow/mainwindow.cpp | 22 +++++++- src/meson.build | 20 ++++---- src/session.cpp | 80 ----------------------------- src/session.h | 21 -------- src/session/session.cpp | 114 ++++++++++++++++++++++++++++++++++++++++++ src/session/session.h | 26 ++++++++++ src/webengine/webview.h | 2 +- 9 files changed, 174 insertions(+), 115 deletions(-) delete mode 100644 src/session.cpp delete mode 100644 src/session.h create mode 100644 src/session/session.cpp create mode 100644 src/session/session.h diff --git a/src/browser.h b/src/browser.h index 2148484..1989631 100644 --- a/src/browser.h +++ b/src/browser.h @@ -9,7 +9,7 @@ #ifndef SMOLBOTE_BROWSER_H #define SMOLBOTE_BROWSER_H -#include "session.h" +#include "session/session.h" #include #include #include diff --git a/src/main.cpp b/src/main.cpp index 3eb6dac..a80784b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,7 +8,7 @@ #include "browser.h" #include "configuration.h" -#include "session.h" +#include "session/session.h" #include "util.h" #include #include diff --git a/src/mainwindow/mainwindow.cpp b/src/mainwindow/mainwindow.cpp index 80e4faa..a01cb94 100644 --- a/src/mainwindow/mainwindow.cpp +++ b/src/mainwindow/mainwindow.cpp @@ -12,7 +12,7 @@ #include "config.h" #include "configuration.h" #include "profilemanager.h" -#include "session.h" +#include "session/session.h" #include "session/sessiondialog.h" #include "subwindow/subwindow.h" #include "ui_mainwindow.h" @@ -119,13 +119,33 @@ MainWindow::MainWindow(const std::unique_ptr &config, QWidget *pa // connect session menu { connect(ui->actionSaveSession, &QAction::triggered, this, [this]() { +#ifndef QT_DEBUG const QString filename = QFileDialog::getSaveFileName(this, tr("Save Session"), QDir::homePath(), tr("JSON (*.json)")); QFile output(filename); if(output.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) { output.write(QJsonDocument(Session::window(this)).toJson()); output.close(); } +#else + auto data = Session::view(currentView); + QJsonDocument doc(data); + qDebug(qUtf8Printable(doc.toJson())); +#endif + }); + +#ifdef QT_DEBUG + auto *openViewAction = ui->menuSession->addAction("Open View"); + connect(openViewAction, &QAction::triggered, this, [this]() { + const QString filename = QFileDialog::getOpenFileName(this, tr("Open View"), QDir::homePath(), tr("JSON (*json)")); + QFile output(filename); + if(output.open(QIODevice::ReadOnly | QIODevice::Text)) { + QJsonDocument doc = QJsonDocument::fromJson(output.readAll()); + Session::restoreView(currentView, doc.object()); + output.close(); + } }); +#endif + connect(ui->actionLoadSession, &QAction::triggered, this, [this]() { auto *sessionDialog = new SessionDialog(this); sessionDialog->exec(); diff --git a/src/meson.build b/src/meson.build index 5df5a36..209fb5c 100644 --- a/src/meson.build +++ b/src/meson.build @@ -27,24 +27,24 @@ poi = executable(get_option('poiName'), install: true, include_directories: [include], sources: ['main.cpp', poi_moc, 'browser.cpp', - 'session.cpp', 'util.cpp', 'util.h', - 'mainwindow/mainwindow.cpp', - 'mainwindow/widgets/dockwidget.cpp', - 'mainwindow/widgets/navigationbar.cpp', + 'mainwindow/mainwindow.cpp', + 'mainwindow/widgets/dockwidget.cpp', + 'mainwindow/widgets/navigationbar.cpp', 'mainwindow/widgets/searchform.cpp', + 'session/session.cpp', 'session/sessiondialog.cpp', 'session/sessionform.cpp', - 'subwindow/subwindow.cpp', - 'subwindow/tabwidget.cpp', + 'subwindow/subwindow.cpp', + 'subwindow/tabwidget.cpp', - 'webengine/filter.cpp', - 'webengine/urlinterceptor.cpp', - 'webengine/webpage.cpp', - 'webengine/webview.cpp', + 'webengine/filter.cpp', + 'webengine/urlinterceptor.cpp', + 'webengine/webpage.cpp', + 'webengine/webview.cpp', 'wallet/wallet.cpp', 'wallet/wallet.h'] ) diff --git a/src/session.cpp b/src/session.cpp deleted file mode 100644 index 4e1c6d6..0000000 --- a/src/session.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* - * 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 "session.h" -#include "mainwindow/mainwindow.h" -#include "subwindow/subwindow.h" -#include -#include -#include "webengine/webview.h" -#include "profilemanager.h" -#include "browser.h" - -QJsonObject Session::session(QVector windows) -{ - QJsonObject obj; - - QJsonArray windowsArray; - for(const MainWindow *window : windows) { - windowsArray.append(Session::window(window)); - } - obj.insert("windows", windowsArray); - - return obj; -} - -QJsonObject Session::window(const MainWindow *window) -{ - QJsonObject obj; - auto *profileManager = dynamic_cast(qApp)->getProfileManager(); - - QJsonArray subwindows; - for(const SubWindow *subwindow : window->subWindows()) { - QJsonObject window; - window.insert("profile", profileManager->id(subwindow->profile())); - - QJsonArray tabs; - for(int i = 0; i < subwindow->tabCount(); ++i) { - QJsonObject tab; - tab.insert("url", subwindow->view(i)->url().toString()); - tab.insert("profile", profileManager->id(subwindow->view(i)->profile())); - tabs.append(tab); - } - window.insert("tabs", tabs); - - subwindows.append(window); - } - obj.insert("subwindows", subwindows); - - return obj; -} - -QJsonObject Session::window(const QString &profile, const QStringList &urls) -{ - QJsonObject session; - - QJsonArray subwindows; - { - QJsonObject window; - window.insert("profile", profile); - - QJsonArray tabs; - for(const auto &url : urls) { - QJsonObject tab; - tab.insert("url", url); - tab.insert("profile", profile); - tabs.append(tab); - } - window.insert("tabs", tabs); - - subwindows.append(window); - } - session.insert("subwindows", subwindows); - - return session; -} diff --git a/src/session.h b/src/session.h deleted file mode 100644 index 8c0300c..0000000 --- a/src/session.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * 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_SESSION_H -#define SMOLBOTE_SESSION_H - -#include - -class MainWindow; -namespace Session { -QJsonObject session(QVector windows); -QJsonObject window(const MainWindow *window); -QJsonObject window(const QString &profile, const QStringList &urls); -} - -#endif // SMOLBOTE_SESSION_H diff --git a/src/session/session.cpp b/src/session/session.cpp new file mode 100644 index 0000000..d728d55 --- /dev/null +++ b/src/session/session.cpp @@ -0,0 +1,114 @@ +/* + * 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 "session.h" +#include "mainwindow/mainwindow.h" +#include "subwindow/subwindow.h" +#include +#include +#include "webengine/webview.h" +#include "profilemanager.h" +#include "browser.h" +#include "../webengine/webview.h" +#include + +QJsonObject Session::session(QVector windows) +{ + QJsonObject obj; + + QJsonArray windowsArray; + for(const MainWindow *window : windows) { + windowsArray.append(Session::window(window)); + } + obj.insert("windows", windowsArray); + + return obj; +} + +QJsonObject Session::window(const MainWindow *window) +{ + QJsonObject obj; + auto *profileManager = dynamic_cast(qApp)->getProfileManager(); + + QJsonArray subwindows; + for(const SubWindow *subwindow : window->subWindows()) { + QJsonObject window; + window.insert("profile", profileManager->id(subwindow->profile())); + + QJsonArray tabs; + for(int i = 0; i < subwindow->tabCount(); ++i) { + QJsonObject tab; + tab.insert("url", subwindow->view(i)->url().toString()); + tab.insert("profile", profileManager->id(subwindow->view(i)->profile())); + tabs.append(tab); + } + window.insert("tabs", tabs); + + subwindows.append(window); + } + obj.insert("subwindows", subwindows); + + return obj; +} + +QJsonObject Session::window(const QString &profile, const QStringList &urls) +{ + QJsonObject session; + + QJsonArray subwindows; + { + QJsonObject window; + window.insert("profile", profile); + + QJsonArray tabs; + for(const auto &url : urls) { + QJsonObject tab; + tab.insert("url", url); + tab.insert("profile", profile); + tabs.append(tab); + } + window.insert("tabs", tabs); + + subwindows.append(window); + } + session.insert("subwindows", subwindows); + + return session; +} + +QJsonObject Session::view(const WebView *view) +{ + auto *profileManager = dynamic_cast(qApp)->getProfileManager(); + Q_CHECK_PTR(profileManager); + + QByteArray historyData; + QDataStream historyStream(&historyData, QIODevice::WriteOnly); + historyStream << *view->history(); + + QJsonObject viewData; + viewData.insert("url", view->url().toString()); + viewData.insert("profile", profileManager->id(view->profile())); + //viewData.insert("history", QString(qCompress(historyData).toBase64())); + viewData.insert("history", QString(historyData.toBase64())); + + return viewData; +} + +void Session::restoreView(WebView *view, const QJsonObject &data) +{ + auto *profileManager = dynamic_cast(qApp)->getProfileManager(); + Q_CHECK_PTR(profileManager); + + auto *profile = profileManager->profile(data["profile"].toString()); + if(profile) + view->setProfile(profile); + + QByteArray historyData = QByteArray::fromBase64(data["history"].toString().toLatin1()); + QDataStream historyStream(&historyData, QIODevice::ReadOnly); + historyStream >> *view->history(); +} diff --git a/src/session/session.h b/src/session/session.h new file mode 100644 index 0000000..222c7ef --- /dev/null +++ b/src/session/session.h @@ -0,0 +1,26 @@ +/* + * 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_SESSION_H +#define SMOLBOTE_SESSION_H + +#include + +class MainWindow; +class WebView; + +namespace Session { +QJsonObject session(QVector windows); +QJsonObject window(const MainWindow *window); +QJsonObject window(const QString &profile, const QStringList &urls); + +QJsonObject view(const WebView *view); +void restoreView(WebView *view, const QJsonObject &data); +} + +#endif // SMOLBOTE_SESSION_H diff --git a/src/webengine/webview.h b/src/webengine/webview.h index be4dfa4..8d320b9 100644 --- a/src/webengine/webview.h +++ b/src/webengine/webview.h @@ -26,7 +26,7 @@ public: explicit WebView(WebProfile *profile = nullptr, QWidget *parent = nullptr); ~WebView() = default; - WebProfile *profile() + WebProfile *profile() const { return m_profile; } -- cgit v1.2.1