1 /************************************************************************
2 **
3 **  Copyright (C) 2016-2020  Kevin B. Hendricks, Stratford, ON
4 **  Copyright (C) 2016-2020  Doug Massay
5 **  Copyright (C) 2011-2013  John Schember <john@nachtimwald.com>
6 **  Copyright (C) 2012-2013  Dave Heiland
7 **
8 **  This file is part of Sigil.
9 **
10 **  Sigil is free software: you can redistribute it and/or modify
11 **  it under the terms of the GNU General Public License as published by
12 **  the Free Software Foundation, either version 3 of the License, or
13 **  (at your option) any later version.
14 **
15 **  Sigil is distributed in the hope that it will be useful,
16 **  but WITHOUT ANY WARRANTY; without even the implied warranty of
17 **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 **  GNU General Public License for more details.
19 **
20 **  You should have received a copy of the GNU General Public License
21 **  along with Sigil.  If not, see <http://www.gnu.org/licenses/>.
22 **
23 *************************************************************************/
24 
25 #include <QtCore/QLocale>
26 #include <QtCore/QCoreApplication>
27 #include <QPalette>
28 #include <QFile>
29 #include <QDir>
30 
31 #include "Misc/SettingsStore.h"
32 #include "Misc/PluginDB.h"
33 #include "Misc/Utility.h"
34 
35 #include "sigil_constants.h"
36 
37 static QString SETTINGS_GROUP = "user_preferences";
38 static QString KEY_DEFAULT_METADATA_LANGUAGE = SETTINGS_GROUP + "/" + "default_metadata_lang";
39 static QString KEY_UI_LANGUAGE = SETTINGS_GROUP + "/" + "ui_language";
40 static QString KEY_UI_FONT = SETTINGS_GROUP + "/" + "ui_font";
41 static QString KEY_ORIGINAL_UI_FONT = SETTINGS_GROUP + "/" + "original_ui_font";
42 static QString KEY_UI_ICON_THEME = SETTINGS_GROUP + "/" + "ui_icon_theme";
43 static QString KEY_DRAG_DISTANCE_TWEAK = SETTINGS_GROUP + "/" + "drag_distance_tweak";
44 static QString KEY_ZOOM_IMAGE = SETTINGS_GROUP + "/" + "zoom_image";
45 static QString KEY_ZOOM_TEXT = SETTINGS_GROUP + "/" + "zoom_text";
46 static QString KEY_ZOOM_WEB = SETTINGS_GROUP + "/" + "zoom_web";
47 static QString KEY_ZOOM_PREVIEW = SETTINGS_GROUP + "/" + "zoom_preview";
48 static QString KEY_ZOOM_INSPECTOR = SETTINGS_GROUP + "/" + "zoom_inspector";
49 static QString KEY_RENAME_TEMPLATE = SETTINGS_GROUP + "/" + "rename_template";
50 static QString KEY_DICTIONARY_NAME = SETTINGS_GROUP + "/" + "dictionary_name";
51 static QString KEY_SECONDARY_DICTIONARY_NAME = SETTINGS_GROUP + "/" + "secondary_dictionary_name";
52 static QString KEY_SPELL_CHECK = SETTINGS_GROUP + "/" + "spell_check";
53 static QString KEY_SPELL_CHECK_NUMBERS = SETTINGS_GROUP + "/" + "spell_check_numbers";
54 static QString KEY_DEFAULT_USER_DICTIONARY = SETTINGS_GROUP + "/" + "user_dictionary_name";
55 static QString KEY_ENABLED_USER_DICTIONARIES = SETTINGS_GROUP + "/" + "enabled_user_dictionaries";
56 static QString KEY_PLUGIN_USER_MAP = SETTINGS_GROUP + "/" + "plugin_user_map";
57 static QString KEY_CLEAN_ON = SETTINGS_GROUP + "/" + "clean_on";
58 static QString KEY_REMOTE_ON = SETTINGS_GROUP + "/" + "remote_on";
59 static QString KEY_JAVASCRIPT_ON = SETTINGS_GROUP + "/" + "javascript_on";
60 static QString KEY_SHOWFULLPATH_ON = SETTINGS_GROUP + "/" + "showfullpath_on";
61 static QString KEY_HIGHDPI_SETTING = SETTINGS_GROUP + "/" + "high_dpi";
62 static QString KEY_PREVIEW_DARK_IN_DM = SETTINGS_GROUP + "/" + "preview_dark_in_dm";
63 static QString KEY_DEFAULT_VERSION = SETTINGS_GROUP + "/" + "default_version";
64 static QString KEY_PRESERVE_ENTITY_NAMES = SETTINGS_GROUP + "/" + "preserve_entity_names";
65 static QString KEY_PRESERVE_ENTITY_CODES = SETTINGS_GROUP + "/" + "preserve_entity_codes";
66 static QString KEY_EXTERNAL_XHTML_EDITOR = SETTINGS_GROUP + "/" + "external_xhtml_editor";
67 static QString KEY_ENABLE_ALTGR = SETTINGS_GROUP + "/" + "enable_altgr";
68 
69 static QString KEY_PLUGIN_INFO = SETTINGS_GROUP + "/" + "plugin_info";
70 static QString KEY_PLUGIN_ENGINE_PATHS = SETTINGS_GROUP + "/" + "plugin_engine_paths";
71 static QString KEY_PLUGIN_LAST_FOLDER = SETTINGS_GROUP + "/" + "plugin_add_last_folder";
72 static QString KEY_PLUGIN_USE_BUNDLED_INTERP = SETTINGS_GROUP + "/" + "plugin_use_bundled_interp";
73 
74 static QString KEY_CSS_EPUB2_VALIDATION_SPEC = SETTINGS_GROUP + "/" + "css_epub2_validation_spec";
75 static QString KEY_CSS_EPUB3_VALIDATION_SPEC = SETTINGS_GROUP + "/" + "css_epub3_validation_spec";
76 
77 static QString KEY_TEMP_FOLDER = SETTINGS_GROUP + "/" + "temp_folder_path";
78 
79 static QString KEY_APPEARANCE_PREFS_TAB_INDEX = SETTINGS_GROUP + "/" + "appearance_prefs_tab_index";
80 static QString KEY_PREVIEW_FONT_FAMILY_STANDARD = SETTINGS_GROUP + "/" + "preview_font_family_standard";
81 static QString KEY_PREVIEW_FONT_FAMILY_SERIF = SETTINGS_GROUP + "/" + "preview_font_family_serif";
82 static QString KEY_PREVIEW_FONT_FAMILY_SANS_SERIF = SETTINGS_GROUP + "/" + "preview_font_family_sans_serif";
83 static QString KEY_PREVIEW_FONT_SIZE = SETTINGS_GROUP + "/" + "preview_font_size";
84 
85 static QString KEY_CODE_VIEW_CSS_COMMENT_COLOR = SETTINGS_GROUP + "/" + "code_view_css_comment_color";
86 static QString KEY_CODE_VIEW_CSS_PROPERTY_COLOR = SETTINGS_GROUP + "/" + "code_view_css_property_color";
87 static QString KEY_CODE_VIEW_CSS_QUOTE_COLOR = SETTINGS_GROUP + "/" + "code_view_css_quote_color";
88 static QString KEY_CODE_VIEW_CSS_SELECTOR_COLOR = SETTINGS_GROUP + "/" + "code_view_css_selector_color";
89 static QString KEY_CODE_VIEW_CSS_VALUE_COLOR = SETTINGS_GROUP + "/" + "code_view_css_value_color";
90 static QString KEY_CODE_VIEW_FONT_FAMILY = SETTINGS_GROUP + "/" + "code_view_font_family_standard";
91 static QString KEY_CODE_VIEW_FONT_SIZE = SETTINGS_GROUP + "/" + "code_view_font_size";
92 static QString KEY_CODE_VIEW_LINE_HIGHLIGHT_COLOR = SETTINGS_GROUP + "/" + "code_view_line_highlight_color";
93 static QString KEY_CODE_VIEW_LINE_NUMBER_BACKGROUND_COLOR = SETTINGS_GROUP + "/" + "code_view_line_number_background_color";
94 static QString KEY_CODE_VIEW_LINE_NUMBER_FOREGROUND_COLOR = SETTINGS_GROUP + "/" + "code_view_line_number_foreground_color";
95 static QString KEY_CODE_VIEW_SPELLING_UNDERLINE_COLOR = SETTINGS_GROUP + "/" + "code_view_spelling_underline_color";
96 static QString KEY_CODE_VIEW_XHTML_ATTRIBUTE_NAME_COLOR = SETTINGS_GROUP + "/" + "code_view_xhtml_attribute_name_color";
97 static QString KEY_CODE_VIEW_XHTML_ATTRIBUTE_VALUE_COLOR = SETTINGS_GROUP + "/" + "code_view_xhtml_attribute_value_color";
98 static QString KEY_CODE_VIEW_XHTML_CSS_COLOR = SETTINGS_GROUP + "/" + "code_view_xhtml_css_color";
99 static QString KEY_CODE_VIEW_XHTML_CSS_COMMENT_COLOR = SETTINGS_GROUP + "/" + "code_view_xhtml_css_comment_color";
100 static QString KEY_CODE_VIEW_XHTML_DOCTYPE_COLOR = SETTINGS_GROUP + "/" + "code_view_xhtml_doctype_color";
101 static QString KEY_CODE_VIEW_XHTML_ENTITY_COLOR = SETTINGS_GROUP + "/" + "code_view_xhtml_entity_color";
102 static QString KEY_CODE_VIEW_XHTML_HTML_COLOR = SETTINGS_GROUP + "/" + "code_view_xhtml_html_color";
103 static QString KEY_CODE_VIEW_XHTML_HTML_COMMENT_COLOR = SETTINGS_GROUP + "/" + "code_view_xhtml_html_comment_color";
104 
105 static QString KEY_CODE_VIEW_HIGHLIGHT_OPEN_CLOSE_TAGS = SETTINGS_GROUP + "/" + "code_view_highlight_open_close_tags";
106 
107 // Dark Appearance
108 static QString KEY_CV_DARK_CSS_COMMENT_COLOR = SETTINGS_GROUP + "/" + "cv_dark_css_comment_color";
109 static QString KEY_CV_DARK_CSS_PROPERTY_COLOR = SETTINGS_GROUP + "/" + "cv_dark_css_property_color";
110 static QString KEY_CV_DARK_CSS_QUOTE_COLOR = SETTINGS_GROUP + "/" + "cv_dark_css_quote_color";
111 static QString KEY_CV_DARK_CSS_SELECTOR_COLOR = SETTINGS_GROUP + "/" + "cv_dark_css_selector_color";
112 static QString KEY_CV_DARK_CSS_VALUE_COLOR = SETTINGS_GROUP + "/" + "cv_dark_css_value_color";
113 static QString KEY_CV_DARK_FONT_FAMILY = SETTINGS_GROUP + "/" + "cv_dark_font_family_standard";
114 static QString KEY_CV_DARK_FONT_SIZE = SETTINGS_GROUP + "/" + "cv_dark_font_size";
115 static QString KEY_CV_DARK_LINE_HIGHLIGHT_COLOR = SETTINGS_GROUP + "/" + "cv_dark_line_highlight_color";
116 static QString KEY_CV_DARK_LINE_NUMBER_BACKGROUND_COLOR = SETTINGS_GROUP + "/" + "cv_dark_line_number_background_color";
117 static QString KEY_CV_DARK_LINE_NUMBER_FOREGROUND_COLOR = SETTINGS_GROUP + "/" + "cv_dark_line_number_foreground_color";
118 static QString KEY_CV_DARK_SPELLING_UNDERLINE_COLOR = SETTINGS_GROUP + "/" + "cv_dark_spelling_underline_color";
119 static QString KEY_CV_DARK_XHTML_ATTRIBUTE_NAME_COLOR = SETTINGS_GROUP + "/" + "cv_dark_xhtml_attribute_name_color";
120 static QString KEY_CV_DARK_XHTML_ATTRIBUTE_VALUE_COLOR = SETTINGS_GROUP + "/" + "cv_dark_xhtml_attribute_value_color";
121 static QString KEY_CV_DARK_XHTML_CSS_COLOR = SETTINGS_GROUP + "/" + "cv_dark_xhtml_css_color";
122 static QString KEY_CV_DARK_XHTML_CSS_COMMENT_COLOR = SETTINGS_GROUP + "/" + "cv_dark_xhtml_css_comment_color";
123 static QString KEY_CV_DARK_XHTML_DOCTYPE_COLOR = SETTINGS_GROUP + "/" + "cv_dark_xhtml_doctype_color";
124 static QString KEY_CV_DARK_XHTML_ENTITY_COLOR = SETTINGS_GROUP + "/" + "cv_dark_xhtml_entity_color";
125 static QString KEY_CV_DARK_XHTML_HTML_COLOR = SETTINGS_GROUP + "/" + "cv_dark_xhtml_html_color";
126 static QString KEY_CV_DARK_XHTML_HTML_COMMENT_COLOR = SETTINGS_GROUP + "/" + "cv_dark_xhtml_html_comment_color";
127 // End Dark appearance
128 
129 static QString KEY_SPECIAL_CHARACTER_FONT_FAMILY = SETTINGS_GROUP + "/" + "special_character_font_family";
130 static QString KEY_SPECIAL_CHARACTER_FONT_SIZE = SETTINGS_GROUP + "/" + "special_character_font_size";
131 static QString KEY_MAIN_MENU_ICON_SIZE = SETTINGS_GROUP + "/" + "main_menu_icon_size";
132 static QString KEY_CLIPBOARD_HISTORY_LIMIT = SETTINGS_GROUP + "/" + "clipboard_history_limit";
133 
SettingsStore()134 SettingsStore::SettingsStore()
135     : QSettings(Utility::DefinePrefsDir() + "/sigil.ini", QSettings::IniFormat)
136 {
137     // See QTBUG-40796 and QTBUG-54510 as using UTF-8 as a codec for ini files is very broken
138     // setIniCodec("UTF-8");
139 }
140 
SettingsStore(QString filename)141 SettingsStore::SettingsStore(QString filename)
142     : QSettings(filename, QSettings::IniFormat)
143 {
144     // See QTBUG-40796 and QTBUG-54510 as using UTF-8 as a codec for ini files is very broken
145     // setIniCodec("UTF-8");
146 }
147 
uiLanguage()148 QString SettingsStore::uiLanguage()
149 {
150     clearSettingsGroup();
151     return value(KEY_UI_LANGUAGE, QLocale::system().name()).toString();
152 }
153 
uiFont()154 QString SettingsStore::uiFont()
155 {
156     clearSettingsGroup();
157     return value(KEY_UI_FONT, "").toString();
158 }
159 
originalUIFont()160 QString SettingsStore::originalUIFont()
161 {
162     clearSettingsGroup();
163     return value(KEY_ORIGINAL_UI_FONT, "").toString();
164 }
165 
uiIconTheme()166 QString SettingsStore::uiIconTheme()
167 {
168     clearSettingsGroup();
169     return value(KEY_UI_ICON_THEME, "main").toString();
170 }
171 
uiDragDistanceTweak()172 int SettingsStore::uiDragDistanceTweak()
173 {
174     clearSettingsGroup();
175     return value(KEY_DRAG_DISTANCE_TWEAK, 0).toInt();
176 }
177 
defaultMetadataLang()178 QString SettingsStore::defaultMetadataLang()
179 {
180     clearSettingsGroup();
181     return value(KEY_DEFAULT_METADATA_LANGUAGE, "en").toString();
182 }
183 
externalXEditorPath()184 QString SettingsStore::externalXEditorPath()
185 {
186     clearSettingsGroup();
187     return value(KEY_EXTERNAL_XHTML_EDITOR, "").toString();
188 }
189 
zoomImage()190 float SettingsStore::zoomImage()
191 {
192     clearSettingsGroup();
193     return value(KEY_ZOOM_IMAGE, ZOOM_NORMAL).toFloat();;
194 }
195 
zoomText()196 float SettingsStore::zoomText()
197 {
198     clearSettingsGroup();
199     return value(KEY_ZOOM_TEXT, ZOOM_NORMAL).toFloat();
200 }
201 
zoomWeb()202 float SettingsStore::zoomWeb()
203 {
204     clearSettingsGroup();
205     return value(KEY_ZOOM_WEB, ZOOM_NORMAL).toFloat();
206 }
207 
zoomPreview()208 float SettingsStore::zoomPreview()
209 {
210     clearSettingsGroup();
211     return value(KEY_ZOOM_PREVIEW, ZOOM_NORMAL).toFloat();
212 }
213 
zoomInspector()214 float SettingsStore::zoomInspector()
215 {
216     clearSettingsGroup();
217     return value(KEY_ZOOM_INSPECTOR, ZOOM_NORMAL).toFloat();
218 }
219 
dictionary()220 QString SettingsStore::dictionary()
221 {
222     clearSettingsGroup();
223     return value(KEY_DICTIONARY_NAME, "en_US").toString();
224 }
225 
secondary_dictionary()226 QString SettingsStore::secondary_dictionary()
227 {
228     clearSettingsGroup();
229     return value(KEY_SECONDARY_DICTIONARY_NAME, "").toString();
230 }
231 
enabledUserDictionaries()232 QStringList SettingsStore::enabledUserDictionaries()
233 {
234     clearSettingsGroup();
235     return value(KEY_ENABLED_USER_DICTIONARIES, defaultUserDictionary()).toStringList();
236 }
237 
spellCheck()238 bool SettingsStore::spellCheck()
239 {
240     clearSettingsGroup();
241     return static_cast<bool>(value(KEY_SPELL_CHECK, false).toBool());
242 }
243 
spellCheckNumbers()244 bool SettingsStore::spellCheckNumbers()
245 {
246     clearSettingsGroup();
247     return static_cast<bool>(value(KEY_SPELL_CHECK_NUMBERS, false).toBool());
248 }
249 
defaultUserDictionary()250 QString SettingsStore::defaultUserDictionary()
251 {
252     clearSettingsGroup();
253     return value(KEY_DEFAULT_USER_DICTIONARY, "default").toString();
254 }
255 
renameTemplate()256 QString SettingsStore::renameTemplate()
257 {
258     clearSettingsGroup();
259     return value(KEY_RENAME_TEMPLATE, "").toString();
260 }
261 
remoteOn()262 int SettingsStore::remoteOn()
263 {
264     clearSettingsGroup();
265     return value(KEY_REMOTE_ON, 0).toInt();
266 }
267 
javascriptOn()268 int SettingsStore::javascriptOn()
269 {
270     clearSettingsGroup();
271     return value(KEY_JAVASCRIPT_ON, 0).toInt();
272 }
273 
showFullPathOn()274 int SettingsStore::showFullPathOn()
275 {
276     clearSettingsGroup();
277     return value(KEY_SHOWFULLPATH_ON, 0).toInt();
278 }
279 
highDPI()280 int SettingsStore::highDPI()
281 {
282     clearSettingsGroup();
283     return value(KEY_HIGHDPI_SETTING, 0).toInt();
284 }
285 
previewDark()286 int SettingsStore::previewDark()
287 {
288     clearSettingsGroup();
289     return value(KEY_PREVIEW_DARK_IN_DM, 1).toInt();
290 }
291 
cleanOn()292 int SettingsStore::cleanOn()
293 {
294     clearSettingsGroup();
295     return value(KEY_CLEAN_ON, (CLEANON_OPEN | CLEANON_SAVE)).toInt();
296 }
297 
pluginMap()298 QStringList SettingsStore::pluginMap()
299 {
300     clearSettingsGroup();
301     QStringList EmptyMap = QStringList();
302     for (int i = 0; i < 10; i++) {
303         EmptyMap.append("");
304     }
305     return value(KEY_PLUGIN_USER_MAP, EmptyMap).toStringList();
306 }
307 
defaultVersion()308 QString SettingsStore::defaultVersion()
309 {
310     clearSettingsGroup();
311     return value(KEY_DEFAULT_VERSION, "2.0").toString();
312 }
313 
preserveEntityCodeNames()314 QList <std::pair <ushort, QString>>  SettingsStore::preserveEntityCodeNames()
315 {
316     clearSettingsGroup();
317     QList <std::pair <ushort, QString>> codenames;
318     QStringList names = value(KEY_PRESERVE_ENTITY_NAMES, "&#160;").toStringList();
319     QString codes = value(KEY_PRESERVE_ENTITY_CODES, QChar(160)).toString();
320     int i = 0;
321     foreach(QString name, names) {
322         std::pair <ushort, QString> epair;
323         epair.first = (ushort) codes.at(i++).unicode();
324         epair.second = name;
325         codenames.append(epair);
326     }
327     return codenames;
328 }
329 
pluginEnginePaths()330 QHash <QString, QString> SettingsStore::pluginEnginePaths()
331 {
332     QHash <QString, QVariant> ep;
333     QHash <QString, QString>  enginepath;
334 
335     clearSettingsGroup();
336 
337     ep = value(KEY_PLUGIN_ENGINE_PATHS).toHash();
338     foreach (QString k, ep.keys()) {
339         enginepath.insert(k, ep.value(k).toString());
340     }
341 
342     return enginepath;
343 }
344 
pluginLastFolder()345 QString SettingsStore::pluginLastFolder()
346 {
347     clearSettingsGroup();
348     return value(KEY_PLUGIN_LAST_FOLDER, QDir::homePath()).toString();
349 }
350 
useBundledInterp()351 bool SettingsStore::useBundledInterp()
352 {
353     clearSettingsGroup();
354     // Defaults to true.
355     return static_cast<bool>(value(KEY_PLUGIN_USE_BUNDLED_INTERP, true).toBool());
356 }
357 
cssEpub2ValidationSpec()358 QString SettingsStore::cssEpub2ValidationSpec()
359 {
360     clearSettingsGroup();
361     return value(KEY_CSS_EPUB2_VALIDATION_SPEC, "css21").toString();
362 }
363 
cssEpub3ValidationSpec()364 QString SettingsStore::cssEpub3ValidationSpec()
365 {
366     clearSettingsGroup();
367     return value(KEY_CSS_EPUB3_VALIDATION_SPEC, "css30").toString();
368 }
369 
tempFolderHome()370 QString SettingsStore::tempFolderHome()
371 {
372     clearSettingsGroup();
373     QString temp_path = value(KEY_TEMP_FOLDER, "<SIGIL_DEFAULT_TEMP_HOME>").toString();
374     if (temp_path != "<SIGIL_DEFAULT_TEMP_HOME>") {
375         QDir tdir = QDir(temp_path);
376         if ( !tdir.exists() || !tdir.isReadable()) {
377             temp_path = "<SIGIL_DEFAULT_TEMP_HOME>";
378         }
379     }
380     return temp_path;
381 }
382 
appearancePrefsTabIndex()383 int SettingsStore::appearancePrefsTabIndex() {
384     clearSettingsGroup();
385     return value(KEY_APPEARANCE_PREFS_TAB_INDEX, 0).toInt();
386 }
387 
previewAppearance()388 SettingsStore::PreviewAppearance SettingsStore::previewAppearance()
389 {
390     clearSettingsGroup();
391     SettingsStore::PreviewAppearance appearance;
392     appearance.font_family_standard = value(KEY_PREVIEW_FONT_FAMILY_STANDARD, "Arial").toString();
393     appearance.font_family_serif = value(KEY_PREVIEW_FONT_FAMILY_SERIF, "Times New Roman").toString();
394     appearance.font_family_sans_serif = value(KEY_PREVIEW_FONT_FAMILY_SANS_SERIF, "Arial").toString();
395     appearance.font_size = value(KEY_PREVIEW_FONT_SIZE, 16).toInt();
396     return appearance;
397 }
398 
codeViewAppearance()399 SettingsStore::CodeViewAppearance SettingsStore::codeViewAppearance()
400 {
401     clearSettingsGroup();
402     SettingsStore::CodeViewAppearance appearance;
403     appearance.css_comment_color = value(KEY_CODE_VIEW_CSS_COMMENT_COLOR, QColor(Qt::darkGreen)).value<QColor>();
404     appearance.css_property_color = value(KEY_CODE_VIEW_CSS_PROPERTY_COLOR, QColor(Qt::darkBlue)).value<QColor>();
405     appearance.css_quote_color = value(KEY_CODE_VIEW_CSS_QUOTE_COLOR, QColor(Qt::darkMagenta)).value<QColor>();
406     appearance.css_selector_color = value(KEY_CODE_VIEW_CSS_SELECTOR_COLOR, QColor(Qt::darkRed)).value<QColor>();
407     appearance.css_value_color = value(KEY_CODE_VIEW_CSS_VALUE_COLOR, QColor(Qt::black)).value<QColor>();
408     appearance.font_family = value(KEY_CODE_VIEW_FONT_FAMILY, "Courier New").toString();
409     appearance.font_size = value(KEY_CODE_VIEW_FONT_SIZE, 10).toInt();
410     QColor defaultlineColor = QColor(Qt::yellow).lighter(175);
411     appearance.line_highlight_color = value(KEY_CODE_VIEW_LINE_HIGHLIGHT_COLOR, defaultlineColor).value<QColor>();
412     appearance.line_number_background_color = value(KEY_CODE_VIEW_LINE_NUMBER_BACKGROUND_COLOR, QColor(225, 225, 225)).value<QColor>();
413     appearance.line_number_foreground_color = value(KEY_CODE_VIEW_LINE_NUMBER_FOREGROUND_COLOR, QColor(125, 125, 125)).value<QColor>();
414     appearance.spelling_underline_color = value(KEY_CODE_VIEW_SPELLING_UNDERLINE_COLOR, QColor(Qt::red)).value<QColor>();
415     appearance.xhtml_attribute_name_color = value(KEY_CODE_VIEW_XHTML_ATTRIBUTE_NAME_COLOR, QColor(Qt::darkRed)).value<QColor>();
416     appearance.xhtml_attribute_value_color = value(KEY_CODE_VIEW_XHTML_ATTRIBUTE_VALUE_COLOR, QColor(Qt::darkCyan)).value<QColor>();
417     appearance.xhtml_css_color = value(KEY_CODE_VIEW_XHTML_CSS_COLOR, QColor(Qt::darkYellow)).value<QColor>();
418     appearance.xhtml_css_comment_color = value(KEY_CODE_VIEW_XHTML_CSS_COMMENT_COLOR, QColor(Qt::darkGreen)).value<QColor>();
419     appearance.xhtml_doctype_color = value(KEY_CODE_VIEW_XHTML_DOCTYPE_COLOR, QColor(Qt::darkBlue)).value<QColor>();
420     appearance.xhtml_entity_color = value(KEY_CODE_VIEW_XHTML_ENTITY_COLOR, QColor(Qt::darkMagenta)).value<QColor>();
421     appearance.xhtml_html_color = value(KEY_CODE_VIEW_XHTML_HTML_COLOR, QColor(Qt::blue)).value<QColor>();
422     appearance.xhtml_html_comment_color = value(KEY_CODE_VIEW_XHTML_HTML_COMMENT_COLOR, QColor(Qt::darkGreen)).value<QColor>();
423     return appearance;
424 }
425 
highlightOpenCloseTags()426 bool SettingsStore::highlightOpenCloseTags()
427 {
428     clearSettingsGroup();
429     return static_cast<bool>(value(KEY_CODE_VIEW_HIGHLIGHT_OPEN_CLOSE_TAGS, true).toBool());
430 }
431 
codeViewDarkAppearance()432 SettingsStore::CodeViewAppearance SettingsStore::codeViewDarkAppearance()
433 {
434     clearSettingsGroup();
435     SettingsStore::CodeViewAppearance appearance;
436     appearance.css_comment_color = value(KEY_CV_DARK_CSS_COMMENT_COLOR, QColor(112, 109, 91)).value<QColor>();
437     appearance.css_property_color = value(KEY_CV_DARK_CSS_PROPERTY_COLOR, QColor(159, 194, 138)).value<QColor>();
438     appearance.css_quote_color = value(KEY_CV_DARK_CSS_QUOTE_COLOR, QColor(235, 147, 154)).value<QColor>();
439     appearance.css_selector_color = value(KEY_CV_DARK_CSS_SELECTOR_COLOR, QColor(239, 239, 143)).value<QColor>();
440     appearance.css_value_color = value(KEY_CV_DARK_CSS_VALUE_COLOR, QColor(252, 255, 224)).value<QColor>();
441     appearance.font_family = value(KEY_CV_DARK_FONT_FAMILY, "Courier New").toString();
442     appearance.font_size = value(KEY_CV_DARK_FONT_SIZE, 10).toInt();
443     appearance.line_highlight_color = value(KEY_CV_DARK_LINE_HIGHLIGHT_COLOR, QColor(81, 81, 81)).value<QColor>();
444     appearance.line_number_background_color = value(KEY_CV_DARK_LINE_NUMBER_BACKGROUND_COLOR, QPalette().color(QPalette::AlternateBase)).value<QColor>();
445     appearance.line_number_foreground_color = value(KEY_CV_DARK_LINE_NUMBER_FOREGROUND_COLOR, QColor(229, 229, 229)).value<QColor>();
446     appearance.spelling_underline_color = value(KEY_CV_DARK_SPELLING_UNDERLINE_COLOR, QColor(255, 55, 55)).value<QColor>();
447     appearance.xhtml_attribute_name_color = value(KEY_CV_DARK_XHTML_ATTRIBUTE_NAME_COLOR, QColor(159, 194, 138)).value<QColor>();
448     appearance.xhtml_attribute_value_color = value(KEY_CV_DARK_XHTML_ATTRIBUTE_VALUE_COLOR, QColor(232, 145, 152)).value<QColor>();
449     appearance.xhtml_css_color = value(KEY_CV_DARK_XHTML_CSS_COLOR, QColor(128, 128, 0)).value<QColor>();
450     appearance.xhtml_css_comment_color = value(KEY_CV_DARK_XHTML_CSS_COMMENT_COLOR, QColor(112, 109, 91)).value<QColor>();
451     appearance.xhtml_doctype_color = value(KEY_CV_DARK_XHTML_DOCTYPE_COLOR, QColor(126, 252, 255)).value<QColor>();
452     appearance.xhtml_entity_color = value(KEY_CV_DARK_XHTML_ENTITY_COLOR, QColor(235, 255, 196)).value<QColor>();
453     appearance.xhtml_html_color = value(KEY_CV_DARK_XHTML_HTML_COLOR, QColor(239, 239, 143)).value<QColor>();
454     appearance.xhtml_html_comment_color = value(KEY_CV_DARK_XHTML_HTML_COMMENT_COLOR, QColor(112, 109, 91)).value<QColor>();
455     return appearance;
456 }
457 
specialCharacterAppearance()458 SettingsStore::SpecialCharacterAppearance SettingsStore::specialCharacterAppearance()
459 {
460     clearSettingsGroup();
461     SettingsStore::SpecialCharacterAppearance appearance;
462     appearance.font_family = value(KEY_SPECIAL_CHARACTER_FONT_FAMILY, "Arial").toString();
463     appearance.font_size = value(KEY_SPECIAL_CHARACTER_FONT_SIZE, 14).toInt();
464     return appearance;
465 }
466 
mainMenuIconSize()467 double SettingsStore::mainMenuIconSize()
468 {
469     clearSettingsGroup();
470     return value(KEY_MAIN_MENU_ICON_SIZE, 1.8).toDouble();
471 }
472 
clipboardHistoryLimit()473 int SettingsStore::clipboardHistoryLimit()
474 {
475     clearSettingsGroup();
476     int tmpLimit = value(KEY_CLIPBOARD_HISTORY_LIMIT, CLIPBOARD_HISTORY_MAX).toInt();
477     // Ensure that any clipboard history limit gleaned from the ini file is between 0 and CLIPBOARD_HISTORY_MAX
478     return ((tmpLimit >= 0 && tmpLimit <= CLIPBOARD_HISTORY_MAX) ? tmpLimit : CLIPBOARD_HISTORY_MAX);
479     //return value(KEY_CLIPBOARD_HISTORY_LIMIT, CLIPBOARD_HISTORY_MAX).toInt();
480 }
481 
enableAltGr()482 bool SettingsStore::enableAltGr()
483 {
484     clearSettingsGroup();
485     return static_cast<bool>(value(KEY_ENABLE_ALTGR, false).toBool());
486 }
487 
setDefaultMetadataLang(const QString & lang)488 void SettingsStore::setDefaultMetadataLang(const QString &lang)
489 {
490     clearSettingsGroup();
491     setValue(KEY_DEFAULT_METADATA_LANGUAGE, lang);
492 }
493 
setUILanguage(const QString & language_code)494 void SettingsStore::setUILanguage(const QString &language_code)
495 {
496     clearSettingsGroup();
497     setValue(KEY_UI_LANGUAGE, language_code);
498 }
499 
setUIFont(const QString & font_data)500 void SettingsStore::setUIFont(const QString &font_data)
501 {
502     clearSettingsGroup();
503     setValue(KEY_UI_FONT, font_data);
504 }
505 
setOriginalUIFont(const QString & font_data)506 void SettingsStore::setOriginalUIFont(const QString &font_data)
507 {
508     clearSettingsGroup();
509     setValue(KEY_ORIGINAL_UI_FONT, font_data);
510 }
511 
setUIIconTheme(const QString & iconthemename)512 void SettingsStore::setUIIconTheme(const QString &iconthemename)
513 {
514     clearSettingsGroup();
515     setValue(KEY_UI_ICON_THEME, iconthemename);
516 }
517 
setUiDragDistanceTweak(int tweak)518 void SettingsStore::setUiDragDistanceTweak(int tweak)
519 {
520     clearSettingsGroup();
521     setValue(KEY_DRAG_DISTANCE_TWEAK, tweak);
522 }
523 
setExternalXEditorPath(const QString & path)524 void SettingsStore::setExternalXEditorPath(const QString &path)
525 {
526     clearSettingsGroup();
527     setValue(KEY_EXTERNAL_XHTML_EDITOR, path);
528 }
529 
setZoomImage(float zoom)530 void SettingsStore::setZoomImage(float zoom)
531 {
532     clearSettingsGroup();
533     setValue(KEY_ZOOM_IMAGE, zoom);
534 }
535 
setZoomText(float zoom)536 void SettingsStore::setZoomText(float zoom)
537 {
538     clearSettingsGroup();
539     setValue(KEY_ZOOM_TEXT, zoom);
540 }
541 
setZoomWeb(float zoom)542 void SettingsStore::setZoomWeb(float zoom)
543 {
544     clearSettingsGroup();
545     setValue(KEY_ZOOM_WEB, zoom);
546 }
547 
setZoomPreview(float zoom)548 void SettingsStore::setZoomPreview(float zoom)
549 {
550     clearSettingsGroup();
551     setValue(KEY_ZOOM_PREVIEW, zoom);
552 }
553 
setZoomInspector(float zoom)554 void SettingsStore::setZoomInspector(float zoom)
555 {
556     clearSettingsGroup();
557     setValue(KEY_ZOOM_INSPECTOR, zoom);
558 }
559 
setDictionary(const QString & name)560 void SettingsStore::setDictionary(const QString &name)
561 {
562     clearSettingsGroup();
563     setValue(KEY_DICTIONARY_NAME, name);
564 }
565 
setSecondaryDictionary(const QString & name)566 void SettingsStore::setSecondaryDictionary(const QString &name)
567 {
568     clearSettingsGroup();
569     setValue(KEY_SECONDARY_DICTIONARY_NAME, name);
570 }
571 
setEnabledUserDictionaries(const QStringList names)572 void SettingsStore::setEnabledUserDictionaries(const QStringList names)
573 {
574     clearSettingsGroup();
575     setValue(KEY_ENABLED_USER_DICTIONARIES, names);
576 }
577 
setSpellCheck(bool enabled)578 void SettingsStore::setSpellCheck(bool enabled)
579 {
580     clearSettingsGroup();
581     setValue(KEY_SPELL_CHECK, enabled);
582 }
583 
setSpellCheckNumbers(bool enabled)584 void SettingsStore::setSpellCheckNumbers(bool enabled)
585 {
586     clearSettingsGroup();
587     setValue(KEY_SPELL_CHECK_NUMBERS, enabled);
588 }
589 
setDefaultUserDictionary(const QString & name)590 void SettingsStore::setDefaultUserDictionary(const QString &name)
591 {
592     clearSettingsGroup();
593     setValue(KEY_DEFAULT_USER_DICTIONARY, name);
594 }
595 
setRenameTemplate(const QString & name)596 void SettingsStore::setRenameTemplate(const QString &name)
597 {
598     clearSettingsGroup();
599     setValue(KEY_RENAME_TEMPLATE, name);
600 }
601 
setRemoteOn(int on)602 void SettingsStore::setRemoteOn(int on)
603 {
604     clearSettingsGroup();
605     setValue(KEY_REMOTE_ON, on);
606 }
607 
setJavascriptOn(int on)608 void SettingsStore::setJavascriptOn(int on)
609 {
610     clearSettingsGroup();
611     setValue(KEY_JAVASCRIPT_ON, on);
612 }
613 
setShowFullPathOn(int on)614 void SettingsStore::setShowFullPathOn(int on)
615 {
616     clearSettingsGroup();
617     setValue(KEY_SHOWFULLPATH_ON, on);
618 }
619 
setHighDPI(int value)620 void SettingsStore::setHighDPI(int value)
621 {
622     clearSettingsGroup();
623     setValue(KEY_HIGHDPI_SETTING, value);
624 }
625 
setPreviewDark(int enabled)626 void SettingsStore::setPreviewDark(int enabled)
627 {
628     clearSettingsGroup();
629     setValue(KEY_PREVIEW_DARK_IN_DM, enabled);
630 }
631 
632 
setCleanOn(int on)633 void SettingsStore::setCleanOn(int on)
634 {
635     clearSettingsGroup();
636     setValue(KEY_CLEAN_ON, on);
637 }
638 
setPluginMap(const QStringList & map)639 void SettingsStore::setPluginMap(const QStringList &map)
640 {
641     clearSettingsGroup();
642     setValue(KEY_PLUGIN_USER_MAP, map);
643 }
644 
setDefaultVersion(const QString & version)645 void SettingsStore::setDefaultVersion(const QString &version)
646 {
647     clearSettingsGroup();
648     setValue(KEY_DEFAULT_VERSION, version);
649 }
650 
setPreserveEntityCodeNames(const QList<std::pair<ushort,QString>> codenames)651 void SettingsStore::setPreserveEntityCodeNames(const QList<std::pair <ushort, QString>> codenames)
652 {
653     clearSettingsGroup();
654     QStringList names;
655     QString codes;
656     std::pair <ushort, QString> epair;
657     foreach (epair, codenames) {
658         names.append(epair.second);
659         codes.append(QChar(epair.first));
660     }
661     setValue(KEY_PRESERVE_ENTITY_NAMES, names);
662     setValue(KEY_PRESERVE_ENTITY_CODES, codes);
663 }
664 
setPluginEnginePaths(const QHash<QString,QString> & enginepaths)665 void SettingsStore::setPluginEnginePaths(const QHash <QString, QString> &enginepaths)
666 {
667     clearSettingsGroup();
668     QHash<QString, QVariant> ep;
669 
670     foreach (QString k, enginepaths.keys()) {
671         ep.insert(k, enginepaths.value(k));
672     }
673     setValue(KEY_PLUGIN_ENGINE_PATHS, ep);
674 }
675 
setPluginLastFolder(const QString & lastfolder)676 void SettingsStore::setPluginLastFolder(const QString &lastfolder)
677 {
678     clearSettingsGroup();
679     setValue(KEY_PLUGIN_LAST_FOLDER, lastfolder);
680 }
681 
setUseBundledInterp(bool use)682 void SettingsStore::setUseBundledInterp(bool use)
683 {
684     clearSettingsGroup();
685     setValue(KEY_PLUGIN_USE_BUNDLED_INTERP, use);
686 }
687 
setCssEpub2ValidationSpec(const QString & spec)688 void SettingsStore::setCssEpub2ValidationSpec(const QString &spec)
689 {
690     clearSettingsGroup();
691     setValue(KEY_CSS_EPUB2_VALIDATION_SPEC, spec);
692 }
693 
setCssEpub3ValidationSpec(const QString & spec)694 void SettingsStore::setCssEpub3ValidationSpec(const QString &spec)
695 {
696     clearSettingsGroup();
697     setValue(KEY_CSS_EPUB3_VALIDATION_SPEC, spec);
698 }
699 
setTempFolderHome(const QString & path)700 void SettingsStore::setTempFolderHome(const QString &path)
701 {
702     clearSettingsGroup();
703     if (QDir(path).exists()) {
704         setValue(KEY_TEMP_FOLDER, path);
705     } else {
706         setValue(KEY_TEMP_FOLDER, "<SIGIL_DEFAULT_TEMP_HOME>" );
707     }
708 }
709 
setAppearancePrefsTabIndex(int index)710 void SettingsStore::setAppearancePrefsTabIndex(int index) {
711     clearSettingsGroup();
712     setValue(KEY_APPEARANCE_PREFS_TAB_INDEX, index);
713 }
714 
setPreviewAppearance(const SettingsStore::PreviewAppearance & preview_appearance)715 void SettingsStore::setPreviewAppearance(const SettingsStore::PreviewAppearance &preview_appearance)
716 {
717     clearSettingsGroup();
718     setValue(KEY_PREVIEW_FONT_FAMILY_STANDARD, preview_appearance.font_family_standard);
719     setValue(KEY_PREVIEW_FONT_FAMILY_SERIF, preview_appearance.font_family_serif);
720     setValue(KEY_PREVIEW_FONT_FAMILY_SANS_SERIF, preview_appearance.font_family_sans_serif);
721     setValue(KEY_PREVIEW_FONT_SIZE, preview_appearance.font_size);
722 }
723 
setCodeViewAppearance(const SettingsStore::CodeViewAppearance & code_view_appearance)724 void SettingsStore::setCodeViewAppearance(const SettingsStore::CodeViewAppearance &code_view_appearance)
725 {
726     clearSettingsGroup();
727     setValue(KEY_CODE_VIEW_CSS_COMMENT_COLOR, code_view_appearance.css_comment_color);
728     setValue(KEY_CODE_VIEW_CSS_PROPERTY_COLOR, code_view_appearance.css_property_color);
729     setValue(KEY_CODE_VIEW_CSS_QUOTE_COLOR, code_view_appearance.css_quote_color);
730     setValue(KEY_CODE_VIEW_CSS_SELECTOR_COLOR, code_view_appearance.css_selector_color);
731     setValue(KEY_CODE_VIEW_CSS_VALUE_COLOR, code_view_appearance.css_value_color);
732     setValue(KEY_CODE_VIEW_FONT_FAMILY, code_view_appearance.font_family);
733     setValue(KEY_CODE_VIEW_FONT_SIZE, code_view_appearance.font_size);
734     setValue(KEY_CODE_VIEW_LINE_HIGHLIGHT_COLOR, code_view_appearance.line_highlight_color);
735     setValue(KEY_CODE_VIEW_LINE_NUMBER_BACKGROUND_COLOR, code_view_appearance.line_number_background_color);
736     setValue(KEY_CODE_VIEW_LINE_NUMBER_FOREGROUND_COLOR, code_view_appearance.line_number_foreground_color);
737     setValue(KEY_CODE_VIEW_SPELLING_UNDERLINE_COLOR, code_view_appearance.spelling_underline_color);
738     setValue(KEY_CODE_VIEW_XHTML_ATTRIBUTE_NAME_COLOR, code_view_appearance.xhtml_attribute_name_color);
739     setValue(KEY_CODE_VIEW_XHTML_ATTRIBUTE_VALUE_COLOR, code_view_appearance.xhtml_attribute_value_color);
740     setValue(KEY_CODE_VIEW_XHTML_CSS_COLOR, code_view_appearance.xhtml_css_color);
741     setValue(KEY_CODE_VIEW_XHTML_CSS_COMMENT_COLOR, code_view_appearance.xhtml_css_comment_color);
742     setValue(KEY_CODE_VIEW_XHTML_DOCTYPE_COLOR, code_view_appearance.xhtml_doctype_color);
743     setValue(KEY_CODE_VIEW_XHTML_ENTITY_COLOR, code_view_appearance.xhtml_entity_color);
744     setValue(KEY_CODE_VIEW_XHTML_HTML_COLOR, code_view_appearance.xhtml_html_color);
745     setValue(KEY_CODE_VIEW_XHTML_HTML_COMMENT_COLOR, code_view_appearance.xhtml_html_comment_color);
746 }
747 
setHighlightOpenCloseTags(bool enabled)748 void SettingsStore::setHighlightOpenCloseTags(bool enabled)
749 {
750     clearSettingsGroup();
751     setValue(KEY_CODE_VIEW_HIGHLIGHT_OPEN_CLOSE_TAGS, enabled);
752 }
753 
setCodeViewDarkAppearance(const SettingsStore::CodeViewAppearance & code_view_appearance)754 void SettingsStore::setCodeViewDarkAppearance(const SettingsStore::CodeViewAppearance &code_view_appearance)
755 {
756     clearSettingsGroup();
757     setValue(KEY_CV_DARK_CSS_COMMENT_COLOR, code_view_appearance.css_comment_color);
758     setValue(KEY_CV_DARK_CSS_PROPERTY_COLOR, code_view_appearance.css_property_color);
759     setValue(KEY_CV_DARK_CSS_QUOTE_COLOR, code_view_appearance.css_quote_color);
760     setValue(KEY_CV_DARK_CSS_SELECTOR_COLOR, code_view_appearance.css_selector_color);
761     setValue(KEY_CV_DARK_CSS_VALUE_COLOR, code_view_appearance.css_value_color);
762     setValue(KEY_CV_DARK_FONT_FAMILY, code_view_appearance.font_family);
763     setValue(KEY_CV_DARK_FONT_SIZE, code_view_appearance.font_size);
764     setValue(KEY_CV_DARK_LINE_HIGHLIGHT_COLOR, code_view_appearance.line_highlight_color);
765     setValue(KEY_CV_DARK_LINE_NUMBER_BACKGROUND_COLOR, code_view_appearance.line_number_background_color);
766     setValue(KEY_CV_DARK_LINE_NUMBER_FOREGROUND_COLOR, code_view_appearance.line_number_foreground_color);
767     setValue(KEY_CV_DARK_SPELLING_UNDERLINE_COLOR, code_view_appearance.spelling_underline_color);
768     setValue(KEY_CV_DARK_XHTML_ATTRIBUTE_NAME_COLOR, code_view_appearance.xhtml_attribute_name_color);
769     setValue(KEY_CV_DARK_XHTML_ATTRIBUTE_VALUE_COLOR, code_view_appearance.xhtml_attribute_value_color);
770     setValue(KEY_CV_DARK_XHTML_CSS_COLOR, code_view_appearance.xhtml_css_color);
771     setValue(KEY_CV_DARK_XHTML_CSS_COMMENT_COLOR, code_view_appearance.xhtml_css_comment_color);
772     setValue(KEY_CV_DARK_XHTML_DOCTYPE_COLOR, code_view_appearance.xhtml_doctype_color);
773     setValue(KEY_CV_DARK_XHTML_ENTITY_COLOR, code_view_appearance.xhtml_entity_color);
774     setValue(KEY_CV_DARK_XHTML_HTML_COLOR, code_view_appearance.xhtml_html_color);
775     setValue(KEY_CV_DARK_XHTML_HTML_COMMENT_COLOR, code_view_appearance.xhtml_html_comment_color);
776 }
777 
setSpecialCharacterAppearance(const SettingsStore::SpecialCharacterAppearance & special_character_appearance)778 void SettingsStore::setSpecialCharacterAppearance(const SettingsStore::SpecialCharacterAppearance &special_character_appearance)
779 {
780     clearSettingsGroup();
781     setValue(KEY_SPECIAL_CHARACTER_FONT_FAMILY, special_character_appearance.font_family);
782     setValue(KEY_SPECIAL_CHARACTER_FONT_SIZE, special_character_appearance.font_size);
783 }
784 
setMainMenuIconSize(double icon_size)785 void SettingsStore::setMainMenuIconSize(double icon_size)
786 {
787     clearSettingsGroup();
788     setValue(KEY_MAIN_MENU_ICON_SIZE, icon_size);
789 }
790 
setClipboardHistoryLimit(int limit)791 void SettingsStore::setClipboardHistoryLimit(int limit)
792 {
793     clearSettingsGroup();
794     setValue(KEY_CLIPBOARD_HISTORY_LIMIT, limit);
795 }
796 
setEnableAltGr(bool enabled)797 void SettingsStore::setEnableAltGr(bool enabled)
798 {
799     clearSettingsGroup();
800     setValue(KEY_ENABLE_ALTGR, enabled);
801 }
802 
clearAppearanceSettings()803 void SettingsStore::clearAppearanceSettings()
804 {
805     clearSettingsGroup();
806     remove(KEY_PREVIEW_FONT_FAMILY_STANDARD);
807     remove(KEY_PREVIEW_FONT_FAMILY_SERIF);
808     remove(KEY_PREVIEW_FONT_FAMILY_SANS_SERIF);
809     remove(KEY_PREVIEW_FONT_SIZE);
810     if (!Utility::IsDarkMode()) {
811         remove(KEY_CODE_VIEW_CSS_COMMENT_COLOR);
812         remove(KEY_CODE_VIEW_CSS_PROPERTY_COLOR);
813         remove(KEY_CODE_VIEW_CSS_QUOTE_COLOR);
814         remove(KEY_CODE_VIEW_CSS_SELECTOR_COLOR);
815         remove(KEY_CODE_VIEW_CSS_VALUE_COLOR);
816         remove(KEY_CODE_VIEW_FONT_FAMILY);
817         remove(KEY_CODE_VIEW_FONT_SIZE);
818         remove(KEY_CODE_VIEW_LINE_HIGHLIGHT_COLOR);
819         remove(KEY_CODE_VIEW_LINE_NUMBER_BACKGROUND_COLOR);
820         remove(KEY_CODE_VIEW_LINE_NUMBER_FOREGROUND_COLOR);
821         remove(KEY_CODE_VIEW_SPELLING_UNDERLINE_COLOR);
822         remove(KEY_CODE_VIEW_XHTML_ATTRIBUTE_NAME_COLOR);
823         remove(KEY_CODE_VIEW_XHTML_ATTRIBUTE_VALUE_COLOR);
824         remove(KEY_CODE_VIEW_XHTML_CSS_COLOR);
825         remove(KEY_CODE_VIEW_XHTML_CSS_COMMENT_COLOR);
826         remove(KEY_CODE_VIEW_XHTML_DOCTYPE_COLOR);
827         remove(KEY_CODE_VIEW_XHTML_ENTITY_COLOR);
828         remove(KEY_CODE_VIEW_XHTML_HTML_COLOR);
829         remove(KEY_CODE_VIEW_XHTML_HTML_COMMENT_COLOR);
830     } else {
831         // Dark Appearance
832         remove(KEY_CV_DARK_CSS_COMMENT_COLOR);
833         remove(KEY_CV_DARK_CSS_PROPERTY_COLOR);
834         remove(KEY_CV_DARK_CSS_QUOTE_COLOR);
835         remove(KEY_CV_DARK_CSS_SELECTOR_COLOR);
836         remove(KEY_CV_DARK_CSS_VALUE_COLOR);
837         remove(KEY_CV_DARK_FONT_FAMILY);
838         remove(KEY_CV_DARK_FONT_SIZE);
839         remove(KEY_CV_DARK_LINE_HIGHLIGHT_COLOR);
840         remove(KEY_CV_DARK_LINE_NUMBER_BACKGROUND_COLOR);
841         remove(KEY_CV_DARK_LINE_NUMBER_FOREGROUND_COLOR);
842         remove(KEY_CV_DARK_SPELLING_UNDERLINE_COLOR);
843         remove(KEY_CV_DARK_XHTML_ATTRIBUTE_NAME_COLOR);
844         remove(KEY_CV_DARK_XHTML_ATTRIBUTE_VALUE_COLOR);
845         remove(KEY_CV_DARK_XHTML_CSS_COLOR);
846         remove(KEY_CV_DARK_XHTML_CSS_COMMENT_COLOR);
847         remove(KEY_CV_DARK_XHTML_DOCTYPE_COLOR);
848         remove(KEY_CV_DARK_XHTML_ENTITY_COLOR);
849         remove(KEY_CV_DARK_XHTML_HTML_COLOR);
850         remove(KEY_CV_DARK_XHTML_HTML_COMMENT_COLOR);
851     }
852 
853     remove(KEY_CODE_VIEW_HIGHLIGHT_OPEN_CLOSE_TAGS);
854     remove(KEY_SPECIAL_CHARACTER_FONT_FAMILY);
855     remove(KEY_SPECIAL_CHARACTER_FONT_SIZE);
856     remove(KEY_MAIN_MENU_ICON_SIZE);
857     remove(KEY_SHOWFULLPATH_ON);
858     remove(KEY_HIGHDPI_SETTING);
859     remove(KEY_UI_FONT);
860     remove(KEY_UI_ICON_THEME);
861     remove(KEY_DRAG_DISTANCE_TWEAK);
862     remove(KEY_PREVIEW_DARK_IN_DM);
863     ;
864 }
865 
clearSettingsGroup()866 void SettingsStore::clearSettingsGroup()
867 {
868     while (!group().isEmpty()) {
869         endGroup();
870     }
871 }
872