Try to detect system wake-up event
[qBittorrent.git] / src / base / preferences.cpp
blob5cbbce6475d2384502658b1725aa8b0ecd11c1b1
1 /*
2 * Bittorrent Client using Qt and libtorrent.
3 * Copyright (C) 2014 sledgehammer999 <hammered999@gmail.com>
4 * Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 * In addition, as a special exception, the copyright holders give permission to
21 * link this program with the OpenSSL project's "OpenSSL" library (or with
22 * modified versions of it that use the same license as the "OpenSSL" library),
23 * and distribute the linked executables. You must obey the GNU General Public
24 * License in all respects for all of the code used other than "OpenSSL". If you
25 * modify file(s), you may extend this exception to your version of the file(s),
26 * but you are not obligated to do so. If you do not wish to do so, delete this
27 * exception statement from your version.
30 #include "preferences.h"
32 #include <chrono>
34 #ifdef Q_OS_MACOS
35 #include <CoreServices/CoreServices.h>
36 #endif
37 #ifdef Q_OS_WIN
38 #include <shlobj.h>
39 #endif
41 #include <QCoreApplication>
42 #include <QDateTime>
43 #include <QDir>
44 #include <QList>
45 #include <QLocale>
46 #include <QNetworkCookie>
47 #include <QSettings>
48 #include <QTime>
50 #ifdef Q_OS_WIN
51 #include <QRegularExpression>
52 #endif
54 #include "algorithm.h"
55 #include "global.h"
56 #include "path.h"
57 #include "profile.h"
58 #include "settingsstorage.h"
59 #include "utils/fs.h"
61 namespace
63 template <typename T>
64 T value(const QString &key, const T &defaultValue = {})
66 return SettingsStorage::instance()->loadValue(key, defaultValue);
69 template <typename T>
70 void setValue(const QString &key, const T &value)
72 SettingsStorage::instance()->storeValue(key, value);
75 #ifdef Q_OS_WIN
76 QString makeProfileID(const Path &profilePath, const QString &profileName)
78 return profilePath.isEmpty()
79 ? profileName
80 : profileName + u'@' + Utils::Fs::toValidFileName(profilePath.data(), {});
82 #endif
85 Preferences *Preferences::m_instance = nullptr;
87 Preferences::Preferences() = default;
89 Preferences *Preferences::instance()
91 return m_instance;
94 void Preferences::initInstance()
96 if (!m_instance)
97 m_instance = new Preferences;
100 void Preferences::freeInstance()
102 delete m_instance;
103 m_instance = nullptr;
106 // General options
107 QString Preferences::getLocale() const
109 const auto localeName = value<QString>(u"Preferences/General/Locale"_qs);
110 return (localeName.isEmpty() ? QLocale::system().name() : localeName);
113 void Preferences::setLocale(const QString &locale)
115 setValue(u"Preferences/General/Locale"_qs, locale);
118 bool Preferences::useCustomUITheme() const
120 return value(u"Preferences/General/UseCustomUITheme"_qs, false) && !customUIThemePath().isEmpty();
123 void Preferences::setUseCustomUITheme(const bool use)
125 setValue(u"Preferences/General/UseCustomUITheme"_qs, use);
128 Path Preferences::customUIThemePath() const
130 return value<Path>(u"Preferences/General/CustomUIThemePath"_qs);
133 void Preferences::setCustomUIThemePath(const Path &path)
135 setValue(u"Preferences/General/CustomUIThemePath"_qs, path);
138 bool Preferences::deleteTorrentFilesAsDefault() const
140 return value(u"Preferences/General/DeleteTorrentsFilesAsDefault"_qs, false);
143 void Preferences::setDeleteTorrentFilesAsDefault(const bool del)
145 setValue(u"Preferences/General/DeleteTorrentsFilesAsDefault"_qs, del);
148 bool Preferences::confirmOnExit() const
150 return value(u"Preferences/General/ExitConfirm"_qs, true);
153 void Preferences::setConfirmOnExit(const bool confirm)
155 setValue(u"Preferences/General/ExitConfirm"_qs, confirm);
158 bool Preferences::speedInTitleBar() const
160 return value(u"Preferences/General/SpeedInTitleBar"_qs, false);
163 void Preferences::showSpeedInTitleBar(const bool show)
165 setValue(u"Preferences/General/SpeedInTitleBar"_qs, show);
168 bool Preferences::useAlternatingRowColors() const
170 return value(u"Preferences/General/AlternatingRowColors"_qs, true);
173 void Preferences::setAlternatingRowColors(const bool b)
175 setValue(u"Preferences/General/AlternatingRowColors"_qs, b);
178 bool Preferences::getHideZeroValues() const
180 return value(u"Preferences/General/HideZeroValues"_qs, false);
183 void Preferences::setHideZeroValues(const bool b)
185 setValue(u"Preferences/General/HideZeroValues"_qs, b);
188 int Preferences::getHideZeroComboValues() const
190 return value<int>(u"Preferences/General/HideZeroComboValues"_qs, 0);
193 void Preferences::setHideZeroComboValues(const int n)
195 setValue(u"Preferences/General/HideZeroComboValues"_qs, n);
198 // In Mac OS X the dock is sufficient for our needs so we disable the sys tray functionality.
199 // See extensive discussion in https://github.com/qbittorrent/qBittorrent/pull/3018
200 #ifndef Q_OS_MACOS
201 bool Preferences::systemTrayEnabled() const
203 return value(u"Preferences/General/SystrayEnabled"_qs, true);
206 void Preferences::setSystemTrayEnabled(const bool enabled)
208 setValue(u"Preferences/General/SystrayEnabled"_qs, enabled);
211 bool Preferences::minimizeToTray() const
213 return value(u"Preferences/General/MinimizeToTray"_qs, false);
216 void Preferences::setMinimizeToTray(const bool b)
218 setValue(u"Preferences/General/MinimizeToTray"_qs, b);
221 bool Preferences::minimizeToTrayNotified() const
223 return value(u"Preferences/General/MinimizeToTrayNotified"_qs, false);
226 void Preferences::setMinimizeToTrayNotified(const bool b)
228 setValue(u"Preferences/General/MinimizeToTrayNotified"_qs, b);
231 bool Preferences::closeToTray() const
233 return value(u"Preferences/General/CloseToTray"_qs, true);
236 void Preferences::setCloseToTray(const bool b)
238 setValue(u"Preferences/General/CloseToTray"_qs, b);
241 bool Preferences::closeToTrayNotified() const
243 return value(u"Preferences/General/CloseToTrayNotified"_qs, false);
246 void Preferences::setCloseToTrayNotified(const bool b)
248 setValue(u"Preferences/General/CloseToTrayNotified"_qs, b);
251 bool Preferences::iconsInMenusEnabled() const
253 return value(u"Preferences/Advanced/EnableIconsInMenus"_qs, true);
256 void Preferences::setIconsInMenusEnabled(const bool enable)
258 setValue(u"Preferences/Advanced/EnableIconsInMenus"_qs, enable);
260 #endif // Q_OS_MACOS
262 bool Preferences::isToolbarDisplayed() const
264 return value(u"Preferences/General/ToolbarDisplayed"_qs, true);
267 void Preferences::setToolbarDisplayed(const bool displayed)
269 setValue(u"Preferences/General/ToolbarDisplayed"_qs, displayed);
272 bool Preferences::isStatusbarDisplayed() const
274 return value(u"Preferences/General/StatusbarDisplayed"_qs, true);
277 void Preferences::setStatusbarDisplayed(const bool displayed)
279 setValue(u"Preferences/General/StatusbarDisplayed"_qs, displayed);
282 bool Preferences::isSplashScreenDisabled() const
284 return value(u"Preferences/General/NoSplashScreen"_qs, true);
287 void Preferences::setSplashScreenDisabled(const bool b)
289 setValue(u"Preferences/General/NoSplashScreen"_qs, b);
292 // Preventing from system suspend while active torrents are presented.
293 bool Preferences::preventFromSuspendWhenDownloading() const
295 return value(u"Preferences/General/PreventFromSuspendWhenDownloading"_qs, false);
298 void Preferences::setPreventFromSuspendWhenDownloading(const bool b)
300 setValue(u"Preferences/General/PreventFromSuspendWhenDownloading"_qs, b);
303 bool Preferences::preventFromSuspendWhenSeeding() const
305 return value(u"Preferences/General/PreventFromSuspendWhenSeeding"_qs, false);
308 void Preferences::setPreventFromSuspendWhenSeeding(const bool b)
310 setValue(u"Preferences/General/PreventFromSuspendWhenSeeding"_qs, b);
313 #ifdef Q_OS_WIN
314 bool Preferences::WinStartup() const
316 const QString profileName = Profile::instance()->profileName();
317 const Path profilePath = Profile::instance()->rootPath();
318 const QString profileID = makeProfileID(profilePath, profileName);
319 const QSettings settings {u"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run"_qs, QSettings::NativeFormat};
321 return settings.contains(profileID);
324 void Preferences::setWinStartup(const bool b)
326 const QString profileName = Profile::instance()->profileName();
327 const Path profilePath = Profile::instance()->rootPath();
328 const QString profileID = makeProfileID(profilePath, profileName);
329 QSettings settings {u"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run"_qs, QSettings::NativeFormat};
330 if (b)
332 const QString configuration = Profile::instance()->configurationName();
334 const auto cmd = uR"("%1" "--profile=%2" "--configuration=%3")"_qs
335 .arg(Path(qApp->applicationFilePath()).toString(), profilePath.toString(), configuration);
336 settings.setValue(profileID, cmd);
338 else
340 settings.remove(profileID);
343 #endif // Q_OS_WIN
345 // Downloads
346 Path Preferences::getScanDirsLastPath() const
348 return value<Path>(u"Preferences/Downloads/ScanDirsLastPath"_qs);
351 void Preferences::setScanDirsLastPath(const Path &path)
353 setValue(u"Preferences/Downloads/ScanDirsLastPath"_qs, path);
356 bool Preferences::isMailNotificationEnabled() const
358 return value(u"Preferences/MailNotification/enabled"_qs, false);
361 void Preferences::setMailNotificationEnabled(const bool enabled)
363 setValue(u"Preferences/MailNotification/enabled"_qs, enabled);
366 QString Preferences::getMailNotificationSender() const
368 return value<QString>(u"Preferences/MailNotification/sender"_qs
369 , u"qBittorrent_notification@example.com"_qs);
372 void Preferences::setMailNotificationSender(const QString &mail)
374 setValue(u"Preferences/MailNotification/sender"_qs, mail);
377 QString Preferences::getMailNotificationEmail() const
379 return value<QString>(u"Preferences/MailNotification/email"_qs);
382 void Preferences::setMailNotificationEmail(const QString &mail)
384 setValue(u"Preferences/MailNotification/email"_qs, mail);
387 QString Preferences::getMailNotificationSMTP() const
389 return value<QString>(u"Preferences/MailNotification/smtp_server"_qs, u"smtp.changeme.com"_qs);
392 void Preferences::setMailNotificationSMTP(const QString &smtp_server)
394 setValue(u"Preferences/MailNotification/smtp_server"_qs, smtp_server);
397 bool Preferences::getMailNotificationSMTPSSL() const
399 return value(u"Preferences/MailNotification/req_ssl"_qs, false);
402 void Preferences::setMailNotificationSMTPSSL(const bool use)
404 setValue(u"Preferences/MailNotification/req_ssl"_qs, use);
407 bool Preferences::getMailNotificationSMTPAuth() const
409 return value(u"Preferences/MailNotification/req_auth"_qs, false);
412 void Preferences::setMailNotificationSMTPAuth(const bool use)
414 setValue(u"Preferences/MailNotification/req_auth"_qs, use);
417 QString Preferences::getMailNotificationSMTPUsername() const
419 return value<QString>(u"Preferences/MailNotification/username"_qs);
422 void Preferences::setMailNotificationSMTPUsername(const QString &username)
424 setValue(u"Preferences/MailNotification/username"_qs, username);
427 QString Preferences::getMailNotificationSMTPPassword() const
429 return value<QString>(u"Preferences/MailNotification/password"_qs);
432 void Preferences::setMailNotificationSMTPPassword(const QString &password)
434 setValue(u"Preferences/MailNotification/password"_qs, password);
437 int Preferences::getActionOnDblClOnTorrentDl() const
439 return value<int>(u"Preferences/Downloads/DblClOnTorDl"_qs, 0);
442 void Preferences::setActionOnDblClOnTorrentDl(const int act)
444 setValue(u"Preferences/Downloads/DblClOnTorDl"_qs, act);
447 int Preferences::getActionOnDblClOnTorrentFn() const
449 return value<int>(u"Preferences/Downloads/DblClOnTorFn"_qs, 1);
452 void Preferences::setActionOnDblClOnTorrentFn(const int act)
454 setValue(u"Preferences/Downloads/DblClOnTorFn"_qs, act);
457 QTime Preferences::getSchedulerStartTime() const
459 return value(u"Preferences/Scheduler/start_time"_qs, QTime(8, 0));
462 void Preferences::setSchedulerStartTime(const QTime &time)
464 setValue(u"Preferences/Scheduler/start_time"_qs, time);
467 QTime Preferences::getSchedulerEndTime() const
469 return value(u"Preferences/Scheduler/end_time"_qs, QTime(20, 0));
472 void Preferences::setSchedulerEndTime(const QTime &time)
474 setValue(u"Preferences/Scheduler/end_time"_qs, time);
477 Scheduler::Days Preferences::getSchedulerDays() const
479 return value(u"Preferences/Scheduler/days"_qs, Scheduler::Days::EveryDay);
482 void Preferences::setSchedulerDays(const Scheduler::Days days)
484 setValue(u"Preferences/Scheduler/days"_qs, days);
487 // Search
488 bool Preferences::isSearchEnabled() const
490 return value(u"Preferences/Search/SearchEnabled"_qs, false);
493 void Preferences::setSearchEnabled(const bool enabled)
495 setValue(u"Preferences/Search/SearchEnabled"_qs, enabled);
498 bool Preferences::isWebUiEnabled() const
500 #ifdef DISABLE_GUI
501 return true;
502 #else
503 return value(u"Preferences/WebUI/Enabled"_qs, false);
504 #endif
507 void Preferences::setWebUiEnabled(const bool enabled)
509 setValue(u"Preferences/WebUI/Enabled"_qs, enabled);
512 bool Preferences::isWebUiLocalAuthEnabled() const
514 return value(u"Preferences/WebUI/LocalHostAuth"_qs, true);
517 void Preferences::setWebUiLocalAuthEnabled(const bool enabled)
519 setValue(u"Preferences/WebUI/LocalHostAuth"_qs, enabled);
522 bool Preferences::isWebUiAuthSubnetWhitelistEnabled() const
524 return value(u"Preferences/WebUI/AuthSubnetWhitelistEnabled"_qs, false);
527 void Preferences::setWebUiAuthSubnetWhitelistEnabled(const bool enabled)
529 setValue(u"Preferences/WebUI/AuthSubnetWhitelistEnabled"_qs, enabled);
532 QVector<Utils::Net::Subnet> Preferences::getWebUiAuthSubnetWhitelist() const
534 const auto subnets = value<QStringList>(u"Preferences/WebUI/AuthSubnetWhitelist"_qs);
536 QVector<Utils::Net::Subnet> ret;
537 ret.reserve(subnets.size());
539 for (const QString &rawSubnet : subnets)
541 const std::optional<Utils::Net::Subnet> subnet = Utils::Net::parseSubnet(rawSubnet.trimmed());
542 if (subnet)
543 ret.append(subnet.value());
546 return ret;
549 void Preferences::setWebUiAuthSubnetWhitelist(QStringList subnets)
551 Algorithm::removeIf(subnets, [](const QString &subnet)
553 return !Utils::Net::parseSubnet(subnet.trimmed()).has_value();
556 setValue(u"Preferences/WebUI/AuthSubnetWhitelist"_qs, subnets);
559 QString Preferences::getServerDomains() const
561 return value<QString>(u"Preferences/WebUI/ServerDomains"_qs, u"*"_qs);
564 void Preferences::setServerDomains(const QString &str)
566 setValue(u"Preferences/WebUI/ServerDomains"_qs, str);
569 QString Preferences::getWebUiAddress() const
571 return value<QString>(u"Preferences/WebUI/Address"_qs, u"*"_qs).trimmed();
574 void Preferences::setWebUiAddress(const QString &addr)
576 setValue(u"Preferences/WebUI/Address"_qs, addr.trimmed());
579 quint16 Preferences::getWebUiPort() const
581 return value<quint16>(u"Preferences/WebUI/Port"_qs, 8080);
584 void Preferences::setWebUiPort(const quint16 port)
586 // cast to `int` type so it will show human readable unit in configuration file
587 setValue(u"Preferences/WebUI/Port"_qs, static_cast<int>(port));
590 bool Preferences::useUPnPForWebUIPort() const
592 return value(u"Preferences/WebUI/UseUPnP"_qs, false);
595 void Preferences::setUPnPForWebUIPort(const bool enabled)
597 setValue(u"Preferences/WebUI/UseUPnP"_qs, enabled);
600 QString Preferences::getWebUiUsername() const
602 return value<QString>(u"Preferences/WebUI/Username"_qs, u"admin"_qs);
605 void Preferences::setWebUiUsername(const QString &username)
607 setValue(u"Preferences/WebUI/Username"_qs, username);
610 QByteArray Preferences::getWebUIPassword() const
612 // default: adminadmin
613 const auto defaultValue = QByteArrayLiteral("ARQ77eY1NUZaQsuDHbIMCA==:0WMRkYTUWVT9wVvdDtHAjU9b3b7uB8NR1Gur2hmQCvCDpm39Q+PsJRJPaCU51dEiz+dTzh8qbPsL8WkFljQYFQ==");
614 return value(u"Preferences/WebUI/Password_PBKDF2"_qs, defaultValue);
617 void Preferences::setWebUIPassword(const QByteArray &password)
619 setValue(u"Preferences/WebUI/Password_PBKDF2"_qs, password);
622 int Preferences::getWebUIMaxAuthFailCount() const
624 return value<int>(u"Preferences/WebUI/MaxAuthenticationFailCount"_qs, 5);
627 void Preferences::setWebUIMaxAuthFailCount(const int count)
629 setValue(u"Preferences/WebUI/MaxAuthenticationFailCount"_qs, count);
632 std::chrono::seconds Preferences::getWebUIBanDuration() const
634 return std::chrono::seconds(value<int>(u"Preferences/WebUI/BanDuration"_qs, 3600));
637 void Preferences::setWebUIBanDuration(const std::chrono::seconds duration)
639 setValue(u"Preferences/WebUI/BanDuration"_qs, static_cast<int>(duration.count()));
642 int Preferences::getWebUISessionTimeout() const
644 return value<int>(u"Preferences/WebUI/SessionTimeout"_qs, 3600);
647 void Preferences::setWebUISessionTimeout(const int timeout)
649 setValue(u"Preferences/WebUI/SessionTimeout"_qs, timeout);
652 QString Preferences::getWebAPISessionCookieName() const
654 return value<QString>(u"WebAPI/SessionCookieName"_qs);
657 void Preferences::setWebAPISessionCookieName(const QString &cookieName)
659 setValue(u"WebAPI/SessionCookieName"_qs, cookieName);
662 bool Preferences::isWebUiClickjackingProtectionEnabled() const
664 return value(u"Preferences/WebUI/ClickjackingProtection"_qs, true);
667 void Preferences::setWebUiClickjackingProtectionEnabled(const bool enabled)
669 setValue(u"Preferences/WebUI/ClickjackingProtection"_qs, enabled);
672 bool Preferences::isWebUiCSRFProtectionEnabled() const
674 return value(u"Preferences/WebUI/CSRFProtection"_qs, true);
677 void Preferences::setWebUiCSRFProtectionEnabled(const bool enabled)
679 setValue(u"Preferences/WebUI/CSRFProtection"_qs, enabled);
682 bool Preferences::isWebUiSecureCookieEnabled() const
684 return value(u"Preferences/WebUI/SecureCookie"_qs, true);
687 void Preferences::setWebUiSecureCookieEnabled(const bool enabled)
689 setValue(u"Preferences/WebUI/SecureCookie"_qs, enabled);
692 bool Preferences::isWebUIHostHeaderValidationEnabled() const
694 return value(u"Preferences/WebUI/HostHeaderValidation"_qs, true);
697 void Preferences::setWebUIHostHeaderValidationEnabled(const bool enabled)
699 setValue(u"Preferences/WebUI/HostHeaderValidation"_qs, enabled);
702 bool Preferences::isWebUiHttpsEnabled() const
704 return value(u"Preferences/WebUI/HTTPS/Enabled"_qs, false);
707 void Preferences::setWebUiHttpsEnabled(const bool enabled)
709 setValue(u"Preferences/WebUI/HTTPS/Enabled"_qs, enabled);
712 Path Preferences::getWebUIHttpsCertificatePath() const
714 return value<Path>(u"Preferences/WebUI/HTTPS/CertificatePath"_qs);
717 void Preferences::setWebUIHttpsCertificatePath(const Path &path)
719 setValue(u"Preferences/WebUI/HTTPS/CertificatePath"_qs, path);
722 Path Preferences::getWebUIHttpsKeyPath() const
724 return value<Path>(u"Preferences/WebUI/HTTPS/KeyPath"_qs);
727 void Preferences::setWebUIHttpsKeyPath(const Path &path)
729 setValue(u"Preferences/WebUI/HTTPS/KeyPath"_qs, path);
732 bool Preferences::isAltWebUiEnabled() const
734 return value(u"Preferences/WebUI/AlternativeUIEnabled"_qs, false);
737 void Preferences::setAltWebUiEnabled(const bool enabled)
739 setValue(u"Preferences/WebUI/AlternativeUIEnabled"_qs, enabled);
742 Path Preferences::getWebUiRootFolder() const
744 return value<Path>(u"Preferences/WebUI/RootFolder"_qs);
747 void Preferences::setWebUiRootFolder(const Path &path)
749 setValue(u"Preferences/WebUI/RootFolder"_qs, path);
752 bool Preferences::isWebUICustomHTTPHeadersEnabled() const
754 return value(u"Preferences/WebUI/CustomHTTPHeadersEnabled"_qs, false);
757 void Preferences::setWebUICustomHTTPHeadersEnabled(const bool enabled)
759 setValue(u"Preferences/WebUI/CustomHTTPHeadersEnabled"_qs, enabled);
762 QString Preferences::getWebUICustomHTTPHeaders() const
764 return value<QString>(u"Preferences/WebUI/CustomHTTPHeaders"_qs);
767 void Preferences::setWebUICustomHTTPHeaders(const QString &headers)
769 setValue(u"Preferences/WebUI/CustomHTTPHeaders"_qs, headers);
772 bool Preferences::isWebUIReverseProxySupportEnabled() const
774 return value(u"Preferences/WebUI/ReverseProxySupportEnabled"_qs, false);
777 void Preferences::setWebUIReverseProxySupportEnabled(const bool enabled)
779 setValue(u"Preferences/WebUI/ReverseProxySupportEnabled"_qs, enabled);
782 QString Preferences::getWebUITrustedReverseProxiesList() const
784 return value<QString>(u"Preferences/WebUI/TrustedReverseProxiesList"_qs);
787 void Preferences::setWebUITrustedReverseProxiesList(const QString &addr)
789 setValue(u"Preferences/WebUI/TrustedReverseProxiesList"_qs, addr);
792 bool Preferences::isDynDNSEnabled() const
794 return value(u"Preferences/DynDNS/Enabled"_qs, false);
797 void Preferences::setDynDNSEnabled(const bool enabled)
799 setValue(u"Preferences/DynDNS/Enabled"_qs, enabled);
802 DNS::Service Preferences::getDynDNSService() const
804 return value(u"Preferences/DynDNS/Service"_qs, DNS::Service::DynDNS);
807 void Preferences::setDynDNSService(const DNS::Service service)
809 setValue(u"Preferences/DynDNS/Service"_qs, service);
812 QString Preferences::getDynDomainName() const
814 return value<QString>(u"Preferences/DynDNS/DomainName"_qs, u"changeme.dyndns.org"_qs);
817 void Preferences::setDynDomainName(const QString &name)
819 setValue(u"Preferences/DynDNS/DomainName"_qs, name);
822 QString Preferences::getDynDNSUsername() const
824 return value<QString>(u"Preferences/DynDNS/Username"_qs);
827 void Preferences::setDynDNSUsername(const QString &username)
829 setValue(u"Preferences/DynDNS/Username"_qs, username);
832 QString Preferences::getDynDNSPassword() const
834 return value<QString>(u"Preferences/DynDNS/Password"_qs);
837 void Preferences::setDynDNSPassword(const QString &password)
839 setValue(u"Preferences/DynDNS/Password"_qs, password);
842 // Advanced settings
843 QByteArray Preferences::getUILockPassword() const
845 return value<QByteArray>(u"Locking/password_PBKDF2"_qs);
848 void Preferences::setUILockPassword(const QByteArray &password)
850 setValue(u"Locking/password_PBKDF2"_qs, password);
853 bool Preferences::isUILocked() const
855 return value(u"Locking/locked"_qs, false);
858 void Preferences::setUILocked(const bool locked)
860 setValue(u"Locking/locked"_qs, locked);
863 bool Preferences::isAutoRunOnTorrentAddedEnabled() const
865 return value(u"AutoRun/OnTorrentAdded/Enabled"_qs, false);
868 void Preferences::setAutoRunOnTorrentAddedEnabled(const bool enabled)
870 setValue(u"AutoRun/OnTorrentAdded/Enabled"_qs, enabled);
873 QString Preferences::getAutoRunOnTorrentAddedProgram() const
875 return value<QString>(u"AutoRun/OnTorrentAdded/Program"_qs);
878 void Preferences::setAutoRunOnTorrentAddedProgram(const QString &program)
880 setValue(u"AutoRun/OnTorrentAdded/Program"_qs, program);
883 bool Preferences::isAutoRunOnTorrentFinishedEnabled() const
885 return value(u"AutoRun/enabled"_qs, false);
888 void Preferences::setAutoRunOnTorrentFinishedEnabled(const bool enabled)
890 setValue(u"AutoRun/enabled"_qs, enabled);
893 QString Preferences::getAutoRunOnTorrentFinishedProgram() const
895 return value<QString>(u"AutoRun/program"_qs);
898 void Preferences::setAutoRunOnTorrentFinishedProgram(const QString &program)
900 setValue(u"AutoRun/program"_qs, program);
903 #if defined(Q_OS_WIN)
904 bool Preferences::isAutoRunConsoleEnabled() const
906 return value(u"AutoRun/ConsoleEnabled"_qs, false);
909 void Preferences::setAutoRunConsoleEnabled(const bool enabled)
911 setValue(u"AutoRun/ConsoleEnabled"_qs, enabled);
913 #endif
915 bool Preferences::shutdownWhenDownloadsComplete() const
917 return value(u"Preferences/Downloads/AutoShutDownOnCompletion"_qs, false);
920 void Preferences::setShutdownWhenDownloadsComplete(const bool shutdown)
922 setValue(u"Preferences/Downloads/AutoShutDownOnCompletion"_qs, shutdown);
925 bool Preferences::suspendWhenDownloadsComplete() const
927 return value(u"Preferences/Downloads/AutoSuspendOnCompletion"_qs, false);
930 void Preferences::setSuspendWhenDownloadsComplete(const bool suspend)
932 setValue(u"Preferences/Downloads/AutoSuspendOnCompletion"_qs, suspend);
935 bool Preferences::hibernateWhenDownloadsComplete() const
937 return value(u"Preferences/Downloads/AutoHibernateOnCompletion"_qs, false);
940 void Preferences::setHibernateWhenDownloadsComplete(const bool hibernate)
942 setValue(u"Preferences/Downloads/AutoHibernateOnCompletion"_qs, hibernate);
945 bool Preferences::shutdownqBTWhenDownloadsComplete() const
947 return value(u"Preferences/Downloads/AutoShutDownqBTOnCompletion"_qs, false);
950 void Preferences::setShutdownqBTWhenDownloadsComplete(const bool shutdown)
952 setValue(u"Preferences/Downloads/AutoShutDownqBTOnCompletion"_qs, shutdown);
955 bool Preferences::dontConfirmAutoExit() const
957 return value(u"ShutdownConfirmDlg/DontConfirmAutoExit"_qs, false);
960 void Preferences::setDontConfirmAutoExit(const bool dontConfirmAutoExit)
962 setValue(u"ShutdownConfirmDlg/DontConfirmAutoExit"_qs, dontConfirmAutoExit);
965 bool Preferences::recheckTorrentsOnCompletion() const
967 return value(u"Preferences/Advanced/RecheckOnCompletion"_qs, false);
970 void Preferences::recheckTorrentsOnCompletion(const bool recheck)
972 setValue(u"Preferences/Advanced/RecheckOnCompletion"_qs, recheck);
975 bool Preferences::resolvePeerCountries() const
977 return value(u"Preferences/Connection/ResolvePeerCountries"_qs, true);
980 void Preferences::resolvePeerCountries(const bool resolve)
982 setValue(u"Preferences/Connection/ResolvePeerCountries"_qs, resolve);
985 bool Preferences::resolvePeerHostNames() const
987 return value(u"Preferences/Connection/ResolvePeerHostNames"_qs, false);
990 void Preferences::resolvePeerHostNames(const bool resolve)
992 setValue(u"Preferences/Connection/ResolvePeerHostNames"_qs, resolve);
995 #if (defined(Q_OS_UNIX) && !defined(Q_OS_MACOS))
996 bool Preferences::useSystemIcons() const
998 return value(u"Preferences/Advanced/useSystemIconTheme"_qs, false);
1001 void Preferences::useSystemIcons(const bool enabled)
1003 setValue(u"Preferences/Advanced/useSystemIconTheme"_qs, enabled);
1005 #endif
1007 bool Preferences::isRecursiveDownloadEnabled() const
1009 return !value(u"Preferences/Advanced/DisableRecursiveDownload"_qs, false);
1012 void Preferences::setRecursiveDownloadEnabled(const bool enable)
1014 setValue(u"Preferences/Advanced/DisableRecursiveDownload"_qs, !enable);
1017 #ifdef Q_OS_WIN
1018 bool Preferences::neverCheckFileAssoc() const
1020 return value(u"Preferences/Win32/NeverCheckFileAssocation"_qs, false);
1023 void Preferences::setNeverCheckFileAssoc(const bool check)
1025 setValue(u"Preferences/Win32/NeverCheckFileAssocation"_qs, check);
1028 bool Preferences::isTorrentFileAssocSet()
1030 const QSettings settings(u"HKEY_CURRENT_USER\\Software\\Classes"_qs, QSettings::NativeFormat);
1031 if (settings.value(u".torrent/Default"_qs).toString() != u"qBittorrent")
1033 qDebug(".torrent != qBittorrent");
1034 return false;
1037 return true;
1040 bool Preferences::isMagnetLinkAssocSet()
1042 const QSettings settings(u"HKEY_CURRENT_USER\\Software\\Classes"_qs, QSettings::NativeFormat);
1044 // Check magnet link assoc
1045 const QString shellCommand = settings.value(u"magnet/shell/open/command/Default"_qs, QString()).toString();
1047 const QRegularExpressionMatch exeRegMatch = QRegularExpression(u"\"([^\"]+)\".*"_qs).match(shellCommand);
1048 if (!exeRegMatch.hasMatch())
1049 return false;
1051 const Path assocExe {exeRegMatch.captured(1)};
1052 if (assocExe != Path(qApp->applicationFilePath()))
1053 return false;
1055 return true;
1058 void Preferences::setTorrentFileAssoc(const bool set)
1060 QSettings settings(u"HKEY_CURRENT_USER\\Software\\Classes"_qs, QSettings::NativeFormat);
1062 // .Torrent association
1063 if (set)
1065 const QString oldProgId = settings.value(u".torrent/Default"_qs).toString();
1066 if (!oldProgId.isEmpty() && (oldProgId != u"qBittorrent"))
1067 settings.setValue((u".torrent/OpenWithProgids/" + oldProgId), QString());
1068 settings.setValue(u".torrent/Default"_qs, u"qBittorrent"_qs);
1070 else if (isTorrentFileAssocSet())
1072 settings.setValue(u".torrent/Default"_qs, QString());
1075 SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
1078 void Preferences::setMagnetLinkAssoc(const bool set)
1080 QSettings settings(u"HKEY_CURRENT_USER\\Software\\Classes"_qs, QSettings::NativeFormat);
1082 // Magnet association
1083 if (set)
1085 const QString applicationFilePath = Path(qApp->applicationFilePath()).toString();
1086 const QString commandStr = u'"' + applicationFilePath + u"\" \"%1\"";
1087 const QString iconStr = u'"' + applicationFilePath + u"\",1";
1089 settings.setValue(u"magnet/Default"_qs, u"URL:Magnet link"_qs);
1090 settings.setValue(u"magnet/Content Type"_qs, u"application/x-magnet"_qs);
1091 settings.setValue(u"magnet/URL Protocol"_qs, QString());
1092 settings.setValue(u"magnet/DefaultIcon/Default"_qs, iconStr);
1093 settings.setValue(u"magnet/shell/Default"_qs, u"open"_qs);
1094 settings.setValue(u"magnet/shell/open/command/Default"_qs, commandStr);
1096 else if (isMagnetLinkAssocSet())
1098 settings.remove(u"magnet"_qs);
1101 SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
1103 #endif // Q_OS_WIN
1105 #ifdef Q_OS_MACOS
1106 namespace
1108 const CFStringRef torrentExtension = CFSTR("torrent");
1109 const CFStringRef magnetUrlScheme = CFSTR("magnet");
1112 bool Preferences::isTorrentFileAssocSet()
1114 bool isSet = false;
1115 const CFStringRef torrentId = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, torrentExtension, NULL);
1116 if (torrentId != NULL)
1118 const CFStringRef defaultHandlerId = LSCopyDefaultRoleHandlerForContentType(torrentId, kLSRolesViewer);
1119 if (defaultHandlerId != NULL)
1121 const CFStringRef myBundleId = CFBundleGetIdentifier(CFBundleGetMainBundle());
1122 isSet = CFStringCompare(myBundleId, defaultHandlerId, 0) == kCFCompareEqualTo;
1123 CFRelease(defaultHandlerId);
1125 CFRelease(torrentId);
1127 return isSet;
1130 bool Preferences::isMagnetLinkAssocSet()
1132 bool isSet = false;
1133 const CFStringRef defaultHandlerId = LSCopyDefaultHandlerForURLScheme(magnetUrlScheme);
1134 if (defaultHandlerId != NULL)
1136 const CFStringRef myBundleId = CFBundleGetIdentifier(CFBundleGetMainBundle());
1137 isSet = CFStringCompare(myBundleId, defaultHandlerId, 0) == kCFCompareEqualTo;
1138 CFRelease(defaultHandlerId);
1140 return isSet;
1143 void Preferences::setTorrentFileAssoc()
1145 if (isTorrentFileAssocSet())
1146 return;
1147 const CFStringRef torrentId = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, torrentExtension, NULL);
1148 if (torrentId != NULL)
1150 const CFStringRef myBundleId = CFBundleGetIdentifier(CFBundleGetMainBundle());
1151 LSSetDefaultRoleHandlerForContentType(torrentId, kLSRolesViewer, myBundleId);
1152 CFRelease(torrentId);
1156 void Preferences::setMagnetLinkAssoc()
1158 if (isMagnetLinkAssocSet())
1159 return;
1160 const CFStringRef myBundleId = CFBundleGetIdentifier(CFBundleGetMainBundle());
1161 LSSetDefaultHandlerForURLScheme(magnetUrlScheme, myBundleId);
1163 #endif // Q_OS_MACOS
1165 int Preferences::getTrackerPort() const
1167 return value<int>(u"Preferences/Advanced/trackerPort"_qs, 9000);
1170 void Preferences::setTrackerPort(const int port)
1172 setValue(u"Preferences/Advanced/trackerPort"_qs, port);
1175 bool Preferences::isTrackerPortForwardingEnabled() const
1177 return value(u"Preferences/Advanced/trackerPortForwarding"_qs, false);
1180 void Preferences::setTrackerPortForwardingEnabled(const bool enabled)
1182 setValue(u"Preferences/Advanced/trackerPortForwarding"_qs, enabled);
1185 #if defined(Q_OS_WIN) || defined(Q_OS_MACOS)
1186 bool Preferences::isUpdateCheckEnabled() const
1188 return value(u"Preferences/Advanced/updateCheck"_qs, true);
1191 void Preferences::setUpdateCheckEnabled(const bool enabled)
1193 setValue(u"Preferences/Advanced/updateCheck"_qs, enabled);
1195 #endif
1197 bool Preferences::confirmTorrentDeletion() const
1199 return value(u"Preferences/Advanced/confirmTorrentDeletion"_qs, true);
1202 void Preferences::setConfirmTorrentDeletion(const bool enabled)
1204 setValue(u"Preferences/Advanced/confirmTorrentDeletion"_qs, enabled);
1207 bool Preferences::confirmTorrentRecheck() const
1209 return value(u"Preferences/Advanced/confirmTorrentRecheck"_qs, true);
1212 void Preferences::setConfirmTorrentRecheck(const bool enabled)
1214 setValue(u"Preferences/Advanced/confirmTorrentRecheck"_qs, enabled);
1217 bool Preferences::confirmRemoveAllTags() const
1219 return value(u"Preferences/Advanced/confirmRemoveAllTags"_qs, true);
1222 void Preferences::setConfirmRemoveAllTags(const bool enabled)
1224 setValue(u"Preferences/Advanced/confirmRemoveAllTags"_qs, enabled);
1227 #ifndef Q_OS_MACOS
1228 TrayIcon::Style Preferences::trayIconStyle() const
1230 return value(u"Preferences/Advanced/TrayIconStyle"_qs, TrayIcon::Style::Normal);
1233 void Preferences::setTrayIconStyle(const TrayIcon::Style style)
1235 setValue(u"Preferences/Advanced/TrayIconStyle"_qs, style);
1237 #endif
1239 // Stuff that don't appear in the Options GUI but are saved
1240 // in the same file.
1242 QDateTime Preferences::getDNSLastUpd() const
1244 return value<QDateTime>(u"DNSUpdater/lastUpdateTime"_qs);
1247 void Preferences::setDNSLastUpd(const QDateTime &date)
1249 setValue(u"DNSUpdater/lastUpdateTime"_qs, date);
1252 QString Preferences::getDNSLastIP() const
1254 return value<QString>(u"DNSUpdater/lastIP"_qs);
1257 void Preferences::setDNSLastIP(const QString &ip)
1259 setValue(u"DNSUpdater/lastIP"_qs, ip);
1262 bool Preferences::getAcceptedLegal() const
1264 return value(u"LegalNotice/Accepted"_qs, false);
1267 void Preferences::setAcceptedLegal(const bool accepted)
1269 setValue(u"LegalNotice/Accepted"_qs, accepted);
1272 QByteArray Preferences::getMainGeometry() const
1274 return value<QByteArray>(u"MainWindow/geometry"_qs);
1277 void Preferences::setMainGeometry(const QByteArray &geometry)
1279 setValue(u"MainWindow/geometry"_qs, geometry);
1282 bool Preferences::isFiltersSidebarVisible() const
1284 return value(u"GUI/MainWindow/FiltersSidebarVisible"_qs, true);
1287 void Preferences::setFiltersSidebarVisible(const bool value)
1289 setValue(u"GUI/MainWindow/FiltersSidebarVisible"_qs, value);
1292 int Preferences::getFiltersSidebarWidth() const
1294 return value(u"GUI/MainWindow/FiltersSidebarWidth"_qs, 120);
1297 void Preferences::setFiltersSidebarWidth(const int value)
1299 setValue(u"GUI/MainWindow/FiltersSidebarWidth"_qs, value);
1302 Path Preferences::getMainLastDir() const
1304 return value(u"MainWindow/LastDir"_qs, Utils::Fs::homePath());
1307 void Preferences::setMainLastDir(const Path &path)
1309 setValue(u"MainWindow/LastDir"_qs, path);
1312 QByteArray Preferences::getPeerListState() const
1314 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
1315 return value<QByteArray>(u"GUI/Qt6/TorrentProperties/PeerListState"_qs);
1316 #else
1317 return value<QByteArray>(u"TorrentProperties/Peers/qt5/PeerListState"_qs);
1318 #endif
1321 void Preferences::setPeerListState(const QByteArray &state)
1323 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
1324 setValue(u"GUI/Qt6/TorrentProperties/PeerListState"_qs, state);
1325 #else
1326 setValue(u"TorrentProperties/Peers/qt5/PeerListState"_qs, state);
1327 #endif
1330 QString Preferences::getPropSplitterSizes() const
1332 return value<QString>(u"TorrentProperties/SplitterSizes"_qs);
1335 void Preferences::setPropSplitterSizes(const QString &sizes)
1337 setValue(u"TorrentProperties/SplitterSizes"_qs, sizes);
1340 QByteArray Preferences::getPropFileListState() const
1342 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
1343 return value<QByteArray>(u"GUI/Qt6/TorrentProperties/FilesListState"_qs);
1344 #else
1345 return value<QByteArray>(u"TorrentProperties/qt5/FilesListState"_qs);
1346 #endif
1349 void Preferences::setPropFileListState(const QByteArray &state)
1351 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
1352 setValue(u"GUI/Qt6/TorrentProperties/FilesListState"_qs, state);
1353 #else
1354 setValue(u"TorrentProperties/qt5/FilesListState"_qs, state);
1355 #endif
1358 int Preferences::getPropCurTab() const
1360 return value<int>(u"TorrentProperties/CurrentTab"_qs, -1);
1363 void Preferences::setPropCurTab(const int tab)
1365 setValue(u"TorrentProperties/CurrentTab"_qs, tab);
1368 bool Preferences::getPropVisible() const
1370 return value(u"TorrentProperties/Visible"_qs, false);
1373 void Preferences::setPropVisible(const bool visible)
1375 setValue(u"TorrentProperties/Visible"_qs, visible);
1378 QByteArray Preferences::getPropTrackerListState() const
1380 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
1381 return value<QByteArray>(u"GUI/Qt6/TorrentProperties/TrackerListState"_qs);
1382 #else
1383 return value<QByteArray>(u"TorrentProperties/Trackers/qt5/TrackerListState"_qs);
1384 #endif
1387 void Preferences::setPropTrackerListState(const QByteArray &state)
1389 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
1390 setValue(u"GUI/Qt6/TorrentProperties/TrackerListState"_qs, state);
1391 #else
1392 setValue(u"TorrentProperties/Trackers/qt5/TrackerListState"_qs, state);
1393 #endif
1396 QStringList Preferences::getRssOpenFolders() const
1398 return value<QStringList>(u"GUI/RSSWidget/OpenedFolders"_qs);
1401 void Preferences::setRssOpenFolders(const QStringList &folders)
1403 setValue(u"GUI/RSSWidget/OpenedFolders"_qs, folders);
1406 QByteArray Preferences::getRssSideSplitterState() const
1408 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
1409 return value<QByteArray>(u"GUI/Qt6/RSSWidget/SideSplitterState"_qs);
1410 #else
1411 return value<QByteArray>(u"GUI/RSSWidget/qt5/splitter_h"_qs);
1412 #endif
1415 void Preferences::setRssSideSplitterState(const QByteArray &state)
1417 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
1418 setValue(u"GUI/Qt6/RSSWidget/SideSplitterState"_qs, state);
1419 #else
1420 setValue(u"GUI/RSSWidget/qt5/splitter_h"_qs, state);
1421 #endif
1424 QByteArray Preferences::getRssMainSplitterState() const
1426 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
1427 return value<QByteArray>(u"GUI/Qt6/RSSWidget/MainSplitterState"_qs);
1428 #else
1429 return value<QByteArray>(u"GUI/RSSWidget/qt5/splitterMain"_qs);
1430 #endif
1433 void Preferences::setRssMainSplitterState(const QByteArray &state)
1435 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
1436 setValue(u"GUI/Qt6/RSSWidget/MainSplitterState"_qs, state);
1437 #else
1438 setValue(u"GUI/RSSWidget/qt5/splitterMain"_qs, state);
1439 #endif
1442 QByteArray Preferences::getSearchTabHeaderState() const
1444 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
1445 return value<QByteArray>(u"GUI/Qt6/SearchTab/HeaderState"_qs);
1446 #else
1447 return value<QByteArray>(u"SearchTab/qt5/HeaderState"_qs);
1448 #endif
1451 void Preferences::setSearchTabHeaderState(const QByteArray &state)
1453 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
1454 setValue(u"GUI/Qt6/SearchTab/HeaderState"_qs, state);
1455 #else
1456 setValue(u"SearchTab/qt5/HeaderState"_qs, state);
1457 #endif
1460 bool Preferences::getRegexAsFilteringPatternForSearchJob() const
1462 return value(u"SearchTab/UseRegexAsFilteringPattern"_qs, false);
1465 void Preferences::setRegexAsFilteringPatternForSearchJob(const bool checked)
1467 setValue(u"SearchTab/UseRegexAsFilteringPattern"_qs, checked);
1470 QStringList Preferences::getSearchEngDisabled() const
1472 return value<QStringList>(u"SearchEngines/disabledEngines"_qs);
1475 void Preferences::setSearchEngDisabled(const QStringList &engines)
1477 setValue(u"SearchEngines/disabledEngines"_qs, engines);
1480 QString Preferences::getTorImportLastContentDir() const
1482 return value(u"TorrentImport/LastContentDir"_qs, QDir::homePath());
1485 void Preferences::setTorImportLastContentDir(const QString &path)
1487 setValue(u"TorrentImport/LastContentDir"_qs, path);
1490 QByteArray Preferences::getTorImportGeometry() const
1492 return value<QByteArray>(u"TorrentImportDlg/dimensions"_qs);
1495 void Preferences::setTorImportGeometry(const QByteArray &geometry)
1497 setValue(u"TorrentImportDlg/dimensions"_qs, geometry);
1500 bool Preferences::getStatusFilterState() const
1502 return value(u"TransferListFilters/statusFilterState"_qs, true);
1505 void Preferences::setStatusFilterState(const bool checked)
1507 setValue(u"TransferListFilters/statusFilterState"_qs, checked);
1510 bool Preferences::getCategoryFilterState() const
1512 return value(u"TransferListFilters/CategoryFilterState"_qs, true);
1515 void Preferences::setCategoryFilterState(const bool checked)
1517 setValue(u"TransferListFilters/CategoryFilterState"_qs, checked);
1520 bool Preferences::getTagFilterState() const
1522 return value(u"TransferListFilters/TagFilterState"_qs, true);
1525 void Preferences::setTagFilterState(const bool checked)
1527 setValue(u"TransferListFilters/TagFilterState"_qs, checked);
1530 bool Preferences::getTrackerFilterState() const
1532 return value(u"TransferListFilters/trackerFilterState"_qs, true);
1535 void Preferences::setTrackerFilterState(const bool checked)
1537 setValue(u"TransferListFilters/trackerFilterState"_qs, checked);
1540 int Preferences::getTransSelFilter() const
1542 return value<int>(u"TransferListFilters/selectedFilterIndex"_qs, 0);
1545 void Preferences::setTransSelFilter(const int index)
1547 setValue(u"TransferListFilters/selectedFilterIndex"_qs, index);
1550 bool Preferences::getHideZeroStatusFilters() const
1552 return value<bool>(u"TransferListFilters/HideZeroStatusFilters"_qs, false);
1555 void Preferences::setHideZeroStatusFilters(const bool hide)
1557 setValue(u"TransferListFilters/HideZeroStatusFilters"_qs, hide);
1560 QByteArray Preferences::getTransHeaderState() const
1562 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
1563 return value<QByteArray>(u"GUI/Qt6/TransferList/HeaderState"_qs);
1564 #else
1565 return value<QByteArray>(u"TransferList/qt5/HeaderState"_qs);
1566 #endif
1569 void Preferences::setTransHeaderState(const QByteArray &state)
1571 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
1572 setValue(u"GUI/Qt6/TransferList/HeaderState"_qs, state);
1573 #else
1574 setValue(u"TransferList/qt5/HeaderState"_qs, state);
1575 #endif
1578 bool Preferences::getRegexAsFilteringPatternForTransferList() const
1580 return value(u"TransferList/UseRegexAsFilteringPattern"_qs, false);
1583 void Preferences::setRegexAsFilteringPatternForTransferList(const bool checked)
1585 setValue(u"TransferList/UseRegexAsFilteringPattern"_qs, checked);
1588 // From old RssSettings class
1589 bool Preferences::isRSSWidgetEnabled() const
1591 return value(u"GUI/RSSWidget/Enabled"_qs, false);
1594 void Preferences::setRSSWidgetVisible(const bool enabled)
1596 setValue(u"GUI/RSSWidget/Enabled"_qs, enabled);
1599 int Preferences::getToolbarTextPosition() const
1601 return value<int>(u"Toolbar/textPosition"_qs, -1);
1604 void Preferences::setToolbarTextPosition(const int position)
1606 setValue(u"Toolbar/textPosition"_qs, position);
1609 QList<QNetworkCookie> Preferences::getNetworkCookies() const
1611 const auto rawCookies = value<QStringList>(u"Network/Cookies"_qs);
1612 QList<QNetworkCookie> cookies;
1613 cookies.reserve(rawCookies.size());
1614 for (const QString &rawCookie : rawCookies)
1615 cookies << QNetworkCookie::parseCookies(rawCookie.toUtf8());
1616 return cookies;
1619 void Preferences::setNetworkCookies(const QList<QNetworkCookie> &cookies)
1621 QStringList rawCookies;
1622 rawCookies.reserve(cookies.size());
1623 for (const QNetworkCookie &cookie : cookies)
1624 rawCookies << QString::fromLatin1(cookie.toRawForm());
1625 setValue(u"Network/Cookies"_qs, rawCookies);
1628 bool Preferences::useProxyForBT() const
1630 return value<bool>(u"Network/Proxy/Profiles/BitTorrent"_qs);
1633 void Preferences::setUseProxyForBT(const bool value)
1635 setValue(u"Network/Proxy/Profiles/BitTorrent"_qs, value);
1638 bool Preferences::useProxyForRSS() const
1640 return value<bool>(u"Network/Proxy/Profiles/RSS"_qs);
1643 void Preferences::setUseProxyForRSS(const bool value)
1645 setValue(u"Network/Proxy/Profiles/RSS"_qs, value);
1648 bool Preferences::useProxyForGeneralPurposes() const
1650 return value<bool>(u"Network/Proxy/Profiles/Misc"_qs);
1654 void Preferences::setUseProxyForGeneralPurposes(const bool value)
1656 setValue(u"Network/Proxy/Profiles/Misc"_qs, value);
1659 bool Preferences::isSpeedWidgetEnabled() const
1661 return value(u"SpeedWidget/Enabled"_qs, true);
1664 void Preferences::setSpeedWidgetEnabled(const bool enabled)
1666 setValue(u"SpeedWidget/Enabled"_qs, enabled);
1669 int Preferences::getSpeedWidgetPeriod() const
1671 return value<int>(u"SpeedWidget/period"_qs, 1);
1674 void Preferences::setSpeedWidgetPeriod(const int period)
1676 setValue(u"SpeedWidget/period"_qs, period);
1679 bool Preferences::getSpeedWidgetGraphEnable(const int id) const
1681 // UP and DOWN graphs enabled by default
1682 return value(u"SpeedWidget/graph_enable_%1"_qs.arg(id), ((id == 0) || (id == 1)));
1685 void Preferences::setSpeedWidgetGraphEnable(const int id, const bool enable)
1687 setValue(u"SpeedWidget/graph_enable_%1"_qs.arg(id), enable);
1690 void Preferences::apply()
1692 if (SettingsStorage::instance()->save())
1693 emit changed();