// For license of this file, see /LICENSE.md. #include "miscellaneous/settings.h" #include "miscellaneous/application.h" #include "miscellaneous/iofactory.h" #include #include #include #include #if defined(NO_LITE) // WebEngine. DKEY WebEngineAttributes::ID = "web_engine_attributes"; #endif DKEY DialogGeometries::ID = "dialog_geometries"; // Media player. KEY VideoPlayer::ID = "media_player"; DKEY VideoPlayer::MpvUseCustomConfigFolder = "mpv_use_custom_config_folder"; DVALUE(bool) VideoPlayer::MpvUseCustomConfigFolderDef = true; DKEY VideoPlayer::MpvCustomConfigFolder = "mpv_config_folder"; DVALUE(QString) VideoPlayer::MpvCustomConfigFolderDef = "%data%/mpv"; // Node.js. DKEY Node::ID = "nodejs"; DKEY Node::NodeJsExecutable = QSL("nodejs_executable_") + OS_ID; #if defined(Q_OS_WIN) || defined(Q_OS_OS2) DVALUE(QString) Node::NodeJsExecutableDef = "node.exe"; #else DVALUE(QString) Node::NodeJsExecutableDef = "node"; #endif DKEY Node::NpmExecutable = QSL("npm_executable_") + OS_ID; #if defined(Q_OS_WIN) DVALUE(QString) Node::NpmExecutableDef = "npm.cmd"; #elif defined(Q_OS_OS2) DVALUE(QString) Node::NpmExecutableDef = "npm.exe"; #else DVALUE(QString) Node::NpmExecutableDef = "npm"; #endif DKEY Node::PackageFolder = QSL("package_folder") + OS_ID; DVALUE(QString) Node::PackageFolderDef = QSL(USER_DATA_PLACEHOLDER) + "/node-packages-" + QSL(OS_ID).toLower(); // Cookies. DKEY Cookies::ID = "cookies"; // Network. DKEY Network::ID = "network"; DKEY Network::SendDNT = "send_dnt"; VALUE(bool) Network::SendDNTDef = false; DKEY Network::EnableApiServer = "api_server"; VALUE(bool) Network::EnableApiServerDef = false; DKEY Network::EnableHttp2 = "http2_enabled"; DVALUE(bool) Network::EnableHttp2Def = false; DKEY Network::CustomUserAgent = "user_agent"; DVALUE(QString) Network::CustomUserAgentDef = QString(); DKEY Network::IgnoreAllCookies = "ignore_all_cookies"; DVALUE(bool) Network::IgnoreAllCookiesDef = false; // AdBlock. DKEY AdBlock::ID = "adblock"; DKEY AdBlock::AdBlockEnabled = "enabled"; DVALUE(bool) AdBlock::AdBlockEnabledDef = false; DKEY AdBlock::FilterLists = "filter_lists"; DVALUE(QStringList) AdBlock::FilterListsDef = {QSL("https://secure.fanboy.co.nz/easylist.txt"), QSL("https://secure.fanboy.co.nz/easyprivacy.txt"), QSL("https://secure.fanboy.co.nz/fanboy-social.txt")}; DKEY AdBlock::CustomFilters = "custom_filters"; DVALUE(QStringList) AdBlock::CustomFiltersDef = {}; // Feeds. DKEY Feeds::ID = "feeds"; DKEY Feeds::UpdateTimeout = "feed_update_timeout"; DVALUE(int) Feeds::UpdateTimeoutDef = DOWNLOAD_TIMEOUT; DKEY Feeds::CountFormat = "count_format"; DVALUE(char*) Feeds::CountFormatDef = "(%unread)"; DKEY Feeds::EnableTooltipsFeedsMessages = "show_tooltips"; DVALUE(bool) Feeds::EnableTooltipsFeedsMessagesDef = true; DKEY Feeds::AutoUpdateInterval = "auto_update_interval"; DVALUE(int) Feeds::AutoUpdateIntervalDef = DEFAULT_AUTO_UPDATE_INTERVAL; DKEY Feeds::AutoUpdateEnabled = "auto_update_enabled"; DVALUE(bool) Feeds::AutoUpdateEnabledDef = false; DKEY Feeds::FastAutoUpdate = "auto_update_fast"; DVALUE(bool) Feeds::FastAutoUpdateDef = false; DKEY Feeds::AutoUpdateOnlyUnfocused = "auto_update_only_unfocused"; DVALUE(bool) Feeds::AutoUpdateOnlyUnfocusedDef = false; DKEY Feeds::FeedsUpdateOnStartup = "feeds_update_on_startup"; DVALUE(bool) Feeds::FeedsUpdateOnStartupDef = false; DKEY Feeds::FeedsUpdateStartupDelay = "feeds_update_on_startup_delay"; DVALUE(double) Feeds::FeedsUpdateStartupDelayDef = STARTUP_UPDATE_DELAY; DKEY Feeds::ShowOnlyUnreadFeeds = "show_only_unread_feeds"; DVALUE(bool) Feeds::ShowOnlyUnreadFeedsDef = false; DKEY Feeds::SortAlphabetically = "sort_alphabetically"; DVALUE(bool) Feeds::SortAlphabeticallyDef = false; DKEY Feeds::ShowTreeBranches = "show_tree_branches"; DVALUE(bool) Feeds::ShowTreeBranchesDef = true; DKEY Feeds::HideCountsIfNoUnread = "hide_counts_if_no_unread"; DVALUE(bool) Feeds::HideCountsIfNoUnreadDef = false; DKEY Feeds::UpdateFeedListDuringFetching = "update_feed_list_during_fetching"; DVALUE(bool) Feeds::UpdateFeedListDuringFetchingDef = false; DKEY Feeds::AutoExpandOnSelection = "auto_expand_on_selection"; DVALUE(bool) Feeds::AutoExpandOnSelectionDef = false; DKEY Feeds::OnlyBasicShortcutsInLists = "only_basic_shortcuts_in_lists"; DVALUE(bool) Feeds::OnlyBasicShortcutsInListsDef = false; DKEY Feeds::CustomizeListFont = "customize_list_font"; DVALUE(bool) Feeds::CustomizeListFontDef = false; DKEY Feeds::ListFont = "list_font"; // Messages. DKEY Messages::ID = "messages"; DKEY Messages::LimitArticleImagesHeight = "message_head_image_height"; DVALUE(int) Messages::LimitArticleImagesHeightDef = 72; DKEY Messages::UseLegacyArticleFormat = "legacy_article_format"; DVALUE(bool) Messages::UseLegacyArticleFormatDef = false; DKEY Messages::DisplayEnclosuresInMessage = "show_enclosures_in_message"; DVALUE(bool) Messages::DisplayEnclosuresInMessageDef = false; DKEY Messages::AvoidOldArticles = "avoid_old_articles"; DVALUE(bool) Messages::AvoidOldArticlesDef = false; DKEY Messages::DateTimeToAvoidArticle = "datetime_to_avoid_article"; DVALUE(QDateTime) Messages::DateTimeToAvoidArticleDef = QDateTime::currentDateTime(); DKEY Messages::HoursToAvoidArticle = "hours_to_avoid_article"; DVALUE(int) Messages::HoursToAvoidArticleDef = 0; DKEY Messages::LimitDoNotRemoveUnread = "limit_dont_remove_unread"; DVALUE(bool) Messages::LimitDoNotRemoveUnreadDef = true; DKEY Messages::LimitDoNotRemoveStarred = "limit_dont_remove_starred"; DVALUE(bool) Messages::LimitDoNotRemoveStarredDef = true; DKEY Messages::LimitRecycleInsteadOfPurging = "limit_recycle_dont_purge"; DVALUE(bool) Messages::LimitRecycleInsteadOfPurgingDef = false; DKEY Messages::LimitCountOfArticles = "limit_count_of_articles"; DVALUE(int) Messages::LimitCountOfArticlesDef = 0; DKEY Messages::AlwaysDisplayItemPreview = "always_display_preview"; DVALUE(bool) Messages::AlwaysDisplayItemPreviewDef = true; DKEY Messages::EnableMessagePreview = "enable_message_preview"; DVALUE(bool) Messages::EnableMessagePreviewDef = true; DKEY Messages::ShowResourcesInArticles = "enable_message_resources"; DVALUE(bool) Messages::ShowResourcesInArticlesDef = true; DKEY Messages::Zoom = "zoom"; DVALUE(qreal) Messages::ZoomDef = double(1.0); DKEY Messages::FixupFutureArticleDateTimes = "fixup_future_datetimes"; DVALUE(bool) Messages::FixupFutureArticleDateTimesDef = false; DKEY Messages::UseCustomDate = "use_custom_date"; DVALUE(bool) Messages::UseCustomDateDef = false; DKEY Messages::CustomDateFormat = "custom_date_format"; DVALUE(char*) Messages::CustomDateFormatDef = ""; DKEY Messages::CustomFormatForDatesOnly = "custom_date_format_for_dates_only"; DVALUE(char*) Messages::CustomFormatForDatesOnlyDef = ""; DKEY Messages::UseCustomFormatForDatesOnly = "use_custom_date_for_dates_only"; DVALUE(bool) Messages::UseCustomFormatForDatesOnlyDef = false; DKEY Messages::RelativeTimeForNewerArticles = "relative_time_for_new_articles"; DVALUE(int) Messages::RelativeTimeForNewerArticlesDef = -1; DKEY Messages::ArticleMarkOnSelection = "mark_message_on_selected"; DVALUE(int) Messages::ArticleMarkOnSelectionDef = int(MessagesView::ArticleMarkingPolicy::MarkImmediately); DKEY Messages::ArticleMarkOnSelectionDelay = "mark_message_on_selected_delay"; DVALUE(int) Messages::ArticleMarkOnSelectionDelayDef = 3000; DKEY Messages::ArticleListPadding = "article_list_padding"; DVALUE(int) Messages::ArticleListPaddingDef = -1; DKEY Messages::MultilineArticleList = "multiline_article_list"; DVALUE(bool) Messages::MultilineArticleListDef = false; DKEY Messages::SwitchArticleListRtl = "switch_article_list_rtl"; DVALUE(bool) Messages::SwitchArticleListRtlDef = true; DKEY Messages::UseCustomTime = "use_custom_time"; DVALUE(bool) Messages::UseCustomTimeDef = false; DKEY Messages::CustomTimeFormat = "custom_time_format"; DVALUE(QString) Messages::CustomTimeFormatDef = {}; DKEY Messages::ClearReadOnExit = "clear_read_on_exit"; DVALUE(bool) Messages::ClearReadOnExitDef = false; DKEY Messages::IgnoreContentsChanges = "ignore_contents_changes"; DVALUE(bool) Messages::IgnoreContentsChangesDef = true; DKEY Messages::UnreadIconType = "unread_icons_in_message_list"; DVALUE(int) Messages::UnreadIconTypeDef = 1; /* MessagesModel::MessageUnreadIcon::Dot */ DKEY Messages::BringAppToFrontAfterMessageOpenedExternally = "bring_app_to_front_after_msg_opened"; DVALUE(bool) Messages::BringAppToFrontAfterMessageOpenedExternallyDef = false; DKEY Messages::KeepCursorInCenter = "keep_cursor_center"; DVALUE(bool) Messages::KeepCursorInCenterDef = false; DKEY Messages::ShowOnlyUnreadMessages = "show_only_unread_messages"; DVALUE(bool) Messages::ShowOnlyUnreadMessagesDef = false; DKEY Messages::PreviewerFontStandard = "previewer_font_standard"; NON_CONST_DVALUE(QString) Messages::PreviewerFontStandardDef = QString(); DKEY Messages::CustomizeListFont = "customize_list_font"; DVALUE(bool) Messages::CustomizeListFontDef = false; DKEY Messages::ListFont = "list_font"; // Custom skin colors. DKEY CustomSkinColors::ID = "custom_skin_colors"; DKEY CustomSkinColors::Enabled = "enabled"; DVALUE(bool) CustomSkinColors::EnabledDef = false; // GUI. DKEY GUI::ID = "gui"; DKEY GUI::MessageViewState = "msg_view_state"; DVALUE(QString) GUI::MessageViewStateDef = QString(); DKEY GUI::SplitterFeeds = "splitter_feeds"; DVALUE(QList) GUI::SplitterFeedsDef = {}; DKEY GUI::SplitterMessagesIsVertical = "splitter_messages_is_vertical"; DVALUE(bool) GUI::SplitterMessagesIsVerticalDef = true; DKEY GUI::SplitterMessagesVertical = "splitter_messages_vertical"; DVALUE(QList) GUI::SplitterMessagesVerticalDef = {}; DKEY GUI::SplitterMessagesHorizontal = "splitter_messages_horizontal"; DVALUE(QList) GUI::SplitterMessagesHorizontalDef = {}; DKEY GUI::ToolbarIconSize = "toolbar_icon_size"; DVALUE(int) GUI::ToolbarIconSizeDef = 0; DKEY GUI::ToolbarStyle = "toolbar_style"; DVALUE(Qt::ToolButtonStyle) GUI::ToolbarStyleDef = Qt::ToolButtonIconOnly; DKEY GUI::HeightRowMessages = "height_row_messages"; DVALUE(int) GUI::HeightRowMessagesDef = -1; DKEY GUI::HeightRowFeeds = "height_row_feeds"; DVALUE(int) GUI::HeightRowFeedsDef = -1; DKEY GUI::FeedsToolbarActions = "feeds_toolbar"; DVALUE(char*) GUI::FeedsToolbarActionsDef = "m_actionUpdateAllItems,m_actionStopRunningItemsUpdate,m_actionMarkAllItemsRead,spacer,search"; DKEY GUI::StatusbarActions = "status_bar"; DVALUE(char*) GUI::StatusbarActionsDef = "m_barProgressDownloadAction,m_barProgressFeedsAction,m_actionUpdateAllItems,m_" "actionUpdateSelectedItems,m_actionStopRunningItemsUpdate,m_actionFullscreen,m_actionQuit"; DKEY GUI::MainWindowInitialSize = "window_size"; DKEY GUI::MainWindowInitialPosition = "window_position"; DKEY GUI::IsMainWindowMaximizedBeforeFullscreen = "is_window_maximized_before_fullscreen"; DVALUE(bool) GUI::IsMainWindowMaximizedBeforeFullscreenDef = false; DKEY GUI::MainWindowStartsFullscreen = "start_in_fullscreen"; DVALUE(bool) GUI::MainWindowStartsFullscreenDef = false; DKEY GUI::MainWindowStartsHidden = "start_hidden"; DVALUE(bool) GUI::MainWindowStartsHiddenDef = false; DKEY GUI::MainWindowStartsMaximized = "window_is_maximized"; DVALUE(bool) GUI::MainWindowStartsMaximizedDef = false; DKEY GUI::AlternateRowColorsInLists = "alternate_colors_in_lists"; DVALUE(bool) GUI::AlternateRowColorsInListsDef = false; DKEY GUI::MainMenuVisible = "main_menu_visible"; DVALUE(bool) GUI::MainMenuVisibleDef = true; DKEY GUI::ToolbarsVisible = "enable_toolbars"; DVALUE(bool) GUI::ToolbarsVisibleDef = true; DKEY GUI::ListHeadersVisible = "enable_list_headers"; DVALUE(bool) GUI::ListHeadersVisibleDef = true; DKEY GUI::MessageViewerToolbarsVisible = "message_viewer_toolbars"; DVALUE(bool) GUI::MessageViewerToolbarsVisibleDef = true; DKEY GUI::StatusBarVisible = "enable_status_bar"; DVALUE(bool) GUI::StatusBarVisibleDef = true; DKEY GUI::EnableNotifications = "enable_notifications"; DVALUE(bool) GUI::EnableNotificationsDef = true; DKEY GUI::UseToastNotifications = "use_toast_notifications"; DVALUE(bool) GUI::UseToastNotificationsDef = true; DKEY GUI::ToastNotificationsPosition = "toast_notifications_position"; DVALUE(ToastNotificationsManager::NotificationPosition) GUI::ToastNotificationsPositionDef = ToastNotificationsManager::NotificationPosition::BottomRight; DKEY GUI::ToastNotificationsScreen = "toast_notifications_screen"; DVALUE(int) GUI::ToastNotificationsScreenDef = -1; DKEY GUI::ToastNotificationsMargin = "toast_notifications_margin"; DVALUE(int) GUI::ToastNotificationsMarginDef = NOTIFICATIONS_MARGIN; DKEY GUI::ToastNotificationsOpacity = "toast_notifications_opacity"; DVALUE(double) GUI::ToastNotificationsOpacityDef = 0.9; DKEY GUI::ToastNotificationsWidth = "toast_notifications_width"; DVALUE(int) GUI::ToastNotificationsWidthDef = NOTIFICATIONS_WIDTH; DKEY GUI::HideMainWindowWhenMinimized = "hide_when_minimized"; DVALUE(bool) GUI::HideMainWindowWhenMinimizedDef = false; DKEY GUI::MonochromeTrayIcon = "monochrome_tray_icon"; DVALUE(bool) GUI::MonochromeTrayIconDef = false; DKEY GUI::ForcedSkinColors = "forced_skin_colors"; DVALUE(bool) GUI::ForcedSkinColorsDef = true; DKEY GUI::UnreadNumbersInTrayIcon = "show_unread_numbers_in_tray_icon"; DVALUE(bool) GUI::UnreadNumbersInTrayIconDef = true; #if (defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)) || defined(Q_OS_WIN) DKEY GUI::UnreadNumbersOnTaskBar = "show_unread_numbers_on_task_bar"; DVALUE(bool) GUI::UnreadNumbersOnTaskBarDef = true; #endif DKEY GUI::UseTrayIcon = "use_tray_icon"; DVALUE(bool) GUI::UseTrayIconDef = true; DKEY GUI::TabCloseMiddleClick = "tab_close_mid_button"; DVALUE(bool) GUI::TabCloseMiddleClickDef = true; DKEY GUI::TabCloseDoubleClick = "tab_close_double_button"; DVALUE(bool) GUI::TabCloseDoubleClickDef = true; DKEY GUI::TabNewDoubleClick = "tab_new_double_button"; DVALUE(bool) GUI::TabNewDoubleClickDef = true; DKEY GUI::HideTabBarIfOnlyOneTab = "hide_tabbar_one_tab"; DVALUE(bool) GUI::HideTabBarIfOnlyOneTabDef = false; DKEY GUI::MessagesToolbarDefaultButtons = "messages_toolbar"; DVALUE(char*) GUI::MessagesToolbarDefaultButtonsDef = "m_actionMarkSelectedMessagesAsRead,m_actionMarkSelectedMessagesAsUnread,m_actionSwitchImportanceOfSelectedMessages," "separator,highlighter,filter,spacer,search"; DKEY GUI::DefaultSortColumnFeeds = "default_sort_column_feeds"; DVALUE(int) GUI::DefaultSortColumnFeedsDef = FDS_MODEL_TITLE_INDEX; DKEY GUI::DefaultSortOrderFeeds = "default_sort_order_feeds"; DVALUE(Qt::SortOrder) GUI::DefaultSortOrderFeedsDef = Qt::AscendingOrder; DKEY GUI::IconTheme = "icon_theme_name"; DVALUE(char*) GUI::IconThemeDef = APP_ICON_THEME_DEFAULT; DKEY GUI::Skin = "skin"; DVALUE(char*) GUI::SkinDef = APP_SKIN_DEFAULT; DKEY GUI::Style = "style"; DVALUE(char*) GUI::StyleDef = APP_STYLE_DEFAULT; // General. DKEY General::ID = "main"; DKEY General::UpdateOnStartup = "update_on_start"; DVALUE(bool) General::UpdateOnStartupDef = false; DKEY General::FirstRun = "first_run"; DVALUE(bool) General::FirstRunDef = true; DKEY General::Language = "language"; DVALUE(QString) General::LanguageDef = QLocale::system().name(); // Downloads. DKEY Downloads::ID = "download_manager"; DKEY Downloads::AlwaysPromptForFilename = "prompt_for_filename"; DVALUE(bool) Downloads::AlwaysPromptForFilenameDef = false; DKEY Downloads::TargetDirectory = "target_directory"; DVALUE(QString) Downloads::TargetDirectoryDef = IOFactory::getSystemFolder(QStandardPaths::DownloadLocation); DKEY Downloads::RemovePolicy = "remove_policy"; DVALUE(int) Downloads::RemovePolicyDef = int(DownloadManager::RemovePolicy::Never); DKEY Downloads::TargetExplicitDirectory = "target_explicit_directory"; DVALUE(QString) Downloads::TargetExplicitDirectoryDef = IOFactory::getSystemFolder(QStandardPaths::DownloadLocation); DKEY Downloads::ShowDownloadsWhenNewDownloadStarts = "show_downloads_on_new_download_start"; DVALUE(bool) Downloads::ShowDownloadsWhenNewDownloadStartsDef = true; DKEY Downloads::ItemUrl = "download_%1_url"; DKEY Downloads::ItemLocation = "download_%1_location"; DKEY Downloads::ItemDone = "download_%1_done"; // Proxy. DKEY Proxy::ID = "proxy"; DKEY Proxy::Type = "proxy_type"; DVALUE(QNetworkProxy::ProxyType) Proxy::TypeDef = QNetworkProxy::NoProxy; DKEY Proxy::Host = "host"; DVALUE(QString) Proxy::HostDef = QString(); DKEY Proxy::Username = "username"; DVALUE(QString) Proxy::UsernameDef = QString(); DKEY Proxy::Password = "password"; DVALUE(QString) Proxy::PasswordDef = QString(); DKEY Proxy::Port = "port"; DVALUE(int) Proxy::PortDef = 80; // Database. DKEY Database::ID = "database"; DKEY Database::UseInMemory = "use_in_memory_db"; DVALUE(bool) Database::UseInMemoryDef = false; DKEY Database::MySQLHostname = "mysql_hostname"; DVALUE(QString) Database::MySQLHostnameDef = QString(); DKEY Database::MySQLUsername = "mysql_username"; DVALUE(QString) Database::MySQLUsernameDef = QString(); DKEY Database::MySQLPassword = "mysql_password"; DVALUE(QString) Database::MySQLPasswordDef = QString(); DKEY Database::MySQLDatabase = "mysql_database"; DVALUE(char*) Database::MySQLDatabaseDef = APP_LOW_NAME; DKEY Database::MySQLPort = "mysql_port"; DVALUE(int) Database::MySQLPortDef = APP_DB_MYSQL_PORT; DKEY Database::ActiveDriver = "database_driver"; DVALUE(char*) Database::ActiveDriverDef = APP_DB_SQLITE_DRIVER; // Keyboard. DKEY Keyboard::ID = "keyboard"; // Notifications. DKEY Notifications::ID = "notifications"; // Web browser. DKEY Browser::ID = "browser"; DKEY Browser::DisableCache = "disable_cache"; DVALUE(bool) Browser::DisableCacheDef = false; DKEY Browser::WebEngineChromiumFlags = "webengine_chromium_flags"; #if defined(Q_OS_LINUX) && !defined(IS_FLATPAK_BUILD) DVALUE(QString) Browser::WebEngineChromiumFlagsDef = QSL("--no-sandbox --enable-smooth-scrolling"); #else DVALUE(QString) Browser::WebEngineChromiumFlagsDef = QSL("--enable-smooth-scrolling"); #endif DKEY Browser::OpenLinksInExternalBrowserRightAway = "open_link_externally_wo_confirmation"; DVALUE(bool) Browser::OpenLinksInExternalBrowserRightAwayDef = false; DKEY Browser::CustomExternalBrowserEnabled = "custom_external_browser"; DVALUE(bool) Browser::CustomExternalBrowserEnabledDef = false; DKEY Browser::CustomExternalBrowserExecutable = "external_browser_executable"; DVALUE(QString) Browser::CustomExternalBrowserExecutableDef = QString(); DKEY Browser::CustomExternalBrowserArguments = "external_browser_arguments"; DVALUE(char*) Browser::CustomExternalBrowserArgumentsDef = "\"%1\""; DKEY Browser::CustomExternalEmailEnabled = "custom_external_email"; DVALUE(bool) Browser::CustomExternalEmailEnabledDef = false; DKEY Browser::CustomExternalEmailExecutable = "external_email_executable"; DVALUE(QString) Browser::CustomExternalEmailExecutableDef = QString(); DKEY Browser::CustomExternalEmailArguments = "external_email_arguments"; DVALUE(char*) Browser::CustomExternalEmailArgumentsDef = ""; DKEY Browser::ExternalTools = "external_tools"; DVALUE(QStringList) Browser::ExternalToolsDef = QStringList(); // Categories. DKEY CategoriesExpandStates::ID = "categories_expand_states"; Settings::Settings(const QString& file_name, Format format, SettingsProperties::SettingsType type, QObject* parent) : QSettings(file_name, format, parent), m_lock(QReadWriteLock(QReadWriteLock::RecursionMode::Recursive)), m_initializationStatus(type) { Messages::PreviewerFontStandardDef = QFont(QApplication::font().family(), 12).toString(); } Settings::~Settings() = default; QStringList Settings::allKeys(const QString& section) { if (!section.isEmpty()) { beginGroup(section); auto keys = QSettings::allKeys(); endGroup(); return keys; } else { return QSettings::allKeys(); } } QString Settings::pathName() const { return QFileInfo(fileName()).absolutePath(); } QSettings::Status Settings::checkSettings() { qDebugNN << LOGSEC_CORE << "Syncing settings."; sync(); return status(); } bool Settings::initiateRestoration(const QString& settings_backup_file_path) { return IOFactory::copyFile(settings_backup_file_path, QFileInfo(fileName()).absolutePath() + QDir::separator() + BACKUP_NAME_SETTINGS + BACKUP_SUFFIX_SETTINGS); } void Settings::finishRestoration(const QString& desired_settings_file_path) { const QString backup_settings_file = QFileInfo(desired_settings_file_path).absolutePath() + QDir::separator() + BACKUP_NAME_SETTINGS + BACKUP_SUFFIX_SETTINGS; if (QFile::exists(backup_settings_file)) { qWarningNN << LOGSEC_CORE << "Backup settings file" << QUOTE_W_SPACE(QDir::toNativeSeparators(backup_settings_file)) << "was detected. Restoring it."; if (IOFactory::copyFile(backup_settings_file, desired_settings_file_path)) { QFile::remove(backup_settings_file); qDebugNN << LOGSEC_CORE << "Settings file was restored successully."; } else { qCriticalNN << LOGSEC_CORE << "Settings file was NOT restored due to error when copying the file."; } } } Settings* Settings::setupSettings(QObject* parent) { Settings* new_settings; // If settings file exists (and is writable) in executable file working directory // (in subdirectory APP_CFG_PATH), then use it (portable settings). // Otherwise use settings file stored in home path. const SettingsProperties properties = determineProperties(); finishRestoration(properties.m_absoluteSettingsFileName); // Portable settings are available, use them. new_settings = new Settings(properties.m_absoluteSettingsFileName, QSettings::IniFormat, properties.m_type, parent); if (properties.m_type == SettingsProperties::SettingsType::Portable) { qDebugNN << LOGSEC_CORE << "Initializing settings in" << QUOTE_W_SPACE(QDir::toNativeSeparators(properties.m_absoluteSettingsFileName)) << "(portable way)."; } else if (properties.m_type == SettingsProperties::SettingsType::Custom) { qDebugNN << LOGSEC_CORE << "Initializing settings in" << QUOTE_W_SPACE(QDir::toNativeSeparators(properties.m_absoluteSettingsFileName)) << "(custom way)."; } else { qDebugNN << LOGSEC_CORE << "Initializing settings in" << QUOTE_W_SPACE(QDir::toNativeSeparators(properties.m_absoluteSettingsFileName)) << "(non-portable way)."; } return new_settings; } SettingsProperties Settings::determineProperties() { SettingsProperties properties; properties.m_settingsSuffix = QDir::separator() + QSL(APP_CFG_PATH) + QDir::separator() + QSL(APP_CFG_FILE); const QString app_path = qApp->userDataAppFolder(); const QString home_path = qApp->userDataHomeFolder(); const QString custom_path = qApp->customDataFolder(); if (!custom_path.isEmpty()) { // User wants to have his user data in custom folder, okay. properties.m_type = SettingsProperties::SettingsType::Custom; properties.m_baseDirectory = custom_path; } else { // We will use PORTABLE settings only and only if it is available and NON-PORTABLE // settings was not initialized before. #if defined(Q_OS_UNIX) // DO NOT use portable settings for *nix, it is really not used on that platform. const bool will_we_use_portable_settings = false; #else const QString exe_path = qApp->applicationDirPath(); const QString home_path_file = home_path + properties.m_settingsSuffix; const bool portable_settings_available = IOFactory::isFolderWritable(exe_path); const bool non_portable_settings_exist = QFile::exists(home_path_file); const bool will_we_use_portable_settings = portable_settings_available && !non_portable_settings_exist; #endif if (will_we_use_portable_settings) { properties.m_type = SettingsProperties::SettingsType::Portable; properties.m_baseDirectory = QDir::toNativeSeparators(app_path); } else { properties.m_type = SettingsProperties::SettingsType::NonPortable; properties.m_baseDirectory = QDir::toNativeSeparators(home_path); } } properties.m_absoluteSettingsFileName = properties.m_baseDirectory + properties.m_settingsSuffix; return properties; }