19#include "ui_preferences.h"
57#include <QInputDialog>
61#include <QColorDialog>
62#include <QWebEngineProfile>
63#include <QWebEngineSettings>
64#include <QLibraryInfo>
65#include <QtWebEngineWidgetsVersion>
67static QString createLanguageItem(
const QString &lang)
71 if (
locale.language() == QLocale::C) {
75 const QString country = QLocale::countryToString(
locale.country());
76 const QString language = QLocale::languageToString(
locale.language());
78 if (lang == QLatin1String(
"es_ES")) {
79 return QString::fromUtf8(
"Castellano");
81 if (lang == QLatin1String(
"nqo")) {
82 return QSL(
"N'ko (nqo)");
84 if (lang == QLatin1String(
"sr")) {
85 return QString::fromUtf8(
"српски екавски");
87 if (lang == QLatin1String(
"sr@ijekavian")) {
88 return QString::fromUtf8(
"српски ијекавски");
90 if (lang == QLatin1String(
"sr@latin")) {
91 return QString::fromUtf8(
"srpski ekavski");
93 if (lang == QLatin1String(
"sr@ijekavianlatin")) {
94 return QString::fromUtf8(
"srpski ijekavski");
96 return QStringLiteral(
"%1, %2 (%3)").arg(language, country, lang);
103 , m_autoFillManager(nullptr)
104 , m_pluginsList(nullptr)
106 setAttribute(Qt::WA_DeleteOnClose);
110 m_themesManager =
new ThemeManager(ui->themesWidget,
this);
112 ui->pluginsFrame->addWidget(m_pluginsList);
114#ifdef DISABLE_CHECK_UPDATES
115 ui->checkUpdates->setVisible(
false);
119 auto setCategoryIcon = [
this](
int index,
const QIcon &icon) {
120 ui->listWidget->item(index)->setIcon(QIcon(icon.pixmap(32)));
123 setCategoryIcon(0, QIcon(QStringLiteral(
":/icons/preferences/general.svg")));
124 setCategoryIcon(1, QIcon(QStringLiteral(
":/icons/preferences/appearance.svg")));
125 setCategoryIcon(2, QIcon(QStringLiteral(
":/icons/preferences/tabs.svg")));
126 setCategoryIcon(3, QIcon(QStringLiteral(
":/icons/preferences/browsing.svg")));
127 setCategoryIcon(4, QIcon(QStringLiteral(
":/icons/preferences/fonts.svg")));
128 setCategoryIcon(5, QIcon(QStringLiteral(
":/icons/preferences/shortcuts.svg")));
129 setCategoryIcon(6, QIcon(QStringLiteral(
":/icons/preferences/downloads.svg")));
130 setCategoryIcon(7, QIcon(QStringLiteral(
":/icons/preferences/passwords.svg")));
131 setCategoryIcon(8, QIcon(QStringLiteral(
":/icons/preferences/privacy.svg")));
132 setCategoryIcon(9, QIcon(QStringLiteral(
":/icons/preferences/notifications.svg")));
133 setCategoryIcon(10, QIcon(QStringLiteral(
":/icons/preferences/extensions.svg")));
134 setCategoryIcon(11, QIcon(QStringLiteral(
":/icons/preferences/spellcheck.svg")));
135 setCategoryIcon(12, QIcon(QStringLiteral(
":/icons/preferences/other.svg")));
140 m_homepage = settings.
value(
QSL(
"homepage"), QUrl(
QSL(
"falkon:start"))).toUrl();
141 m_newTabUrl = settings.
value(
QSL(
"newTabUrl"), QUrl(
QSL(
"falkon:speeddial"))).toUrl();
142 ui->homepage->setText(QString::fromUtf8(m_homepage.toEncoded()));
143 ui->newTabUrl->setText(QString::fromUtf8(m_newTabUrl.toEncoded()));
145 ui->afterLaunch->setCurrentIndex(
mApp->afterLaunch());
146 ui->checkUpdates->setChecked(settings.
value(
QSL(
"Web-Browser-Settings/CheckUpdates"),
true).toBool());
147 ui->dontLoadTabsUntilSelected->setChecked(settings.
value(
QSL(
"Web-Browser-Settings/LoadTabsOnActivation"),
true).toBool());
149#if defined(Q_OS_WIN) && !defined(Q_OS_OS2)
150 if (!
mApp->isPortable()) {
151 ui->checkDefaultBrowser->setChecked(settings.
value(
QSL(
"Web-Browser-Settings/CheckDefaultBrowser"),
153 if (
mApp->associationManager()->isDefaultForAllCapabilities()) {
154 ui->checkNowDefaultBrowser->setText(tr(
"Default"));
155 ui->checkNowDefaultBrowser->setEnabled(
false);
158 ui->checkNowDefaultBrowser->setText(tr(
"Set as default"));
159 ui->checkNowDefaultBrowser->setEnabled(
true);
160 connect(ui->checkNowDefaultBrowser, SIGNAL(clicked()),
this, SLOT(makeFalkonDefault()));
164 ui->checkDefaultBrowser->hide();
165 ui->checkNowDefaultBrowser->hide();
168 ui->hSpacerDefaultBrowser->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Fixed);
169 ui->hLayoutDefaultBrowser->invalidate();
170 delete ui->hLayoutDefaultBrowser;
171 delete ui->checkDefaultBrowser;
172 delete ui->checkNowDefaultBrowser;
175 ui->newTabFrame->setVisible(
false);
176 if (m_newTabUrl.isEmpty() || m_newTabUrl.toString() ==
QL1S(
"about:blank")) {
177 ui->newTab->setCurrentIndex(0);
179 else if (m_newTabUrl == m_homepage) {
180 ui->newTab->setCurrentIndex(1);
182 else if (m_newTabUrl.toString() ==
QL1S(
"falkon:speeddial")) {
183 ui->newTab->setCurrentIndex(2);
186 ui->newTab->setCurrentIndex(3);
187 ui->newTabFrame->setVisible(
true);
190 afterLaunchChanged(ui->afterLaunch->currentIndex());
191 connect(ui->afterLaunch, SIGNAL(currentIndexChanged(
int)),
this, SLOT(afterLaunchChanged(
int)));
192 connect(ui->newTab, SIGNAL(currentIndexChanged(
int)),
this, SLOT(newTabChanged(
int)));
194 connect(ui->useCurrentBut, &QAbstractButton::clicked,
this, &Preferences::useActualHomepage);
195 connect(ui->newTabUseCurrent, &QAbstractButton::clicked,
this, &Preferences::useActualNewTab);
198 ui->useCurrentBut->setEnabled(
false);
199 ui->newTabUseCurrent->setEnabled(
false);
205 ui->startProfile->addItem(startingProfile);
208 for (
const QString &name : names) {
209 if (startingProfile != name) {
210 ui->startProfile->addItem(name);
214 connect(ui->createProfile, &QAbstractButton::clicked,
this, &Preferences::createProfile);
215 connect(ui->deleteProfile, &QAbstractButton::clicked,
this, &Preferences::deleteProfile);
216 connect(ui->startProfile, SIGNAL(currentIndexChanged(
int)),
this, SLOT(startProfileIndexChanged(
int)));
217 startProfileIndexChanged(ui->startProfile->currentIndex());
221 ui->showStatusbar->setChecked(settings.
value(
QSL(
"showStatusBar"),
false).toBool());
223 ui->instantBookmarksToolbar->setChecked(settings.
value(
QSL(
"instantBookmarksToolbar"),
false).toBool());
224 ui->showBookmarksToolbar->setChecked(settings.
value(
QSL(
"showBookmarksToolbar"),
false).toBool());
225 ui->instantBookmarksToolbar->setDisabled(settings.
value(
QSL(
"showBookmarksToolbar"),
false).toBool());
226 ui->showBookmarksToolbar->setDisabled(settings.
value(
QSL(
"instantBookmarksToolbar")).toBool());
227 connect(ui->instantBookmarksToolbar, &QAbstractButton::toggled, ui->showBookmarksToolbar, &QWidget::setDisabled);
228 connect(ui->showBookmarksToolbar, &QAbstractButton::toggled, ui->instantBookmarksToolbar, &QWidget::setDisabled);
229 ui->showNavigationToolbar->setChecked(settings.
value(
QSL(
"showNavigationToolbar"),
true).toBool());
230 int currentSettingsPage = settings.
value(
QSL(
"settingsDialogPage"), 0).toInt(
nullptr);
235 ui->hideTabsOnTab->setChecked(settings.
value(
QSL(
"hideTabsWithOneTab"),
false).toBool());
236 ui->activateLastTab->setChecked(settings.
value(
QSL(
"ActivateLastTabWhenClosingActual"),
false).toBool());
237 ui->openNewTabAfterActive->setChecked(settings.
value(
QSL(
"newTabAfterActive"),
true).toBool());
238 ui->openNewEmptyTabAfterActive->setChecked(settings.
value(
QSL(
"newEmptyTabAfterActive"),
false).toBool());
239 ui->openPopupsInTabs->setChecked(settings.
value(
QSL(
"OpenPopupsInTabs"),
false).toBool());
240 ui->alwaysSwitchTabsWithWheel->setChecked(settings.
value(
QSL(
"AlwaysSwitchTabsWithWheel"),
false).toBool());
241 ui->switchToNewTabs->setChecked(settings.
value(
QSL(
"OpenNewTabsSelected"),
false).toBool());
242 ui->dontCloseOnLastTab->setChecked(settings.
value(
QSL(
"dontCloseWithOneTab"),
false).toBool());
243 ui->askWhenClosingMultipleTabs->setChecked(settings.
value(
QSL(
"AskOnClosing"),
false).toBool());
244 ui->showClosedTabsButton->setChecked(settings.
value(
QSL(
"showClosedTabsButton"),
false).toBool());
245 ui->showCloseOnInactive->setCurrentIndex(settings.
value(
QSL(
"showCloseOnInactiveTabs"), 0).toInt());
250 ui->addressbarCompletion->setCurrentIndex(settings.
value(
QSL(
"showSuggestions"), 0).toInt());
251 ui->useInlineCompletion->setChecked(settings.
value(
QSL(
"useInlineCompletion"),
true).toBool());
252 ui->completionShowSwitchTab->setChecked(settings.
value(
QSL(
"showSwitchTab"),
true).toBool());
253 ui->alwaysShowGoIcon->setChecked(settings.
value(
QSL(
"alwaysShowGoIcon"),
false).toBool());
254 ui->showZoomLabel->setChecked(settings.
value(
QSL(
"showZoomLabel"),
true).toBool());
255 ui->selectAllOnFocus->setChecked(settings.
value(
QSL(
"SelectAllTextOnDoubleClick"),
true).toBool());
256 ui->selectAllOnClick->setChecked(settings.
value(
QSL(
"SelectAllTextOnClick"),
false).toBool());
257 ui->completionPopupExpandToWindow->setChecked(settings.
value(
QSL(
"CompletionPopupExpandToWindow"),
false).toBool());
258 bool showPBinAB = settings.
value(
QSL(
"ShowLoadingProgress"),
false).toBool();
259 ui->showLoadingInAddressBar->setChecked(showPBinAB);
260 ui->adressProgressSettings->setEnabled(showPBinAB);
261 ui->progressStyleSelector->setCurrentIndex(settings.
value(
QSL(
"ProgressStyle"), 0).toInt());
262 bool pbInABuseCC = settings.
value(
QSL(
"UseCustomProgressColor"),
false).toBool();
263 ui->checkBoxCustomProgressColor->setChecked(pbInABuseCC);
264 ui->progressBarColorSelector->setEnabled(pbInABuseCC);
265 QColor pbColor = settings.
value(
QSL(
"CustomProgressColor"), palette().color(QPalette::Highlight)).value<QColor>();
266 setProgressBarColorIcon(pbColor);
267 connect(ui->customColorToolButton, &QAbstractButton::clicked,
this, &Preferences::selectCustomProgressBarColor);
268 connect(ui->resetProgressBarcolor, SIGNAL(clicked()), SLOT(setProgressBarColorIcon()));
272 bool searchFromAB = settings.
value(
QSL(
"SearchFromAddressBar"),
true).toBool();
273 ui->searchFromAddressBar->setChecked(searchFromAB);
274 ui->searchWithDefaultEngine->setEnabled(searchFromAB);
275 ui->searchWithDefaultEngine->setChecked(settings.
value(
QSL(
"SearchWithDefaultEngine"),
true).toBool());
276 ui->showABSearchSuggestions->setEnabled(searchFromAB);
277 ui->showABSearchSuggestions->setChecked(settings.
value(
QSL(
"showSearchSuggestions"),
true).toBool());
278 connect(ui->searchFromAddressBar, &QAbstractButton::toggled,
this, &Preferences::searchFromAddressBarChanged);
283 ui->allowPlugins->setChecked(settings.
value(
QSL(
"allowPlugins"),
true).toBool());
284 connect(ui->allowPlugins, &QAbstractButton::toggled,
this, &Preferences::allowPluginsToggled);
285 ui->allowJavaScript->setChecked(settings.
value(
QSL(
"allowJavaScript"),
true).toBool());
286 ui->linksInFocusChain->setChecked(settings.
value(
QSL(
"IncludeLinkInFocusChain"),
false).toBool());
287 ui->spatialNavigation->setChecked(settings.
value(
QSL(
"SpatialNavigation"),
false).toBool());
288 ui->animateScrolling->setChecked(settings.
value(
QSL(
"AnimateScrolling"),
true).toBool());
289 ui->wheelScroll->setValue(settings.
value(
QSL(
"wheelScrollLines"), qApp->wheelScrollLines()).toInt());
290 ui->xssAuditing->setChecked(settings.
value(
QSL(
"XSSAuditing"),
false).toBool());
291 ui->printEBackground->setChecked(settings.
value(
QSL(
"PrintElementBackground"),
true).toBool());
292 ui->useNativeScrollbars->setChecked(settings.
value(
QSL(
"UseNativeScrollbars"),
false).toBool());
293 ui->disableVideoAutoPlay->setChecked(settings.
value(
QSL(
"DisableVideoAutoPlay"),
false).toBool());
294 ui->webRTCPublicIpOnly->setChecked(settings.
value(
QSL(
"WebRTCPublicIpOnly"),
true).toBool());
295 ui->dnsPrefetch->setChecked(settings.
value(
QSL(
"DNSPrefetch"),
true).toBool());
296 ui->intPDFViewer->setChecked(settings.
value(
QSL(
"intPDFViewer"),
false).toBool());
297 ui->intPDFViewer->setEnabled(ui->allowPlugins->isChecked());
298 ui->screenCaptureEnabled->setChecked(settings.
value(
QSL(
"screenCaptureEnabled"),
false).toBool());
299 ui->hardwareAccel->setChecked(settings.
value(
QSL(
"hardwareAccel"),
false).toBool());
300#if QTWEBENGINECORE_VERSION >= QT_VERSION_CHECK(6, 6, 0)
301 ui->readingFromCanvasEnabled->setChecked(settings.
value(
QSL(
"readingFromCanvasEnabled"),
true).toBool());
303 ui->readingFromCanvasEnabled->hide();
305#if QTWEBENGINECORE_VERSION >= QT_VERSION_CHECK(6, 7, 0)
306 ui->forceDarkMode->setChecked(settings.
value(
QSL(
"forceDarkMode"),
false).toBool());
308 ui->forceDarkMode->hide();
312 for (
int level : levels) {
313 ui->defaultZoomLevel->addItem(tr(
"%1%").arg(QString::number(level)));
316 ui->closeAppWithCtrlQ->setChecked(settings.
value(
QSL(
"closeAppWithCtrlQ"),
true).toBool());
319 ui->allowCache->setChecked(settings.
value(
QSL(
"AllowLocalCache"),
true).toBool());
320 ui->removeCache->setChecked(settings.
value(
QSL(
"deleteCacheOnClose"),
false).toBool());
321 ui->cacheMB->setValue(settings.
value(
QSL(
"LocalCacheSize"), 50).toInt());
322 ui->cachePath->setText(settings.
value(
QSL(
"CachePath"),
mApp->webProfile()->cachePath()).toString());
323 connect(ui->allowCache, &QAbstractButton::clicked,
this, &Preferences::allowCacheChanged);
324 connect(ui->changeCachePath, &QAbstractButton::clicked,
this, &Preferences::changeCachePathClicked);
325 allowCacheChanged(ui->allowCache->isChecked());
328 ui->allowPassManager->setChecked(settings.
value(
QSL(
"SavePasswordsOnSites"),
true).toBool());
329 ui->autoCompletePasswords->setChecked(settings.
value(
QSL(
"AutoCompletePasswords"),
true).toBool());
333 ui->saveHistory->setChecked(settings.
value(
QSL(
"allowHistory"),
true).toBool());
334 ui->deleteHistoryOnClose->setChecked(settings.
value(
QSL(
"deleteHistoryOnClose"),
false).toBool());
335 if (!ui->saveHistory->isChecked()) {
336 ui->deleteHistoryOnClose->setEnabled(
false);
338 connect(ui->saveHistory, &QAbstractButton::toggled,
this, &Preferences::saveHistoryChanged);
343 auto* listItem =
new QListWidgetItem(ui->siteSettingsList);
346 ui->siteSettingsList->setItemWidget(listItem, optionItem);
347 listItem->setSizeHint(optionItem->sizeHint());
352 auto* listItem =
new QListWidgetItem(ui->siteSettingsHtml5List);
355 ui->siteSettingsHtml5List->setItemWidget(listItem, optionItem);
356 listItem->setSizeHint(optionItem->sizeHint());
360 ui->html5storage->setChecked(settings.
value(
QSL(
"HTML5StorageEnabled"),
true).toBool());
361 ui->deleteHtml5storageOnClose->setChecked(settings.
value(
QSL(
"deleteHTML5StorageOnClose"),
false).toBool());
362 connect(ui->html5storage, &QAbstractButton::toggled,
this, &Preferences::allowHtml5storageChanged);
364 ui->doNotTrack->setChecked(settings.
value(
QSL(
"DoNotTrack"),
false).toBool());
367 ui->userStyleSheet->setText(settings.
value(
QSL(
"userStyleSheet"),
QSL(
"")).toString());
368 connect(ui->chooseUserStylesheet, &QAbstractButton::clicked,
this, &Preferences::chooseUserStyleClicked);
373 ui->downLoc->setText(settings.
value(
QSL(
"defaultDownloadPath"),
QSL(
"")).toString());
374 ui->closeDownManOnFinish->setChecked(settings.
value(
QSL(
"CloseManagerOnFinish"),
false).toBool());
375 if (ui->downLoc->text().isEmpty()) {
376 ui->askEverytime->setChecked(
true);
379 ui->useDefined->setChecked(
true);
381 ui->useExternalDownManager->setChecked(settings.
value(
QSL(
"UseExternalManager"),
false).toBool());
382 ui->externalDownExecutable->setText(settings.
value(
QSL(
"ExternalManagerExecutable"),
QSL(
"")).toString());
383 ui->externalDownArguments->setText(settings.
value(
QSL(
"ExternalManagerArguments"),
QSL(
"")).toString());
385 connect(ui->useExternalDownManager, &QAbstractButton::toggled,
this, &Preferences::useExternalDownManagerChanged);
388 connect(ui->useDefined, &QAbstractButton::toggled,
this, &Preferences::downLocChanged);
389 connect(ui->downButt, &QAbstractButton::clicked,
this, &Preferences::chooseDownPath);
390 connect(ui->chooseExternalDown, &QAbstractButton::clicked,
this, &Preferences::chooseExternalDownloadManager);
391 downLocChanged(ui->useDefined->isChecked());
392 useExternalDownManagerChanged(ui->useExternalDownManager->isChecked());
397 QWebEngineSettings* webSettings =
mApp->webSettings();
398 auto defaultFont = [&](QWebEngineSettings::FontFamily font) ->
const QString {
399 const QString family = webSettings->fontFamily(font);
400 if (!family.isEmpty())
403 case QWebEngineSettings::FixedFont:
404 return QFontDatabase::systemFont(QFontDatabase::FixedFont).family();
405 case QWebEngineSettings::SerifFont:
408 return QFontDatabase::systemFont(QFontDatabase::GeneralFont).family();
411 ui->fontStandard->setCurrentFont(QFont(settings.
value(
QSL(
"StandardFont"), defaultFont(QWebEngineSettings::StandardFont)).toString()));
412 ui->fontCursive->setCurrentFont(QFont(settings.
value(
QSL(
"CursiveFont"), defaultFont(QWebEngineSettings::CursiveFont)).toString()));
413 ui->fontFantasy->setCurrentFont(QFont(settings.
value(
QSL(
"FantasyFont"), defaultFont(QWebEngineSettings::FantasyFont)).toString()));
414 ui->fontFixed->setCurrentFont(QFont(settings.
value(
QSL(
"FixedFont"), defaultFont(QWebEngineSettings::FixedFont)).toString()));
415 ui->fontSansSerif->setCurrentFont(QFont(settings.
value(
QSL(
"SansSerifFont"), defaultFont(QWebEngineSettings::SansSerifFont)).toString()));
416 ui->fontSerif->setCurrentFont(QFont(settings.
value(
QSL(
"SerifFont"), defaultFont(QWebEngineSettings::SerifFont)).toString()));
417 ui->sizeDefault->setValue(settings.
value(
QSL(
"DefaultFontSize"), webSettings->fontSize(QWebEngineSettings::DefaultFontSize)).toInt());
418 ui->sizeFixed->setValue(settings.
value(
QSL(
"FixedFontSize"), webSettings->fontSize(QWebEngineSettings::DefaultFixedFontSize)).toInt());
419 ui->sizeMinimum->setValue(settings.
value(
QSL(
"MinimumFontSize"), webSettings->fontSize(QWebEngineSettings::MinimumFontSize)).toInt());
420 ui->sizeMinimumLogical->setValue(settings.
value(
QSL(
"MinimumLogicalFontSize"), webSettings->fontSize(QWebEngineSettings::MinimumLogicalFontSize)).toInt());
425 ui->switchTabsAlt->setChecked(settings.
value(
QSL(
"useTabNumberShortcuts"),
true).toBool());
426 ui->loadSpeedDialsCtrl->setChecked(settings.
value(
QSL(
"useSpeedDialNumberShortcuts"),
true).toBool());
427 ui->singleKeyShortcuts->setChecked(settings.
value(
QSL(
"useSingleKeyShortcuts"),
false).toBool());
431 ui->useNativeSystemNotifications->setEnabled(
mApp->desktopNotifications()->supportsNativeNotifications());
435 ui->notificationTimeout->setValue(settings.
value(
QSL(
"Timeout"), 6000).toInt() / 1000);
436#if defined(Q_OS_UNIX) && !defined(DISABLE_DBUS)
442 ui->useNativeSystemNotifications->setChecked(
true);
445 ui->useOSDNotifications->setChecked(
true);
448 connect(ui->notificationPreview, &QPushButton::clicked,
this, &Preferences::showNotificationPreview);
450 ui->doNotUseNotifications->setChecked(!settings.
value(
QSL(
"Enabled"),
true).toBool());
451 m_notifPosition = settings.
value(
QSL(
"Position"), QPoint(10, 10)).toPoint();
456 ui->spellcheckEnabled->setChecked(settings.
value(
QSL(
"Enabled"),
false).toBool());
457 const QStringList spellcheckLanguages = settings.
value(
QSL(
"Languages")).toStringList();
460 auto updateSpellCheckEnabled = [
this]() {
461 ui->spellcheckLanguages->setEnabled(ui->spellcheckEnabled->isChecked());
462 ui->spellcheckNoLanguages->setEnabled(ui->spellcheckEnabled->isChecked());
464 updateSpellCheckEnabled();
465 connect(ui->spellcheckEnabled, &QCheckBox::toggled,
this, updateSpellCheckEnabled);
467 QStringList dictionariesDirs = {};
468 const QByteArray qtWeDictionariesDirs = qgetenv(
"QTWEBENGINE_DICTIONARIES_PATH");
469 if (!qtWeDictionariesDirs.isNull()) {
470 dictionariesDirs.append(QDir::cleanPath(QString::fromLocal8Bit(qtWeDictionariesDirs)));
474 dictionariesDirs.append(QDir::cleanPath(QCoreApplication::applicationDirPath() +
QL1S(
"/../Resources/qtwebengine_dictionaries")));
475 dictionariesDirs.append(QDir::cleanPath(QCoreApplication::applicationDirPath() +
QL1S(
"/../Frameworks/QtWebEngineCore.framework/Resources/qtwebengine_dictionaries")));
477 dictionariesDirs.append(QDir::cleanPath(QCoreApplication::applicationDirPath() +
QL1S(
"/qtwebengine_dictionaries")));
478 dictionariesDirs.append(QDir::cleanPath(QLibraryInfo::location(QLibraryInfo::DataPath) +
QL1S(
"/qtwebengine_dictionaries")));
481 dictionariesDirs.removeDuplicates();
483 ui->spellcheckDirectories->setText(dictionariesDirs.join(
QL1C(
'\n')));
485 for (
const QString &path : dictionariesDirs) {
487 const QStringList files = dir.entryList({
QSL(
"*.bdic")});
488 for (
const QString &file : files) {
489 const QString lang = file.left(file.size() - 5);
490 const QString langName = createLanguageItem(lang);
491 if (!ui->spellcheckLanguages->findItems(langName, Qt::MatchExactly).isEmpty()) {
494 auto *item =
new QListWidgetItem;
495 item->setText(langName);
496 item->setData(Qt::UserRole, lang);
497 item->setFlags(item->flags() & ~Qt::ItemIsSelectable);
498 item->setCheckState(Qt::Unchecked);
499 ui->spellcheckLanguages->addItem(item);
504 for (
const QString &lang : spellcheckLanguages) {
505 const auto items = ui->spellcheckLanguages->findItems(createLanguageItem(lang), Qt::MatchExactly);
506 if (items.isEmpty()) {
509 QListWidgetItem *item = items.at(0);
510 ui->spellcheckLanguages->takeItem(ui->spellcheckLanguages->row(item));
511 ui->spellcheckLanguages->insertItem(topIndex++, item);
512 item->setCheckState(Qt::Checked);
515 if (ui->spellcheckLanguages->count() == 0) {
516 ui->spellcheckLanguages->hide();
518 ui->spellcheckNoLanguages->hide();
523 int proxyType = settings.
value(
QSL(
"ProxyType"), 2).toInt();
524 if (proxyType == 0) {
525 ui->noProxy->setChecked(
true);
526 }
else if (proxyType == 2) {
527 ui->systemProxy->setChecked(
true);
528 }
else if (proxyType == 3) {
529 ui->manualProxy->setChecked(
true);
530 ui->proxyType->setCurrentIndex(0);
532 ui->manualProxy->setChecked(
true);
533 ui->proxyType->setCurrentIndex(1);
536 ui->proxyServer->setText(settings.
value(
QSL(
"HostName"),
QSL(
"")).toString());
537 ui->proxyPort->setText(settings.
value(
QSL(
"Port"), 8080).toString());
538 ui->proxyUsername->setText(settings.
value(
QSL(
"Username"),
QSL(
"")).toString());
539 ui->proxyPassword->setText(settings.
value(
QSL(
"Password"),
QSL(
"")).toString());
542 setManualProxyConfigurationEnabled(ui->manualProxy->isChecked());
543 connect(ui->manualProxy, &QAbstractButton::toggled,
this, &Preferences::setManualProxyConfigurationEnabled);
546 connect(ui->buttonBox, &QDialogButtonBox::clicked,
this, &Preferences::buttonClicked);
547 connect(ui->cookieManagerBut, &QAbstractButton::clicked,
this, &Preferences::showCookieManager);
548 connect(ui->preferredLanguages, &QAbstractButton::clicked,
this, &Preferences::showAcceptLanguage);
549 connect(ui->deleteHtml5storage, &QAbstractButton::clicked,
this, &Preferences::deleteHtml5storage);
550 connect(ui->uaManager, &QAbstractButton::clicked,
this, &Preferences::openUserAgentManager);
551 connect(ui->jsOptionsButton, &QAbstractButton::clicked,
this, &Preferences::openJsOptions);
552 connect(ui->searchEngines, &QAbstractButton::clicked,
this, &Preferences::openSearchEnginesManager);
553 connect(ui->certificateManager, &QAbstractButton::clicked,
this, &Preferences::openCertificateManager);
554 connect(ui->protocolHandlers, &QAbstractButton::clicked,
this, &Preferences::openProtocolHandlersManager);
555 connect(ui->customSchemes, &QAbstractButton::clicked,
this, &Preferences::openSchemesManager);
557 connect(ui->listWidget, &QListWidget::currentItemChanged,
this, &Preferences::showStackedPage);
558 ui->listWidget->itemAt(5, 5)->setSelected(
true);
560 ui->listWidget->setCurrentRow(currentSettingsPage);
563 const QRect &availableGeometryForScreen = screen()->availableGeometry();
564 if (availableGeometryForScreen.size().width() < s.width()) {
565 s.setWidth(availableGeometryForScreen.size().width() - 50);
567 if (availableGeometryForScreen.size().height() < s.height()) {
568 s.setHeight(availableGeometryForScreen.size().height() - 50);
573 restoreGeometry(settings.
value(
QSL(
"Geometry")).toByteArray());
579void Preferences::allowPluginsToggled(
bool checked)
581 ui->intPDFViewer->setEnabled(checked);
584void Preferences::chooseExternalDownloadManager()
586 QString path =
QzTools::getOpenFileName(
QSL(
"Preferences-ExternalDownloadManager"),
this, tr(
"Choose executable location..."), QDir::homePath());
587 if (path.isEmpty()) {
591 ui->externalDownExecutable->setText(path);
594void Preferences::showStackedPage(QListWidgetItem* item)
600 int index = ui->listWidget->currentRow();
602 ui->caption->setText(
QSL(
"<b>") + item->text() +
QSL(
"</b>"));
603 ui->stackedWidget->setCurrentIndex(index);
605 if (m_notification) {
606 m_notifPosition = m_notification.data()->pos();
607 delete m_notification.data();
611 m_pluginsList->
load();
614 if (index == 7 && !m_autoFillManager) {
616 ui->autoFillFrame->addWidget(m_autoFillManager);
620void Preferences::showNotificationPreview()
622 if (ui->useOSDNotifications->isChecked()) {
623 if (m_notification) {
624 m_notifPosition = m_notification.data()->pos();
625 delete m_notification.data();
629 m_notification.data()->setHeading(tr(
"OSD Notification"));
630 m_notification.data()->setText(tr(
"Drag it on the screen to place it where you want."));
631 m_notification.data()->move(m_notifPosition);
632 m_notification.data()->show();
634 else if (ui->useNativeSystemNotifications->isChecked()) {
635 mApp->desktopNotifications()->nativeNotificationPreview();
639void Preferences::makeFalkonDefault()
641#if defined(Q_OS_WIN) && !defined(Q_OS_OS2)
642 disconnect(ui->checkNowDefaultBrowser, SIGNAL(clicked()),
this, SLOT(makeFalkonDefault()));
643 ui->checkNowDefaultBrowser->setText(tr(
"Default"));
644 ui->checkNowDefaultBrowser->setEnabled(
false);
646 if (!
mApp->associationManager()->showNativeDefaultAppSettingsUi())
647 mApp->associationManager()->registerAllAssociation();
651void Preferences::allowCacheChanged(
bool state)
653 ui->removeCache->setEnabled(
state);
654 ui->maxCacheLabel->setEnabled(
state);
655 ui->cacheMB->setEnabled(
state);
656 ui->storeCacheLabel->setEnabled(
state);
657 ui->cachePath->setEnabled(
state);
658 ui->changeCachePath->setEnabled(
state);
661void Preferences::useActualHomepage()
666 ui->homepage->setText(m_window->
weView()->url().toString());
669void Preferences::useActualNewTab()
674 ui->newTabUrl->setText(m_window->
weView()->url().toString());
677void Preferences::chooseDownPath()
680 if (userFileName.isEmpty()) {
684 userFileName.replace(QLatin1Char(
'\\'), QLatin1Char(
'/'));
686 userFileName += QLatin1Char(
'/');
688 ui->downLoc->setText(userFileName);
691void Preferences::chooseUserStyleClicked()
694 if (file.isEmpty()) {
697 ui->userStyleSheet->setText(file);
700void Preferences::deleteHtml5storage()
704 ui->deleteHtml5storage->setText(tr(
"Deleted"));
705 ui->deleteHtml5storage->setEnabled(
false);
708void Preferences::openUserAgentManager()
714void Preferences::downLocChanged(
bool state)
716 ui->downButt->setEnabled(
state);
717 ui->downLoc->setEnabled(
state);
720void Preferences::setManualProxyConfigurationEnabled(
bool state)
722 ui->proxyType->setEnabled(
state);
723 ui->proxyServer->setEnabled(
state);
724 ui->proxyPort->setEnabled(
state);
725 ui->proxyUsername->setEnabled(
state);
726 ui->proxyPassword->setEnabled(
state);
729void Preferences::searchFromAddressBarChanged(
bool stat)
731 ui->searchWithDefaultEngine->setEnabled(stat);
732 ui->showABSearchSuggestions->setEnabled(stat);
735void Preferences::saveHistoryChanged(
bool stat)
737 ui->deleteHistoryOnClose->setEnabled(stat);
740void Preferences::allowHtml5storageChanged(
bool stat)
742 ui->deleteHtml5storageOnClose->setEnabled(stat);
745void Preferences::showCookieManager()
751void Preferences::openJsOptions()
757void Preferences::useExternalDownManagerChanged(
bool state)
759 ui->externalDownExecutable->setEnabled(
state);
760 ui->externalDownArguments->setEnabled(
state);
761 ui->chooseExternalDown->setEnabled(
state);
764void Preferences::openSearchEnginesManager()
770void Preferences::openCertificateManager()
776void Preferences::openProtocolHandlersManager()
782void Preferences::openSchemesManager()
788void Preferences::showAcceptLanguage()
794void Preferences::newTabChanged(
int value)
796 ui->newTabFrame->setVisible(
value == 3);
799void Preferences::afterLaunchChanged(
int value)
801 ui->dontLoadTabsUntilSelected->setEnabled(
value == 3 ||
value == 4);
804void Preferences::changeCachePathClicked()
807 if (path.isEmpty()) {
811 ui->cachePath->setText(path);
814void Preferences::buttonClicked(QAbstractButton* button)
816 switch (ui->buttonBox->buttonRole(button)) {
817 case QDialogButtonBox::ApplyRole:
821 case QDialogButtonBox::RejectRole:
825 case QDialogButtonBox::AcceptRole:
835void Preferences::createProfile()
837 QString name = QInputDialog::getText(
this, tr(
"New Profile"), tr(
"Enter the new profile's name:"));
840 if (name.isEmpty()) {
847 QMessageBox::warning(
this, tr(
"Error!"), tr(
"This profile already exists!"));
852 QMessageBox::warning(
this, tr(
"Error!"), tr(
"Cannot create profile directory!"));
856 ui->startProfile->addItem(name);
857 ui->startProfile->setCurrentIndex(ui->startProfile->count() - 1);
860void Preferences::deleteProfile()
862 QString name = ui->startProfile->currentText();
863 QMessageBox::StandardButton button = QMessageBox::warning(
this, tr(
"Confirmation"),
864 tr(
"Are you sure you want to permanently delete \"%1\" profile? This action cannot be undone!").arg(name), QMessageBox::Yes | QMessageBox::No);
865 if (button != QMessageBox::Yes) {
871 ui->startProfile->removeItem(ui->startProfile->currentIndex());
874void Preferences::startProfileIndexChanged(
int index)
878 ui->deleteProfile->setEnabled(!current);
879 ui->cannotDeleteActiveProfileLabel->setText(current ? tr(
"Note: You cannot delete active profile.") : QString());
882void Preferences::closeEvent(QCloseEvent* event)
886 settings.
setValue(
QSL(
"settingsDialogPage"), ui->stackedWidget->currentIndex());
892void Preferences::saveSettings()
896 QUrl homepage = QUrl::fromUserInput(ui->homepage->text());
900 settings.
setValue(
QSL(
"afterLaunch"), ui->afterLaunch->currentIndex());
902 switch (ui->newTab->currentIndex()) {
912 settings.
setValue(
QSL(
"newTabUrl"), QUrl(
QSL(
"falkon:speeddial")));
916 settings.
setValue(
QSL(
"newTabUrl"), QUrl::fromUserInput(ui->newTabUrl->text()));
933 settings.
setValue(
QSL(
"showStatusBar"), ui->showStatusbar->isChecked());
934 settings.
setValue(
QSL(
"instantBookmarksToolbar"), ui->instantBookmarksToolbar->isChecked());
935 settings.
setValue(
QSL(
"showBookmarksToolbar"), ui->showBookmarksToolbar->isChecked());
936 settings.
setValue(
QSL(
"showNavigationToolbar"), ui->showNavigationToolbar->isChecked());
941 settings.
setValue(
QSL(
"hideTabsWithOneTab"), ui->hideTabsOnTab->isChecked());
942 settings.
setValue(
QSL(
"ActivateLastTabWhenClosingActual"), ui->activateLastTab->isChecked());
943 settings.
setValue(
QSL(
"newTabAfterActive"), ui->openNewTabAfterActive->isChecked());
944 settings.
setValue(
QSL(
"newEmptyTabAfterActive"), ui->openNewEmptyTabAfterActive->isChecked());
945 settings.
setValue(
QSL(
"OpenPopupsInTabs"), ui->openPopupsInTabs->isChecked());
946 settings.
setValue(
QSL(
"AlwaysSwitchTabsWithWheel"), ui->alwaysSwitchTabsWithWheel->isChecked());
947 settings.
setValue(
QSL(
"OpenNewTabsSelected"), ui->switchToNewTabs->isChecked());
948 settings.
setValue(
QSL(
"dontCloseWithOneTab"), ui->dontCloseOnLastTab->isChecked());
949 settings.
setValue(
QSL(
"AskOnClosing"), ui->askWhenClosingMultipleTabs->isChecked());
950 settings.
setValue(
QSL(
"showClosedTabsButton"), ui->showClosedTabsButton->isChecked());
951 settings.
setValue(
QSL(
"showCloseOnInactiveTabs"), ui->showCloseOnInactive->currentIndex());
956 if (ui->askEverytime->isChecked()) {
960 settings.
setValue(
QSL(
"defaultDownloadPath"), ui->downLoc->text());
962 settings.
setValue(
QSL(
"CloseManagerOnFinish"), ui->closeDownManOnFinish->isChecked());
963 settings.
setValue(
QSL(
"UseExternalManager"), ui->useExternalDownManager->isChecked());
964 settings.
setValue(
QSL(
"ExternalManagerExecutable"), ui->externalDownExecutable->text());
965 settings.
setValue(
QSL(
"ExternalManagerArguments"), ui->externalDownArguments->text());
971 settings.
setValue(
QSL(
"StandardFont"), ui->fontStandard->currentFont().family());
972 settings.
setValue(
QSL(
"CursiveFont"), ui->fontCursive->currentFont().family());
973 settings.
setValue(
QSL(
"FantasyFont"), ui->fontFantasy->currentFont().family());
974 settings.
setValue(
QSL(
"FixedFont"), ui->fontFixed->currentFont().family());
975 settings.
setValue(
QSL(
"SansSerifFont"), ui->fontSansSerif->currentFont().family());
976 settings.
setValue(
QSL(
"SerifFont"), ui->fontSerif->currentFont().family());
978 settings.
setValue(
QSL(
"DefaultFontSize"), ui->sizeDefault->value());
979 settings.
setValue(
QSL(
"FixedFontSize"), ui->sizeFixed->value());
980 settings.
setValue(
QSL(
"MinimumFontSize"), ui->sizeMinimum->value());
981 settings.
setValue(
QSL(
"MinimumLogicalFontSize"), ui->sizeMinimumLogical->value());
986 settings.
setValue(
QSL(
"useTabNumberShortcuts"), ui->switchTabsAlt->isChecked());
987 settings.
setValue(
QSL(
"useSpeedDialNumberShortcuts"), ui->loadSpeedDialsCtrl->isChecked());
988 settings.
setValue(
QSL(
"useSingleKeyShortcuts"), ui->singleKeyShortcuts->isChecked());
993 settings.
setValue(
QSL(
"allowPlugins"), ui->allowPlugins->isChecked());
994 settings.
setValue(
QSL(
"allowJavaScript"), ui->allowJavaScript->isChecked());
995 settings.
setValue(
QSL(
"IncludeLinkInFocusChain"), ui->linksInFocusChain->isChecked());
996 settings.
setValue(
QSL(
"SpatialNavigation"), ui->spatialNavigation->isChecked());
997 settings.
setValue(
QSL(
"AnimateScrolling"), ui->animateScrolling->isChecked());
998 settings.
setValue(
QSL(
"wheelScrollLines"), ui->wheelScroll->value());
999 settings.
setValue(
QSL(
"DoNotTrack"), ui->doNotTrack->isChecked());
1000 settings.
setValue(
QSL(
"CheckUpdates"), ui->checkUpdates->isChecked());
1001 settings.
setValue(
QSL(
"LoadTabsOnActivation"), ui->dontLoadTabsUntilSelected->isChecked());
1002 settings.
setValue(
QSL(
"DefaultZoomLevel"), ui->defaultZoomLevel->currentIndex());
1003 settings.
setValue(
QSL(
"XSSAuditing"), ui->xssAuditing->isChecked());
1004 settings.
setValue(
QSL(
"PrintElementBackground"), ui->printEBackground->isChecked());
1005 settings.
setValue(
QSL(
"closeAppWithCtrlQ"), ui->closeAppWithCtrlQ->isChecked());
1006 settings.
setValue(
QSL(
"UseNativeScrollbars"), ui->useNativeScrollbars->isChecked());
1007 settings.
setValue(
QSL(
"DisableVideoAutoPlay"), ui->disableVideoAutoPlay->isChecked());
1008 settings.
setValue(
QSL(
"WebRTCPublicIpOnly"), ui->webRTCPublicIpOnly->isChecked());
1009 settings.
setValue(
QSL(
"DNSPrefetch"), ui->dnsPrefetch->isChecked());
1010 settings.
setValue(
QSL(
"intPDFViewer"), ui->intPDFViewer->isChecked());
1011 settings.
setValue(
QSL(
"screenCaptureEnabled"), ui->screenCaptureEnabled->isChecked());
1012 settings.
setValue(
QSL(
"hardwareAccel"), ui->hardwareAccel->isChecked());
1013#if QTWEBENGINECORE_VERSION >= QT_VERSION_CHECK(6, 6, 0)
1014 settings.
setValue(
QSL(
"readingFromCanvasEnabled"), ui->readingFromCanvasEnabled->isChecked());
1016#if QTWEBENGINECORE_VERSION >= QT_VERSION_CHECK(6, 7, 0)
1017 settings.
setValue(
QSL(
"forceDarkMode"), ui->forceDarkMode->isChecked());
1020 settings.
setValue(
QSL(
"CheckDefaultBrowser"), ui->checkDefaultBrowser->isChecked());
1023 settings.
setValue(
QSL(
"AllowLocalCache"), ui->allowCache->isChecked());
1024 settings.
setValue(
QSL(
"deleteCacheOnClose"), ui->removeCache->isChecked());
1025 settings.
setValue(
QSL(
"LocalCacheSize"), ui->cacheMB->value());
1026 settings.
setValue(
QSL(
"CachePath"), ui->cachePath->text());
1028 settings.
setValue(
QSL(
"userStyleSheet"), ui->userStyleSheet->text());
1031 settings.
setValue(
QSL(
"SavePasswordsOnSites"), ui->allowPassManager->isChecked());
1032 settings.
setValue(
QSL(
"AutoCompletePasswords"), ui->autoCompletePasswords->isChecked());
1036 settings.
setValue(
QSL(
"allowHistory"), ui->saveHistory->isChecked());
1037 settings.
setValue(
QSL(
"deleteHistoryOnClose"), ui->deleteHistoryOnClose->isChecked());
1038 settings.
setValue(
QSL(
"HTML5StorageEnabled"), ui->html5storage->isChecked());
1039 settings.
setValue(
QSL(
"deleteHTML5StorageOnClose"), ui->deleteHtml5storageOnClose->isChecked());
1044 settings.
setValue(
QSL(
"Timeout"), ui->notificationTimeout->value() * 1000);
1045 settings.
setValue(
QSL(
"Enabled"), !ui->doNotUseNotifications->isChecked());
1046 settings.
setValue(
QSL(
"UseNativeDesktop"), ui->useNativeSystemNotifications->isChecked());
1047 settings.
setValue(
QSL(
"Position"), m_notification.data() ? m_notification.data()->pos() : m_notifPosition);
1052 settings.
setValue(
QSL(
"Enabled"), ui->spellcheckEnabled->isChecked());
1054 for (
int i = 0;
i < ui->spellcheckLanguages->count(); ++
i) {
1055 QListWidgetItem *item = ui->spellcheckLanguages->item(
i);
1056 if (item->checkState() == Qt::Checked) {
1057 languages.append(item->data(Qt::UserRole).toString());
1066 settings.
setValue(
QSL(
"showSuggestions"), ui->addressbarCompletion->currentIndex());
1067 settings.
setValue(
QSL(
"useInlineCompletion"), ui->useInlineCompletion->isChecked());
1068 settings.
setValue(
QSL(
"alwaysShowGoIcon"), ui->alwaysShowGoIcon->isChecked());
1069 settings.
setValue(
QSL(
"showZoomLabel"), ui->showZoomLabel->isChecked());
1070 settings.
setValue(
QSL(
"showSwitchTab"), ui->completionShowSwitchTab->isChecked());
1071 settings.
setValue(
QSL(
"SelectAllTextOnDoubleClick"), ui->selectAllOnFocus->isChecked());
1072 settings.
setValue(
QSL(
"SelectAllTextOnClick"), ui->selectAllOnClick->isChecked());
1073 settings.
setValue(
QSL(
"CompletionPopupExpandToWindow"), ui->completionPopupExpandToWindow->isChecked());
1074 settings.
setValue(
QSL(
"ShowLoadingProgress"), ui->showLoadingInAddressBar->isChecked());
1075 settings.
setValue(
QSL(
"ProgressStyle"), ui->progressStyleSelector->currentIndex());
1076 settings.
setValue(
QSL(
"UseCustomProgressColor"), ui->checkBoxCustomProgressColor->isChecked());
1077 settings.
setValue(
QSL(
"CustomProgressColor"), ui->customColorToolButton->property(
"ProgressColor").value<QColor>());
1081 settings.
setValue(
QSL(
"SearchFromAddressBar"), ui->searchFromAddressBar->isChecked());
1082 settings.
setValue(
QSL(
"SearchWithDefaultEngine"), ui->searchWithDefaultEngine->isChecked());
1083 settings.
setValue(
QSL(
"showSearchSuggestions"), ui->showABSearchSuggestions->isChecked());
1088 if (ui->noProxy->isChecked()) {
1090 }
else if (ui->systemProxy->isChecked()) {
1092 }
else if (ui->proxyType->currentIndex() == 0) {
1100 settings.
setValue(
QSL(
"HostName"), ui->proxyServer->text());
1101 settings.
setValue(
QSL(
"Port"), ui->proxyPort->text().toInt());
1102 settings.
setValue(
QSL(
"Username"), ui->proxyUsername->text());
1103 settings.
setValue(
QSL(
"Password"), ui->proxyPassword->text());
1109 for (
int i = 0;
i < ui->siteSettingsHtml5List->count(); ++
i) {
1110 auto *item =
static_cast<SiteSettingsHtml5Item*
>(ui->siteSettingsHtml5List->itemWidget(ui->siteSettingsHtml5List->item(
i)));
1111 settings.
setValue(
mApp->siteSettingsManager()->featureToSqlColumn(item->feature()), item->permission());
1117 m_pluginsList->
save();
1118 m_themesManager->
save();
1119 mApp->cookieJar()->loadSettings();
1120 mApp->siteSettingsManager()->loadSettings();
1121 mApp->history()->loadSettings();
1122 mApp->reloadSettings();
1123 mApp->desktopNotifications()->loadSettings();
1124 mApp->autoFill()->loadSettings();
1125 mApp->networkManager()->loadSettings();
1135 delete m_autoFillManager;
1136 delete m_pluginsList;
1137 delete m_notification.data();
1140void Preferences::setProgressBarColorIcon(QColor color)
1142 const int size = style()->pixelMetric(QStyle::PM_ToolBarIconSize);
1143 QPixmap pm(QSize(size, size));
1144 if (!color.isValid()) {
1145 color = palette().color(QPalette::Highlight);
1148 ui->customColorToolButton->setIcon(pm);
1149 ui->customColorToolButton->setProperty(
"ProgressColor", color);
1152void Preferences::selectCustomProgressBarColor()
1154 QColor newColor = QColorDialog::getColor(ui->customColorToolButton->property(
"ProgressColor").value<QColor>(),
this, tr(
"Select Color"));
1155 if (newColor.isValid()) {
1156 setProgressBarColorIcon(newColor);
TabbedWebView * weView() const
static void clearLocalStorage()
Preferences(BrowserWindow *window)
static QString startingProfile()
static QString currentProfile()
static int createProfile(const QString &profileName)
static QStringList availableProfiles()
static bool removeProfile(const QString &profileName)
static void setStartingProfile(const QString &profileName)
void beginGroup(const QString &prefix)
QVariant value(const QString &key, const QVariant &defaultValue=QVariant())
void setValue(const QString &key, const QVariant &defaultValue=QVariant())
static QList< int > zoomLevels()
int value(const QColor &c)
#define DEFAULT_CHECK_DEFAULTBROWSER
const QList< QWebEngineSettings::WebAttribute > supportedAttribute
const QList< QWebEnginePage::Feature > supportedFeatures