From d796821f8304306dbe088701724243b39e8eb358 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Mon, 16 Apr 2018 17:07:36 +0200 Subject: 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 --- src/browser.cpp | 180 ++++++++++++++++++++++---------------------------------- 1 file changed, 71 insertions(+), 109 deletions(-) (limited to 'src/browser.cpp') 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 -#include +#include "mainwindow/window.h" +#include "webengine/webprofile.h" +#include +#include #include #include +#include +#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 &config) { + Q_ASSERT(config); m_config = config; - - QDir pluginsDir(QString::fromStdString(m_config->value("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(QString::fromStdString(m_config->value("bookmarks.path").value())); - m_downloadManager = std::make_shared(QString::fromStdString(m_config->value("downloads.path").value())); - - m_urlRequestInterceptor = new UrlRequestInterceptor(QString::fromStdString(m_config->value("filter.path").value())); - - // set default profile - m_defaultProfile = profile(QString::fromStdString(m_config->value("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(QString::fromStdString(m_config->value("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(QString::fromStdString(m_config->value("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(QString::fromStdString(m_config->value("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("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 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("profile.path").value()); - std::shared_ptr _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(nullptr); - _profile->loadProfile(m_config->section("profile"), path + "/otr.ini"); - } else { - // regular profile - _profile = std::make_shared(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("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("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; } -- cgit v1.2.1