Falkon Develop
Cross-platform Qt-based web browser
preferences.cpp
Go to the documentation of this file.
1/* ============================================================
2* Falkon - Qt web browser
3* Copyright (C) 2010-2018 David Rosca <nowrep@gmail.com>
4*
5* This program is free software: you can redistribute it and/or modify
6* it under the terms of the GNU General Public License as published by
7* the Free Software Foundation, either version 3 of the License, or
8* (at your option) any later version.
9*
10* This program is distributed in the hope that it will be useful,
11* but WITHOUT ANY WARRANTY; without even the implied warranty of
12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13* GNU General Public License for more details.
14*
15* You should have received a copy of the GNU General Public License
16* along with this program. If not, see <http://www.gnu.org/licenses/>.
17* ============================================================ */
18#include "preferences.h"
19#include "ui_preferences.h"
20#include "browserwindow.h"
21#include "bookmarkstoolbar.h"
22#include "history.h"
23#include "tabwidget.h"
24#include "cookiejar.h"
25#include "locationbar.h"
26#include "autofillmanager.h"
27#include "mainapplication.h"
28#include "cookiemanager.h"
29#include "pluginproxy.h"
30#include "pluginsmanager.h"
31#include "jsoptions.h"
32#include "networkmanager.h"
34#include "desktopnotification.h"
35#include "thememanager.h"
36#include "acceptlanguage.h"
37#include "qztools.h"
38#include "autofill.h"
39#include "settings.h"
40#include "datapaths.h"
41#include "tabbedwebview.h"
42#include "clearprivatedata.h"
43#include "useragentdialog.h"
45#include "profilemanager.h"
46#include "certificatemanager.h"
47#include "searchenginesdialog.h"
48#include "webscrollbarmanager.h"
50#include "schememanager.h"
51#include "../config.h"
52#include "sitesettingsmanager.h"
55
56#include <QSettings>
57#include <QInputDialog>
58#include <QFileDialog>
59#include <QMessageBox>
60#include <QCloseEvent>
61#include <QColorDialog>
62#include <QWebEngineProfile>
63#include <QWebEngineSettings>
64#include <QLibraryInfo>
65#include <QtWebEngineWidgetsVersion>
66
67static QString createLanguageItem(const QString &lang)
68{
69 QLocale locale(lang);
70
71 if (locale.language() == QLocale::C) {
72 return lang;
73 }
74
75 const QString country = QLocale::countryToString(locale.country());
76 const QString language = QLocale::languageToString(locale.language());
77
78 if (lang == QLatin1String("es_ES")) {
79 return QString::fromUtf8("Castellano");
80 }
81 if (lang == QLatin1String("nqo")) {
82 return QSL("N'ko (nqo)");
83 }
84 if (lang == QLatin1String("sr")) {
85 return QString::fromUtf8("српски екавски");
86 }
87 if (lang == QLatin1String("sr@ijekavian")) {
88 return QString::fromUtf8("српски ијекавски");
89 }
90 if (lang == QLatin1String("sr@latin")) {
91 return QString::fromUtf8("srpski ekavski");
92 }
93 if (lang == QLatin1String("sr@ijekavianlatin")) {
94 return QString::fromUtf8("srpski ijekavski");
95 }
96 return QStringLiteral("%1, %2 (%3)").arg(language, country, lang);
97}
98
100 : QDialog(window)
101 , ui(new Ui::Preferences)
102 , m_window(window)
103 , m_autoFillManager(nullptr)
104 , m_pluginsList(nullptr)
105{
106 setAttribute(Qt::WA_DeleteOnClose);
107 ui->setupUi(this);
109
110 m_themesManager = new ThemeManager(ui->themesWidget, this);
111 m_pluginsList = new PluginsManager(this);
112 ui->pluginsFrame->addWidget(m_pluginsList);
113
114#ifdef DISABLE_CHECK_UPDATES
115 ui->checkUpdates->setVisible(false);
116#endif
117
118
119 auto setCategoryIcon = [this](int index, const QIcon &icon) {
120 ui->listWidget->item(index)->setIcon(QIcon(icon.pixmap(32)));
121 };
122
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")));
136
137 Settings settings;
138 //GENERAL URLs
139 settings.beginGroup(QSL("Web-URL-Settings"));
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()));
144 settings.endGroup();
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());
148
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);
156 }
157 else {
158 ui->checkNowDefaultBrowser->setText(tr("Set as default"));
159 ui->checkNowDefaultBrowser->setEnabled(true);
160 connect(ui->checkNowDefaultBrowser, SIGNAL(clicked()), this, SLOT(makeFalkonDefault()));
161 }
162 }
163 else {
164 ui->checkDefaultBrowser->hide();
165 ui->checkNowDefaultBrowser->hide();
166 }
167#else // No Default Browser settings on non-Windows platform
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;
173#endif
174
175 ui->newTabFrame->setVisible(false);
176 if (m_newTabUrl.isEmpty() || m_newTabUrl.toString() == QL1S("about:blank")) {
177 ui->newTab->setCurrentIndex(0);
178 }
179 else if (m_newTabUrl == m_homepage) {
180 ui->newTab->setCurrentIndex(1);
181 }
182 else if (m_newTabUrl.toString() == QL1S("falkon:speeddial")) {
183 ui->newTab->setCurrentIndex(2);
184 }
185 else {
186 ui->newTab->setCurrentIndex(3);
187 ui->newTabFrame->setVisible(true);
188 }
189
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)));
193 if (m_window) {
194 connect(ui->useCurrentBut, &QAbstractButton::clicked, this, &Preferences::useActualHomepage);
195 connect(ui->newTabUseCurrent, &QAbstractButton::clicked, this, &Preferences::useActualNewTab);
196 }
197 else {
198 ui->useCurrentBut->setEnabled(false);
199 ui->newTabUseCurrent->setEnabled(false);
200 }
201
202 // PROFILES
203 QString startingProfile = ProfileManager::startingProfile();
204 ui->activeProfile->setText(QStringLiteral("<b>") + ProfileManager::currentProfile() + QStringLiteral("</b>"));
205 ui->startProfile->addItem(startingProfile);
206
207 const auto names = ProfileManager::availableProfiles();
208 for (const QString &name : names) {
209 if (startingProfile != name) {
210 ui->startProfile->addItem(name);
211 }
212 }
213
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());
218
219 //APPEREANCE
220 settings.beginGroup(QSL("Browser-View-Settings"));
221 ui->showStatusbar->setChecked(settings.value(QSL("showStatusBar"), false).toBool());
222 // NOTE: instantBookmarksToolbar and showBookmarksToolbar cannot be both enabled at the same time
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);
231 settings.endGroup();
232
233 //TABS
234 settings.beginGroup(QSL("Browser-Tabs-Settings"));
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());
246 settings.endGroup();
247
248 //AddressBar
249 settings.beginGroup(QSL("AddressBar"));
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()));
269 settings.endGroup();
270
271 settings.beginGroup(QSL("SearchEngines"));
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);
279 settings.endGroup();
280
281 // BROWSING
282 settings.beginGroup(QSL("Web-Browser-Settings"));
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());
302#else
303 ui->readingFromCanvasEnabled->hide();
304#endif
305#if QTWEBENGINECORE_VERSION >= QT_VERSION_CHECK(6, 7, 0)
306 ui->forceDarkMode->setChecked(settings.value(QSL("forceDarkMode"), false).toBool());
307#else
308 ui->forceDarkMode->hide();
309#endif
310
311 const auto levels = WebView::zoomLevels();
312 for (int level : levels) {
313 ui->defaultZoomLevel->addItem(tr("%1%").arg(QString::number(level)));
314 }
315 ui->defaultZoomLevel->setCurrentIndex(settings.value(QSL("DefaultZoomLevel"), WebView::zoomLevels().indexOf(100)).toInt());
316 ui->closeAppWithCtrlQ->setChecked(settings.value(QSL("closeAppWithCtrlQ"), true).toBool());
317
318 //Cache
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());
326
327 //PASSWORD MANAGER
328 ui->allowPassManager->setChecked(settings.value(QSL("SavePasswordsOnSites"), true).toBool());
329 ui->autoCompletePasswords->setChecked(settings.value(QSL("AutoCompletePasswords"), true).toBool());
330
331 //PRIVACY
332 //Web storage
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);
337 }
338 connect(ui->saveHistory, &QAbstractButton::toggled, this, &Preferences::saveHistoryChanged);
339
340 /* SiteSettings - WebAttributes */
341 const auto supportedAttribute = mApp->siteSettingsManager()->getSupportedAttribute();
342 for (const auto &attribute : supportedAttribute) {
343 auto* listItem = new QListWidgetItem(ui->siteSettingsList);
344 auto* optionItem = new SiteSettingsAttributesItem(attribute, this);
345
346 ui->siteSettingsList->setItemWidget(listItem, optionItem);
347 listItem->setSizeHint(optionItem->sizeHint());
348 }
349 /* SiteSettings - HTML5 features */
350 const auto supportedFeatures = mApp->siteSettingsManager()->getSupportedFeatures();
351 for (const auto &feature : supportedFeatures) {
352 auto* listItem = new QListWidgetItem(ui->siteSettingsHtml5List);
353 auto* optionItem = new SiteSettingsHtml5Item(feature, this);
354
355 ui->siteSettingsHtml5List->setItemWidget(listItem, optionItem);
356 listItem->setSizeHint(optionItem->sizeHint());
357 }
358
359 // Html5Storage
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);
363 // Other
364 ui->doNotTrack->setChecked(settings.value(QSL("DoNotTrack"), false).toBool());
365
366 //CSS Style
367 ui->userStyleSheet->setText(settings.value(QSL("userStyleSheet"), QSL("")).toString());
368 connect(ui->chooseUserStylesheet, &QAbstractButton::clicked, this, &Preferences::chooseUserStyleClicked);
369 settings.endGroup();
370
371 //DOWNLOADS
372 settings.beginGroup(QSL("DownloadManager"));
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);
377 }
378 else {
379 ui->useDefined->setChecked(true);
380 }
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());
384
385 connect(ui->useExternalDownManager, &QAbstractButton::toggled, this, &Preferences::useExternalDownManagerChanged);
386
387
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());
393 settings.endGroup();
394
395 //FONTS
396 settings.beginGroup(QSL("Browser-Fonts"));
397 QWebEngineSettings* webSettings = mApp->webSettings();
398 auto defaultFont = [&](QWebEngineSettings::FontFamily font) -> const QString {
399 const QString family = webSettings->fontFamily(font);
400 if (!family.isEmpty())
401 return family;
402 switch (font) {
403 case QWebEngineSettings::FixedFont:
404 return QFontDatabase::systemFont(QFontDatabase::FixedFont).family();
405 case QWebEngineSettings::SerifFont:
406 // TODO
407 default:
408 return QFontDatabase::systemFont(QFontDatabase::GeneralFont).family();
409 }
410 };
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());
421 settings.endGroup();
422
423 //KEYBOARD SHORTCUTS
424 settings.beginGroup(QSL("Shortcuts"));
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());
428 settings.endGroup();
429
430 //NOTIFICATIONS
431 ui->useNativeSystemNotifications->setEnabled(mApp->desktopNotifications()->supportsNativeNotifications());
432
434 settings.beginGroup(QSL("Notifications"));
435 ui->notificationTimeout->setValue(settings.value(QSL("Timeout"), 6000).toInt() / 1000);
436#if defined(Q_OS_UNIX) && !defined(DISABLE_DBUS)
437 notifyType = settings.value(QSL("UseNativeDesktop"), true).toBool() ? DesktopNotificationsFactory::DesktopNative : DesktopNotificationsFactory::PopupWidget;
438#else
440#endif
441 if (ui->useNativeSystemNotifications->isEnabled() && notifyType == DesktopNotificationsFactory::DesktopNative) {
442 ui->useNativeSystemNotifications->setChecked(true);
443 }
444 else {
445 ui->useOSDNotifications->setChecked(true);
446 }
447
448 connect(ui->notificationPreview, &QPushButton::clicked, this, &Preferences::showNotificationPreview);
449
450 ui->doNotUseNotifications->setChecked(!settings.value(QSL("Enabled"), true).toBool());
451 m_notifPosition = settings.value(QSL("Position"), QPoint(10, 10)).toPoint();
452 settings.endGroup();
453
454 //SPELLCHECK
455 settings.beginGroup(QSL("SpellCheck"));
456 ui->spellcheckEnabled->setChecked(settings.value(QSL("Enabled"), false).toBool());
457 const QStringList spellcheckLanguages = settings.value(QSL("Languages")).toStringList();
458 settings.endGroup();
459
460 auto updateSpellCheckEnabled = [this]() {
461 ui->spellcheckLanguages->setEnabled(ui->spellcheckEnabled->isChecked());
462 ui->spellcheckNoLanguages->setEnabled(ui->spellcheckEnabled->isChecked());
463 };
464 updateSpellCheckEnabled();
465 connect(ui->spellcheckEnabled, &QCheckBox::toggled, this, updateSpellCheckEnabled);
466
467 QStringList dictionariesDirs = {};
468 const QByteArray qtWeDictionariesDirs = qgetenv("QTWEBENGINE_DICTIONARIES_PATH");
469 if (!qtWeDictionariesDirs.isNull()) {
470 dictionariesDirs.append(QDir::cleanPath(QString::fromLocal8Bit(qtWeDictionariesDirs)));
471 }
472 else {
473#ifdef Q_OS_OSX
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")));
476#else
477 dictionariesDirs.append(QDir::cleanPath(QCoreApplication::applicationDirPath() + QL1S("/qtwebengine_dictionaries")));
478 dictionariesDirs.append(QDir::cleanPath(QLibraryInfo::location(QLibraryInfo::DataPath) + QL1S("/qtwebengine_dictionaries")));
479#endif
480 }
481 dictionariesDirs.removeDuplicates();
482
483 ui->spellcheckDirectories->setText(dictionariesDirs.join(QL1C('\n')));
484
485 for (const QString &path : dictionariesDirs) {
486 QDir dir(path);
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()) {
492 continue;
493 }
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);
500 }
501 }
502
503 int topIndex = 0;
504 for (const QString &lang : spellcheckLanguages) {
505 const auto items = ui->spellcheckLanguages->findItems(createLanguageItem(lang), Qt::MatchExactly);
506 if (items.isEmpty()) {
507 continue;
508 }
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);
513 }
514
515 if (ui->spellcheckLanguages->count() == 0) {
516 ui->spellcheckLanguages->hide();
517 } else {
518 ui->spellcheckNoLanguages->hide();
519 }
520
521 // Proxy Configuration
522 settings.beginGroup(QSL("Web-Proxy"));
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);
531 } else {
532 ui->manualProxy->setChecked(true);
533 ui->proxyType->setCurrentIndex(1);
534 }
535
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());
540 settings.endGroup();
541
542 setManualProxyConfigurationEnabled(ui->manualProxy->isChecked());
543 connect(ui->manualProxy, &QAbstractButton::toggled, this, &Preferences::setManualProxyConfigurationEnabled);
544
545 //CONNECTS
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);
556
557 connect(ui->listWidget, &QListWidget::currentItemChanged, this, &Preferences::showStackedPage);
558 ui->listWidget->itemAt(5, 5)->setSelected(true);
559
560 ui->listWidget->setCurrentRow(currentSettingsPage);
561
562 QSize s = size();
563 const QRect &availableGeometryForScreen = screen()->availableGeometry();
564 if (availableGeometryForScreen.size().width() < s.width()) {
565 s.setWidth(availableGeometryForScreen.size().width() - 50);
566 }
567 if (availableGeometryForScreen.size().height() < s.height()) {
568 s.setHeight(availableGeometryForScreen.size().height() - 50);
569 }
570 resize(s);
571
572 settings.beginGroup(QSL("Preferences"));
573 restoreGeometry(settings.value(QSL("Geometry")).toByteArray());
574 settings.endGroup();
575
576 QzTools::setWmClass(QSL("Preferences"), this);
577}
578
579void Preferences::allowPluginsToggled(bool checked)
580{
581 ui->intPDFViewer->setEnabled(checked);
582}
583
584void Preferences::chooseExternalDownloadManager()
585{
586 QString path = QzTools::getOpenFileName(QSL("Preferences-ExternalDownloadManager"), this, tr("Choose executable location..."), QDir::homePath());
587 if (path.isEmpty()) {
588 return;
589 }
590
591 ui->externalDownExecutable->setText(path);
592}
593
594void Preferences::showStackedPage(QListWidgetItem* item)
595{
596 if (!item) {
597 return;
598 }
599
600 int index = ui->listWidget->currentRow();
601
602 ui->caption->setText(QSL("<b>") + item->text() + QSL("</b>"));
603 ui->stackedWidget->setCurrentIndex(index);
604
605 if (m_notification) {
606 m_notifPosition = m_notification.data()->pos();
607 delete m_notification.data();
608 }
609
610 if (index == 10) {
611 m_pluginsList->load();
612 }
613
614 if (index == 7 && !m_autoFillManager) {
615 m_autoFillManager = new AutoFillManager(this);
616 ui->autoFillFrame->addWidget(m_autoFillManager);
617 }
618}
619
620void Preferences::showNotificationPreview()
621{
622 if (ui->useOSDNotifications->isChecked()) {
623 if (m_notification) {
624 m_notifPosition = m_notification.data()->pos();
625 delete m_notification.data();
626 }
627
628 m_notification = new DesktopNotification(true);
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();
633 }
634 else if (ui->useNativeSystemNotifications->isChecked()) {
635 mApp->desktopNotifications()->nativeNotificationPreview();
636 }
637}
638
639void Preferences::makeFalkonDefault()
640{
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);
645
646 if (!mApp->associationManager()->showNativeDefaultAppSettingsUi())
647 mApp->associationManager()->registerAllAssociation();
648#endif
649}
650
651void Preferences::allowCacheChanged(bool state)
652{
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);
659}
660
661void Preferences::useActualHomepage()
662{
663 if (!m_window)
664 return;
665
666 ui->homepage->setText(m_window->weView()->url().toString());
667}
668
669void Preferences::useActualNewTab()
670{
671 if (!m_window)
672 return;
673
674 ui->newTabUrl->setText(m_window->weView()->url().toString());
675}
676
677void Preferences::chooseDownPath()
678{
679 QString userFileName = QzTools::getExistingDirectory(QSL("Preferences-ChooseDownPath"), this, tr("Choose download location..."), QDir::homePath());
680 if (userFileName.isEmpty()) {
681 return;
682 }
683#ifdef Q_OS_WIN //QFileDialog::getExistingDirectory returns path with \ instead of / (??)
684 userFileName.replace(QLatin1Char('\\'), QLatin1Char('/'));
685#endif
686 userFileName += QLatin1Char('/');
687
688 ui->downLoc->setText(userFileName);
689}
690
691void Preferences::chooseUserStyleClicked()
692{
693 QString file = QzTools::getOpenFileName(QSL("Preferences-UserStyle"), this, tr("Choose stylesheet location..."), QDir::homePath(), QSL("*.css"));
694 if (file.isEmpty()) {
695 return;
696 }
697 ui->userStyleSheet->setText(file);
698}
699
700void Preferences::deleteHtml5storage()
701{
703
704 ui->deleteHtml5storage->setText(tr("Deleted"));
705 ui->deleteHtml5storage->setEnabled(false);
706}
707
708void Preferences::openUserAgentManager()
709{
710 auto* dialog = new UserAgentDialog(this);
711 dialog->open();
712}
713
714void Preferences::downLocChanged(bool state)
715{
716 ui->downButt->setEnabled(state);
717 ui->downLoc->setEnabled(state);
718}
719
720void Preferences::setManualProxyConfigurationEnabled(bool state)
721{
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);
727}
728
729void Preferences::searchFromAddressBarChanged(bool stat)
730{
731 ui->searchWithDefaultEngine->setEnabled(stat);
732 ui->showABSearchSuggestions->setEnabled(stat);
733}
734
735void Preferences::saveHistoryChanged(bool stat)
736{
737 ui->deleteHistoryOnClose->setEnabled(stat);
738}
739
740void Preferences::allowHtml5storageChanged(bool stat)
741{
742 ui->deleteHtml5storageOnClose->setEnabled(stat);
743}
744
745void Preferences::showCookieManager()
746{
747 auto* dialog = new CookieManager(this);
748 dialog->show();
749}
750
751void Preferences::openJsOptions()
752{
753 auto* dialog = new JsOptions(this);
754 dialog->open();
755}
756
757void Preferences::useExternalDownManagerChanged(bool state)
758{
759 ui->externalDownExecutable->setEnabled(state);
760 ui->externalDownArguments->setEnabled(state);
761 ui->chooseExternalDown->setEnabled(state);
762}
763
764void Preferences::openSearchEnginesManager()
765{
766 auto* dialog = new SearchEnginesDialog(this);
767 dialog->open();
768}
769
770void Preferences::openCertificateManager()
771{
772 auto *dialog = new CertificateManager(this);
773 dialog->open();
774}
775
776void Preferences::openProtocolHandlersManager()
777{
778 auto *dialog = new ProtocolHandlerDialog(this);
779 dialog->open();
780}
781
782void Preferences::openSchemesManager()
783{
784 auto *dialog = new SchemeManager(this);
785 dialog->open();
786}
787
788void Preferences::showAcceptLanguage()
789{
790 auto* dialog = new AcceptLanguage(this);
791 dialog->open();
792}
793
794void Preferences::newTabChanged(int value)
795{
796 ui->newTabFrame->setVisible(value == 3);
797}
798
799void Preferences::afterLaunchChanged(int value)
800{
801 ui->dontLoadTabsUntilSelected->setEnabled(value == 3 || value == 4);
802}
803
804void Preferences::changeCachePathClicked()
805{
806 QString path = QzTools::getExistingDirectory(QSL("Preferences-CachePath"), this, tr("Choose cache path..."), ui->cachePath->text());
807 if (path.isEmpty()) {
808 return;
809 }
810
811 ui->cachePath->setText(path);
812}
813
814void Preferences::buttonClicked(QAbstractButton* button)
815{
816 switch (ui->buttonBox->buttonRole(button)) {
817 case QDialogButtonBox::ApplyRole:
818 saveSettings();
819 break;
820
821 case QDialogButtonBox::RejectRole:
822 close();
823 break;
824
825 case QDialogButtonBox::AcceptRole:
826 saveSettings();
827 close();
828 break;
829
830 default:
831 break;
832 }
833}
834
835void Preferences::createProfile()
836{
837 QString name = QInputDialog::getText(this, tr("New Profile"), tr("Enter the new profile's name:"));
839
840 if (name.isEmpty()) {
841 return;
842 }
843
844 int res = ProfileManager::createProfile(name);
845
846 if (res == -1) {
847 QMessageBox::warning(this, tr("Error!"), tr("This profile already exists!"));
848 return;
849 }
850
851 if (res != 0) {
852 QMessageBox::warning(this, tr("Error!"), tr("Cannot create profile directory!"));
853 return;
854 }
855
856 ui->startProfile->addItem(name);
857 ui->startProfile->setCurrentIndex(ui->startProfile->count() - 1);
858}
859
860void Preferences::deleteProfile()
861{
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) {
866 return;
867 }
868
870
871 ui->startProfile->removeItem(ui->startProfile->currentIndex());
872}
873
874void Preferences::startProfileIndexChanged(int index)
875{
876 const bool current = ui->startProfile->itemText(index) == ProfileManager::currentProfile();
877
878 ui->deleteProfile->setEnabled(!current);
879 ui->cannotDeleteActiveProfileLabel->setText(current ? tr("Note: You cannot delete active profile.") : QString());
880}
881
882void Preferences::closeEvent(QCloseEvent* event)
883{
884 Settings settings;
885 settings.beginGroup(QSL("Browser-View-Settings"));
886 settings.setValue(QSL("settingsDialogPage"), ui->stackedWidget->currentIndex());
887 settings.endGroup();
888
889 event->accept();
890}
891
892void Preferences::saveSettings()
893{
894 Settings settings;
895 //GENERAL URLs
896 QUrl homepage = QUrl::fromUserInput(ui->homepage->text());
897
898 settings.beginGroup(QSL("Web-URL-Settings"));
899 settings.setValue(QSL("homepage"), homepage);
900 settings.setValue(QSL("afterLaunch"), ui->afterLaunch->currentIndex());
901
902 switch (ui->newTab->currentIndex()) {
903 case 0:
904 settings.setValue(QSL("newTabUrl"), QUrl());
905 break;
906
907 case 1:
908 settings.setValue(QSL("newTabUrl"), homepage);
909 break;
910
911 case 2:
912 settings.setValue(QSL("newTabUrl"), QUrl(QSL("falkon:speeddial")));
913 break;
914
915 case 3:
916 settings.setValue(QSL("newTabUrl"), QUrl::fromUserInput(ui->newTabUrl->text()));
917 break;
918
919 default:
920 break;
921 }
922
923 settings.endGroup();
924 //PROFILES
925 /*
926 *
927 *
928 *
929 */
930
931 //WINDOW
932 settings.beginGroup(QSL("Browser-View-Settings"));
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());
937 settings.endGroup();
938
939 //TABS
940 settings.beginGroup(QSL("Browser-Tabs-Settings"));
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());
952 settings.endGroup();
953
954 //DOWNLOADS
955 settings.beginGroup(QSL("DownloadManager"));
956 if (ui->askEverytime->isChecked()) {
957 settings.setValue(QSL("defaultDownloadPath"), QSL(""));
958 }
959 else {
960 settings.setValue(QSL("defaultDownloadPath"), ui->downLoc->text());
961 }
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());
966
967 settings.endGroup();
968
969 //FONTS
970 settings.beginGroup(QSL("Browser-Fonts"));
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());
977
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());
982 settings.endGroup();
983
984 //KEYBOARD SHORTCUTS
985 settings.beginGroup(QSL("Shortcuts"));
986 settings.setValue(QSL("useTabNumberShortcuts"), ui->switchTabsAlt->isChecked());
987 settings.setValue(QSL("useSpeedDialNumberShortcuts"), ui->loadSpeedDialsCtrl->isChecked());
988 settings.setValue(QSL("useSingleKeyShortcuts"), ui->singleKeyShortcuts->isChecked());
989 settings.endGroup();
990
991 //BROWSING
992 settings.beginGroup(QSL("Web-Browser-Settings"));
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());
1015#endif
1016#if QTWEBENGINECORE_VERSION >= QT_VERSION_CHECK(6, 7, 0)
1017 settings.setValue(QSL("forceDarkMode"), ui->forceDarkMode->isChecked());
1018#endif
1019#ifdef Q_OS_WIN
1020 settings.setValue(QSL("CheckDefaultBrowser"), ui->checkDefaultBrowser->isChecked());
1021#endif
1022 //Cache
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());
1027 //CSS Style
1028 settings.setValue(QSL("userStyleSheet"), ui->userStyleSheet->text());
1029
1030 //PASSWORD MANAGER
1031 settings.setValue(QSL("SavePasswordsOnSites"), ui->allowPassManager->isChecked());
1032 settings.setValue(QSL("AutoCompletePasswords"), ui->autoCompletePasswords->isChecked());
1033
1034 //PRIVACY
1035 //Web storage
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());
1040 settings.endGroup();
1041
1042 //NOTIFICATIONS
1043 settings.beginGroup(QSL("Notifications"));
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);
1048 settings.endGroup();
1049
1050 //SPELLCHECK
1051 settings.beginGroup(QSL("SpellCheck"));
1052 settings.setValue(QSL("Enabled"), ui->spellcheckEnabled->isChecked());
1053 QStringList languages;
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());
1058 }
1059 }
1060 settings.setValue(QSL("Languages"), languages);
1061 settings.endGroup();
1062
1063 //OTHER
1064 //AddressBar
1065 settings.beginGroup(QSL("AddressBar"));
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>());
1078 settings.endGroup();
1079
1080 settings.beginGroup(QSL("SearchEngines"));
1081 settings.setValue(QSL("SearchFromAddressBar"), ui->searchFromAddressBar->isChecked());
1082 settings.setValue(QSL("SearchWithDefaultEngine"), ui->searchWithDefaultEngine->isChecked());
1083 settings.setValue(QSL("showSearchSuggestions"), ui->showABSearchSuggestions->isChecked());
1084 settings.endGroup();
1085
1086 //Proxy Configuration
1087 int proxyType;
1088 if (ui->noProxy->isChecked()) {
1089 proxyType = 0;
1090 } else if (ui->systemProxy->isChecked()) {
1091 proxyType = 2;
1092 } else if (ui->proxyType->currentIndex() == 0) { // Http
1093 proxyType = 3;
1094 } else { // Socks5
1095 proxyType = 4;
1096 }
1097
1098 settings.beginGroup(QSL("Web-Proxy"));
1099 settings.setValue(QSL("ProxyType"), proxyType);
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());
1104 settings.endGroup();
1105
1106 //SiteSettings
1107 settings.beginGroup(QSL("Site-Settings"));
1108 /* HTML5 Features */
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());
1112 }
1113 settings.endGroup();
1114
1115 ProfileManager::setStartingProfile(ui->startProfile->currentText());
1116
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();
1126
1128}
1129
1131{
1132 Settings().setValue(QSL("Preferences/Geometry"), saveGeometry());
1133
1134 delete ui;
1135 delete m_autoFillManager;
1136 delete m_pluginsList;
1137 delete m_notification.data();
1138}
1139
1140void Preferences::setProgressBarColorIcon(QColor color)
1141{
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);
1146 }
1147 pm.fill(color);
1148 ui->customColorToolButton->setIcon(pm);
1149 ui->customColorToolButton->setProperty("ProgressColor", color);
1150}
1151
1152void Preferences::selectCustomProgressBarColor()
1153{
1154 QColor newColor = QColorDialog::getColor(ui->customColorToolButton->property("ProgressColor").value<QColor>(), this, tr("Select Color"));
1155 if (newColor.isValid()) {
1156 setProgressBarColorIcon(newColor);
1157 }
1158}
TabbedWebView * weView() const
static void clearLocalStorage()
Preferences(BrowserWindow *window)
Definition: preferences.cpp:99
~Preferences() override
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)
static void setWmClass(const QString &name, const QWidget *widget)
Definition: qztools.cpp:874
static QString getExistingDirectory(const QString &name, QWidget *parent=nullptr, const QString &caption=QString(), const QString &dir=QString(), QFileDialog::Options options=QFileDialog::ShowDirsOnly)
Definition: qztools.cpp:623
static QString filterCharsFromFilename(const QString &name)
Definition: qztools.cpp:309
static void centerWidgetOnScreen(QWidget *w)
Definition: qztools.cpp:116
static QString getOpenFileName(const QString &name, QWidget *parent=nullptr, const QString &caption=QString(), const QString &dir=QString(), const QString &filter=QString(), QString *selectedFilter=nullptr, QFileDialog::Options options=QFileDialog::Options())
Definition: qztools.cpp:659
void beginGroup(const QString &prefix)
Definition: settings.cpp:79
void endGroup()
Definition: settings.cpp:84
QVariant value(const QString &key, const QVariant &defaultValue=QVariant())
Definition: settings.cpp:74
void setValue(const QString &key, const QVariant &defaultValue=QVariant())
Definition: settings.cpp:69
static WebScrollBarManager * instance()
static QList< int > zoomLevels()
Definition: webview.cpp:264
#define mApp
int value(const QColor &c)
Definition: colors.cpp:238
i
Definition: i18n.py:23
locale
Definition: i18n.py:21
list languages
Definition: i18n.py:22
State state
#define QL1S(x)
Definition: qzcommon.h:44
#define QL1C(x)
Definition: qzcommon.h:48
#define DEFAULT_CHECK_DEFAULTBROWSER
Definition: qzcommon.h:132
#define QSL(x)
Definition: qzcommon.h:40
const QList< QWebEngineSettings::WebAttribute > supportedAttribute
const QList< QWebEnginePage::Feature > supportedFeatures