aboutsummaryrefslogtreecommitdiff
path: root/src/browser.cpp
diff options
context:
space:
mode:
authorAqua-sama <aqua@iserlohn-fortress.net>2018-04-16 17:07:36 +0200
committerAqua-sama <aqua@iserlohn-fortress.net>2018-04-16 17:07:36 +0200
commitd796821f8304306dbe088701724243b39e8eb358 (patch)
tree836c85aa421db5c495e2b36f6a02cea924b6d919 /src/browser.cpp
parentBranch of Qt5.11 features (diff)
downloadsmolbote-d796821f8304306dbe088701724243b39e8eb358.tar.xz
Multiple subwindows interface
Subwindows are similar to tab groups. - Rewrote Browser and MainWindow, so they should be somewhat cleaner now - Moved AboutDialog to lib/about What's broken: - loading bar - search box - address bar bookmark suggestions - plugins
Diffstat (limited to 'src/browser.cpp')
-rw-r--r--src/browser.cpp180
1 files changed, 71 insertions, 109 deletions
diff --git a/src/browser.cpp b/src/browser.cpp
index c32aee7..ab07f2e 100644
--- a/src/browser.cpp
+++ b/src/browser.cpp
@@ -7,152 +7,114 @@
*/
#include "browser.h"
-#include "configuration/configuration.h"
#include "mainwindow/mainwindow.h"
-#include "webengine/urlinterceptor.h"
-#include "webengine/webengineprofile.h"
-#include <QWebEngineDownloadItem>
-#include <QtConcurrent>
+#include "mainwindow/window.h"
+#include "webengine/webprofile.h"
+#include <QAction>
+#include <configuration/configuration.h>
#include <bookmarks/bookmarkswidget.h>
#include <downloads/downloadswidget.h>
+#include <version.h>
+#include "webengine/urlinterceptor.h"
Browser::Browser(int &argc, char *argv[])
: SingleApplication(argc, argv)
{
- QApplication::setApplicationName("smolbote");
- QApplication::setWindowIcon(QIcon(":/icon.svg"));
-
- connect(this, &Browser::messageAvailable, this, &Browser::createSession);
+ setApplicationName("smolbote");
+ setWindowIcon(QIcon(":/icon.svg"));
+ setApplicationVersion(SMOLBOTE_VERSION);
}
Browser::~Browser()
{
- if(m_bookmarksManager) {
- QtConcurrent::run(QThreadPool::globalInstance(), m_bookmarksManager.get(), &BookmarksWidget::save);
- }
-
- qDebug("Waiting for threads to wind down...");
- qDebug("Thread pool is done: %s", QThreadPool::globalInstance()->waitForDone() ? "okay" : "failed");
-
- delete m_urlRequestInterceptor;
+ qDeleteAll(m_windows);
+ m_windows.clear();
}
void Browser::setConfiguration(std::shared_ptr<Configuration> &config)
{
+ Q_ASSERT(config);
m_config = config;
-
- QDir pluginsDir(QString::fromStdString(m_config->value<std::string>("plugins.path").value()));
- if(pluginsDir.exists()) {
- const QStringList entries = pluginsDir.entryList(QDir::Files | QDir::Readable);
- for(const QString &name : entries) {
- QPluginLoader loader(pluginsDir.absoluteFilePath(name));
- qDebug("Loading plugin %s: %s", qUtf8Printable(name), loader.load() ? "ok" : "failed");
- if(!loader.isLoaded()) {
- qDebug("Error: %s", qUtf8Printable(loader.errorString()));
- } else {
- Plugin d;
- d.meta = loader.metaData()["MetaData"].toObject();
- d.pointer = loader.instance();
- d.pointer->setParent(this);
- m_plugins.append(d);
- }
- }
- }
-
- m_bookmarksManager = std::make_shared<BookmarksWidget>(QString::fromStdString(m_config->value<std::string>("bookmarks.path").value()));
- m_downloadManager = std::make_shared<DownloadsWidget>(QString::fromStdString(m_config->value<std::string>("downloads.path").value()));
-
- m_urlRequestInterceptor = new UrlRequestInterceptor(QString::fromStdString(m_config->value<std::string>("filter.path").value()));
-
- // set default profile
- m_defaultProfile = profile(QString::fromStdString(m_config->value<std::string>("browser.profile").value()));
}
-MainWindow *Browser::createWindow()
+void Browser::setup(const QString &defaultProfile)
{
- // the window will delete itself when it closes, so we don't need to delete it
- MainWindow *window = new MainWindow(m_config);
- window->setBookmarksWidget(m_bookmarksManager);
- window->setDownloadsWidget(m_downloadManager);
- window->setProfile(m_defaultProfile);
- window->addPlugins(m_plugins);
+ Q_ASSERT_X(m_config, "Browser::setup", "Configuration not set");
- m_windows.append(window);
+ // url request filter
+ m_urlFilter = std::make_shared<UrlRequestInterceptor>(QString::fromStdString(m_config->value<std::string>("filter.path").value()));
- // has to be window.get(), but can't be *window
- connect(window, &MainWindow::destroyed, this, [this, window]() {
- m_windows.removeOne(window);
- });
- window->show();
+ // cookie request filter
- return window;
-}
+ // bookmarks
+ m_bookmarks = std::make_shared<BookmarksWidget>(QString::fromStdString(m_config->value<std::string>("bookmarks.path").value()));
+ connect(m_bookmarks.get(), &BookmarksWidget::openUrl, this, [this](const QUrl &url) {
+ m_windows.last()->createTab(url);
+ });
-MainWindow *Browser::createSession(const QString &profileName, bool newWindow, const QStringList &urls)
-{
- MainWindow *window = nullptr;
+ // downloads
+ m_downloads = std::make_shared<DownloadsWidget>(QString::fromStdString(m_config->value<std::string>("downloads.path").value()));
- // if we need to open in a new window, or there are no windows, make one
- if(newWindow || m_windows.isEmpty()) {
- window = createWindow();
- window->setProfile(profile(profileName));
+ // load profiles
+ if(defaultProfile == "") {
+ auto *p = new WebProfile(this);
+ p->setRequestInterceptor(m_urlFilter.get());
+ connect(p, &WebProfile::downloadRequested, m_downloads.get(), &DownloadsWidget::addDownload);
+ WebProfile::setDefaultProfile(p);
} else {
- // reverse-iterate through windows to check for window with the same profile
- for(auto it = m_windows.rbegin(); it != m_windows.rend(); ++it) {
- if((*it)->profile()->storageName() == profileName) {
- window = *it;
- break;
- }
- }
- // if none is found, create one
- if(window == nullptr) {
- window = createWindow();
- window->setProfile(profile(profileName));
- }
+ auto *p = new WebProfile(defaultProfile, this);
+ p->setRequestInterceptor(m_urlFilter.get());
+ connect(p, &WebProfile::downloadRequested, m_downloads.get(), &DownloadsWidget::addDownload);
+ WebProfile::setDefaultProfile(p);
}
+}
- Q_CHECK_PTR(window);
+void Browser::createSession(const QString &profileName, bool newWindow, const QStringList &urls)
+{
+ if(m_windows.isEmpty()) {
+ createWindow();
+ }
- if(urls.isEmpty()) {
- // no URLs were given
- window->newTab(QUrl::fromUserInput(m_config->value<std::string>("profile.homepage").value().c_str()));
+ auto *mainwindow = m_windows.last();
+ if(newWindow) {
+ QUrl firstUrl = WebProfile::defaultProfile()->homepage();
+ if(!urls.isEmpty())
+ firstUrl = QUrl::fromUserInput(urls.at(0));
+ auto *w = mainwindow->createSubWindow(firstUrl);
+ for(int i = 1; i < urls.count() - 1; i++) {
+ w->addTab(QUrl::fromUserInput(urls.at(i)));
+ }
} else {
for(const QString &url : urls) {
- window->newTab(QUrl::fromUserInput(url));
+ mainwindow->createTab(QUrl::fromUserInput(url));
}
}
-
- return window;
}
-std::shared_ptr<WebEngineProfile> Browser::profile(const QString &storageName)
+MainWindow *Browser::createWindow()
{
- if(m_profiles.contains(storageName)) {
- return m_profiles[storageName];
- }
-
- // profile with name storageName has not been loaded
- Q_ASSERT(m_config);
-
- const QString &path = QString::fromStdString(m_config->value<std::string>("profile.path").value());
- std::shared_ptr<WebEngineProfile> _profile;
+ // the window will delete itself when it closes, so we don't need to delete it
+ MainWindow *window = new MainWindow(m_config);
+ window->createSubWindow(WebProfile::defaultProfile()->newtab());
- if(storageName.isEmpty()) {
- // create off-the-record profile
- _profile = std::make_shared<WebEngineProfile>(nullptr);
- _profile->loadProfile(m_config->section("profile"), path + "/otr.ini");
- } else {
- // regular profile
- _profile = std::make_shared<WebEngineProfile>(storageName, nullptr);
- _profile->loadProfile(m_config->section("profile"), path + "/" + storageName + "/profile.ini");
- _profile->setPersistentStoragePath(path + "/storage");
- _profile->setCachePath(path + "/cache");
- }
+ auto *bookmarksAction = new QAction(tr("Bookmarks"), window);
+ bookmarksAction->setShortcut(QKeySequence(QString::fromStdString(m_config->value<std::string>("bookmarks.shortcut").value())));
+ connect(bookmarksAction, &QAction::triggered, window, [this, window]() {
+ window->addDockWidget(Qt::RightDockWidgetArea, m_bookmarks.get());
+ });
+ window->addAction(MainWindow::ToolsMenu, bookmarksAction);
- _profile->setRequestInterceptor(m_urlRequestInterceptor);
+ auto *downloadsAction = new QAction(tr("Downloads"), window);
+ downloadsAction->setShortcut(QKeySequence(QString::fromStdString(m_config->value<std::string>("downloads.shortcut").value())));
+ connect(downloadsAction, &QAction::triggered, window, [this, window]() {
+ window->addDockWidget(Qt::RightDockWidgetArea, m_downloads.get());
+ });
+ window->addAction(MainWindow::ToolsMenu, downloadsAction);
- connect(_profile.get(), &WebEngineProfile::downloadRequested, m_downloadManager.get(), &DownloadsWidget::addDownload);
+ m_windows.append(window);
+ connect(window, &MainWindow::destroyed, this, [this, window]() {
+ m_windows.removeOne(window);
+ });
- m_profiles.insert(storageName, _profile);
- return _profile;
+ return window;
}