eric6/Preferences/__init__.py

changeset 6942
2602857055c5
parent 6932
8a3df4c6ac9a
child 6977
1ceea617d286
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Preferences/__init__.py	Sun Apr 14 15:09:21 2019 +0200
@@ -0,0 +1,3999 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2002 - 2019 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Package implementing the preferences interface.
+
+The preferences interface consists of a class, which defines the default
+values for all configuration items and stores the actual values. These
+values are read and written to the eric6 preferences file by module
+functions. The data is stored in a file in a subdirectory of the users home
+directory. The individual configuration data is accessed by accessor functions
+defined on the module level. The module is simply imported wherever it is
+needed with the statement 'import Preferences'. Do not use
+'from Preferences import *' to import it.
+"""
+
+from __future__ import unicode_literals
+try:
+    basestring    # __IGNORE_WARNING__
+except NameError:
+    basestring = str
+
+import os
+import fnmatch
+import shutil
+import json
+import sys
+
+from PyQt5.QtCore import QDir, QPoint, QLocale, QSettings, QFileInfo, \
+    QCoreApplication, QByteArray, QSize, QUrl, Qt, QLibraryInfo, QDateTime
+from PyQt5.QtGui import QColor, QFont, QPalette
+from PyQt5.QtWidgets import QApplication
+from PyQt5.QtNetwork import QNetworkRequest
+try:
+    from PyQt5.QtWebKit import QWebSettings
+except ImportError:
+    QWebSettings = None
+try:
+    from PyQt5.QtWebEngineWidgets import QWebEngineSettings
+except ImportError:
+    QWebEngineSettings = None
+from PyQt5.Qsci import QsciScintilla, QsciLexerPython
+
+from E5Gui import E5FileDialog
+
+from E5Network.E5Ftp import E5FtpProxyType
+
+from Globals import settingsNameOrganization, settingsNameGlobal, \
+    settingsNameRecent, isWindowsPlatform, getPyQt5ModulesDirectory, \
+    qVersionTuple
+
+from Project.ProjectBrowserFlags import SourcesBrowserFlag, FormsBrowserFlag, \
+    ResourcesBrowserFlag, TranslationsBrowserFlag, InterfacesBrowserFlag, \
+    OthersBrowserFlag, ProtocolsBrowserFlag, AllBrowsersFlag
+
+try:
+    from Helpviewer.FlashCookieManager.FlashCookieUtilities import \
+        flashDataPathForOS
+except ImportError:
+    from WebBrowser.FlashCookieManager.FlashCookieUtilities import \
+        flashDataPathForOS
+
+from QScintilla.Shell import ShellHistoryStyle
+
+
+class Prefs(object):
+    """
+    A class to hold all configuration items for the application.
+    """
+    # defaults for the variables window
+    varDefaults = {
+        "LocalsFilter": "[]",
+        "GlobalsFilter": "[]"
+    }
+    
+    # defaults for the debugger
+    debuggerDefaults = {
+        "RemoteDbgEnabled": False,
+        "RemoteHost": "",
+        "RemoteExecution": "",
+        "PassiveDbgEnabled": False,
+        "PassiveDbgPort": 42424,
+        "PassiveDbgType": "Python",
+        "AutomaticReset": False,
+        "Autosave": True,
+        "ThreeStateBreakPoints": False,
+        "RecentNumber": 9,
+        # max. number of file names to be remembered for the add breakpoint
+        # dialog
+        "SuppressClientExit": False,
+        "BreakAlways": False,
+        "ShowExceptionInShell": True,
+        "Python2VirtualEnv": "",
+        "Python3VirtualEnv": "",
+        "RubyInterpreter": "",
+        "DebugClientType": "standard",
+        # supported "standard", "custom"
+        "DebugClient": "",
+        "DebugClientType3": "standard",
+        # supported "standard", "custom"
+        "DebugClient3": "",
+        "DebugEnvironmentReplace": False,
+        "DebugEnvironment": "",
+        "PythonRedirect": True,
+        "PythonNoEncoding": False,
+        "Python3Redirect": True,
+        "Python3NoEncoding": False,
+        "RubyRedirect": True,
+        "ConsoleDbgEnabled": False,
+        "ConsoleDbgCommand": "",
+        "PathTranslation": False,
+        "PathTranslationRemote": "",
+        "PathTranslationLocal": "",
+        "NetworkInterface": "127.0.0.1",
+        "AutoViewSourceCode": False,
+        "MaxVariableSize": 0,     # Bytes, 0 = no limit
+    }
+    debuggerDefaults["AllowedHosts"] = ["127.0.0.1", "::1%0"]
+    if sys.version_info[0] == 2:
+        # space separated list of Python2 extensions
+        debuggerDefaults["PythonExtensions"] = ".py .pyw .py2 .pyw2 .ptl"
+        # space separated list of Python3 extensions
+        debuggerDefaults["Python3Extensions"] = ".py3 .pyw3"
+    else:
+        # space separated list of Python2 extensions
+        debuggerDefaults["PythonExtensions"] = ".py2 .pyw2 .ptl"
+        # space separated list of Python3 extensions
+        debuggerDefaults["Python3Extensions"] = ".py .pyw .py3 .pyw3"
+    
+    # defaults for the UI settings
+    uiDefaults = {
+        "KeyboardInputInterval": 0,         # 0 = use system default
+        "BackgroundServiceProcesses": 0,    # 0 = max. CPUs minus one
+        "Language": "System",
+        "Style": "System",
+        "StyleSheet": "",
+        "ViewManager": "tabview",
+        "LayoutType": "Sidebars",
+        "SidebarDelay": 200,
+        # allowed values are "Toolboxes" and "Sidebars"
+        "LayoutShellEmbedded": 0,           # 0 = separate
+                                            # 1 = embedded in debug browser
+        "LayoutFileBrowserEmbedded": 0,     # 0 = separate
+                                            # 1 = embedded in debug browser
+                                            # 2 = embedded in project browser
+        "BrowsersListFoldersFirst": True,
+        "BrowsersHideNonPublic": False,
+        "BrowsersListContentsByOccurrence": False,
+        "BrowsersListHiddenFiles": False,
+        "BrowsersFileFilters": "*.py[co];*.so;*.dll",
+        "LogViewerAutoRaise": True,
+        "LogViewerStdoutFilter": [],
+        "LogViewerStderrFilter": [],
+        "LogViewerStdxxxFilter": [],
+        "SingleApplicationMode": False,
+        "CaptionShowsFilename": True,
+        "CaptionFilenameLength": 100,
+        "RecentNumber": 9,
+        "TopLeftByLeft": True,
+        "BottomLeftByLeft": False,
+        "TopRightByRight": True,
+        "BottomRightByRight": False,
+        "TabViewManagerFilenameLength": 40,
+        "TabViewManagerFilenameOnly": True,
+        "ShowFilePreview": True,
+        "ShowFilePreviewJS": True,
+        "ShowFilePreviewSSI": True,
+        "ShowTemplateViewer": True,             # left side
+        "ShowFileBrowser": True,                # left side
+        "ShowSymbolsViewer": True,              # left side
+        "ShowCodeDocumentationViewer": True,    # right side
+        "ShowPyPIPackageManager": True,         # right side
+        "ShowCondaPackageManager": True,        # right side
+        "ShowCooperation": True,                # right side
+        "ShowIrc": True,                        # right side
+        "ShowNumbersViewer": True,              # bottom side
+        "ViewProfiles2": {
+            "edit": [
+                # saved state main window with toolbox windows (0)
+                QByteArray(),
+                # visibility of the toolboxes/sidebars (1)
+                # left, bottom, right
+                [True, True, True],
+                # saved states of the splitters and sidebars of the
+                # sidebars layout (2)
+                # left splitter, vertical splitter, left sidebar,
+                # bottom sidebar, right splitter, right sidebar
+                [QByteArray(), QByteArray(), QByteArray(),
+                 QByteArray(), QByteArray(), QByteArray()],
+            ],
+            "debug": [
+                # saved state main window with toolbox windows (0)
+                QByteArray(),
+                # visibility of the toolboxes/sidebars (1)
+                # left, bottom, right
+                [False, True, True],
+                # saved states of the splitters and sidebars of the
+                # sidebars layout (2)
+                # left splitter, vertical splitter, left sidebar,
+                # bottom sidebar, right splitter, right sidebar
+                [QByteArray(), QByteArray(), QByteArray(),
+                 QByteArray(), QByteArray(), QByteArray()],
+            ],
+        },
+        "ToolbarManagerState": QByteArray(),
+        "PreviewSplitterState": QByteArray(),
+        "ShowSplash": True,
+        "SingleCloseButton": False,
+        "SplitOrientationVertical": False,
+        "UseNativeMenuBar": True,
+        
+        "PerformVersionCheck": 4,
+        # 0 = off
+        # 1 = at startup
+        # 2 = daily
+        # 3 = weekly
+        # 4 = monthly
+        "DynamicOnlineCheck": True,
+        "UseProxy": False,
+        "UseSystemProxy": True,
+        "UseHttpProxyForAll": False,
+        "ProxyHost/Http": "",
+        "ProxyHost/Https": "",
+        "ProxyHost/Ftp": "",
+        "ProxyPort/Http": 80,
+        "ProxyPort/Https": 443,
+        "ProxyPort/Ftp": 21,
+        "ProxyUser/Http": "",
+        "ProxyUser/Https": "",
+        "ProxyUser/Ftp": "",
+        "ProxyPassword/Http": "",
+        "ProxyPassword/Https": "",
+        "ProxyPassword/Ftp": "",
+        "ProxyType/Ftp": E5FtpProxyType.NoProxy,
+        "ProxyAccount/Ftp": "",
+        "ProxyExceptions": "localhost,127.0.0.,::1",
+        
+        "PluginRepositoryUrl6":
+        "https://eric-ide.python-projects.org/plugins6/repository.xml",
+        "VersionsUrls6": [
+            "https://die-offenbachs.homelinux.org/eric/versions/"
+            "versions6",
+            "https://eric-ide.python-projects.org/versions/versions6",
+        ],
+        
+        "OpenOnStartup": 0,        # 0 = nothing
+                                   # 1 = last file
+                                   # 2 = last project
+                                   # 3 = last multiproject
+                                   # 4 = last global session
+        "OpenCrashSessionOnStartup": True,
+        "CrashSessionEnabled": True,
+        
+        "DownloadPath": "",
+        "RequestDownloadFilename": True,
+        "CheckErrorLog": True,
+        
+        "LogStdErrColour": QColor(Qt.red),
+        "NotificationsEnabled": True,
+        "NotificationTimeout": 5,       # time in seconds the notification
+                                        # is shown
+        "NotificationPosition": QPoint(10, 10),
+        "TextMimeTypes": [
+            "application/bookmarks.xbel",
+            "application/x-xbel",
+            "application/opensearchdescription+xml",
+            "application/x-actionscript",
+            "application/x-actionscript3",
+            "application/x-awk",
+            "application/x-sh",
+            "application/x-shellscript",
+            "application/x-shell-session",
+            "application/x-dos-batch",
+            "application/x-befunge",
+            "application/x-brainfuck",
+            "application/x-javascript+cheetah",
+            "application/x-javascript+spitfire",
+            "application/x-cheetah",
+            "application/x-spitfire",
+            "application/xml+cheetah",
+            "application/xml+spitfire",
+            "application/x-clojure",
+            "application/x-coldfusion",
+            "application/x-cython",
+            "application/x-django-templating",
+            "application/x-jinja",
+            "application/xml-dtd",
+            "application/x-ecl",
+            "application/x-ruby-templating",
+            "application/x-evoque",
+            "application/xml+evoque",
+            "application/x-fantom",
+            "application/x-genshi",
+            "application/x-kid",
+            "application/x-genshi-text",
+            "application/x-gettext",
+            "application/x-troff",
+            "application/xhtml+xml",
+            "application/x-php",
+            "application/x-httpd-php",
+            "application/x-httpd-php3",
+            "application/x-httpd-php4",
+            "application/x-httpd-php5",
+            "application/x-hybris",
+            "application/x-javascript+django",
+            "application/x-javascript+jinja",
+            "application/x-javascript+ruby",
+            "application/x-javascript+genshi",
+            "application/javascript",
+            "application/x-javascript",
+            "application/x-javascript+php",
+            "application/x-javascript+smarty",
+            "application/json",
+            "application/x-jsp",
+            "application/x-julia",
+            "application/x-httpd-lasso",
+            "application/x-httpd-lasso[89]",
+            "application/x-httpd-lasso8",
+            "application/x-httpd-lasso9",
+            "application/x-javascript+lasso",
+            "application/xml+lasso",
+            "application/x-lua",
+            "application/x-javascript+mako",
+            "application/x-mako",
+            "application/xml+mako",
+            "application/x-gooddata-maql",
+            "application/x-mason",
+            "application/x-moonscript",
+            "application/x-javascript+myghty",
+            "application/x-myghty",
+            "application/xml+myghty",
+            "application/x-newlisp",
+            "application/x-openedge",
+            "application/x-perl",
+            "application/postscript",
+            "application/x-pypylog",
+            "application/x-python3",
+            "application/x-python",
+            "application/x-qml",
+            "application/x-racket",
+            "application/x-pygments-tokens",
+            "application/x-ruby",
+            "application/x-standardml",
+            "application/x-scheme",
+            "application/x-sh-session",
+            "application/x-smarty",
+            "application/x-ssp",
+            "application/x-tcl",
+            "application/x-csh",
+            "application/x-urbiscript",
+            "application/xml+velocity",
+            "application/xquery",
+            "application/xml+django",
+            "application/xml+jinja",
+            "application/xml+ruby",
+            "application/xml",
+            "application/rss+xml",
+            "application/atom+xml",
+            "application/xml+php",
+            "application/xml+smarty",
+            "application/xsl+xml",
+            "application/xslt+xml",
+            "application/x-desktop",
+            
+            "image/svg+xml",
+        ],
+    }
+    
+    iconsDefaults = {
+        "Path": [],
+    }
+    
+    # defaults for the cooperation settings
+    cooperationDefaults = {
+        "ServerPort": 42000,
+        "AutoStartServer": False,
+        "TryOtherPorts": True,
+        "MaxPortsToTry": 100,
+        "AutoAcceptConnections": False,
+        "BannedUsers": [],
+    }
+    
+    # defaults for the editor settings
+    editorDefaults = {
+        "AutosaveInterval": 0,
+        "TabWidth": 4,
+        "IndentWidth": 4,
+        "IndentationGuides": True,
+        "LinenoMargin": True,
+        "FoldingMargin": True,
+        "FoldingStyle": 1,
+        "TabForIndentation": False,
+        "TabIndents": True,
+        "ConvertTabsOnLoad": False,
+        "AutomaticEOLConversion": True,
+        "ShowWhitespace": False,
+        "WhitespaceSize": 1,
+        "ShowEOL": False,
+        "UseMonospacedFont": False,
+        "WrapLongLinesMode": QsciScintilla.WrapNone,
+        "WrapVisualFlag": QsciScintilla.WrapFlagNone,
+        "WrapIndentMode": QsciScintilla.WrapIndentFixed,
+        "WrapStartIndent": 0,
+        "WarnFilesize": 512,
+        "ClearBreaksOnClose": True,
+        "StripTrailingWhitespace": False,
+        "InsertFinalNewline": True,
+        "CommentColumn0": True,
+        "OverrideEditAreaColours": False,
+        
+        "EdgeMode": QsciScintilla.EdgeNone,
+        "EdgeColumn": 80,
+        
+        "AutoIndentation": True,
+        "BraceHighlighting": True,
+        "CreateBackupFile": False,
+        "CaretLineVisible": False,
+        "CaretLineAlwaysVisible": False,
+        "CaretWidth": 1,
+        "CaretLineFrameWidth": 0,
+        "ColourizeSelText": False,
+        "CustomSelectionColours": False,
+        "ExtendSelectionToEol": False,
+        "LineMarkersBackground": True,
+        
+        "AutoPrepareAPIs": False,
+        
+        "AutoCompletionEnabled": False,
+        "AutoCompletionCaseSensitivity": True,
+        "AutoCompletionReplaceWord": False,
+        "AutoCompletionShowSingle": False,
+        "AutoCompletionSource": QsciScintilla.AcsDocument,
+        "AutoCompletionThreshold": 2,
+        # timeout in ms before auto-completion is started
+        "AutoCompletionTimeout": 200,
+        "AutoCompletionFillups": False,
+        # show QScintilla completions, if plug-in fails
+        "AutoCompletionScintillaOnFail": False,
+        "AutoCompletionReversedList": False,
+        "AutoCompletionCacheEnabled": True,
+        "AutoCompletionCacheSize": 100,
+        "AutoCompletionCacheTime": 300,     # 5 minutes
+        "AutoCompletionWatchdogTime": 3000,     # ms
+        "AutoCompletionMaxLines": 6,
+        "AutoCompletionMaxChars": 40,
+        
+        "CallTipsEnabled": False,
+        "CallTipsVisible": 0,
+        "CallTipsStyle": QsciScintilla.CallTipsNoContext,
+        # show QScintilla calltips, if plug-in fails
+        "CallTipsScintillaOnFail": False,
+        
+        "AutoCheckSyntax": True,
+        "OnlineSyntaxCheck": True,
+        "OnlineSyntaxCheckInterval": 5,
+        
+        "OnlineChangeTrace": True,
+        "OnlineChangeTraceInterval": 500,      # 1000 milliseconds
+        
+        "AutoReopen": False,
+        
+        "AnnotationsEnabled": True,
+        
+        "MiniContextMenu": False,
+        "HideFormatButtons": True,
+        
+        "SearchMarkersEnabled": True,
+        "QuickSearchMarkersEnabled": True,
+        "MarkOccurrencesEnabled": True,
+        "MarkOccurrencesTimeout": 500,     # 500 milliseconds
+        "SearchRegexpMode": 0,             # 0: POSIX mode, 1: CXX11 mode
+        "AdvancedEncodingDetection": True,
+        
+        "SpellCheckingEnabled": True,
+        "AutoSpellCheckingEnabled": True,
+        "AutoSpellCheckChunkSize": 30,
+        "SpellCheckStringsOnly": True,
+        "SpellCheckingMinWordSize": 3,
+        "SpellCheckingDefaultLanguage": "en_US",
+        "SpellCheckingPersonalWordList": "",
+        "SpellCheckingPersonalExcludeList": "",
+        
+        "DefaultEncoding": "utf-8",
+        "DefaultOpenFilter": QCoreApplication.translate(
+            'Lexers', 'Python Files (*.py *.py2 *.py3)'),
+        "DefaultSaveFilter": QCoreApplication.translate(
+            'Lexers', "Python3 Files (*.py)"),
+        "AdditionalOpenFilters": [],
+        "AdditionalSaveFilters": [],
+        
+        "ZoomFactor": 0,
+        
+        "PreviewHtmlFileNameExtensions": ["html", "htm", "svg", "asp", "kid"],
+        "PreviewMarkdownFileNameExtensions": ["md", "markdown"],
+        "PreviewRestFileNameExtensions": ["rst"],
+        "PreviewQssFileNameExtensions": ["qss"],
+        "PreviewRestUseSphinx": False,
+        "PreviewMarkdownNLtoBR": True,
+        "PreviewMarkdownHTMLFormat": "XHTML1",  # XHTML1, HTML4, HTML5
+        "PreviewRestDocutilsHTMLFormat": "HTML5",   # HTML4, HTML5
+        
+        "VirtualSpaceOptions": QsciScintilla.SCVS_NONE,
+        
+        "MouseClickHandlersEnabled": True,
+        
+        "ShowMarkerMapOnRight": True,
+        "ShowMarkerChanges": True,
+        "ShowMarkerCoverage": True,
+        "ShowMarkerSearch": True,
+        
+        # All (most) lexers
+        "AllFoldCompact": True,
+        
+        # Bash specifics
+        "BashFoldComment": True,
+        
+        # CMake specifics
+        "CMakeFoldAtElse": False,
+        
+        # C++ specifics
+        "CppCaseInsensitiveKeywords": False,
+        "CppFoldComment": True,
+        "CppFoldPreprocessor": False,
+        "CppFoldAtElse": False,
+        "CppIndentOpeningBrace": False,
+        "CppIndentClosingBrace": False,
+        "CppDollarsAllowed": True,
+        "CppStylePreprocessor": False,
+        "CppHighlightTripleQuotedStrings": False,
+        "CppHighlightHashQuotedStrings": False,
+        "CppHighlightBackQuotedStrings": False,
+        "CppHighlightEscapeSequences": False,
+        "CppVerbatimStringEscapeSequencesAllowed": False,
+        
+        # CoffeeScript specifics
+        "CoffeScriptFoldComment": False,
+        "CoffeeScriptDollarsAllowed": True,
+        "CoffeeScriptStylePreprocessor": False,
+        
+        # CSS specifics
+        "CssFoldComment": True,
+        "CssHssSupport": False,
+        "CssLessSupport": False,
+        "CssSassySupport": False,
+        
+        # D specifics
+        "DFoldComment": True,
+        "DFoldAtElse": False,
+        "DIndentOpeningBrace": False,
+        "DIndentClosingBrace": False,
+        
+        # Gettext specifics
+        "PoFoldComment": False,
+        
+        # HTML specifics
+        "HtmlFoldPreprocessor": False,
+        "HtmlFoldScriptComments": False,
+        "HtmlFoldScriptHeredocs": False,
+        "HtmlCaseSensitiveTags": False,
+        "HtmlDjangoTemplates": False,
+        "HtmlMakoTemplates": False,
+        
+        # JSON specifics
+        "JSONHightlightComments": True,
+        "JSONHighlightEscapeSequences": True,
+        
+        # Pascal specifics
+        "PascalFoldComment": True,
+        "PascalFoldPreprocessor": False,
+        "PascalSmartHighlighting": True,
+        
+        # Perl specifics
+        "PerlFoldComment": True,
+        "PerlFoldPackages": True,
+        "PerlFoldPODBlocks": True,
+        "PerlFoldAtElse": False,
+        
+        # PostScript specifics
+        "PostScriptTokenize": False,
+        "PostScriptLevel": 3,
+        "PostScriptFoldAtElse": False,
+        
+        # Povray specifics
+        "PovFoldComment": True,
+        "PovFoldDirectives": False,
+        
+        # Properties specifics
+        "PropertiesInitialSpaces": True,
+        
+        # Python specifics
+        "PythonBadIndentation": QsciLexerPython.Inconsistent,
+        "PythonFoldComment": True,
+        "PythonFoldString": True,
+        "PythonAutoIndent": True,
+        "PythonAllowV2Unicode": True,
+        "PythonAllowV3Binary": True,
+        "PythonAllowV3Bytes": True,
+        "PythonFoldQuotes": False,
+        "PythonStringsOverNewLineAllowed": False,
+        "PythonHighlightSubidentifier": True,
+        
+        # Ruby specifics
+        "RubyFoldComment": False,
+        
+        # SQL specifics
+        "SqlFoldComment": True,
+        "SqlBackslashEscapes": False,
+        "SqlDottedWords": False,
+        "SqlFoldAtElse": False,
+        "SqlFoldOnlyBegin": False,
+        "SqlHashComments": False,
+        "SqlQuotedIdentifiers": False,
+        
+        # TCL specifics
+        "TclFoldComment": False,
+        
+        # TeX specifics
+        "TexFoldComment": False,
+        "TexProcessComments": False,
+        "TexProcessIf": True,
+        
+        # VHDL specifics
+        "VHDLFoldComment": True,
+        "VHDLFoldAtElse": True,
+        "VHDLFoldAtBegin": True,
+        "VHDLFoldAtParenthesis": True,
+        
+        # XML specifics
+        "XMLStyleScripts": True,
+        
+        # YAML specifics
+        "YAMLFoldComment": False,
+    }
+    
+    if isWindowsPlatform():
+        editorDefaults["EOLMode"] = QsciScintilla.EolWindows
+    else:
+        editorDefaults["EOLMode"] = QsciScintilla.EolUnix
+    
+    try:
+        # since QScintilla 2.7.0
+        editorDefaults["CallTipsPosition"] = QsciScintilla.CallTipsBelowText
+    except AttributeError:
+        editorDefaults["CallTipsPosition"] = 0
+    
+    editorColourDefaults = {
+        "CurrentMarker": QColor(Qt.yellow),
+        "ErrorMarker": QColor(Qt.red),
+        "MatchingBrace": QColor(Qt.green),
+        "MatchingBraceBack": QColor(Qt.white),
+        "NonmatchingBrace": QColor(Qt.red),
+        "NonmatchingBraceBack": QColor(Qt.white),
+        "CallTipsBackground": QColor(Qt.white),
+        "CaretForeground": QColor(Qt.black),
+        "CaretLineBackground": QColor(Qt.white),
+        "Edge": QColor(Qt.lightGray),
+        "SelectionBackground": QColor(Qt.black),
+        "SelectionForeground": QColor(Qt.white),
+        "SearchMarkers": QColor(Qt.blue),
+        "MarginsBackground": QColor(Qt.lightGray),
+        "MarginsForeground": QColor(Qt.black),
+        "FoldmarginBackground": QColor("#e6e6e6"),
+        "FoldMarkersForeground": QColor(Qt.white),
+        "FoldMarkersBackground": QColor(Qt.black),
+        "SpellingMarkers": QColor(Qt.red),
+        "AnnotationsWarningForeground": QColor("#606000"),
+        "AnnotationsWarningBackground": QColor("#ffffd0"),
+        "AnnotationsErrorForeground": QColor("#600000"),
+        "AnnotationsErrorBackground": QColor("#ffd0d0"),
+        "AnnotationsStyleForeground": QColor("#000060"),
+        "AnnotationsStyleBackground": QColor("#d0d0ff"),
+        "WhitespaceForeground": QColor(Qt.darkGray),
+        "WhitespaceBackground": QColor(Qt.white),
+        "OnlineChangeTraceMarkerUnsaved": QColor("#ff8888"),
+        "OnlineChangeTraceMarkerSaved": QColor("#88ff88"),
+        "IndentationGuidesBackground": QColor(Qt.white),
+        "IndentationGuidesForeground": QColor(Qt.black),
+        "HighlightMarker": QColor("#200000FF"),     # ARGB format
+        # colors for the marker map
+        "BookmarksMap": QColor("#f8c700"),
+        "ErrorsMap": QColor("#dd0000"),
+        "WarningsMap": QColor("#606000"),
+        "BreakpointsMap": QColor("#f55c07"),
+        "TasksMap": QColor("#2278f8"),
+        "CoverageMap": QColor("#ad3636"),
+        "ChangesMap": QColor("#00b000"),
+        "CurrentMap": QColor("#000000"),
+        "SearchMarkersMap": QColor(Qt.blue),
+        "VcsConflictMarkersMap": QColor("#dd00dd"),
+        "MarkerMapBackground": QColor("#e7e7e7"),
+    }
+    
+    editorOtherFontsDefaults = {
+        "MarginsFont": "Sans Serif,10,-1,5,50,0,0,0,0,0",
+        "DefaultFont": "Sans Serif,10,-1,5,50,0,0,0,0,0",
+        "MonospacedFont": "Courier,10,-1,5,50,0,0,0,0,0",
+    }
+    
+    editorTypingDefaults = {
+        "Python/EnabledTypingAids": True,
+        "Python/InsertClosingBrace": True,
+        "Python/IndentBrace": False,
+        "Python/SkipBrace": True,
+        "Python/InsertQuote": True,
+        "Python/DedentElse": True,
+        "Python/DedentExcept": True,
+        "Python/Py24StyleTry": True,
+        "Python/InsertImport": True,
+        "Python/InsertSelf": True,
+        "Python/InsertBlank": True,
+        "Python/ColonDetection": True,
+        "Python/DedentDef": False,
+        
+        "Ruby/EnabledTypingAids": True,
+        "Ruby/InsertClosingBrace": True,
+        "Ruby/IndentBrace": True,
+        "Ruby/SkipBrace": True,
+        "Ruby/InsertQuote": True,
+        "Ruby/InsertBlank": True,
+        "Ruby/InsertHereDoc": True,
+        "Ruby/InsertInlineDoc": True,
+    }
+    
+    editorExporterDefaults = {
+        "HTML/WYSIWYG": True,
+        "HTML/Folding": False,
+        "HTML/OnlyStylesUsed": False,
+        "HTML/FullPathAsTitle": False,
+        "HTML/UseTabs": False,
+        
+        "RTF/WYSIWYG": True,
+        "RTF/UseTabs": False,
+        "RTF/Font": "Courier New,10,-1,5,50,0,0,0,0,0",
+        
+        "PDF/Magnification": 0,
+        "PDF/Font": "Helvetica",  # must be Courier, Helvetica or Times
+        "PDF/PageSize": "A4",         # must be A4 or Letter
+        "PDF/MarginLeft": 36,
+        "PDF/MarginRight": 36,
+        "PDF/MarginTop": 36,
+        "PDF/MarginBottom": 36,
+        
+        "TeX/OnlyStylesUsed": False,
+        "TeX/FullPathAsTitle": False,
+        
+        "ODT/WYSIWYG": True,
+        "ODT/OnlyStylesUsed": False,
+        "ODT/UseTabs": False,
+    }
+    
+    # defaults for the printer settings
+    printerDefaults = {
+        "PrinterName": "",
+        "ColorMode": True,
+        "FirstPageFirst": True,
+        "Magnification": -3,
+        "Orientation": 0,
+        "PageSize": 0,
+        "HeaderFont": "Serif,10,-1,5,50,0,0,0,0,0",
+        "LeftMargin": 1.0,
+        "RightMargin": 1.0,
+        "TopMargin": 1.0,
+        "BottomMargin": 1.0,
+        "Resolution": 150,      # printer resolution in DPI
+    }
+    
+    # defaults for the project settings
+    projectDefaults = {
+        "SearchNewFiles": False,
+        "SearchNewFilesRecursively": False,
+        "AutoIncludeNewFiles": False,
+        "AutoLoadSession": False,
+        "AutoSaveSession": False,
+        "SessionAllBreakpoints": False,
+        "XMLTimestamp": True,
+        "AutoCompileForms": False,
+        "AutoCompileResources": False,
+        "AutoExecuteMake": False,
+        "AutoLoadDbgProperties": False,
+        "AutoSaveDbgProperties": False,
+        "HideGeneratedForms": False,
+        "FollowEditor": True,
+        "FollowCursorLine": True,
+        "AutoPopulateItems": True,
+        "RecentNumber": 9,
+        "DeterminePyFromProject": True,
+        "TasksProjectAutoSave": True,
+        "TasksProjectRescanOnOpen": True,
+        "DebugClientsHistory": [],
+        "DebuggerInterpreterHistory": [],
+        "RestartShellForProject": True,
+    }
+    
+    # defaults for the multi project settings
+    multiProjectDefaults = {
+        "OpenMasterAutomatically": True,
+        "XMLTimestamp": True,
+        "RecentNumber": 9,
+        "Workspace": "",
+    }
+    
+    # defaults for the project browser flags settings
+    projectBrowserFlagsDefaults = {
+        "Qt4": (
+            SourcesBrowserFlag |
+            FormsBrowserFlag |
+            ResourcesBrowserFlag |
+            TranslationsBrowserFlag |
+            InterfacesBrowserFlag |
+            OthersBrowserFlag |
+            ProtocolsBrowserFlag),
+        "Qt4C": (
+            SourcesBrowserFlag |
+            ResourcesBrowserFlag |
+            TranslationsBrowserFlag |
+            InterfacesBrowserFlag |
+            OthersBrowserFlag |
+            ProtocolsBrowserFlag),
+        "PyQt5": (
+            SourcesBrowserFlag |
+            FormsBrowserFlag |
+            ResourcesBrowserFlag |
+            TranslationsBrowserFlag |
+            InterfacesBrowserFlag |
+            OthersBrowserFlag |
+            ProtocolsBrowserFlag),
+        "PyQt5C": (
+            SourcesBrowserFlag |
+            ResourcesBrowserFlag |
+            TranslationsBrowserFlag |
+            InterfacesBrowserFlag |
+            OthersBrowserFlag |
+            ProtocolsBrowserFlag),
+        "E6Plugin": (
+            SourcesBrowserFlag |
+            FormsBrowserFlag |
+            ResourcesBrowserFlag |
+            TranslationsBrowserFlag |
+            InterfacesBrowserFlag |
+            OthersBrowserFlag |
+            ProtocolsBrowserFlag),
+        "Console": (
+            SourcesBrowserFlag |
+            InterfacesBrowserFlag |
+            OthersBrowserFlag |
+            ProtocolsBrowserFlag),
+        "Other": (
+            SourcesBrowserFlag |
+            InterfacesBrowserFlag |
+            OthersBrowserFlag |
+            ProtocolsBrowserFlag),
+        "PySide": (
+            SourcesBrowserFlag |
+            FormsBrowserFlag |
+            ResourcesBrowserFlag |
+            TranslationsBrowserFlag |
+            InterfacesBrowserFlag |
+            OthersBrowserFlag |
+            ProtocolsBrowserFlag),
+        "PySideC": (
+            SourcesBrowserFlag |
+            ResourcesBrowserFlag |
+            TranslationsBrowserFlag |
+            InterfacesBrowserFlag |
+            OthersBrowserFlag |
+            ProtocolsBrowserFlag),
+        "PySide2": (
+            SourcesBrowserFlag |
+            FormsBrowserFlag |
+            ResourcesBrowserFlag |
+            TranslationsBrowserFlag |
+            InterfacesBrowserFlag |
+            OthersBrowserFlag |
+            ProtocolsBrowserFlag),
+        "PySide2C": (
+            SourcesBrowserFlag |
+            ResourcesBrowserFlag |
+            TranslationsBrowserFlag |
+            InterfacesBrowserFlag |
+            OthersBrowserFlag |
+            ProtocolsBrowserFlag),
+    }
+    
+    # defaults for the project browser colour settings
+    projectBrowserColourDefaults = {
+        "Highlighted": QColor(Qt.red),
+        
+        "VcsAdded": QColor(Qt.blue),
+        "VcsConflict": QColor(Qt.red),
+        "VcsModified": QColor(Qt.yellow),
+        "VcsReplaced": QColor(Qt.cyan),
+        "VcsUpdate": QColor(Qt.green),
+        "VcsRemoved": QColor(Qt.magenta)
+    }
+    
+    # defaults for the help settings
+    helpDefaults = {
+        "CustomViewer": "",
+        "PythonDocDir": "",
+        "Python2DocDir": "",
+        "QtDocDir": "",
+        "Qt4DocDir": "",
+        "Qt5DocDir": "",
+        "PyQt4DocDir": "",
+        "PyQt5DocDir": "",
+        "PySideDocDir": "",
+        "PySide2DocDir": "",
+        "EricDocDir": "",
+        "SingleHelpWindow": True,
+        "SaveGeometry": True,
+        "HelpViewerState": QByteArray(),
+        "WebSearchSuggestions": True,
+        "WebSearchEngine": "Google",
+        "WebSearchKeywords": [],    # array of two tuples (keyword,
+                                    # search engine name)
+        "DiskCacheEnabled": True,
+        "DiskCacheSize": 50,        # 50 MB
+        "CachePolicy": QNetworkRequest.PreferNetwork,
+        "AcceptCookies": 2,         # CookieJar.AcceptOnlyFromSitesNavigatedTo
+        "KeepCookiesUntil": 0,      # CookieJar.KeepUntilExpire
+        "FilterTrackingCookies": True,
+        "PrintBackgrounds": False,
+        "StartupBehavior": 1,      # show speed dial
+        "HomePage": "eric:home",
+        "HistoryLimit": 30,
+        "DefaultScheme": "https://",
+        "OfflineStorageDatabaseQuota": 50,     # 50 MB
+        "UserAgent": "",
+        "ShowPreview": True,
+        "DownloadManagerRemovePolicy": 0,      # never delete downloads
+        "DownloadManagerSize": QSize(400, 300),
+        "DownloadManagerPosition": QPoint(),
+        "DownloadManagerDownloads": [],
+        "AccessKeysEnabled": True,
+        "SearchLanguage": QLocale().language(),
+        "DoNotTrack": False,
+        "SendReferer": True,
+        "SendRefererWhitelist": ["qt-apps.org", "kde-apps.org"],
+        "NoCacheHosts": ["qt-project.org"],
+        "RssFeeds": [],
+        "WarnOnMultipleClose": True,
+        "ZoomValuesDB": "{}",       # empty JSON dictionary
+        # VirusTotal
+        "VirusTotalEnabled": False,
+        "VirusTotalServiceKey": "",
+        "VirusTotalSecure": True,
+        # AdBlock
+        "AdBlockEnabled": False,
+        "AdBlockSubscriptions": [],
+        "AdBlockUpdatePeriod": 1,
+        "AdBlockExceptions": [],
+        # Sync
+        "SyncEnabled": False,
+        "SyncBookmarks": True,
+        "SyncHistory": True,
+        "SyncPasswords": False,
+        "SyncUserAgents": True,
+        "SyncSpeedDial": True,
+        "SyncEncryptData": False,
+        "SyncEncryptionKey": "",
+        "SyncEncryptionKeyLength": 32,      # 16, 24 or 32
+        "SyncEncryptPasswordsOnly": False,
+        "SyncType": 0,
+        "SyncFtpServer": "",
+        "SyncFtpUser": "",
+        "SyncFtpPassword": "",
+        "SyncFtpPath": "",
+        "SyncFtpPort": 21,
+        "SyncFtpIdleTimeout": 30,
+        "SyncDirectoryPath": "",
+        # Click-to-Flash
+        "ClickToFlashEnabled": False,
+        "ClickToFlashWhitelist": [],
+        # PIM
+        "PimFullName": "",
+        "PimFirstName": "",
+        "PimLastName": "",
+        "PimEmail": "",
+        "PimPhone": "",
+        "PimMobile": "",
+        "PimAddress": "",
+        "PimCity": "",
+        "PimZip": "",
+        "PimState": "",
+        "PimCountry": "",
+        "PimHomePage": "",
+        "PimSpecial1": "",
+        "PimSpecial2": "",
+        "PimSpecial3": "",
+        "PimSpecial4": "",
+        # Grease Monkey
+        "GreaseMonkeyDisabledScripts": [],
+        # Flash Cookie Manager
+        "FlashCookiesDeleteOnStartExit": False,
+        "FlashCookieAutoRefresh": False,
+        "FlashCookieNotify": False,
+        "FlashCookiesWhitelist": [],
+        "FlashCookiesBlacklist": [],
+        "FlashCookiesDataPath": flashDataPathForOS(),
+    }
+    if QWebSettings:
+        helpDefaults["HelpViewerType"] = 1      # eric browser
+    else:
+        helpDefaults["HelpViewerType"] = 2      # Qt Assistant
+    
+    @classmethod
+    def initWebSettingsDefaults(cls):
+        """
+        Class method to initialize the web settings related defaults.
+        """
+        if QWebSettings is None:
+            return
+        
+        websettings = QWebSettings.globalSettings()
+        fontFamily = websettings.fontFamily(QWebSettings.StandardFont)
+        fontSize = websettings.fontSize(QWebSettings.DefaultFontSize)
+        cls.helpDefaults["StandardFont"] = \
+            QFont(fontFamily, fontSize).toString()
+        fontFamily = websettings.fontFamily(QWebSettings.FixedFont)
+        fontSize = websettings.fontSize(QWebSettings.DefaultFixedFontSize)
+        cls.helpDefaults["FixedFont"] = QFont(fontFamily, fontSize).toString()
+        cls.helpDefaults.update({
+            "AutoLoadImages":
+            websettings.testAttribute(QWebSettings.AutoLoadImages),
+            "UserStyleSheet": "",
+            "SaveUrlColor": QColor(248, 248, 210),
+            "JavaEnabled":
+            websettings.testAttribute(QWebSettings.JavaEnabled),
+            "JavaScriptEnabled":
+            websettings.testAttribute(QWebSettings.JavascriptEnabled),
+            "JavaScriptCanOpenWindows":
+            websettings.testAttribute(
+                QWebSettings.JavascriptCanOpenWindows),
+            "JavaScriptCanCloseWindows":
+            websettings.testAttribute(
+                QWebSettings.JavascriptCanCloseWindows),
+            "JavaScriptCanAccessClipboard":
+            websettings.testAttribute(
+                QWebSettings.JavascriptCanAccessClipboard),
+            "PluginsEnabled":
+            websettings.testAttribute(QWebSettings.PluginsEnabled),
+            "OfflineStorageDatabaseEnabled":
+            websettings.testAttribute(
+                QWebSettings.OfflineStorageDatabaseEnabled),
+        })
+        if hasattr(QWebSettings, "OfflineWebApplicationCacheEnabled"):
+            cls.helpDefaults.update({
+                "OfflineWebApplicationCacheEnabled":
+                websettings.testAttribute(
+                    QWebSettings.OfflineWebApplicationCacheEnabled),
+                "OfflineWebApplicationCacheQuota": 50,     # 50 MB
+            })
+        if hasattr(QWebSettings, "LocalStorageEnabled"):
+            cls.helpDefaults["LocalStorageEnabled"] = \
+                websettings.testAttribute(QWebSettings.LocalStorageEnabled)
+        if hasattr(QWebSettings, "DnsPrefetchEnabled"):
+            cls.helpDefaults["DnsPrefetchEnabled"] = \
+                websettings.testAttribute(QWebSettings.DnsPrefetchEnabled)
+        if hasattr(QWebSettings, "defaultTextEncoding"):
+            cls.helpDefaults["DefaultTextEncoding"] = \
+                websettings.defaultTextEncoding()
+        if hasattr(QWebSettings, "SpatialNavigationEnabled"):
+            cls.helpDefaults["SpatialNavigationEnabled"] = \
+                websettings.testAttribute(
+                    QWebSettings.SpatialNavigationEnabled)
+        if hasattr(QWebSettings, "LinksIncludedInFocusChain"):
+            cls.helpDefaults["LinksIncludedInFocusChain"] = \
+                websettings.testAttribute(
+                    QWebSettings.LinksIncludedInFocusChain)
+        if hasattr(QWebSettings, "LocalContentCanAccessRemoteUrls"):
+            cls.helpDefaults["LocalContentCanAccessRemoteUrls"] = \
+                websettings.testAttribute(
+                    QWebSettings.LocalContentCanAccessRemoteUrls)
+        if hasattr(QWebSettings, "LocalContentCanAccessFileUrls"):
+            cls.helpDefaults["LocalContentCanAccessFileUrls"] = \
+                websettings.testAttribute(
+                    QWebSettings.LocalContentCanAccessFileUrls)
+        if hasattr(QWebSettings, "XSSAuditingEnabled"):
+            cls.helpDefaults["XSSAuditingEnabled"] = \
+                websettings.testAttribute(QWebSettings.XSSAuditingEnabled)
+        if hasattr(QWebSettings, "SiteSpecificQuirksEnabled"):
+            cls.helpDefaults["SiteSpecificQuirksEnabled"] = \
+                websettings.testAttribute(
+                    QWebSettings.SiteSpecificQuirksEnabled)
+        
+        cls.webSettingsIntitialized = True
+    
+    webSettingsIntitialized = False
+    
+    # defaults for the web browser settings
+    webBrowserDefaults = {
+        "SingleWebBrowserWindow": True,
+        "ShowToolbars": False,
+        "BookmarksToolBarVisible": True,
+        "MenuBarVisible": False,
+        "StatusBarVisible": True,
+        "SaveGeometry": True,
+        "WebBrowserState": QByteArray(),
+        "StartupBehavior": 2,       # show speed dial
+        # 0     open empty page
+        # 1     open home page
+        # 2     open speed dial
+        # 3     restore last session
+        # 4     ask user for session
+        "NewTabBehavior": 2,        # show speed dial
+        # 0     open empty page
+        # 1     open home page
+        # 2     open speed dial
+        "HomePage": "eric:home",
+        "LoadTabOnActivation": True,
+        "WarnOnMultipleClose": True,
+        "DefaultScheme": "https://",
+        "UserStyleSheet": "",
+        "ZoomValuesDB": "{}",       # empty JSON dictionary
+        "HistoryLimit": 30,
+        "WebSearchSuggestions": True,
+        "WebSearchEngine": "DuckDuckGo",
+        "WebSearchKeywords": [],    # array of two tuples (keyword,
+                                    # search engine name)
+        "SearchLanguage": QLocale().language(),
+        "ImageSearchEngine": "Google",
+        "RssFeeds": [],
+        "ShowPreview": True,
+        "WebInspectorPort": 42024,
+        "WebInspectorEnabled": False,
+        "DiskCacheEnabled": True,
+        "DiskCacheSize": 50,        # 50 MB
+        "SslExceptionsDB": "{}",    # empty JSON dictionary
+        "DoNotTrack": False,
+        "RefererSendReferer": 2,        # send always
+        "RefererDefaultPolicy": 3,      # don't send a referer when downgrading
+        "RefererTrimmingPolicy": 0,     # send full URL (no trimming)
+        "SendRefererWhitelist": ["qt-apps.org", "kde-apps.org"],
+        "AcceptCookies": 2,         # CookieJar.AcceptOnlyFromSitesNavigatedTo
+        "KeepCookiesUntil": 0,      # CookieJar.KeepUntilExpire
+        "FilterTrackingCookies": True,
+        "SaveUrlColor": QColor(184, 248, 169),
+        "UserAgent": "",
+        "AcceptQuotaRequest": 2,            # yes/no/ask (0, 1, 2)
+        "AcceptProtocolHandlerRequest": 2,  # yes/no/ask (0, 1, 2)
+        # Auto Scroller
+        "AutoScrollEnabled": True,
+        "AutoScrollDivider": 8.0,
+        # Tab Manager
+        "TabManagerGroupByType": 0,     # TabManagerWidget.GroupByWindow
+        # Grease Monkey
+        "GreaseMonkeyDisabledScripts": [],
+        # Downloads
+        "DownloadManagerRemovePolicy": 0,      # never delete downloads
+        "DownloadManagerSize": QSize(450, 600),
+        "DownloadManagerPosition": QPoint(),
+        "DownloadManagerDownloads": [],
+        "DownloadManagerAutoOpen": False,
+        "DownloadManagerAutoClose": False,
+        # Spell Checking
+        "SpellCheckEnabled": False,
+        "SpellCheckLanguages": [],
+        "SpellCheckDictionariesUrl":
+        "https://eric-ide.python-projects.org/qwebengine_dictionaries/" \
+        "dictionaries.xml",
+        # Sync
+        "SyncEnabled": False,
+        "SyncBookmarks": True,
+        "SyncHistory": True,
+        "SyncPasswords": False,
+        "SyncUserAgents": True,
+        "SyncSpeedDial": True,
+        "SyncEncryptData": False,
+        "SyncEncryptionKey": "",
+        "SyncEncryptionKeyLength": 32,      # 16, 24 or 32
+        "SyncEncryptPasswordsOnly": False,
+        "SyncType": 0,
+        "SyncFtpServer": "",
+        "SyncFtpUser": "",
+        "SyncFtpPassword": "",
+        "SyncFtpPath": "",
+        "SyncFtpPort": 21,
+        "SyncFtpIdleTimeout": 30,
+        "SyncDirectoryPath": "",
+        # AdBlock
+        "AdBlockEnabled": False,
+        "AdBlockSubscriptions": [],
+        "AdBlockUpdatePeriod": 1,
+        "AdBlockExceptions": [],
+        "AdBlockUseLimitedEasyList": True,
+        # Flash Cookie Manager: identical to helpDefaults
+        # PIM:                  identical to helpDefaults
+        # VirusTotal:           identical to helpDefaults
+        # Sessions
+        "SessionAutoSave": True,
+        "SessionAutoSaveInterval": 15,  # interval in seconds
+        "SessionLastActivePath": "",
+        # Google Safe Browsing
+        "SafeBrowsingEnabled": True,
+        "SafeBrowsingApiKey": "",       # API key
+        "SafeBrowsingFilterPlatform": True,
+        "SafeBrowsingAutoUpdate": False,
+        "SafeBrowsingUpdateDateTime": QDateTime(),
+        "SafeBrowsingUseLookupApi": False,
+    }
+    if QWebEngineSettings:
+        webBrowserDefaults["HelpViewerType"] = 1      # eric browser
+    else:
+        webBrowserDefaults["HelpViewerType"] = 2      # Qt Assistant
+    
+    @classmethod
+    def initWebEngineSettingsDefaults(cls):
+        """
+        Class method to initialize the web engine settings related defaults.
+        """
+        if QWebEngineSettings is None:
+            return
+        
+        webEngineSettings = QWebEngineSettings.defaultSettings()
+        cls.webBrowserDefaults.update({
+            "StandardFontFamily": webEngineSettings.fontFamily(
+                QWebEngineSettings.StandardFont),
+            "FixedFontFamily": webEngineSettings.fontFamily(
+                QWebEngineSettings.FixedFont),
+            "SerifFontFamily": webEngineSettings.fontFamily(
+                QWebEngineSettings.StandardFont),
+            "SansSerifFontFamily": webEngineSettings.fontFamily(
+                QWebEngineSettings.SansSerifFont),
+            "CursiveFontFamily": webEngineSettings.fontFamily(
+                QWebEngineSettings.CursiveFont),
+            "FantasyFontFamily": webEngineSettings.fontFamily(
+                QWebEngineSettings.FantasyFont),
+            "DefaultFontSize": webEngineSettings.fontSize(
+                QWebEngineSettings.DefaultFontSize),
+            "DefaultFixedFontSize": webEngineSettings.fontSize(
+                QWebEngineSettings.DefaultFixedFontSize),
+            "MinimumFontSize": webEngineSettings.fontSize(
+                QWebEngineSettings.MinimumFontSize),
+            "MinimumLogicalFontSize": webEngineSettings.fontSize(
+                QWebEngineSettings.MinimumLogicalFontSize),
+            
+            "AutoLoadImages": webEngineSettings.testAttribute(
+                QWebEngineSettings.AutoLoadImages),
+            "JavaScriptEnabled": webEngineSettings.testAttribute(
+                QWebEngineSettings.JavascriptEnabled),
+            "JavaScriptCanOpenWindows": webEngineSettings.testAttribute(
+                QWebEngineSettings.JavascriptCanOpenWindows),
+            "JavaScriptCanAccessClipboard": webEngineSettings.testAttribute(
+                QWebEngineSettings.JavascriptCanAccessClipboard),
+            "PluginsEnabled": webEngineSettings.testAttribute(
+                QWebEngineSettings.PluginsEnabled),
+            "LocalStorageEnabled": webEngineSettings.testAttribute(
+                QWebEngineSettings.LocalStorageEnabled),
+            "DefaultTextEncoding": webEngineSettings.defaultTextEncoding(),
+            "SpatialNavigationEnabled": webEngineSettings.testAttribute(
+                QWebEngineSettings.SpatialNavigationEnabled),
+            "LinksIncludedInFocusChain": webEngineSettings.testAttribute(
+                QWebEngineSettings.LinksIncludedInFocusChain),
+            "LocalContentCanAccessRemoteUrls": webEngineSettings.testAttribute(
+                QWebEngineSettings.LocalContentCanAccessRemoteUrls),
+            "LocalContentCanAccessFileUrls": webEngineSettings.testAttribute(
+                QWebEngineSettings.LocalContentCanAccessFileUrls),
+            "XSSAuditingEnabled": webEngineSettings.testAttribute(
+                QWebEngineSettings.XSSAuditingEnabled),
+            "ScrollAnimatorEnabled": webEngineSettings.testAttribute(
+                QWebEngineSettings.ScrollAnimatorEnabled),
+            "ErrorPageEnabled": webEngineSettings.testAttribute(
+                QWebEngineSettings.ErrorPageEnabled),
+            "FullScreenSupportEnabled": webEngineSettings.testAttribute(
+                QWebEngineSettings.FullScreenSupportEnabled),
+        })
+        try:
+            # Qt 5.7+
+            cls.webBrowserDefaults.update({
+                "PictographFontFamily": webEngineSettings.fontFamily(
+                    QWebEngineSettings.PictographFont),
+                
+                "ScreenCaptureEnabled": webEngineSettings.testAttribute(
+                    QWebEngineSettings.ScreenCaptureEnabled),
+                "WebGLEnabled": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebGLEnabled),
+            })
+        except AttributeError:
+            pass
+        try:
+            # Qt 5.8+
+            cls.webBrowserDefaults.update({
+                "FocusOnNavigationEnabled": webEngineSettings.testAttribute(
+                    QWebEngineSettings.FocusOnNavigationEnabled),
+                "PrintElementBackgrounds": webEngineSettings.testAttribute(
+                    QWebEngineSettings.PrintElementBackgrounds),
+                "AllowRunningInsecureContent": webEngineSettings.testAttribute(
+                    QWebEngineSettings.AllowRunningInsecureContent),
+            })
+        except AttributeError:
+            pass
+        try:
+            # Qt 5.9+
+            cls.webBrowserDefaults.update({
+                "AllowGeolocationOnInsecureOrigins":
+                    webEngineSettings.testAttribute(
+                        QWebEngineSettings.AllowGeolocationOnInsecureOrigins),
+            })
+        except AttributeError:
+            pass
+        try:
+            # Qt 5.10+
+            cls.webBrowserDefaults.update({
+                "AllowWindowActivationFromJavaScript":
+                    webEngineSettings.testAttribute(
+                        QWebEngineSettings.AllowWindowActivationFromJavaScript
+                    ),
+                "ShowScrollBars": webEngineSettings.testAttribute(
+                    QWebEngineSettings.ShowScrollBars),
+            })
+        except AttributeError:
+            pass
+        try:
+            # Qt 5.11+
+            cls.webBrowserDefaults.update({
+                "PlaybackRequiresUserGesture":
+                    webEngineSettings.testAttribute(
+                        QWebEngineSettings.PlaybackRequiresUserGesture),
+                "JavaScriptCanPaste":
+                    webEngineSettings.testAttribute(
+                        QWebEngineSettings.JavascriptCanPaste),
+                "WebRTCPublicInterfacesOnly":
+                    webEngineSettings.testAttribute(
+                        QWebEngineSettings.WebRTCPublicInterfacesOnly),
+            })
+        except AttributeError:
+            pass
+        try:
+            # Qt 5.12+
+            cls.webBrowserDefaults.update({
+                "DnsPrefetchEnabled":
+                    webEngineSettings.testAttribute(
+                        QWebEngineSettings.DnsPrefetchEnabled),
+            })
+        except AttributeError:
+            pass
+        
+        cls.webEngineSettingsIntitialized = True
+    
+    webEngineSettingsIntitialized = False
+
+    # defaults for system settings
+    sysDefaults = {
+        "StringEncoding": "utf-8",
+        "IOEncoding": "utf-8",
+    }
+    
+    # defaults for the shell settings
+    shellDefaults = {
+        "LinenoMargin": True,
+        "AutoCompletionEnabled": True,
+        "CallTipsEnabled": True,
+        "WrapEnabled": True,
+        "MaxHistoryEntries": 100,
+        "HistoryStyle": ShellHistoryStyle.LinuxStyle,
+        "HistoryWrap": False,
+        "HistoryNavigateByCursor": False,
+        "SyntaxHighlightingEnabled": True,
+        "ShowStdOutErr": True,
+        "UseMonospacedFont": False,
+        "MonospacedFont": "Courier,10,-1,5,50,0,0,0,0,0",
+        "MarginsFont": "Sans Serif,10,-1,5,50,0,0,0,0,0",
+        "LastVirtualEnvironment": "",
+        "StartWithMostRecentlyUsedEnvironment": True,
+    }
+
+    # defaults for Qt related stuff
+    qtDefaults = {
+        "Qt4TranslationsDir": "",
+        "Qt5TranslationsDir": "",
+        "QtToolsDir": "",
+        "QtToolsPrefix4": "",
+        "QtToolsPostfix4": "",
+        "PyuicIndent": 4,
+        "PyuicFromImports": False,
+        "PyQtToolsDir": "",
+    }
+    
+    # defaults for corba related stuff
+    corbaDefaults = {
+        "omniidl": ""
+    }
+    
+    # defaults for protobuf related stuff
+    protobufDefaults = {
+        "protoc": "",
+        "grpcPython": "",
+    }
+    
+    # defaults for user related stuff
+    userDefaults = {
+        "Email": "",
+        "MailServer": "",
+        "Signature": "",
+        "MailServerAuthentication": False,
+        "MailServerUser": "",
+        "MailServerPassword": "",
+        "MailServerEncryption": "No",   # valid values: No, SSL, TLS
+        "MailServerPort": 25,
+        "UseSystemEmailClient": False,
+        "UseGoogleMailOAuth2": False,
+        "MasterPassword": "",           # stores the password hash
+        "UseMasterPassword": False,
+        "SavePasswords": False,
+    }
+    
+    # defaults for vcs related stuff
+    vcsDefaults = {
+        "AutoClose": False,
+        "AutoSaveFiles": True,
+        "AutoSaveProject": True,
+        "AutoUpdate": False,
+        "StatusMonitorInterval": 30,
+        "MonitorLocalStatus": False,
+    }
+    
+    # defaults for tasks related stuff
+    tasksDefaults = {
+        "TasksFixmeMarkers": "FIX" + "ME:",
+        "TasksWarningMarkers": "WARN" + "ING:",
+        "TasksTodoMarkers": "TO" + "DO:",
+        "TasksNoteMarkers": "NO" + "TE:",
+        # needed to keep it from being recognized as a task
+        "TasksFixmeColor": QColor("#FFA0A0"),
+        "TasksWarningColor": QColor("#FFFFA0"),
+        "TasksTodoColor": QColor("#A0FFA0"),
+        "TasksNoteColor": QColor("#A0A0FF"),
+        "ClearOnFileClose": True,
+    }
+    
+    # defaults for templates related stuff
+    templatesDefaults = {
+        "AutoOpenGroups": True,
+        "SingleDialog": False,
+        "ShowTooltip": False,
+        "SeparatorChar": "$",
+        "EditorFont": "Monospace,9,-1,5,50,0,0,0,0,0",
+    }
+    
+    # defaults for plugin manager related stuff
+    pluginManagerDefaults = {
+        "ActivateExternal": True,
+        "DownloadPath": "",
+        "UpdatesCheckInterval": 3,
+        # 0 = off
+        # 1 = daily
+        # 2 = weekly
+        # 3 = monthly
+        # 4 = always
+        "CheckInstalledOnly": True,
+        # list of plug-ins not to shown in the repo dialog
+        "HiddenPlugins": [],
+        # parameters for housekeeping
+        "KeepGenerations": 2,
+        "KeepHidden": False,
+        "StartupCleanup": True,
+    }
+    
+    # defaults for the printer settings
+    graphicsDefaults = {
+        "Font": "SansSerif,10,-1,5,50,0,0,0,0,0"
+    }
+    
+    # defaults for the icon editor
+    iconEditorDefaults = {
+        "IconEditorState": QByteArray(),
+    }
+    
+    # defaults for pyflakes
+    pyflakesDefaults = {
+        "IncludeInSyntaxCheck": True,
+        "IgnoreStarImportWarnings": True,
+    }
+    
+    # defaults for tray starter
+    trayStarterDefaults = {
+        "TrayStarterIcon": "erict.png",
+        # valid values are: erict.png, erict-hc.png,
+        #                   erict-bw.png, erict-bwi.png
+    }
+    
+    # defaults for geometry
+    geometryDefaults = {
+        "HelpViewerGeometry": QByteArray(),
+        "HelpInspectorGeometry": QByteArray(),
+        "WebBrowserGeometry": QByteArray(),
+        "IconEditorGeometry": QByteArray(),
+        "HexEditorGeometry": QByteArray(),
+        "MainGeometry": QByteArray(),
+        "MainMaximized": False,
+        "WebInspectorGeometry": QByteArray(),
+    }
+
+    # if true, revert layouts to factory defaults
+    resetLayout = False
+    
+    # defaults for IRC
+    ircDefaults = {
+        "ShowTimestamps": True,
+        "TimestampIncludeDate": False,
+        "TimeFormat": "hh:mm",
+        "DateFormat": "yyyy-MM-dd",
+        
+        "NetworkMessageColour": "#000055",
+        "ServerMessageColour": "#91640A",
+        "ErrorMessageColour": "#FF0000",
+        "TimestampColour": "#709070",
+        "HyperlinkColour": "#0000FF",
+        "ChannelMessageColour": "#000000",
+        "OwnNickColour": "#000000",
+        "NickColour": "#18B33C",
+        "JoinChannelColour": "#72D672",
+        "LeaveChannelColour": "#B00000",
+        "ChannelInfoColour": "#9E54B3",
+        
+        "EnableIrcColours": True,
+        "IrcColor0": "#FFFF00",
+        "IrcColor1": "#000000",
+        "IrcColor2": "#000080",
+        "IrcColor3": "#008000",
+        "IrcColor4": "#FF0000",
+        "IrcColor5": "#A52A2A",
+        "IrcColor6": "#800080",
+        "IrcColor7": "#FF8000",
+        "IrcColor8": "#808000",
+        "IrcColor9": "#00FF00",
+        "IrcColor10": "#008080",
+        "IrcColor11": "#00FFFF",
+        "IrcColor12": "#0000FF",
+        "IrcColor13": "#FFC0CB",
+        "IrcColor14": "#A0A0A0",
+        "IrcColor15": "#C0C0C0",
+        
+        "ShowNotifications": True,
+        "NotifyJoinPart": True,
+        "NotifyMessage": False,
+        "NotifyNick": False,
+        
+        "AutoUserInfoLookup": True,
+        "AutoUserInfoMax": 200,
+        "AutoUserInfoInterval": 90,
+        
+        "MarkPositionWhenHidden": True,
+        "MarkerLineForegroundColour": "#000000",    # Black on
+        "MarkerLineBackgroundColour": "#ffff00",    # Yellow
+        
+        "AskOnShutdown": True,
+    }
+    
+    # defaults for Hex Editor
+    hexEditorDefaults = {
+        "HexEditorState": QByteArray(),
+        "AddressAreaWidth": 4,
+        "ShowAddressArea": True,
+        "ShowAsciiArea": True,
+        "OpenInOverwriteMode": True,
+        "OpenReadOnly": False,
+        "HighlightChanges": True,
+        "HighlightingBackGround": QColor(0xff, 0xff, 0x99, 0xff),
+        "HighlightingForeGround": QColor(Qt.black),
+        "SelectionBackGround": QColor("#308cc6"),
+        "SelectionForeGround": QColor(Qt.white),
+        "AddressAreaBackGround": QColor("#efedec"),
+        "AddressAreaForeGround": QColor(Qt.black),
+        "RecentNumber": 9,
+    }
+    if isWindowsPlatform():
+        hexEditorDefaults["Font"] = "Courier,10,-1,5,50,0,0,0,0,0"
+    else:
+        hexEditorDefaults["Font"] = "Monospace,10,-1,5,50,0,0,0,0,0"
+    
+    # defaults for Diff colors
+    diffColourDefaults = {
+        "TextColor": QColor(0, 0, 0),
+        "AddedColor": QColor(190, 237, 190),
+        "RemovedColor": QColor(237, 190, 190),
+        "ReplacedColor": QColor(190, 190, 237),
+        "ContextColor": QColor(255, 220, 168),
+        "HeaderColor": QColor(237, 237, 190),
+        "BadWhitespaceColor": QColor(255, 0, 0, 192),
+    }
+    
+    # defaults for Code Documentation Viewer
+    docuViewerDefaults = {
+        "ShowInfoAsRichText": False,
+        "Provider": "disabled",
+        "ShowInfoOnOpenParenthesis": True,
+    }
+    
+    # defaults for conda
+    condaDefaults = {
+        "CondaExecutable": "",
+    }
+    
+    # defaults for pip
+    pipDefaults = {
+        "PipSearchIndex": "",           # used by the search command
+    }
+
+
+def readToolGroups(prefClass=Prefs):
+    """
+    Module function to read the tool groups configuration.
+    
+    @param prefClass preferences class used as the storage area
+    @return list of tuples defing the tool groups
+    """
+    toolGroups = []
+    groups = int(prefClass.settings.value("Toolgroups/Groups", 0))
+    for groupIndex in range(groups):
+        groupName = prefClass.settings.value(
+            "Toolgroups/{0:02d}/Name".format(groupIndex))
+        group = [groupName, []]
+        items = int(prefClass.settings.value(
+            "Toolgroups/{0:02d}/Items".format(groupIndex), 0))
+        for ind in range(items):
+            menutext = prefClass.settings.value(
+                "Toolgroups/{0:02d}/{1:02d}/Menutext".format(groupIndex, ind))
+            icon = prefClass.settings.value(
+                "Toolgroups/{0:02d}/{1:02d}/Icon".format(groupIndex, ind))
+            executable = prefClass.settings.value(
+                "Toolgroups/{0:02d}/{1:02d}/Executable".format(
+                    groupIndex, ind))
+            arguments = prefClass.settings.value(
+                "Toolgroups/{0:02d}/{1:02d}/Arguments".format(groupIndex, ind))
+            redirect = prefClass.settings.value(
+                "Toolgroups/{0:02d}/{1:02d}/Redirect".format(groupIndex, ind))
+            
+            if menutext:
+                if menutext == '--':
+                    tool = {
+                        'menutext': '--',
+                        'icon': '',
+                        'executable': '',
+                        'arguments': '',
+                        'redirect': 'no',
+                    }
+                    group[1].append(tool)
+                elif executable:
+                    tool = {
+                        'menutext': menutext,
+                        'icon': icon,
+                        'executable': executable,
+                        'arguments': arguments,
+                        'redirect': redirect,
+                    }
+                    group[1].append(tool)
+        toolGroups.append(group)
+    currentGroup = int(
+        prefClass.settings.value("Toolgroups/Current Group", -1))
+    return toolGroups, currentGroup
+    
+
+def saveToolGroups(toolGroups, currentGroup, prefClass=Prefs):
+    """
+    Module function to write the tool groups configuration.
+    
+    @param toolGroups reference to the list of tool groups
+    @param currentGroup index of the currently selected tool group (integer)
+    @param prefClass preferences class used as the storage area
+    """
+    # first step, remove all tool group entries
+    prefClass.settings.remove("Toolgroups")
+    
+    # second step, write the tool group entries
+    prefClass.settings.setValue("Toolgroups/Groups", len(toolGroups))
+    groupIndex = 0
+    for group in toolGroups:
+        prefClass.settings.setValue(
+            "Toolgroups/{0:02d}/Name".format(groupIndex), group[0])
+        prefClass.settings.setValue(
+            "Toolgroups/{0:02d}/Items".format(groupIndex), len(group[1]))
+        ind = 0
+        for tool in group[1]:
+            prefClass.settings.setValue(
+                "Toolgroups/{0:02d}/{1:02d}/Menutext".format(groupIndex, ind),
+                tool['menutext'])
+            prefClass.settings.setValue(
+                "Toolgroups/{0:02d}/{1:02d}/Icon".format(groupIndex, ind),
+                tool['icon'])
+            prefClass.settings.setValue(
+                "Toolgroups/{0:02d}/{1:02d}/Executable".format(
+                    groupIndex, ind),
+                tool['executable'])
+            prefClass.settings.setValue(
+                "Toolgroups/{0:02d}/{1:02d}/Arguments".format(groupIndex, ind),
+                tool['arguments'])
+            prefClass.settings.setValue(
+                "Toolgroups/{0:02d}/{1:02d}/Redirect".format(groupIndex, ind),
+                tool['redirect'])
+            ind += 1
+        groupIndex += 1
+    prefClass.settings.setValue("Toolgroups/Current Group", currentGroup)
+    
+
+def initPreferences():
+    """
+    Module function to initialize the central configuration store.
+    """
+    Prefs.settings = QSettings(
+        QSettings.IniFormat, QSettings.UserScope,
+        settingsNameOrganization, settingsNameGlobal)
+    if not isWindowsPlatform():
+        hp = QDir.homePath()
+        dn = QDir(hp)
+        dn.mkdir(".eric6")
+    QCoreApplication.setOrganizationName(settingsNameOrganization)
+    QCoreApplication.setApplicationName(settingsNameGlobal)
+    try:
+        Prefs.settings.setAtomicSyncRequired(False)
+    except AttributeError:
+        # backward compatibility fot Qt < 5.10
+        pass
+    
+    # Avoid nasty behavior of QSettings in combination with Py2
+    Prefs.settings.value("UI/SingleApplicationMode")
+    
+
+def syncPreferences(prefClass=Prefs):
+    """
+    Module function to sync the preferences to disk.
+    
+    In addition to syncing, the central configuration store is reinitialized
+    as well.
+    
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("General/Configured", True)
+    prefClass.settings.sync()
+    
+
+def exportPreferences(prefClass=Prefs):
+    """
+    Module function to export the current preferences.
+    
+    @param prefClass preferences class used as the storage area
+    """
+    filename, selectedFilter = E5FileDialog.getSaveFileNameAndFilter(
+        None,
+        QCoreApplication.translate("Preferences", "Export Preferences"),
+        "",
+        QCoreApplication.translate(
+            "Preferences",
+            "Properties File (*.ini);;All Files (*)"),
+        None,
+        E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite))
+    if filename:
+        ext = QFileInfo(filename).suffix()
+        if not ext:
+            ex = selectedFilter.split("(*")[1].split(")")[0]
+            if ex:
+                filename += ex
+        settingsFile = prefClass.settings.fileName()
+        prefClass.settings = None
+        shutil.copy(settingsFile, filename)
+        initPreferences()
+
+
+def importPreferences(prefClass=Prefs):
+    """
+    Module function to import preferences from a file previously saved by
+    the export function.
+    
+    @param prefClass preferences class used as the storage area
+    """
+    filename = E5FileDialog.getOpenFileName(
+        None,
+        QCoreApplication.translate("Preferences", "Import Preferences"),
+        "",
+        QCoreApplication.translate(
+            "Preferences",
+            "Properties File (*.ini);;All Files (*)"))
+    if filename:
+        settingsFile = prefClass.settings.fileName()
+        shutil.copy(filename, settingsFile)
+        initPreferences()
+
+
+def isConfigured(prefClass=Prefs):
+    """
+    Module function to check, if the the application has been configured.
+    
+    @param prefClass preferences class used as the storage area
+    @return flag indicating the configured status (boolean)
+    """
+    return toBool(prefClass.settings.value("General/Configured", False))
+    
+
+def initRecentSettings():
+    """
+    Module function to initialize the central configuration store for recently
+    opened files and projects.
+    
+    This function is called once upon import of the module.
+    """
+    Prefs.rsettings = QSettings(
+        QSettings.IniFormat, QSettings.UserScope,
+        settingsNameOrganization, settingsNameRecent)
+    
+
+def getVarFilters(prefClass=Prefs):
+    """
+    Module function to retrieve the variables filter settings.
+    
+    @param prefClass preferences class used as the storage area
+    @return a tuple defining the variables filter
+    """
+    localsFilter = eval(prefClass.settings.value(
+        "Variables/LocalsFilter", prefClass.varDefaults["LocalsFilter"]))
+    globalsFilter = eval(prefClass.settings.value(
+        "Variables/GlobalsFilter", prefClass.varDefaults["GlobalsFilter"]))
+    return (localsFilter, globalsFilter)
+    
+
+def setVarFilters(filters, prefClass=Prefs):
+    """
+    Module function to store the variables filter settings.
+    
+    @param filters variable filters to set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("Variables/LocalsFilter", str(filters[0]))
+    prefClass.settings.setValue("Variables/GlobalsFilter", str(filters[1]))
+    
+
+def getDebugger(key, prefClass=Prefs):
+    """
+    Module function to retrieve the debugger settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested debugger setting
+    """
+    if key in ["RemoteDbgEnabled", "PassiveDbgEnabled",
+               "AutomaticReset", "DebugEnvironmentReplace",
+               "PythonRedirect", "PythonNoEncoding",
+               "Python3Redirect", "Python3NoEncoding",
+               "RubyRedirect",
+               "ConsoleDbgEnabled", "PathTranslation",
+               "Autosave", "ThreeStateBreakPoints",
+               "SuppressClientExit", "BreakAlways",
+               "AutoViewSourceCode", "ShowExceptionInShell",
+               ]:
+        return toBool(prefClass.settings.value(
+            "Debugger/" + key, prefClass.debuggerDefaults[key]))
+    elif key in ["PassiveDbgPort", "MaxVariableSize", "RecentNumber"]:
+        return int(
+            prefClass.settings.value(
+                "Debugger/" + key, prefClass.debuggerDefaults[key]))
+    elif key in ["AllowedHosts"]:
+        return toList(
+            prefClass.settings.value(
+                "Debugger/" + key, prefClass.debuggerDefaults[key]))
+    elif key in ["PythonInterpreter", "Python3Interpreter"]:
+        # This code is here to ensure backward compatibility.
+        if key == "PythonInterpreter":
+            newKey = "Python2VirtualEnv"
+        else:
+            newKey = "Python3VirtualEnv"
+        venvName = prefClass.settings.value(
+            "Debugger/" + newKey, prefClass.debuggerDefaults[newKey])
+        if venvName:
+            try:
+                from E5Gui.E5Application import e5App
+                virtualenvManager = e5App().getObject("VirtualEnvManager")
+            except KeyError:
+                from VirtualEnv.VirtualenvManager import VirtualenvManager
+                virtualenvManager = VirtualenvManager()
+            interpreter = virtualenvManager.getVirtualenvInterpreter(venvName)
+        else:
+            interpreter = ""
+        if not interpreter:
+            pyVersion = 2 if key == "PythonInterpreter" else 3
+            if sys.version_info[0] == pyVersion:
+                return sys.executable
+        return interpreter
+    elif key in ["DebugClientType", "DebugClientType3"]:
+        debugClientType = prefClass.settings.value(
+            "Debugger/" + key, prefClass.debuggerDefaults[key])
+        # Correct obsolete entry "threaded"
+        if debugClientType == 'threaded':
+            return "standard"
+        else:
+            return debugClientType
+    else:
+        return prefClass.settings.value(
+            "Debugger/" + key, prefClass.debuggerDefaults[key])
+    
+
+def setDebugger(key, value, prefClass=Prefs):
+    """
+    Module function to store the debugger settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("Debugger/" + key, value)
+
+
+def getPython(key, prefClass=Prefs):
+    """
+    Module function to retrieve the Python settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested debugger setting
+    """
+    if key in ["PythonExtensions", "Python3Extensions"]:
+        exts = []
+        for ext in getDebugger(key, prefClass).split():
+            if ext.startswith("."):
+                exts.append(ext)
+            else:
+                exts.append(".{0}".format(ext))
+        return exts
+    
+    return None
+
+
+def setPython(key, value, prefClass=Prefs):
+    """
+    Module function to store the Python settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    if key in ["PythonExtensions", "Python3Extensions"]:
+        setDebugger(key, value, prefClass)
+
+
+def getUILanguage(prefClass=Prefs):
+    """
+    Module function to retrieve the language for the user interface.
+    
+    @param prefClass preferences class used as the storage area
+    @return the language for the UI
+    """
+    lang = prefClass.settings.value("UI/Language",
+                                    prefClass.uiDefaults["Language"])
+    if lang == "None" or lang == "" or lang is None:
+        return None
+    else:
+        return lang
+    
+
+def setUILanguage(lang, prefClass=Prefs):
+    """
+    Module function to store the language for the user interface.
+    
+    @param lang the language
+    @param prefClass preferences class used as the storage area
+    """
+    if lang is None:
+        prefClass.settings.setValue("UI/Language", "None")
+    else:
+        prefClass.settings.setValue("UI/Language", lang)
+
+
+def getViewManager(prefClass=Prefs):
+    """
+    Module function to retrieve the selected viewmanager type.
+    
+    @param prefClass preferences class used as the storage area
+    @return the viewmanager type
+    """
+    return prefClass.settings.value(
+        "UI/ViewManager", prefClass.uiDefaults["ViewManager"])
+    
+
+def setViewManager(vm, prefClass=Prefs):
+    """
+    Module function to store the selected viewmanager type.
+    
+    @param vm the viewmanager type
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("UI/ViewManager", vm)
+
+
+def getUI(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various UI settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested UI setting
+    """
+    if key in ["BrowsersListFoldersFirst", "BrowsersHideNonPublic",
+               "BrowsersListContentsByOccurrence", "BrowsersListHiddenFiles",
+               "LogViewerAutoRaise",
+               "SingleApplicationMode", "TabViewManagerFilenameOnly",
+               "ShowFilePreview", "ShowFilePreviewJS", "ShowFilePreviewSSI",
+               "CaptionShowsFilename", "ShowSplash",
+               "SingleCloseButton", "SplitOrientationVertical",
+               "UseProxy", "UseSystemProxy", "UseHttpProxyForAll",
+               "TopLeftByLeft", "BottomLeftByLeft",
+               "TopRightByRight", "BottomRightByRight",
+               "RequestDownloadFilename",
+               "LayoutShellEmbedded", "LayoutFileBrowserEmbedded",
+               "CheckErrorLog", "NotificationsEnabled", "DynamicOnlineCheck",
+               "OpenCrashSessionOnStartup", "CrashSessionEnabled",
+               "ShowCodeDocumentationViewer", "ShowPyPIPackageManager",
+               "ShowCondaPackageManager", "ShowCooperation", "ShowIrc",
+               "ShowTemplateViewer", "ShowFileBrowser", "ShowSymbolsViewer",
+               "ShowNumbersViewer", "UseNativeMenuBar"]:
+        return toBool(prefClass.settings.value(
+            "UI/" + key, prefClass.uiDefaults[key]))
+    elif key in ["TabViewManagerFilenameLength", "CaptionFilenameLength",
+                 "ProxyPort/Http", "ProxyPort/Https", "ProxyPort/Ftp",
+                 "ProxyType/Ftp", "OpenOnStartup",
+                 "PerformVersionCheck", "RecentNumber", "NotificationTimeout",
+                 "SidebarDelay", "KeyboardInputInterval",
+                 "BackgroundServiceProcesses"]:
+        return int(prefClass.settings.value(
+            "UI/" + key, prefClass.uiDefaults[key]))
+    elif key in ["ProxyPassword/Http", "ProxyPassword/Https",
+                 "ProxyPassword/Ftp", ]:
+        from Utilities.crypto import pwConvert
+        return pwConvert(
+            prefClass.settings.value("UI/" + key, prefClass.uiDefaults[key]),
+            encode=False)
+    elif key in ["LogStdErrColour"]:
+        col = prefClass.settings.value("UI/" + key)
+        if col is not None:
+            return QColor(col)
+        else:
+            return prefClass.uiDefaults[key]
+    elif key in "ViewProfiles2":
+        profilesStr = prefClass.settings.value("UI/ViewProfiles2")
+        if profilesStr is None:
+            # use the defaults
+            viewProfiles = prefClass.uiDefaults["ViewProfiles2"]
+        else:
+            viewProfiles = {}
+            profiles = json.loads(profilesStr)
+            for name in ["edit", "debug"]:
+                viewProfiles[name] = [
+                    QByteArray.fromBase64(profiles[name][0].encode("utf-8")),
+                    profiles[name][1][:],
+                    []
+                ]
+                for bs in profiles[name][2]:
+                    viewProfiles[name][2].append(
+                        QByteArray.fromBase64(bs.encode("utf-8")))
+        return viewProfiles
+    elif key in ["ToolbarManagerState", "PreviewSplitterState"]:
+        state = prefClass.settings.value("UI/" + key)
+        if state is not None:
+            return state
+        else:
+            return prefClass.uiDefaults[key]
+    elif key in ["VersionsUrls6"]:
+        urls = toList(
+            prefClass.settings.value("UI/" + key, prefClass.uiDefaults[key]))
+        if len(urls) == 0:
+            return prefClass.uiDefaults[key]
+        else:
+            return urls
+    elif key in ["LogViewerStdoutFilter", "LogViewerStderrFilter",
+                 "LogViewerStdxxxFilter", "TextMimeTypes"]:
+        return toList(
+            prefClass.settings.value("UI/" + key, prefClass.uiDefaults[key]))
+    else:
+        return prefClass.settings.value("UI/" + key, prefClass.uiDefaults[key])
+    
+
+def setUI(key, value, prefClass=Prefs):
+    """
+    Module function to store the various UI settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    if key == "ViewProfiles2":
+        profiles = {}
+        for name in ["edit", "debug"]:
+            profiles[name] = [
+                bytes(value[name][0].toBase64()).decode(),
+                value[name][1][:],
+                []
+            ]
+            for ba in value[name][2]:
+                profiles[name][2].append(bytes(ba.toBase64()).decode())
+        prefClass.settings.setValue("UI/" + key, json.dumps(profiles))
+    elif key == "LogStdErrColour":
+        prefClass.settings.setValue("UI/" + key, value.name())
+    elif key in ["ProxyPassword/Http", "ProxyPassword/Https",
+                 "ProxyPassword/Ftp", ]:
+        from Utilities.crypto import pwConvert
+        prefClass.settings.setValue("UI/" + key, pwConvert(value, encode=True))
+    else:
+        prefClass.settings.setValue("UI/" + key, value)
+    
+
+def getIcons(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various Icons settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested Icons setting
+    """
+    dirlist = prefClass.settings.value("UI/Icons/" + key)
+    if dirlist is not None:
+        return dirlist
+    else:
+        return prefClass.iconsDefaults[key]
+    
+
+def setIcons(key, value, prefClass=Prefs):
+    """
+    Module function to store the various Icons settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("UI/Icons/" + key, value)
+    
+
+def getCooperation(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various Cooperation settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested UI setting
+    """
+    if key in ["AutoStartServer", "TryOtherPorts", "AutoAcceptConnections"]:
+        return toBool(prefClass.settings.value(
+            "Cooperation/" + key, prefClass.cooperationDefaults[key]))
+    elif key in ["ServerPort", "MaxPortsToTry"]:
+        return int(prefClass.settings.value(
+            "Cooperation/" + key, prefClass.cooperationDefaults[key]))
+    elif key in ["BannedUsers"]:
+        return toList(prefClass.settings.value(
+            "Cooperation/" + key, prefClass.cooperationDefaults[key]))
+    else:
+        return prefClass.settings.value(
+            "Cooperation/" + key, prefClass.cooperationDefaults[key])
+    
+
+def setCooperation(key, value, prefClass=Prefs):
+    """
+    Module function to store the various Cooperation settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("Cooperation/" + key, value)
+
+
+def getEditor(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various editor settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested editor setting
+    """
+    if key in ["DefaultEncoding", "DefaultOpenFilter", "DefaultSaveFilter",
+               "SpellCheckingDefaultLanguage", "SpellCheckingPersonalWordList",
+               "SpellCheckingPersonalExcludeList",
+               "PreviewMarkdownHTMLFormat", "PreviewRestDocutilsHTMLFormat"]:
+        return prefClass.settings.value(
+            "Editor/" + key, prefClass.editorDefaults[key])
+    elif key in ["AutosaveInterval", "TabWidth", "IndentWidth",
+                 "FoldingStyle", "WarnFilesize", "EdgeMode", "EdgeColumn",
+                 "CaretWidth", "CaretLineFrameWidth", "AutoCompletionSource",
+                 "AutoCompletionThreshold", "AutoCompletionTimeout",
+                 "AutoCompletionCacheSize", "AutoCompletionCacheTime",
+                 "AutoCompletionWatchdogTime", "AutoCompletionMaxLines",
+                 "AutoCompletionMaxChars", "CallTipsVisible",
+                 "CallTipsStyle", "MarkOccurrencesTimeout", "SearchRegexpMode",
+                 "AutoSpellCheckChunkSize", "SpellCheckingMinWordSize",
+                 "PostScriptLevel", "EOLMode", "ZoomFactor", "WhitespaceSize",
+                 "OnlineSyntaxCheckInterval", "OnlineChangeTraceInterval",
+                 "WrapLongLinesMode", "WrapVisualFlag", "WrapIndentMode",
+                 "WrapStartIndent", "CallTipsPosition", "VirtualSpaceOptions"]:
+        return int(prefClass.settings.value(
+            "Editor/" + key, prefClass.editorDefaults[key]))
+    elif key in ["AdditionalOpenFilters", "AdditionalSaveFilters",
+                 "PreviewMarkdownFileNameExtensions",
+                 "PreviewRestFileNameExtensions",
+                 "PreviewHtmlFileNameExtensions",
+                 "PreviewQssFileNameExtensions"]:
+        return toList(prefClass.settings.value(
+            "Editor/" + key, prefClass.editorDefaults[key]))
+    elif key in ["PythonBadIndentation"]:
+        value = prefClass.settings.value(
+            "Editor/" + key, prefClass.editorDefaults[key])
+        if value in ["true", "True"]:
+            value = 1
+        elif value in ["false", "False"]:
+            value = 0
+        return QsciLexerPython.IndentationWarning(int(value))
+    else:
+        return toBool(prefClass.settings.value(
+            "Editor/" + key, prefClass.editorDefaults[key]))
+    
+
+def setEditor(key, value, prefClass=Prefs):
+    """
+    Module function to store the various editor settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("Editor/" + key, value)
+    
+
+def getEditorColour(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various editor marker colours.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested editor colour
+    """
+    col = prefClass.settings.value("Editor/Colour/" + key)
+    if col is not None:
+        if len(col) == 9:
+            # color string with alpha
+            return QColor.fromRgba(int(col[1:], 16))
+        else:
+            return QColor(col)
+    else:
+        # palette based defaults here because of Qt5
+        if key == "EditAreaForeground":
+            return QApplication.palette().color(QPalette.Active, QPalette.Base)
+        elif key == "EditAreaBackground":
+            return QApplication.palette().color(QPalette.Active, QPalette.Text)
+        else:
+            return prefClass.editorColourDefaults[key]
+    
+
+def setEditorColour(key, value, prefClass=Prefs):
+    """
+    Module function to store the various editor marker colours.
+    
+    @param key the key of the colour to be set
+    @param value the colour to be set
+    @param prefClass preferences class used as the storage area
+    """
+    if value.alpha() < 255:
+        val = "#{0:8x}".format(value.rgba())
+    else:
+        val = value.name()
+    prefClass.settings.setValue("Editor/Colour/" + key, val)
+    
+
+def getEditorOtherFonts(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various editor fonts except the lexer
+    fonts.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested editor font (QFont)
+    """
+    f = QFont()
+    f.fromString(prefClass.settings.value(
+        "Editor/Other Fonts/" + key, prefClass.editorOtherFontsDefaults[key]))
+    return f
+    
+
+def setEditorOtherFonts(key, font, prefClass=Prefs):
+    """
+    Module function to store the various editor fonts except the lexer fonts.
+    
+    @param key the key of the font to be set
+    @param font the font to be set (QFont)
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("Editor/Other Fonts/" + key, font.toString())
+    
+
+def getEditorAPI(language, projectType="", prefClass=Prefs):
+    """
+    Module function to retrieve the various lists of API files.
+    
+    @param language language of the API list
+    @type str
+    @param projectType project type of the API list
+    @type str
+    @param prefClass preferences class used as the storage area
+    @type Prefs
+    @return requested list of API files
+    @rtype list of str
+    """
+    if projectType:
+        key = "{0}_{1}".format(language, projectType)
+    else:
+        key = language
+    apis = prefClass.settings.value("Editor/APIs/" + key)
+    if apis is not None:
+        if len(apis) and apis[0] == "":
+            return []
+        else:
+            return apis
+    else:
+        if projectType:
+            # try again without project type
+            return getEditorAPI(language, prefClass=prefClass)
+        
+        return []
+    
+
+def setEditorAPI(language, projectType, apilist, prefClass=Prefs):
+    """
+    Module function to store the various lists of API files.
+    
+    @param language language of the API list
+    @type str
+    @param projectType project type of the API list
+    @type str
+    @param apilist list of API files
+    @type list of str
+    @param prefClass preferences class used as the storage area
+    @type Prefs
+    """
+    if projectType:
+        key = "{0}_{1}".format(language, projectType)
+    else:
+        key = language
+    prefClass.settings.setValue("Editor/APIs/" + key, apilist)
+    
+
+def getEditorKeywords(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various lists of language keywords.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested list of language keywords (list of strings)
+    """
+    keywords = prefClass.settings.value("Editor/Keywords/" + key)
+    if keywords is not None:
+        return keywords
+    else:
+        return []
+    
+
+def setEditorKeywords(key, keywordsLists, prefClass=Prefs):
+    """
+    Module function to store the various lists of language keywords.
+    
+    @param key the key of the api to be set
+    @param keywordsLists the list of language keywords (list of strings)
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("Editor/Keywords/" + key, keywordsLists)
+    
+
+def getEditorLexerAssocs(prefClass=Prefs):
+    """
+    Module function to retrieve all lexer associations.
+    
+    @param prefClass preferences class used as the storage area
+    @return a reference to the list of lexer associations
+        (dictionary of strings)
+    """
+    editorLexerAssoc = {}
+    prefClass.settings.beginGroup("Editor/LexerAssociations")
+    keyList = prefClass.settings.childKeys()
+    prefClass.settings.endGroup()
+    
+    import QScintilla.Lexers
+    editorLexerAssocDefaults = QScintilla.Lexers.getDefaultLexerAssociations()
+    
+    if len(keyList) == 0:
+        # build from scratch
+        for key in list(editorLexerAssocDefaults.keys()):
+            editorLexerAssoc[key] = editorLexerAssocDefaults[key]
+    else:
+        for key in keyList:
+            if key in editorLexerAssocDefaults:
+                defaultValue = editorLexerAssocDefaults[key]
+            else:
+                defaultValue = ""
+            editorLexerAssoc[key] = prefClass.settings.value(
+                "Editor/LexerAssociations/" + key, defaultValue)
+        
+        # check for new default lexer associations
+        for key in list(editorLexerAssocDefaults.keys()):
+            if key not in editorLexerAssoc:
+                editorLexerAssoc[key] = editorLexerAssocDefaults[key]
+    return editorLexerAssoc
+    
+
+def setEditorLexerAssocs(assocs, prefClass=Prefs):
+    """
+    Module function to retrieve all lexer associations.
+    
+    @param assocs dictionary of lexer associations to be set
+    @param prefClass preferences class used as the storage area
+    """
+    # first remove lexer associations that no longer exist, than save the rest
+    prefClass.settings.beginGroup("Editor/LexerAssociations")
+    keyList = prefClass.settings.childKeys()
+    prefClass.settings.endGroup()
+    for key in keyList:
+        if key not in assocs:
+            prefClass.settings.remove("Editor/LexerAssociations/" + key)
+    for key in assocs:
+        prefClass.settings.setValue(
+            "Editor/LexerAssociations/" + key, assocs[key])
+    
+
+def getEditorLexerAssoc(filename, prefClass=Prefs):
+    """
+    Module function to retrieve a lexer association.
+    
+    @param filename filename used to determine the associated lexer language
+        (string)
+    @param prefClass preferences class used as the storage area
+    @return the requested lexer language (string)
+    """
+    for pattern, language in list(getEditorLexerAssocs().items()):
+        if fnmatch.fnmatch(filename, pattern):
+            return language
+    
+    return ""
+    
+
+def getEditorTyping(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various editor typing settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested editor setting
+    """
+    return toBool(prefClass.settings.value(
+        "Editor/Typing/" + key, prefClass.editorTypingDefaults[key]))
+    
+
+def setEditorTyping(key, value, prefClass=Prefs):
+    """
+    Module function to store the various editor typing settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("Editor/Typing/" + key, value)
+    
+
+def getEditorExporter(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various editor exporters settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested editor setting
+    """
+    if key in ["RTF/Font"]:
+        f = QFont()
+        f.fromString(prefClass.settings.value(
+            "Editor/Exporters/" + key, prefClass.editorExporterDefaults[key]))
+        return f
+    elif key in ["HTML/WYSIWYG", "HTML/Folding", "HTML/OnlyStylesUsed",
+                 "HTML/FullPathAsTitle", "HTML/UseTabs", "RTF/WYSIWYG",
+                 "RTF/UseTabs", "TeX/OnlyStylesUsed", "TeX/FullPathAsTitle",
+                 "ODT/WYSIWYG", "ODT/OnlyStylesUsed", "ODT/UseTabs"]:
+        return toBool(prefClass.settings.value(
+            "Editor/Exporters/" + key, prefClass.editorExporterDefaults[key]))
+    elif key in ["PDF/Magnification", "PDF/MarginLeft", "PDF/MarginRight",
+                 "PDF/MarginTop", "PDF/MarginBottom"]:
+        return int(prefClass.settings.value(
+            "Editor/Exporters/" + key, prefClass.editorExporterDefaults[key]))
+    else:
+        return prefClass.settings.value(
+            "Editor/Exporters/" + key, prefClass.editorExporterDefaults[key])
+
+
+def setEditorExporter(key, value, prefClass=Prefs):
+    """
+    Module function to store the various editor exporters settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    if key in ["RTF/Font"]:
+        prefClass.settings.setValue(
+            "Editor/Exporters/" + key, value.toString())
+    else:
+        prefClass.settings.setValue("Editor/Exporters/" + key, value)
+    
+
+def getPrinter(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various printer settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested printer setting
+    """
+    if key in ["ColorMode", "FirstPageFirst"]:
+        return toBool(prefClass.settings.value(
+            "Printer/" + key, prefClass.printerDefaults[key]))
+    elif key in ["Magnification", "Orientation", "PageSize", "Resolution"]:
+        return int(prefClass.settings.value(
+            "Printer/" + key, prefClass.printerDefaults[key]))
+    elif key in ["LeftMargin", "RightMargin", "TopMargin", "BottomMargin"]:
+        return float(prefClass.settings.value(
+            "Printer/" + key, prefClass.printerDefaults[key]))
+    elif key in ["HeaderFont"]:
+        f = QFont()
+        f.fromString(prefClass.settings.value(
+            "Printer/" + key, prefClass.printerDefaults[key]))
+        return f
+    else:
+        return prefClass.settings.value(
+            "Printer/" + key, prefClass.printerDefaults[key])
+
+
+def setPrinter(key, value, prefClass=Prefs):
+    """
+    Module function to store the various printer settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    if key in ["HeaderFont"]:
+        prefClass.settings.setValue("Printer/" + key, value.toString())
+    else:
+        prefClass.settings.setValue("Printer/" + key, value)
+
+
+def getShell(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various shell settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested shell setting
+    """
+    if key in ["MonospacedFont", "MarginsFont"]:
+        f = QFont()
+        f.fromString(prefClass.settings.value(
+            "Shell/" + key, prefClass.shellDefaults[key]))
+        return f
+    elif key in ["MaxHistoryEntries"]:
+        return int(prefClass.settings.value(
+            "Shell/" + key, prefClass.shellDefaults[key]))
+    elif key in ["HistoryStyle"]:
+        return ShellHistoryStyle(int(prefClass.settings.value(
+            "Shell/" + key, prefClass.shellDefaults[key].value)))
+    elif key in ["LastVirtualEnvironment"]:
+        return prefClass.settings.value(
+            "Shell/" + key, prefClass.shellDefaults[key])
+    else:
+        return toBool(prefClass.settings.value(
+            "Shell/" + key, prefClass.shellDefaults[key]))
+
+
+def setShell(key, value, prefClass=Prefs):
+    """
+    Module function to store the various shell settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    if key in ["MonospacedFont", "MarginsFont"]:
+        prefClass.settings.setValue("Shell/" + key, value.toString())
+    elif key in ["HistoryStyle"]:
+        prefClass.settings.setValue("Shell/" + key, value.value)
+    else:
+        prefClass.settings.setValue("Shell/" + key, value)
+
+
+def getProject(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various project handling settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested project setting
+    """
+    if key in ["RecentNumber"]:
+        return int(prefClass.settings.value(
+            "Project/" + key, prefClass.projectDefaults[key]))
+    elif key in ["DebugClientsHistory", "DebuggerInterpreterHistory"]:
+        return toList(prefClass.settings.value(
+            "Project/" + key, prefClass.projectDefaults[key]))
+    else:
+        return toBool(prefClass.settings.value(
+            "Project/" + key, prefClass.projectDefaults[key]))
+    
+
+def setProject(key, value, prefClass=Prefs):
+    """
+    Module function to store the various project handling settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    if key in ["DebugClientsHistory", "DebuggerInterpreterHistory"]:
+        # max. list sizes is hard coded to 20 entries
+        newList = [v for v in value if v]
+        if len(newList) > 20:
+            newList = newList[:20]
+        prefClass.settings.setValue("Project/" + key, newList)
+    else:
+        prefClass.settings.setValue("Project/" + key, value)
+    
+
+def getProjectBrowserFlags(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various project browser flags settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested project setting
+    """
+    try:
+        default = prefClass.projectBrowserFlagsDefaults[key]
+    except KeyError:
+        default = AllBrowsersFlag
+    
+    return int(prefClass.settings.value(
+        "Project/BrowserFlags/" + key, default))
+    
+
+def setProjectBrowserFlags(key, value, prefClass=Prefs):
+    """
+    Module function to store the various project browser flags settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("Project/BrowserFlags/" + key, value)
+    
+
+def setProjectBrowserFlagsDefault(key, value, prefClass=Prefs):
+    """
+    Module function to store the various project browser flags settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.projectBrowserFlagsDefaults[key] = value
+    
+
+def removeProjectBrowserFlags(key, prefClass=Prefs):
+    """
+    Module function to remove a project browser flags setting.
+    
+    @param key the key of the setting to be removed
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.remove("Project/BrowserFlags/" + key)
+    
+
+def getProjectBrowserColour(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various project browser colours.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested project browser colour
+    """
+    col = prefClass.settings.value("Project/Colour/" + key)
+    if col is not None:
+        return QColor(col)
+    else:
+        return prefClass.projectBrowserColourDefaults[key]
+    
+
+def setProjectBrowserColour(key, value, prefClass=Prefs):
+    """
+    Module function to store the various project browser colours.
+    
+    @param key the key of the colour to be set
+    @param value the colour to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("Project/Colour/" + key, value.name())
+    
+
+def getMultiProject(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various project handling settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested project setting
+    """
+    if key in ["RecentNumber"]:
+        return int(prefClass.settings.value(
+            "MultiProject/" + key, prefClass.multiProjectDefaults[key]))
+    elif key in ["OpenMasterAutomatically", "XMLTimestamp"]:
+        return toBool(prefClass.settings.value(
+            "MultiProject/" + key, prefClass.multiProjectDefaults[key]))
+    else:
+        return prefClass.settings.value(
+            "MultiProject/" + key, prefClass.multiProjectDefaults[key])
+    
+
+def setMultiProject(key, value, prefClass=Prefs):
+    """
+    Module function to store the various project handling settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("MultiProject/" + key, value)
+    
+
+def getQt4DocDir(prefClass=Prefs):
+    """
+    Module function to retrieve the Qt4DocDir setting.
+    
+    @param prefClass preferences class used as the storage area
+    @return the requested Qt4DocDir setting (string)
+    """
+    s = prefClass.settings.value(
+        "Help/Qt4DocDir", prefClass.helpDefaults["Qt4DocDir"])
+    if s == "":
+        s = os.getenv("QT4DOCDIR", "")
+    if s == "":
+        s = os.path.join(
+            QLibraryInfo.location(QLibraryInfo.DocumentationPath), "html")
+    return s
+    
+
+def getQt5DocDir(prefClass=Prefs):
+    """
+    Module function to retrieve the Qt5DocDir setting.
+    
+    @param prefClass preferences class used as the storage area
+    @return the requested Qt4DocDir setting (string)
+    """
+    s = prefClass.settings.value(
+        "Help/Qt5DocDir", prefClass.helpDefaults["Qt5DocDir"])
+    if s == "":
+        s = os.getenv("QT5DOCDIR", "")
+    if s == "":
+        s = os.path.join(
+            QLibraryInfo.location(QLibraryInfo.DocumentationPath), "qtdoc")
+    return s
+
+
+def getHelp(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various help settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested help setting
+    """
+    if not prefClass.webSettingsIntitialized:
+        prefClass.initWebSettingsDefaults()
+    
+    if key in ["StandardFont", "FixedFont"]:
+        f = QFont()
+        f.fromString(prefClass.settings.value(
+            "Help/" + key, prefClass.helpDefaults[key]))
+        return f
+    elif key in ["SaveUrlColor"]:
+        col = prefClass.settings.value("Help/" + key)
+        if col is not None:
+            return QColor(col)
+        else:
+            return prefClass.helpDefaults[key]
+    elif key in ["WebSearchKeywords"]:
+        # return a list of tuples of (keyword, engine name)
+        keywords = []
+        size = prefClass.settings.beginReadArray("Help/" + key)
+        for index in range(size):
+            prefClass.settings.setArrayIndex(index)
+            keyword = prefClass.settings.value("Keyword")
+            engineName = prefClass.settings.value("Engine")
+            keywords.append((keyword, engineName))
+        prefClass.settings.endArray()
+        return keywords
+    elif key == "DownloadManagerDownloads":
+        # return a list of tuples of (URL, save location, done flag, page url,
+        # date/time downloaded)
+        downloads = []
+        length = prefClass.settings.beginReadArray("Help/" + key)
+        for index in range(length):
+            prefClass.settings.setArrayIndex(index)
+            url = prefClass.settings.value("URL")
+            if url is None:
+                url = QUrl()
+            location = prefClass.settings.value("Location")
+            done = toBool(prefClass.settings.value("Done"))
+            pageUrl = prefClass.settings.value("PageURL")
+            if pageUrl is None:
+                pageUrl = QUrl()
+            downloaded = prefClass.settings.value("Downloaded")
+            if downloaded is None:
+                downloaded = QDateTime()
+            else:
+                downloaded = QDateTime.fromString(
+                    downloaded, "yyyy-MM-dd hh:mm:ss")
+            downloads.append((url, location, done, pageUrl, downloaded))
+        prefClass.settings.endArray()
+        return downloads
+    elif key == "RssFeeds":
+        # return a list of tuples of (URL, title, icon)
+        feeds = []
+        length = prefClass.settings.beginReadArray("Help/" + key)
+        for index in range(length):
+            prefClass.settings.setArrayIndex(index)
+            url = prefClass.settings.value("URL")
+            title = prefClass.settings.value("Title")
+            icon = prefClass.settings.value("Icon")
+            feeds.append((url, title, icon))
+        prefClass.settings.endArray()
+        return feeds
+    elif key in ["SyncFtpPassword", "SyncEncryptionKey"]:
+        from Utilities.crypto import pwConvert
+        return pwConvert(prefClass.settings.value(
+            "Help/" + key, prefClass.helpDefaults[key]), encode=False)
+    elif key == "HelpViewerType":
+        # special treatment to adjust for missing QtWebKit if eric web browser
+        # was selected
+        value = int(prefClass.settings.value(
+            "Help/" + key, prefClass.helpDefaults[key]))
+        if value == 1 and QWebSettings is None:
+            value = prefClass.helpDefaults[key]
+        return value
+    elif key in ["DiskCacheSize", "AcceptCookies",
+                 "KeepCookiesUntil", "StartupBehavior", "HistoryLimit",
+                 "OfflineStorageDatabaseQuota",
+                 "OfflineWebApplicationCacheQuota", "CachePolicy",
+                 "DownloadManagerRemovePolicy", "AdBlockUpdatePeriod",
+                 "SearchLanguage", "SyncType", "SyncFtpPort",
+                 "SyncFtpIdleTimeout", "SyncEncryptionKeyLength",
+                 ]:
+        return int(prefClass.settings.value(
+            "Help/" + key, prefClass.helpDefaults[key]))
+    elif key in ["SingleHelpWindow", "SaveGeometry", "WebSearchSuggestions",
+                 "DiskCacheEnabled", "FilterTrackingCookies",
+                 "PrintBackgrounds", "AdBlockEnabled", "AutoLoadImages",
+                 "JavaEnabled", "JavaScriptEnabled",
+                 "JavaScriptCanOpenWindows", "JavaScriptCanCloseWindows",
+                 "JavaScriptCanAccessClipboard",
+                 "PluginsEnabled", "DnsPrefetchEnabled",
+                 "OfflineStorageDatabaseEnabled",
+                 "OfflineWebApplicationCacheEnabled", "LocalStorageEnabled",
+                 "ShowPreview", "AccessKeysEnabled", "VirusTotalEnabled",
+                 "VirusTotalSecure", "DoNotTrack", "SendReferer",
+                 "SpatialNavigationEnabled", "LinksIncludedInFocusChain",
+                 "LocalContentCanAccessRemoteUrls",
+                 "LocalContentCanAccessFileUrls", "XSSAuditingEnabled",
+                 "SiteSpecificQuirksEnabled", "SyncEnabled", "SyncBookmarks",
+                 "SyncHistory", "SyncPasswords", "SyncUserAgents",
+                 "SyncSpeedDial", "SyncEncryptData",
+                 "SyncEncryptPasswordsOnly",
+                 "WarnOnMultipleClose", "ClickToFlashEnabled",
+                 "FlashCookiesDeleteOnStartExit", "FlashCookieAutoRefresh",
+                 "FlashCookieNotify",
+                 ]:
+        return toBool(prefClass.settings.value(
+            "Help/" + key, prefClass.helpDefaults[key]))
+    elif key in ["AdBlockSubscriptions", "AdBlockExceptions",
+                 "ClickToFlashWhitelist", "SendRefererWhitelist",
+                 "GreaseMonkeyDisabledScripts", "NoCacheHosts",
+                 "FlashCookiesWhitelist", "FlashCookiesBlacklist",
+                 ]:
+        return toList(prefClass.settings.value(
+            "Help/" + key, prefClass.helpDefaults[key]))
+    else:
+        return prefClass.settings.value("Help/" + key,
+                                        prefClass.helpDefaults[key])
+    
+
+def setHelp(key, value, prefClass=Prefs):
+    """
+    Module function to store the various help settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    if key in ["StandardFont", "FixedFont"]:
+        prefClass.settings.setValue("Help/" + key, value.toString())
+    elif key == "SaveUrlColor":
+        prefClass.settings.setValue("Help/" + key, value.name())
+    elif key == "WebSearchKeywords":
+        # value is list of tuples of (keyword, engine name)
+        prefClass.settings.remove("Help/" + key)
+        prefClass.settings.beginWriteArray("Help/" + key, len(value))
+        index = 0
+        for v in value:
+            prefClass.settings.setArrayIndex(index)
+            prefClass.settings.setValue("Keyword", v[0])
+            prefClass.settings.setValue("Engine", v[1])
+            index += 1
+        prefClass.settings.endArray()
+    elif key == "DownloadManagerDownloads":
+        # value is list of tuples of (URL, save location, done flag, page url,
+        # date/time downloaded)
+        prefClass.settings.remove("Help/" + key)
+        prefClass.settings.beginWriteArray("Help/" + key, len(value))
+        index = 0
+        for v in value:
+            prefClass.settings.setArrayIndex(index)
+            prefClass.settings.setValue("URL", v[0])
+            prefClass.settings.setValue("Location", v[1])
+            prefClass.settings.setValue("Done", v[2])
+            prefClass.settings.setValue("PageURL", v[3])
+            prefClass.settings.setValue(
+                "Downloaded", v[4].toString("yyyy-MM-dd hh:mm:ss"))
+            index += 1
+        prefClass.settings.endArray()
+    elif key == "RssFeeds":
+        # value is list of tuples of (URL, title, icon)
+        prefClass.settings.remove("Help/" + key)
+        prefClass.settings.beginWriteArray("Help/" + key, len(value))
+        index = 0
+        for v in value:
+            prefClass.settings.setArrayIndex(index)
+            prefClass.settings.setValue("URL", v[0])
+            prefClass.settings.setValue("Title", v[1])
+            prefClass.settings.setValue("Icon", v[2])
+            prefClass.settings.setValue("Downloaded", v[4])
+            index += 1
+        prefClass.settings.endArray()
+    elif key in ["SyncFtpPassword", "SyncEncryptionKey"]:
+        from Utilities.crypto import pwConvert
+        prefClass.settings.setValue(
+            "Help/" + key, pwConvert(value, encode=True))
+    else:
+        prefClass.settings.setValue("Help/" + key, value)
+
+
+def getWebBrowser(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various web browser settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested help setting
+    """
+    # the following entries are identical to the ones of the QtWebKit based
+    # help viewer and are being redirected there
+    if key.startswith(("FlashCookie", "Pim", "VirusTotal")):
+        return getHelp(key, prefClass)
+    
+    # Web inspector stuff must come before initializing web engine settings
+    # because that starts the chromium web process
+    if key == "WebInspectorPort":
+        return int(prefClass.settings.value(
+            "WebBrowser/" + key, prefClass.webBrowserDefaults[key]))
+    elif key == "WebInspectorEnabled":
+        return toBool(prefClass.settings.value(
+            "WebBrowser/" + key, prefClass.webBrowserDefaults[key]))
+    
+    if not prefClass.webEngineSettingsIntitialized:
+        prefClass.initWebEngineSettingsDefaults()
+    
+    if key in ["StandardFont", "FixedFont"]:
+        f = QFont()
+        f.fromString(prefClass.settings.value(
+            "WebBrowser/" + key, prefClass.webBrowserDefaults[key]))
+        return f
+    elif key in ["SaveUrlColor"]:
+        col = prefClass.settings.value("WebBrowser/" + key)
+        if col is not None:
+            return QColor(col)
+        else:
+            return prefClass.webBrowserDefaults[key]
+    elif key in ["WebSearchKeywords"]:
+        # return a list of tuples of (keyword, engine name)
+        keywords = []
+        size = prefClass.settings.beginReadArray("WebBrowser/" + key)
+        for index in range(size):
+            prefClass.settings.setArrayIndex(index)
+            keyword = prefClass.settings.value("Keyword")
+            engineName = prefClass.settings.value("Engine")
+            keywords.append((keyword, engineName))
+        prefClass.settings.endArray()
+        return keywords
+    elif key == "DownloadManagerDownloads":
+        # return a list of dicts containing the URL, save location, done flag,
+        # page URL, date/time downloaded
+        downloads = []
+        length = prefClass.settings.beginReadArray("WebBrowser/" + key)
+        for index in range(length):
+            download = {}
+            prefClass.settings.setArrayIndex(index)
+            download["URL"] = prefClass.settings.value("URL")
+            if download["URL"] is None:
+                download["URL"] = QUrl()
+            download["Location"] = prefClass.settings.value("Location")
+            download["Done"] = toBool(prefClass.settings.value("Done"))
+            download["PageURL"] = prefClass.settings.value("PageURL")
+            if download["PageURL"] is None:
+                download["PageURL"] = QUrl()
+            download["Downloaded"] = prefClass.settings.value("Downloaded")
+            if download["Downloaded"] is None:
+                download["Downloaded"] = QDateTime()
+            elif isinstance(download["Downloaded"], basestring):
+                download["Downloaded"] = QDateTime.fromString(
+                    download["Downloaded"], "yyyy-MM-dd hh:mm:ss")
+            downloads.append(download)
+        prefClass.settings.endArray()
+        return downloads
+    elif key == "RssFeeds":
+        # return a list of tuples of (URL, title, icon)
+        feeds = []
+        length = prefClass.settings.beginReadArray("WebBrowser/" + key)
+        for index in range(length):
+            prefClass.settings.setArrayIndex(index)
+            url = prefClass.settings.value("URL")
+            title = prefClass.settings.value("Title")
+            icon = prefClass.settings.value("Icon")
+            feeds.append((url, title, icon))
+        prefClass.settings.endArray()
+        return feeds
+    elif key in ["SyncFtpPassword", "SyncEncryptionKey"]:
+        from Utilities.crypto import pwConvert
+        return pwConvert(prefClass.settings.value(
+            "WebBrowser/" + key, prefClass.webBrowserDefaults[key]),
+            encode=False)
+    elif key == "HelpViewerType":
+        # special treatment to adjust for missing QtWebEngine
+        value = int(prefClass.settings.value(
+            "WebBrowser/" + key, prefClass.webBrowserDefaults[key]))
+        if QWebEngineSettings is None:
+            value = prefClass.helpDefaults[key]
+        return value
+    elif key in ["StartupBehavior", "HistoryLimit",
+                 "DownloadManagerRemovePolicy", "SyncType", "SyncFtpPort",
+                 "SyncFtpIdleTimeout", "SyncEncryptionKeyLength",
+                 "SearchLanguage", "WebInspectorPort",
+                 "DefaultFontSize", "DefaultFixedFontSize",
+                 "MinimumFontSize", "MinimumLogicalFontSize",
+                 "DiskCacheSize", "AcceptCookies", "KeepCookiesUntil",
+                 "AdBlockUpdatePeriod", "TabManagerGroupByType",
+                 "SessionAutoSaveInterval", "NewTabBehavior",
+                 "RefererSendReferer", "RefererDefaultPolicy",
+                 "RefererTrimmingPolicy", "AcceptQuotaRequest",
+                 "AcceptProtocolHandlerRequest",
+                 ]:
+        return int(prefClass.settings.value(
+            "WebBrowser/" + key, prefClass.webBrowserDefaults[key]))
+    elif key in ["SingleWebBrowserWindow", "SaveGeometry",
+                 "JavaScriptEnabled", "JavaScriptCanOpenWindows",
+                 "JavaScriptCanAccessClipboard",
+                 "AutoLoadImages", "LocalStorageEnabled",
+                 "SpatialNavigationEnabled", "LinksIncludedInFocusChain",
+                 "LocalContentCanAccessRemoteUrls",
+                 "LocalContentCanAccessFileUrls", "XSSAuditingEnabled",
+                 "ScrollAnimatorEnabled", "ErrorPageEnabled",
+                 "WarnOnMultipleClose", "WebSearchSuggestions",
+                 "SyncEnabled", "SyncBookmarks", "SyncHistory",
+                 "SyncPasswords", "SyncUserAgents", "SyncSpeedDial",
+                 "SyncEncryptData", "SyncEncryptPasswordsOnly",
+                 "ShowPreview", "WebInspectorEnabled", "DiskCacheEnabled",
+                 "DoNotTrack", "FilterTrackingCookies",
+                 "AdBlockEnabled", "AdBlockUseLimitedEasyList",
+                 "PluginsEnabled", "FullScreenSupportEnabled",
+                 "AutoScrollEnabled", "ScreenCaptureEnabled",
+                 "WebGLEnabled", "FocusOnNavigationEnabled",
+                 "PrintElementBackgrounds", "AllowRunningInsecureContent",
+                 "SpellCheckEnabled", "ShowToolbars", "MenuBarVisible",
+                 "BookmarksToolBarVisible", "StatusBarVisible",
+                 "SessionAutoSave", "LoadTabOnActivation",
+                 "SafeBrowsingEnabled", "SafeBrowsingFilterPlatform",
+                 "SafeBrowsingAutoUpdate", "SafeBrowsingUseLookupApi",
+                 "AllowGeolocationOnInsecureOrigins",
+                 "AllowWindowActivationFromJavaScript", "ShowScrollBars",
+                 "DownloadManagerAutoOpen", "DownloadManagerAutoClose",
+                 "PlaybackRequiresUserGesture", "JavaScriptCanPaste",
+                 "WebRTCPublicInterfacesOnly",
+                 ]:
+        return toBool(prefClass.settings.value(
+            "WebBrowser/" + key, prefClass.webBrowserDefaults[key]))
+    elif key in ["GreaseMonkeyDisabledScripts", "SendRefererWhitelist",
+                 "AdBlockSubscriptions", "AdBlockExceptions",
+                 "SpellCheckLanguages",
+                 ]:
+        return toList(prefClass.settings.value(
+            "WebBrowser/" + key, prefClass.webBrowserDefaults[key]))
+    elif key in ["AutoScrollDivider"]:
+        return float(prefClass.settings.value(
+            "WebBrowser/" + key, prefClass.webBrowserDefaults[key]))
+    elif key in ["SafeBrowsingUpdateDateTime"]:
+        dateTimeStr = prefClass.settings.value("WebBrowser/" + key)
+        if dateTimeStr is not None:
+            return QDateTime.fromString(dateTimeStr, Qt.ISODate)
+        else:
+            return prefClass.webBrowserDefaults[key]
+    else:
+        return prefClass.settings.value("WebBrowser/" + key,
+                                        prefClass.webBrowserDefaults[key])
+    
+
+def setWebBrowser(key, value, prefClass=Prefs):
+    """
+    Module function to store the various web browser settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    # the following entries are identical to the ones of the QtWebKit based
+    # help viewer and are being redirected there
+    if key.startswith(("FlashCookie", "Pim", "VirusTotal")):
+        setHelp(key, value, prefClass)
+    
+    if key in ["StandardFont", "FixedFont"]:
+        prefClass.settings.setValue("WebBrowser/" + key, value.toString())
+    elif key == "SaveUrlColor":
+        prefClass.settings.setValue("WebBrowser/" + key, value.name())
+    elif key == "WebSearchKeywords":
+        # value is list of tuples of (keyword, engine name)
+        prefClass.settings.remove("WebBrowser/" + key)
+        prefClass.settings.beginWriteArray("WebBrowser/" + key, len(value))
+        index = 0
+        for v in value:
+            prefClass.settings.setArrayIndex(index)
+            prefClass.settings.setValue("Keyword", v[0])
+            prefClass.settings.setValue("Engine", v[1])
+            index += 1
+        prefClass.settings.endArray()
+    elif key == "DownloadManagerDownloads":
+        # value is list of dicts containing the URL, save location, done flag,
+        # page URL, date/time downloaded
+        prefClass.settings.remove("Help/" + key)
+        prefClass.settings.beginWriteArray("WebBrowser/" + key, len(value))
+        index = 0
+        for v in value:
+            prefClass.settings.setArrayIndex(index)
+            prefClass.settings.setValue("URL", v["URL"])
+            prefClass.settings.setValue("Location", v["Location"])
+            prefClass.settings.setValue("Done", v["Done"])
+            prefClass.settings.setValue("PageURL", v["PageURL"])
+            prefClass.settings.setValue(
+                "Downloaded", v["Downloaded"].toString("yyyy-MM-dd hh:mm:ss"))
+            index += 1
+        prefClass.settings.endArray()
+    elif key == "RssFeeds":
+        # value is list of tuples of (URL, title, icon)
+        prefClass.settings.remove("WebBrowser/" + key)
+        prefClass.settings.beginWriteArray("WebBrowser/" + key, len(value))
+        index = 0
+        for v in value:
+            prefClass.settings.setArrayIndex(index)
+            prefClass.settings.setValue("URL", v[0])
+            prefClass.settings.setValue("Title", v[1])
+            prefClass.settings.setValue("Icon", v[2])
+            index += 1
+        prefClass.settings.endArray()
+    elif key in ["SyncFtpPassword", "SyncEncryptionKey"]:
+        from Utilities.crypto import pwConvert
+        prefClass.settings.setValue(
+            "WebBrowser/" + key, pwConvert(value, encode=True))
+    elif key in ["SafeBrowsingUpdateDateTime"]:
+        # value is a QDateTime
+        prefClass.settings.setValue("WebBrowser/" + key,
+                                    value.toString(Qt.ISODate))
+    else:
+        prefClass.settings.setValue("WebBrowser/" + key, value)
+    
+
+def getSystem(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various system settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested system setting
+    """
+    from Utilities import supportedCodecs
+    if key in ["StringEncoding", "IOEncoding"]:
+        encoding = prefClass.settings.value(
+            "System/" + key, prefClass.sysDefaults[key])
+        if encoding not in supportedCodecs:
+            encoding = prefClass.sysDefaults[key]
+        return encoding
+    
+    return None
+    
+
+def setSystem(key, value, prefClass=Prefs):
+    """
+    Module function to store the various system settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("System/" + key, value)
+    
+
+def getQtTranslationsDir(prefClass=Prefs):
+    """
+    Module function to retrieve the Qt4TranslationsDir or Qt5TranslationsDir
+    setting depending on the current Qt version.
+    
+    @param prefClass preferences class used as the storage area
+    @return the requested setting (string)
+    """
+    if qVersionTuple() < (5, 0, 0):
+        s = prefClass.settings.value(
+            "Qt/Qt4TranslationsDir",
+            prefClass.qtDefaults["Qt4TranslationsDir"])
+    else:
+        s = prefClass.settings.value(
+            "Qt/Qt5TranslationsDir",
+            prefClass.qtDefaults["Qt5TranslationsDir"])
+    if s == "":
+        s = os.getenv("QTTRANSLATIONSDIR", "")
+    if s == "":
+        if qVersionTuple() < (5, 0, 0):
+            s = os.getenv("QT4TRANSLATIONSDIR", "")
+        else:
+            s = os.getenv("QT5TRANSLATIONSDIR", "")
+    if s == "":
+        s = QLibraryInfo.location(QLibraryInfo.TranslationsPath)
+    if s == "" and isWindowsPlatform():
+        transPath = os.path.join(getPyQt5ModulesDirectory(), "translations")
+        if os.path.exists(transPath):
+            s = transPath
+    return s
+    
+
+def getQt(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various Qt settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested Qt setting
+    """
+    if key in ["Qt4TranslationsDir", "Qt5TranslationsDir"]:
+        return getQtTranslationsDir(prefClass)
+    elif key in ["PyuicIndent"]:
+        return int(prefClass.settings.value(
+            "Qt/" + key, prefClass.qtDefaults[key]))
+    elif key in ["PyuicFromImports"]:
+        return toBool(prefClass.settings.value(
+            "Qt/" + key, prefClass.qtDefaults[key]))
+    else:
+        return prefClass.settings.value("Qt/" + key, prefClass.qtDefaults[key])
+    
+
+def setQt(key, value, prefClass=Prefs):
+    """
+    Module function to store the various Qt settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("Qt/" + key, value)
+    
+
+def getCorba(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various Corba settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested corba setting
+    """
+    return prefClass.settings.value(
+        "Corba/" + key, prefClass.corbaDefaults[key])
+    
+
+def setCorba(key, value, prefClass=Prefs):
+    """
+    Module function to store the various Corba settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("Corba/" + key, value)
+    
+
+def getProtobuf(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various protobuf settings.
+    
+    @param key the key of the value to get
+    @type str
+    @param prefClass preferences class used as the storage area
+    @type Prefs
+    @return the requested protobuf setting
+    @rtype any
+    """
+    return prefClass.settings.value(
+        "Protobuf/" + key, prefClass.protobufDefaults[key])
+    
+
+def setProtobuf(key, value, prefClass=Prefs):
+    """
+    Module function to store the various protobuf settings.
+    
+    @param key the key of the setting to be set
+    @type str
+    @param value the value to be set
+    @type any
+    @param prefClass preferences class used as the storage area
+    @type Prefs
+    """
+    prefClass.settings.setValue("Protobuf/" + key, value)
+    
+
+def getUser(key, prefClass=Prefs):
+    """
+    Module function to retrieve the various user settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested user setting
+    """
+    if key == "MailServerPassword":
+        from Utilities.crypto import pwConvert
+        return pwConvert(prefClass.settings.value(
+            "User/" + key, prefClass.userDefaults[key]), encode=False)
+    elif key in ["MailServerPort"]:
+        try:
+            return int(prefClass.settings.value(
+                "User/" + key, prefClass.userDefaults[key]))
+        except ValueError:
+            return prefClass.userDefaults[key]
+    elif key in ["MailServerAuthentication", "UseSystemEmailClient",
+                 "UseMasterPassword", "SavePasswords", "UseGoogleMailOAuth2"]:
+        return toBool(prefClass.settings.value(
+            "User/" + key, prefClass.userDefaults[key]))
+    elif key == "MailServerEncryption":
+        # convert from old key 'MailServerUseTLS'
+        val = prefClass.settings.value("User/" + key)
+        if val is None:
+            if toBool(prefClass.settings.value("User/MailServerUseTLS")):
+                val = "TLS"
+            else:
+                val = prefClass.userDefaults[key]
+        return val
+    else:
+        return prefClass.settings.value(
+            "User/" + key, prefClass.userDefaults[key])
+    
+
+def setUser(key, value, prefClass=Prefs):
+    """
+    Module function to store the various user settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    if key == "MailServerPassword":
+        from Utilities.crypto import pwConvert
+        prefClass.settings.setValue(
+            "User/" + key, pwConvert(value, encode=True))
+    elif key == "MasterPassword":
+        from Utilities.crypto.py3PBKDF2 import hashPassword
+        prefClass.settings.setValue(
+            "User/" + key, hashPassword(value))
+    else:
+        prefClass.settings.setValue("User/" + key, value)
+    
+
+def getVCS(key, prefClass=Prefs):
+    """
+    Module function to retrieve the VCS related settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested user setting
+    """
+    if key in ["StatusMonitorInterval"]:
+        return int(prefClass.settings.value(
+            "VCS/" + key, prefClass.vcsDefaults[key]))
+    else:
+        return toBool(prefClass.settings.value(
+            "VCS/" + key, prefClass.vcsDefaults[key]))
+    
+
+def setVCS(key, value, prefClass=Prefs):
+    """
+    Module function to store the VCS related settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("VCS/" + key, value)
+    
+
+def getTasks(key, prefClass=Prefs):
+    """
+    Module function to retrieve the Tasks related settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested user setting
+    """
+    if key in ["TasksFixmeColor", "TasksWarningColor",
+               "TasksTodoColor", "TasksNoteColor"]:
+        col = prefClass.settings.value("Tasks/" + key)
+        if col is not None:
+            return QColor(col)
+        else:
+            return prefClass.tasksDefaults[key]
+    elif key in ["ClearOnFileClose", ]:
+        return toBool(prefClass.settings.value(
+            "Tasks/" + key, prefClass.tasksDefaults[key]))
+    else:
+        return prefClass.settings.value(
+            "Tasks/" + key, prefClass.tasksDefaults[key])
+    
+
+def setTasks(key, value, prefClass=Prefs):
+    """
+    Module function to store the Tasks related settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    if key in ["TasksFixmeColor", "TasksWarningColor",
+               "TasksTodoColor", "TasksNoteColor"]:
+        prefClass.settings.setValue("Tasks/" + key, value.name())
+    else:
+        prefClass.settings.setValue("Tasks/" + key, value)
+    
+
+def getTemplates(key, prefClass=Prefs):
+    """
+    Module function to retrieve the Templates related settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested user setting
+    """
+    if key in ["SeparatorChar"]:
+        return prefClass.settings.value(
+            "Templates/" + key, prefClass.templatesDefaults[key])
+    elif key in ["EditorFont"]:
+        f = QFont()
+        f.fromString(prefClass.settings.value(
+            "Templates/" + key, prefClass.templatesDefaults[key]))
+        return f
+    else:
+        return toBool(prefClass.settings.value(
+            "Templates/" + key, prefClass.templatesDefaults[key]))
+    
+
+def setTemplates(key, value, prefClass=Prefs):
+    """
+    Module function to store the Templates related settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    if key in ["EditorFont"]:
+        prefClass.settings.setValue("Templates/" + key, value.toString())
+    else:
+        prefClass.settings.setValue("Templates/" + key, value)
+    
+
+def getPluginManager(key, prefClass=Prefs):
+    """
+    Module function to retrieve the plugin manager related settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested user setting
+    """
+    if key in ["DownloadPath"]:
+        return prefClass.settings.value(
+            "PluginManager/" + key, prefClass.pluginManagerDefaults[key])
+    elif key in ["UpdatesCheckInterval", "KeepGenerations"]:
+        return int(prefClass.settings.value(
+            "PluginManager/" + key, prefClass.pluginManagerDefaults[key]))
+    elif key in ["HiddenPlugins"]:
+        return toList(prefClass.settings.value(
+            "PluginManager/" + key, prefClass.pluginManagerDefaults[key]))
+    else:
+        return toBool(prefClass.settings.value(
+            "PluginManager/" + key, prefClass.pluginManagerDefaults[key]))
+    
+
+def setPluginManager(key, value, prefClass=Prefs):
+    """
+    Module function to store the plugin manager related settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("PluginManager/" + key, value)
+    
+
+def getGraphics(key, prefClass=Prefs):
+    """
+    Module function to retrieve the Graphics related settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested user setting
+    """
+    if key in ["Font"]:
+        font = prefClass.settings.value(
+            "Graphics/" + key, prefClass.graphicsDefaults[key])
+        if isinstance(font, QFont):
+            # workaround for an old bug in eric < 4.4
+            return font
+        else:
+            f = QFont()
+            f.fromString(font)
+            return f
+    else:
+        return prefClass.settings.value(
+            "Graphics/" + key, prefClass.graphicsDefaults[key])
+    
+
+def setGraphics(key, value, prefClass=Prefs):
+    """
+    Module function to store the Graphics related settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    if key in ["Font"]:
+        prefClass.settings.setValue("Graphics/" + key, value.toString())
+    else:
+        prefClass.settings.setValue("Graphics/" + key, value)
+    
+
+def getIconEditor(key, prefClass=Prefs):
+    """
+    Module function to retrieve the Icon Editor related settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested user setting
+    """
+    return prefClass.settings.value(
+        "IconEditor/" + key, prefClass.iconEditorDefaults[key])
+    
+
+def setIconEditor(key, value, prefClass=Prefs):
+    """
+    Module function to store the Icon Editor related settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("IconEditor/" + key, value)
+
+
+def getFlakes(key, prefClass=Prefs):
+    """
+    Module function to retrieve the pyflakes related settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested user setting
+    """
+    if key in ["IncludeInSyntaxCheck", "IgnoreStarImportWarnings"]:
+        return toBool(prefClass.settings.value("Py3Flakes/" + key,
+                      prefClass.pyflakesDefaults[key]))
+    else:
+        return prefClass.settings.value(
+            "Py3Flakes/" + key, prefClass.pyflakesDefaults[key])
+    
+
+def setFlakes(key, value, prefClass=Prefs):
+    """
+    Module function to store the pyflakes related settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("Py3Flakes/" + key, value)
+
+
+def getTrayStarter(key, prefClass=Prefs):
+    """
+    Module function to retrieve the tray starter related settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested user setting
+    """
+    return prefClass.settings.value(
+        "TrayStarter/" + key, prefClass.trayStarterDefaults[key])
+    
+
+def setTrayStarter(key, value, prefClass=Prefs):
+    """
+    Module function to store the tray starter related settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("TrayStarter/" + key, value)
+    
+
+def getIrc(key, prefClass=Prefs):
+    """
+    Module function to retrieve the IRC related settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested user setting
+    """
+    if key in ["TimestampIncludeDate", "ShowTimestamps", "ShowNotifications",
+               "NotifyJoinPart", "NotifyMessage", "NotifyNick",
+               "EnableIrcColours", "AutoUserInfoLookup",
+               "MarkPositionWhenHidden", "AskOnShutdown"]:
+        return toBool(prefClass.settings.value(
+            "IRC/" + key, prefClass.ircDefaults[key]))
+    elif key in ["AutoUserInfoMax", "AutoUserInfoInterval"]:
+        return int(prefClass.settings.value(
+            "IRC/" + key, prefClass.ircDefaults[key]))
+    else:
+        return prefClass.settings.value(
+            "IRC/" + key, prefClass.ircDefaults[key])
+
+
+def setIrc(key, value, prefClass=Prefs):
+    """
+    Module function to store the IRC related settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("IRC/" + key, value)
+    
+
+def getHexEditor(key, prefClass=Prefs):
+    """
+    Module function to retrieve the Hex Editor related settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested user setting
+    """
+    if key in ["AddressAreaWidth", "RecentNumber"]:
+        return int(prefClass.settings.value(
+            "HexEditor/" + key, prefClass.hexEditorDefaults[key]))
+    elif key in ["ShowAddressArea", "ShowAsciiArea", "OpenInOverwriteMode",
+                 "OpenReadOnly", "HighlightChanges"]:
+        return toBool(prefClass.settings.value(
+            "HexEditor/" + key, prefClass.hexEditorDefaults[key]))
+    elif key in ["HighlightingBackGround", "HighlightingForeGround",
+                 "SelectionBackGround", "SelectionForeGround",
+                 "AddressAreaBackGround", "AddressAreaForeGround"]:
+        return QColor(prefClass.settings.value(
+            "HexEditor/" + key, prefClass.hexEditorDefaults[key]))
+    elif key in ["Font"]:
+        f = QFont()
+        f.fromString(prefClass.settings.value(
+            "HexEditor/" + key, prefClass.hexEditorDefaults[key]))
+        return f
+    else:
+        return prefClass.settings.value(
+            "HexEditor/" + key, prefClass.hexEditorDefaults[key])
+    
+
+def setHexEditor(key, value, prefClass=Prefs):
+    """
+    Module function to store the Hex Editor related settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    if key in ["HighlightingBackGround", "HighlightingForeGround",
+               "SelectionBackGround", "SelectionForeGround",
+               "AddressAreaBackGround", "AddressAreaForeGround"]:
+        if value.alpha() < 255:
+            val = "#{0:8x}".format(value.rgba())
+        else:
+            val = value.name()
+        prefClass.settings.setValue("HexEditor/" + key, val)
+    elif key in ["Font"]:
+        prefClass.settings.setValue("HexEditor/" + key, value.toString())
+    else:
+        prefClass.settings.setValue("HexEditor/" + key, value)
+    
+
+def getDiffColour(key, prefClass=Prefs):
+    """
+    Module function to retrieve the colours for the diff highlighter.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested diff colour
+    """
+    col = prefClass.settings.value("Diff/" + key)
+    if col is not None:
+        if len(col) == 9:
+            # color string with alpha
+            return QColor.fromRgba(int(col[1:], 16))
+        else:
+            return QColor(col)
+    else:
+        return prefClass.diffColourDefaults[key]
+    
+
+def setDiffColour(key, value, prefClass=Prefs):
+    """
+    Module function to store the diff highlighter colours.
+    
+    @param key the key of the colour to be set
+    @param value the colour to be set
+    @param prefClass preferences class used as the storage area
+    """
+    if value.alpha() < 255:
+        val = "#{0:8x}".format(value.rgba())
+    else:
+        val = value.name()
+    prefClass.settings.setValue("Diff/" + key, val)
+
+
+def getDocuViewer(key, prefClass=Prefs):
+    """
+    Module function to retrieve the Code Documentation Viewer related settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested Code Documentation Viewer value
+    """
+    if key in ["ShowInfoAsRichText", "ShowInfoOnOpenParenthesis"]:
+        return toBool(prefClass.settings.value(
+            "CodeDocumentationViewer/" + key,
+            prefClass.docuViewerDefaults[key]))
+    else:
+        return prefClass.settings.value(
+            "CodeDocumentationViewer/" + key,
+            prefClass.docuViewerDefaults[key])
+    
+
+def setDocuViewer(key, value, prefClass=Prefs):
+    """
+    Module function to store the Code Documentation Viewer related settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("CodeDocumentationViewer/" + key, value)
+
+
+def getConda(key, prefClass=Prefs):
+    """
+    Module function to retrieve the conda related settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested conda value
+    """
+    return prefClass.settings.value(
+        "Conda/" + key,
+        prefClass.condaDefaults[key])
+
+
+def setConda(key, value, prefClass=Prefs):
+    """
+    Module function to store the conda related settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("Conda/" + key, value)
+
+
+def getPip(key, prefClass=Prefs):
+    """
+    Module function to retrieve the pip related settings.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested pip value
+    """
+    return prefClass.settings.value(
+        "Pip/" + key,
+        prefClass.pipDefaults[key])
+
+
+def setPip(key, value, prefClass=Prefs):
+    """
+    Module function to store the pip related settings.
+    
+    @param key the key of the setting to be set
+    @param value the value to be set
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.settings.setValue("Pip/" + key, value)
+
+
+def getGeometry(key, prefClass=Prefs):
+    """
+    Module function to retrieve the display geometry.
+    
+    @param key the key of the value to get
+    @param prefClass preferences class used as the storage area
+    @return the requested geometry setting
+    """
+    if key in ["MainMaximized"]:
+        return toBool(prefClass.settings.value(
+            "Geometry/" + key,
+            prefClass.geometryDefaults[key]))
+    else:
+        v = prefClass.settings.value("Geometry/" + key)
+        if v is not None:
+            return v
+        else:
+            return prefClass.geometryDefaults[key]
+
+
+def setGeometry(key, value, prefClass=Prefs):
+    """
+    Module function to store the display geometry.
+    
+    @param key the key of the setting to be set
+    @param value the geometry to be set
+    @param prefClass preferences class used as the storage area
+    """
+    if key in ["MainMaximized"]:
+        prefClass.settings.setValue("Geometry/" + key, value)
+    else:
+        if prefClass.resetLayout:
+            v = prefClass.geometryDefaults[key]
+        else:
+            v = value
+        prefClass.settings.setValue("Geometry/" + key, v)
+
+
+def resetLayout(prefClass=Prefs):
+    """
+    Module function to set a flag not storing the current layout.
+    
+    @param prefClass preferences class used as the storage area
+    """
+    prefClass.resetLayout = True
+
+
+def shouldResetLayout(prefClass=Prefs):
+    """
+    Module function to indicate a reset of the layout.
+    
+    @param prefClass preferences class used as the storage area
+    @return flag indicating a reset of the layout (boolean)
+    """
+    return prefClass.resetLayout
+    
+
+def saveResetLayout(prefClass=Prefs):
+    """
+    Module function to save the reset layout.
+    
+    @param prefClass preferences class used as the storage area
+    """
+    if prefClass.resetLayout:
+        for key in list(prefClass.geometryDefaults.keys()):
+            prefClass.settings.setValue(
+                "Geometry/" + key,
+                prefClass.geometryDefaults[key])
+
+
+def toBool(value):
+    """
+    Module function to convert a value to bool.
+    
+    @param value value to be converted
+    @return converted data
+    """
+    if value in ["true", "1", "True"]:
+        return True
+    elif value in ["false", "0", "False"]:
+        return False
+    else:
+        return bool(value)
+
+
+def toList(value):
+    """
+    Module function to convert a value to a list.
+    
+    @param value value to be converted
+    @return converted data
+    """
+    if value is None:
+        return []
+    elif not isinstance(value, list):
+        return [value]
+    else:
+        return value
+
+
+def toByteArray(value):
+    """
+    Module function to convert a value to a byte array.
+    
+    @param value value to be converted
+    @return converted data
+    """
+    if value is None:
+        return QByteArray()
+    else:
+        return value
+
+
+def toDict(value):
+    """
+    Module function to convert a value to a dictionary.
+    
+    @param value value to be converted
+    @return converted data
+    """
+    if value is None:
+        return {}
+    else:
+        return value
+
+
+def convertPasswords(oldPassword, newPassword, prefClass=Prefs):
+    """
+    Module function to convert all passwords.
+    
+    @param oldPassword current master password (string)
+    @param newPassword new master password (string)
+    @param prefClass preferences class used as the storage area
+    """
+    from Utilities.crypto import pwRecode
+    for key in ["ProxyPassword/Http", "ProxyPassword/Https",
+                "ProxyPassword/Ftp", ]:
+        prefClass.settings.setValue(
+            "UI/" + key,
+            pwRecode(
+                prefClass.settings.value("UI/" + key,
+                                         prefClass.uiDefaults[key]),
+                oldPassword,
+                newPassword
+            )
+        )
+    for key in ["MailServerPassword"]:
+        prefClass.settings.setValue(
+            "User/" + key,
+            pwRecode(
+                prefClass.settings.value("User/" + key,
+                                         prefClass.userDefaults[key]),
+                oldPassword,
+                newPassword
+            )
+        )
+    for key in ["SyncFtpPassword", "SyncEncryptionKey"]:
+        prefClass.settings.setValue(
+            "Help/" + key,
+            pwRecode(
+                prefClass.settings.value("Help/" + key,
+                                         prefClass.helpDefaults[key]),
+                oldPassword,
+                newPassword
+            )
+        )
+    for key in ["SyncFtpPassword", "SyncEncryptionKey"]:
+        prefClass.settings.setValue(
+            "WebBrowser/" + key,
+            pwRecode(
+                prefClass.settings.value("WebBrowser/" + key,
+                                         prefClass.webBrowserDefaults[key]),
+                oldPassword,
+                newPassword
+            )
+        )
+
+
+initPreferences()
+initRecentSettings()
+
+#
+# eflag: noqa = M201, M613

eric ide

mercurial