diff options
Diffstat (limited to 'src/webengine/webprofilemanager.cpp')
-rw-r--r-- | src/webengine/webprofilemanager.cpp | 147 |
1 files changed, 29 insertions, 118 deletions
diff --git a/src/webengine/webprofilemanager.cpp b/src/webengine/webprofilemanager.cpp index bdd10f0..785251b 100644 --- a/src/webengine/webprofilemanager.cpp +++ b/src/webengine/webprofilemanager.cpp @@ -7,28 +7,23 @@ */ #include "webprofilemanager.h" -#include "configuration.h" #include "webprofile.h" -#include <QFileInfo> -#include <QWebEngineSettings> -static WebProfileManager *s_instance = nullptr; +static WebProfileManager<false> *s_instance = nullptr; -auto WebProfileManager::instance() -> const WebProfileManager * +template <> +void WebProfileManager<false>::make_global() { - return s_instance; -} -void WebProfileManager::setInstance(WebProfileManager *ptr) -{ - s_instance = ptr; + if(s_instance == nullptr) { + s_instance = this; + } } -WebProfileManager::WebProfileManager(QObject *parent) - : QObject(parent) -{ -} +template <> +WebProfileManager<true>::~WebProfileManager() = default; -WebProfileManager::~WebProfileManager() +template <> +WebProfileManager<false>::~WebProfileManager() { for(Profile p : qAsConst(profiles)) { if(p.selfDestruct && p.settings != nullptr) { @@ -48,111 +43,30 @@ WebProfileManager::~WebProfileManager() } } -WebProfile *WebProfileManager::profile(const QString &id) const +template <> +WebProfile *WebProfileManager<true>::profile(const QString &id) const { - // Check if profile exists - if(profiles.contains(id)) { - return profiles.value(id).ptr; - } - - return nullptr; + return s_instance->profile(id); } -WebProfile *WebProfileManager::add(const QString &id, const QString &path, bool isOffTheRecord) +template <> +QStringList WebProfileManager<true>::idList() const { - if(profiles.contains(id)) { - return nullptr; - } - - Configuration conf; - Profile profile; - - if(!path.isEmpty()) - profile.settings = new QSettings(path, QSettings::IniFormat); - else - profile.settings = new QSettings; + return s_instance->idList(); +} - // QWebEngineCore cleans up profiles automatically, so no need to set parent - if(profile.settings->value("otr", isOffTheRecord).toBool()) { - // name parent - profile.ptr = new WebProfile(profile.settings->value("name", id).toString(), nullptr); - } else { - // storageName name parent - profile.ptr = new WebProfile(id, profile.settings->value("name", id).toString(), nullptr); +template <> +void WebProfileManager<false>::walk(std::function<void(const QString &id, WebProfile *profile, const QSettings *settings)> f) const +{ + for(auto iter = profiles.begin(); iter != profiles.end(); ++iter) { + f(iter.key(), iter.value().ptr, iter.value().settings); } - - profile.settings->setParent(profile.ptr); - - connect(profile.ptr, &WebProfile::nameChanged, profile.settings, [profile](const QString &name) { - profile.settings->setValue("name", name); - }); - - profile.ptr->setSearch(profile.settings->value("search", conf.value<QString>("profile.search").value()).toString()); - connect(profile.ptr, &WebProfile::searchChanged, profile.settings, [profile](const QString &url) { - profile.settings->setValue("search", url); - }); - - profile.ptr->setHomepage(profile.settings->value("homepage", conf.value<QString>("profile.homepage").value()).toUrl()); - connect(profile.ptr, &WebProfile::homepageChanged, profile.settings, [profile](const QUrl &url) { - profile.settings->setValue("homepage", url); - }); - - profile.ptr->setNewtab(profile.settings->value("newtab", conf.value<QString>("profile.newtab").value()).toUrl()); - connect(profile.ptr, &WebProfile::newtabChanged, profile.settings, [profile](const QUrl &url) { - profile.settings->setValue("newtab", url); - }); - - if(profile.settings != nullptr) { - profile.settings->beginGroup("properties"); - { - const auto keys = profile.settings->childKeys(); - for(const QString &key : keys) { - profile.ptr->setProperty(qUtf8Printable(key), profile.settings->value(key)); - } - } - profile.settings->endGroup(); // properties - connect(profile.ptr, &WebProfile::propertyChanged, [profile](const QString &property, const QVariant &value) { - profile.settings->setValue("properties/" + property, value); - }); - - profile.settings->beginGroup("attributes"); - { - const auto keys = profile.settings->childKeys(); - auto *settings = profile.ptr->settings(); - for(const QString &key : keys) { - auto attribute = static_cast<QWebEngineSettings::WebAttribute>(key.toInt()); - settings->setAttribute(attribute, profile.settings->value(key).toBool()); - } - } - profile.settings->endGroup(); - connect(profile.ptr, &WebProfile::attributeChanged, [profile](const QWebEngineSettings::WebAttribute attr, const bool value) { - profile.settings->setValue("attributes/" + QString::number(attr), value); - }); - - // headers - profile.settings->beginGroup("headers"); - for(const QString &key : profile.settings->childKeys()) { - profile.ptr->setHttpHeader(key.toLatin1(), profile.settings->value(key).toString().toLatin1()); - } - profile.settings->endGroup(); - connect(profile.ptr, &WebProfile::headerChanged, [profile](const QString &name, const QString &value) { - profile.settings->setValue("headers/" + name, value); - }); - connect(profile.ptr, &WebProfile::headerRemoved, [profile](const QString &name) { - profile.settings->remove("headers/" + name); - }); - - } // profile.settings != nullptr - - profiles[id] = profile; - return profile.ptr; } -void WebProfileManager::deleteProfile(const QString &id) +template <> +void WebProfileManager<true>::walk(std::function<void(const QString &id, WebProfile *profile, const QSettings *settings)> f) const { - if(profiles.contains(id)) { - profiles[id].selfDestruct = true; - } + s_instance->walk(f); } void profileMenu(QMenu *menu, const std::function<void(WebProfile *)> &callback, WebProfile *current, bool checkable) @@ -160,13 +74,10 @@ void profileMenu(QMenu *menu, const std::function<void(WebProfile *)> &callback, auto *group = new QActionGroup(menu); QObject::connect(menu, &QMenu::aboutToHide, group, &QActionGroup::deleteLater); - for(const auto &profile : qAsConst(s_instance->profiles)) { - auto *action = menu->addAction(profile.ptr->name(), profile.ptr, [profile, callback]() { - callback(profile.ptr); - }); + s_instance->walk([=](const QString &, WebProfile *profile, const QSettings *) { + auto *action = menu->addAction(profile->name(), profile, [=]() { callback(profile); }); action->setCheckable(checkable); - if(profile.ptr == current) - action->setChecked(true); + action->setChecked(profile == current); group->addAction(action); - } + }); } |