1 /************************************************************************
2 **
3 **  Copyright (C) 2016-2020 Kevin B. Hendricks, Stratford, ON
4 **  Copyright (C) 2011-2013 John Schember <john@nachtimwald.com>
5 **  Copyright (C) 2012-2013 Dave Heiland
6 **
7 **  This file is part of PageEdit.
8 **
9 **  PageEdit is free software: you can redistribute it and/or modify
10 **  it under the terms of the GNU General Public License as published by
11 **  the Free Software Foundation, either version 3 of the License, or
12 **  (at your option) any later version.
13 **
14 **  PageEdit is distributed in the hope that it will be useful,
15 **  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 **  GNU General Public License for more details.
18 **
19 **  You should have received a copy of the GNU General Public License
20 **  along with PageEdit.  If not, see <http://www.gnu.org/licenses/>.
21 **
22 *************************************************************************/
23 
24 #include <QtCore/QLocale>
25 #include <QtCore/QCoreApplication>
26 #include <QFile>
27 #include <QDir>
28 
29 #include "SettingsStore.h"
30 #include "Utility.h"
31 
32 static const float ZOOM_NORMAL = 1.0f;
33 static QString SETTINGS_GROUP = "user_preferences";
34 static QString KEY_UI_LANGUAGE = SETTINGS_GROUP + "/" + "ui_language";
35 static QString KEY_UI_DICTIONARY = SETTINGS_GROUP + "/" + "ui_dictionary";
36 
37 static QString KEY_UI_FONT = SETTINGS_GROUP + "/" + "ui_font";
38 static QString KEY_ORIGINAL_UI_FONT = SETTINGS_GROUP + "/" + "original_ui_font";
39 
40 static QString KEY_HIGHDPI_SETTING = SETTINGS_GROUP + "/" + "high_dpi";
41 static QString KEY_PREVIEW_DARK_IN_DM = SETTINGS_GROUP + "/" + "preview_dark_in_dm";
42 
43 static QString KEY_SPELL_CHECK = SETTINGS_GROUP + "/" + "spellcheck";
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_APPEARANCE_PREFS_TAB_INDEX = SETTINGS_GROUP + "/" + "appearance_prefs_tab_index";
50 static QString KEY_WEBVIEW_FONT_FAMILY_STANDARD = SETTINGS_GROUP + "/" + "webview_font_family_standard";
51 static QString KEY_WEBVIEW_FONT_FAMILY_SERIF = SETTINGS_GROUP + "/" + "webview_font_family_serif";
52 static QString KEY_WEBVIEW_FONT_FAMILY_SANS_SERIF = SETTINGS_GROUP + "/" + "webview_font_family_sans_serif";
53 static QString KEY_WEBVIEW_FONT_SIZE = SETTINGS_GROUP + "/" + "webview_font_size";
54 static QString KEY_SPECIAL_CHARACTER_FONT_FAMILY = SETTINGS_GROUP + "/" + "special_character_font_family";
55 static QString KEY_SPECIAL_CHARACTER_FONT_SIZE = SETTINGS_GROUP + "/" + "special_character_font_size";
56 static QString KEY_MAIN_MENU_ICON_SIZE = SETTINGS_GROUP + "/" + "main_menu_icon_size";
57 static QString KEY_JAVASCRIPT_ON = SETTINGS_GROUP + "/" + "javascript_on";
58 static QString KEY_REMOTE_ON = SETTINGS_GROUP + "/" + "remote_on";
59 static QString KEY_USE_PRETTIFY = SETTINGS_GROUP + "/" + "use_prettify";
60 static QString KEY_USE_WSPREWRAP = SETTINGS_GROUP + "/" + "use_white_space_pre_wrap";
61 
62 
SettingsStore()63 SettingsStore::SettingsStore()
64     : QSettings(Utility::DefinePrefsDir() + "/pageedit.ini", QSettings::IniFormat)
65 {
66     // See QTBUG-40796 and QTBUG-54510 as using UTF-8 as a codec for ini files is very broken
67     // setIniCodec("UTF-8");
68 }
69 
SettingsStore(QString filename)70 SettingsStore::SettingsStore(QString filename)
71     : QSettings(filename, QSettings::IniFormat)
72 {
73     // See QTBUG-40796 and QTBUG-54510 as using UTF-8 as a codec for ini files is very broken
74     // setIniCodec("UTF-8");
75 }
76 
uiLanguage()77 QString SettingsStore::uiLanguage()
78 {
79     clearSettingsGroup();
80     return value(KEY_UI_LANGUAGE, QLocale::system().name()).toString();
81 }
82 
uiDictionary()83 QString SettingsStore::uiDictionary()
84 {
85     clearSettingsGroup();
86     return value(KEY_UI_DICTIONARY, "en_US").toString();
87 }
88 
uiFont()89 QString SettingsStore::uiFont()
90 {
91     clearSettingsGroup();
92     return value(KEY_UI_FONT, "").toString();
93 }
94 
originalUIFont()95 QString SettingsStore::originalUIFont()
96 {
97     clearSettingsGroup();
98     return value(KEY_ORIGINAL_UI_FONT, "").toString();
99 }
100 
highDPI()101 int SettingsStore::highDPI()
102 {
103     clearSettingsGroup();
104     return value(KEY_HIGHDPI_SETTING, 0).toInt();
105 }
106 
previewDark()107 int SettingsStore::previewDark()
108 {
109     clearSettingsGroup();
110     return value(KEY_PREVIEW_DARK_IN_DM, 1).toInt();
111 }
112 
113 #if 0
114 bool SettingsStore::spellCheck()
115 {
116   clearSettingsGroup();
117   return static_cast<bool>(value(KEY_SPELL_CHECK, false).toBool());
118 }
119 #endif
120 
zoomImage()121 float SettingsStore::zoomImage()
122 {
123     clearSettingsGroup();
124     return value(KEY_ZOOM_IMAGE, ZOOM_NORMAL).toFloat();;
125 }
126 
zoomText()127 float SettingsStore::zoomText()
128 {
129     clearSettingsGroup();
130     return value(KEY_ZOOM_TEXT, ZOOM_NORMAL).toFloat();
131 }
132 
zoomWeb()133 float SettingsStore::zoomWeb()
134 {
135     clearSettingsGroup();
136     return value(KEY_ZOOM_WEB, ZOOM_NORMAL).toFloat();
137 }
138 
zoomPreview()139 float SettingsStore::zoomPreview()
140 {
141     clearSettingsGroup();
142     return value(KEY_ZOOM_PREVIEW, ZOOM_NORMAL).toFloat();
143 }
144 
zoomInspector()145 float SettingsStore::zoomInspector()
146 {
147     clearSettingsGroup();
148     return value(KEY_ZOOM_INSPECTOR, ZOOM_NORMAL).toFloat();
149 }
150 
appearancePrefsTabIndex()151 int SettingsStore::appearancePrefsTabIndex() {
152     clearSettingsGroup();
153     return value(KEY_APPEARANCE_PREFS_TAB_INDEX, 0).toInt();
154 }
155 
webViewAppearance()156 SettingsStore::WebViewAppearance SettingsStore::webViewAppearance()
157 {
158     clearSettingsGroup();
159     SettingsStore::WebViewAppearance appearance;
160     appearance.font_family_standard = value(KEY_WEBVIEW_FONT_FAMILY_STANDARD, "Arial").toString();
161     appearance.font_family_serif = value(KEY_WEBVIEW_FONT_FAMILY_SERIF, "Times New Roman").toString();
162     appearance.font_family_sans_serif = value(KEY_WEBVIEW_FONT_FAMILY_SANS_SERIF, "Arial").toString();
163     appearance.font_size = value(KEY_WEBVIEW_FONT_SIZE, 16).toInt();
164     return appearance;
165 }
166 
specialCharacterAppearance()167 SettingsStore::SpecialCharacterAppearance SettingsStore::specialCharacterAppearance()
168 {
169     clearSettingsGroup();
170     SettingsStore::SpecialCharacterAppearance appearance;
171     appearance.font_family = value(KEY_SPECIAL_CHARACTER_FONT_FAMILY, "Arial").toString();
172     appearance.font_size = value(KEY_SPECIAL_CHARACTER_FONT_SIZE, 14).toInt();
173     return appearance;
174 }
175 
mainMenuIconSize()176 double SettingsStore::mainMenuIconSize()
177 {
178     clearSettingsGroup();
179     return value(KEY_MAIN_MENU_ICON_SIZE, 1.8).toDouble();
180 }
181 
javascriptOn()182 int SettingsStore::javascriptOn()
183 {
184   clearSettingsGroup();
185   return value(KEY_JAVASCRIPT_ON, 0).toInt();
186 }
187 
remoteOn()188 int SettingsStore::remoteOn()
189 {
190   clearSettingsGroup();
191   return value(KEY_REMOTE_ON, 0).toInt();
192 }
193 
usePrettify()194 int SettingsStore::usePrettify()
195 {
196   clearSettingsGroup();
197   return value(KEY_USE_PRETTIFY, 0).toInt();
198 }
199 
useWSPreWrap()200 int SettingsStore::useWSPreWrap()
201 {
202   clearSettingsGroup();
203   return value(KEY_USE_WSPREWRAP, 0).toInt();
204 }
205 
setUILanguage(const QString & language_code)206 void SettingsStore::setUILanguage(const QString &language_code)
207 {
208     clearSettingsGroup();
209     setValue(KEY_UI_LANGUAGE, language_code);
210 }
211 
setUIDictionary(const QString & dictionary_name)212 void SettingsStore::setUIDictionary(const QString &dictionary_name)
213 {
214     clearSettingsGroup();
215     setValue(KEY_UI_DICTIONARY, dictionary_name);
216 }
217 
setUIFont(const QString & font_data)218 void SettingsStore::setUIFont(const QString &font_data)
219 {
220     clearSettingsGroup();
221     setValue(KEY_UI_FONT, font_data);
222 }
223 
setOriginalUIFont(const QString & font_data)224 void SettingsStore::setOriginalUIFont(const QString &font_data)
225 {
226     clearSettingsGroup();
227     setValue(KEY_ORIGINAL_UI_FONT, font_data);
228 }
229 
setHighDPI(int value)230 void SettingsStore::setHighDPI(int value)
231 {
232     clearSettingsGroup();
233     setValue(KEY_HIGHDPI_SETTING, value);
234 }
235 
setPreviewDark(int enabled)236 void SettingsStore::setPreviewDark(int enabled)
237 {
238     clearSettingsGroup();
239     setValue(KEY_PREVIEW_DARK_IN_DM, enabled);
240 }
241 
242 #if 0
243 void SettingsStore::setSpellCheck(bool enabled)
244 {
245   clearSettingsGroup();
246   setValue(KEY_SPELL_CHECK, enabled);
247 }
248 #endif
249 
setZoomImage(float zoom)250 void SettingsStore::setZoomImage(float zoom)
251 {
252     clearSettingsGroup();
253     setValue(KEY_ZOOM_IMAGE, zoom);
254 }
255 
setZoomText(float zoom)256 void SettingsStore::setZoomText(float zoom)
257 {
258     clearSettingsGroup();
259     setValue(KEY_ZOOM_TEXT, zoom);
260 }
261 
setZoomWeb(float zoom)262 void SettingsStore::setZoomWeb(float zoom)
263 {
264     clearSettingsGroup();
265     setValue(KEY_ZOOM_WEB, zoom);
266 }
267 
setZoomPreview(float zoom)268 void SettingsStore::setZoomPreview(float zoom)
269 {
270     clearSettingsGroup();
271     setValue(KEY_ZOOM_PREVIEW, zoom);
272 }
273 
setZoomInspector(float zoom)274 void SettingsStore::setZoomInspector(float zoom)
275 {
276     clearSettingsGroup();
277     setValue(KEY_ZOOM_INSPECTOR, zoom);
278 }
279 
setAppearancePrefsTabIndex(int index)280 void SettingsStore::setAppearancePrefsTabIndex(int index) {
281     clearSettingsGroup();
282     setValue(KEY_APPEARANCE_PREFS_TAB_INDEX, index);
283 }
284 
setWebViewAppearance(const SettingsStore::WebViewAppearance & webview_appearance)285 void SettingsStore::setWebViewAppearance(const SettingsStore::WebViewAppearance &webview_appearance)
286 {
287     clearSettingsGroup();
288     setValue(KEY_WEBVIEW_FONT_FAMILY_STANDARD, webview_appearance.font_family_standard);
289     setValue(KEY_WEBVIEW_FONT_FAMILY_SERIF, webview_appearance.font_family_serif);
290     setValue(KEY_WEBVIEW_FONT_FAMILY_SANS_SERIF, webview_appearance.font_family_sans_serif);
291     setValue(KEY_WEBVIEW_FONT_SIZE, webview_appearance.font_size);
292 }
293 
setSpecialCharacterAppearance(const SettingsStore::SpecialCharacterAppearance & special_character_appearance)294 void SettingsStore::setSpecialCharacterAppearance(const SettingsStore::SpecialCharacterAppearance &special_character_appearance)
295 {
296     clearSettingsGroup();
297     setValue(KEY_SPECIAL_CHARACTER_FONT_FAMILY, special_character_appearance.font_family);
298     setValue(KEY_SPECIAL_CHARACTER_FONT_SIZE, special_character_appearance.font_size);
299 }
300 
setMainMenuIconSize(double icon_size)301 void SettingsStore::setMainMenuIconSize(double icon_size)
302 {
303     clearSettingsGroup();
304     setValue(KEY_MAIN_MENU_ICON_SIZE, icon_size);
305 }
306 
setJavascriptOn(int on)307 void SettingsStore::setJavascriptOn(int on)
308 {
309   clearSettingsGroup();
310   setValue(KEY_JAVASCRIPT_ON, on);
311 }
312 
setRemoteOn(int on)313 void SettingsStore::setRemoteOn(int on)
314 {
315   clearSettingsGroup();
316   setValue(KEY_REMOTE_ON, on);
317 }
318 
setUsePrettify(int on)319 void SettingsStore::setUsePrettify(int on)
320 {
321   clearSettingsGroup();
322   setValue(KEY_USE_PRETTIFY, on);
323 }
324 
setUseWSPreWrap(int on)325 void SettingsStore::setUseWSPreWrap(int on)
326 {
327   clearSettingsGroup();
328   setValue(KEY_USE_WSPREWRAP, on);
329 }
330 
clearAppearanceSettings()331 void SettingsStore::clearAppearanceSettings()
332 {
333     clearSettingsGroup();
334     remove(KEY_WEBVIEW_FONT_FAMILY_STANDARD);
335     remove(KEY_WEBVIEW_FONT_FAMILY_SERIF);
336     remove(KEY_WEBVIEW_FONT_FAMILY_SANS_SERIF);
337     remove(KEY_WEBVIEW_FONT_SIZE);
338     remove(KEY_SPECIAL_CHARACTER_FONT_FAMILY);
339     remove(KEY_SPECIAL_CHARACTER_FONT_SIZE);
340     remove(KEY_MAIN_MENU_ICON_SIZE);
341 }
342 
clearSettingsGroup()343 void SettingsStore::clearSettingsGroup()
344 {
345     while (!group().isEmpty()) {
346         endGroup();
347     }
348 }
349