• Skip to content
  • Skip to link menu
KDE API Documentation - ApplicationSettings.cpp Source File (GCompris-qt)
  • KDE Home
  • Contact Us
 

GCompris-qt

  • src
  • core
ApplicationSettings.cpp
1 /* GCompris - ApplicationSettingsDefault.cpp
2  *
3  * Copyright (C) 2014 Johnny Jazeix <jazeix@gmail.com>
4  *
5  * Authors:
6  * Johnny Jazeix <jazeix@gmail.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, see <http://www.gnu.org/licenses/>.
20  */
21 
22 #include "ApplicationSettings.h"
23 #include "ApplicationInfo.h"
24 
25 #include <QtCore/qmath.h>
26 #include <QtCore/QUrl>
27 #include <QtCore/QUrlQuery>
28 #include <QtGui/QGuiApplication>
29 #include <QtGui/QScreen>
30 #include <QtCore/QLocale>
31 
32 #include <QSettings>
33 #include <QStandardPaths>
34 #include <QDebug>
35 
36 #define GC_DEFAULT_FONT "Andika-R.ttf"
37 #define GC_DEFAULT_FONT_CAPITALIZATION 0 // Font.MixedCase
38 
39 static const QString GENERAL_GROUP_KEY = "General";
40 static const QString ADMIN_GROUP_KEY = "Admin";
41 static const QString INTERNAL_GROUP_KEY = "Internal";
42 static const QString FAVORITE_GROUP_KEY = "Favorite";
43 
44 static const QString FULLSCREEN_KEY = "fullscreen";
45 static const QString SHOW_LOCKED_ACTIVITIES_KEY = "showLockedActivities";
46 static const QString ENABLE_AUDIO_VOICES_KEY = "enableAudioVoices";
47 static const QString ENABLE_AUDIO_EFFECTS_KEY = "enableAudioEffects";
48 static const QString VIRTUALKEYBOARD_KEY = "virtualKeyboard";
49 static const QString LOCALE_KEY = "locale";
50 static const QString FONT_KEY = "font";
51 static const QString IS_CURRENT_FONT_EMBEDDED = "isCurrentFontEmbedded";
52 static const QString ENABLE_AUTOMATIC_DOWNLOADS = "enableAutomaticDownloads";
53 
54 static const QString DOWNLOAD_SERVER_URL_KEY = "downloadServerUrl";
55 
56 static const QString EXE_COUNT_KEY = "exeCount";
57 
58 static const QString FILTER_LEVEL_MIN = "filterLevelMin";
59 static const QString FILTER_LEVEL_MAX = "filterLevelMax";
60 
61 static const QString BASE_FONT_SIZE_KEY = "baseFontSize";
62 static const QString FONT_CAPITALIZATION = "fontCapitalization";
63 
64 static const QString DEFAULT_CURSOR = "defaultCursor";
65 static const QString NO_CURSOR = "noCursor";
66 static const QString DEMO_KEY = "demo";
67 static const QString KIOSK_KEY = "kiosk";
68 static const QString SECTION_VISIBLE = "sectionVisible";
69 
70 ApplicationSettings *ApplicationSettings::m_instance = NULL;
71 
72 ApplicationSettings::ApplicationSettings(QObject *parent): QObject(parent),
73  m_config(QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) +
74  "/gcompris/" + GCOMPRIS_APPLICATION_NAME + ".conf", QSettings::IniFormat), m_baseFontSizeMin(-7), m_baseFontSizeMax(7)
75 {
76  // initialize from settings file or default
77 
78  // general group
79  m_config.beginGroup(GENERAL_GROUP_KEY);
80  m_isAudioEffectsEnabled = m_config.value(ENABLE_AUDIO_EFFECTS_KEY, true).toBool();
81  m_isFullscreen = m_config.value(FULLSCREEN_KEY, true).toBool();
82  m_isAudioVoicesEnabled = m_config.value(ENABLE_AUDIO_VOICES_KEY, true).toBool();
83  m_isVirtualKeyboard = m_config.value(VIRTUALKEYBOARD_KEY,
84  ApplicationInfo::getInstance()->isMobile()).toBool();
85  m_locale = m_config.value(LOCALE_KEY, GC_DEFAULT_LOCALE).toString();
86  m_font = m_config.value(FONT_KEY, GC_DEFAULT_FONT).toString();
87  m_fontCapitalization = m_config.value(FONT_CAPITALIZATION, GC_DEFAULT_FONT_CAPITALIZATION).toUInt();
88  m_isEmbeddedFont = m_config.value(IS_CURRENT_FONT_EMBEDDED, true).toBool();
89 
90 // The default demo mode based on the platform
91 #if defined(WITH_ACTIVATION_CODE)
92  m_isDemoMode = m_config.value(DEMO_KEY, true).toBool();
93 #else
94  m_isDemoMode = m_config.value(DEMO_KEY, false).toBool();
95 #endif
96 
97 #if defined(WITH_KIOSK_MODE)
98  m_isKioskMode = m_config.value(KIOSK_KEY, true).toBool();
99 #else
100  m_isKioskMode = m_config.value(KIOSK_KEY, false).toBool();
101 #endif
102 
103  // Option only useful if we are in demo mode (else all the activities are available and unlocked)
104  // By default, all the activities are displayed (even locked ones)
105  m_showLockedActivities = m_config.value(SHOW_LOCKED_ACTIVITIES_KEY, m_isDemoMode).toBool();
106  m_sectionVisible = m_config.value(SECTION_VISIBLE, true).toBool();
107  m_isAutomaticDownloadsEnabled = m_config.value(ENABLE_AUTOMATIC_DOWNLOADS,
108  !ApplicationInfo::getInstance()->isMobile() && ApplicationInfo::isDownloadAllowed()).toBool();
109  m_filterLevelMin = m_config.value(FILTER_LEVEL_MIN, 1).toUInt();
110  m_filterLevelMax = m_config.value(FILTER_LEVEL_MAX, 6).toUInt();
111  m_defaultCursor = m_config.value(DEFAULT_CURSOR, false).toBool();
112  m_noCursor = m_config.value(NO_CURSOR, false).toBool();
113  setBaseFontSize(m_config.value(BASE_FONT_SIZE_KEY, 0).toInt());
114 
115  m_config.sync(); // make sure all defaults are written back
116  m_config.endGroup();
117 
118  // admin group
119  m_config.beginGroup(ADMIN_GROUP_KEY);
120  m_downloadServerUrl = m_config.value(DOWNLOAD_SERVER_URL_KEY, "http://gcompris.net").toString();
121  m_config.endGroup();
122 
123  // internal group
124  m_config.beginGroup(INTERNAL_GROUP_KEY);
125  m_exeCount = m_config.value(EXE_COUNT_KEY, 0).toUInt();
126  m_config.endGroup();
127 
128  // no group
129  m_isBarHidden = false;
130 
131  connect(this, SIGNAL(showLockedActivitiesChanged()), this, SLOT(notifyShowLockedActivitiesChanged()));
132  connect(this, SIGNAL(audioVoicesEnabledChanged()), this, SLOT(notifyAudioVoicesEnabledChanged()));
133  connect(this, SIGNAL(audioEffectsEnabledChanged()), this, SLOT(notifyAudioEffectsEnabledChanged()));
134  connect(this, SIGNAL(fullscreenChanged()), this, SLOT(notifyFullscreenChanged()));
135  connect(this, SIGNAL(localeChanged()), this, SLOT(notifyLocaleChanged()));
136  connect(this, SIGNAL(fontChanged()), this, SLOT(notifyFontChanged()));
137  connect(this, SIGNAL(virtualKeyboardChanged()), this, SLOT(notifyVirtualKeyboardChanged()));
138  connect(this, SIGNAL(automaticDownloadsEnabledChanged()), this, SLOT(notifyAutomaticDownloadsEnabledChanged()));
139  connect(this, SIGNAL(filterLevelMinChanged()), this, SLOT(notifyFilterLevelMinChanged()));
140  connect(this, SIGNAL(filterLevelMaxChanged()), this, SLOT(notifyFilterLevelMaxChanged()));
141  connect(this, SIGNAL(sectionVisibleChanged()), this, SLOT(notifySectionVisibleChanged()));
142  connect(this, SIGNAL(demoModeChanged()), this, SLOT(notifyDemoModeChanged()));
143  connect(this, SIGNAL(kioskModeChanged()), this, SLOT(notifyKioskModeChanged()));
144  connect(this, SIGNAL(downloadServerUrlChanged()), this, SLOT(notifyDownloadServerUrlChanged()));
145  connect(this, SIGNAL(exeCountChanged()), this, SLOT(notifyExeCountChanged()));
146  connect(this, SIGNAL(barHiddenChanged()), this, SLOT(notifyBarHiddenChanged()));
147 }
148 
149 ApplicationSettings::~ApplicationSettings()
150 {
151  // make sure settings file is up2date:
152  // general group
153  m_config.beginGroup(GENERAL_GROUP_KEY);
154  m_config.setValue(SHOW_LOCKED_ACTIVITIES_KEY, m_showLockedActivities);
155  m_config.setValue(ENABLE_AUDIO_VOICES_KEY, m_isAudioVoicesEnabled);
156  m_config.setValue(LOCALE_KEY, m_locale);
157  m_config.setValue(FONT_KEY, m_font);
158  m_config.setValue(IS_CURRENT_FONT_EMBEDDED, m_isEmbeddedFont);
159  m_config.setValue(FULLSCREEN_KEY, m_isFullscreen);
160  m_config.setValue(VIRTUALKEYBOARD_KEY, m_isVirtualKeyboard);
161  m_config.setValue(ENABLE_AUTOMATIC_DOWNLOADS, m_isAutomaticDownloadsEnabled);
162  m_config.setValue(FILTER_LEVEL_MIN, m_filterLevelMin);
163  m_config.setValue(FILTER_LEVEL_MAX, m_filterLevelMax);
164  m_config.setValue(DEMO_KEY, m_isDemoMode);
165  m_config.setValue(KIOSK_KEY, m_isKioskMode);
166  m_config.setValue(SECTION_VISIBLE, m_sectionVisible);
167  m_config.setValue(DEFAULT_CURSOR, m_defaultCursor);
168  m_config.setValue(NO_CURSOR, m_noCursor);
169  m_config.setValue(BASE_FONT_SIZE_KEY, m_baseFontSize);
170  m_config.setValue(FONT_CAPITALIZATION, m_fontCapitalization);
171  m_config.endGroup();
172 
173  // admin group
174  m_config.beginGroup(ADMIN_GROUP_KEY);
175  m_config.setValue(DOWNLOAD_SERVER_URL_KEY, m_downloadServerUrl);
176  m_config.endGroup();
177 
178  // internal group
179  m_config.beginGroup(INTERNAL_GROUP_KEY);
180  m_config.setValue(EXE_COUNT_KEY, m_exeCount);
181  m_config.endGroup();
182 
183  m_config.sync();
184 
185  m_instance = NULL;
186 }
187 
188 void ApplicationSettings::notifyShowLockedActivitiesChanged()
189 {
190  updateValueInConfig(GENERAL_GROUP_KEY, SHOW_LOCKED_ACTIVITIES_KEY, m_showLockedActivities);
191  qDebug() << "notifyShowLockedActivitiesChanged: " << m_showLockedActivities;
192 }
193 
194 void ApplicationSettings::notifyAudioVoicesEnabledChanged()
195 {
196  updateValueInConfig(GENERAL_GROUP_KEY, ENABLE_AUDIO_VOICES_KEY, m_isAudioVoicesEnabled);
197  qDebug() << "notifyAudioVoices: " << m_isAudioVoicesEnabled;
198 }
199 
200 void ApplicationSettings::notifyAudioEffectsEnabledChanged()
201 {
202  updateValueInConfig(GENERAL_GROUP_KEY, ENABLE_AUDIO_EFFECTS_KEY, m_isAudioEffectsEnabled);
203  qDebug() << "notifyAudioEffects: " << m_isAudioEffectsEnabled;
204 }
205 
206 void ApplicationSettings::notifyLocaleChanged()
207 {
208  updateValueInConfig(GENERAL_GROUP_KEY, LOCALE_KEY, m_locale);
209  qDebug() << "new locale: " << m_locale;
210 }
211 
212 void ApplicationSettings::notifyFontChanged()
213 {
214  updateValueInConfig(GENERAL_GROUP_KEY, FONT_KEY, m_font);
215  qDebug() << "new font: " << m_font;
216 }
217 
218 void ApplicationSettings::notifyEmbeddedFontChanged()
219 {
220  updateValueInConfig(GENERAL_GROUP_KEY, IS_CURRENT_FONT_EMBEDDED, m_isEmbeddedFont);
221  qDebug() << "new font is embedded: " << m_isEmbeddedFont;
222 }
223 
224 void ApplicationSettings::notifyFontCapitalizationChanged()
225 {
226  updateValueInConfig(GENERAL_GROUP_KEY, FONT_CAPITALIZATION, m_fontCapitalization);
227  qDebug() << "new fontCapitalization: " << m_fontCapitalization;
228 }
229 
230 void ApplicationSettings::notifyFullscreenChanged()
231 {
232  updateValueInConfig(GENERAL_GROUP_KEY, FULLSCREEN_KEY, m_isFullscreen);
233  qDebug() << "fullscreen set to: " << m_isFullscreen;
234 }
235 
236 void ApplicationSettings::notifyVirtualKeyboardChanged()
237 {
238  updateValueInConfig(GENERAL_GROUP_KEY, VIRTUALKEYBOARD_KEY, m_isVirtualKeyboard);
239  qDebug() << "virtualkeyboard set to: " << m_isVirtualKeyboard;
240 }
241 
242 bool ApplicationSettings::isAutomaticDownloadsEnabled() const {
243  return m_isAutomaticDownloadsEnabled && ApplicationInfo::isDownloadAllowed();
244 }
245 void ApplicationSettings::setIsAutomaticDownloadsEnabled(const bool newIsAutomaticDownloadsEnabled) {
246  if(ApplicationInfo::isDownloadAllowed()) {
247  m_isAutomaticDownloadsEnabled = newIsAutomaticDownloadsEnabled;
248  emit automaticDownloadsEnabledChanged();
249  }
250 }
251 
252 void ApplicationSettings::notifyAutomaticDownloadsEnabledChanged()
253 {
254  updateValueInConfig(GENERAL_GROUP_KEY, ENABLE_AUTOMATIC_DOWNLOADS, m_isAutomaticDownloadsEnabled);
255  qDebug() << "enableAutomaticDownloads set to: " << m_isAutomaticDownloadsEnabled;
256 }
257 
258 void ApplicationSettings::notifyFilterLevelMinChanged()
259 {
260  updateValueInConfig(GENERAL_GROUP_KEY, FILTER_LEVEL_MIN, m_filterLevelMin);
261  qDebug() << "filterLevelMin set to: " << m_filterLevelMin;
262 }
263 
264 void ApplicationSettings::notifyFilterLevelMaxChanged()
265 {
266  updateValueInConfig(GENERAL_GROUP_KEY, FILTER_LEVEL_MAX, m_filterLevelMax);
267  qDebug() << "filterLevelMax set to: " << m_filterLevelMax;
268 }
269 
270 void ApplicationSettings::notifyDemoModeChanged()
271 {
272  updateValueInConfig(GENERAL_GROUP_KEY, DEMO_KEY, m_isDemoMode);
273  qDebug() << "notifyDemoMode: " << m_isDemoMode;
274 }
275 
276 void ApplicationSettings::notifyKioskModeChanged()
277 {
278  updateValueInConfig(GENERAL_GROUP_KEY, KIOSK_KEY, m_isKioskMode);
279  qDebug() << "notifyKioskMode: " << m_isKioskMode;
280 }
281 
282 void ApplicationSettings::notifySectionVisibleChanged()
283 {
284  updateValueInConfig(GENERAL_GROUP_KEY, SECTION_VISIBLE, m_sectionVisible);
285  qDebug() << "notifySectionVisible: " << m_sectionVisible;
286 }
287 
288 void ApplicationSettings::notifyDownloadServerUrlChanged()
289 {
290  updateValueInConfig(ADMIN_GROUP_KEY, DOWNLOAD_SERVER_URL_KEY, m_downloadServerUrl);
291  qDebug() << "downloadServerUrl set to: " << m_downloadServerUrl;
292 }
293 
294 void ApplicationSettings::notifyExeCountChanged()
295 {
296  updateValueInConfig(INTERNAL_GROUP_KEY, EXE_COUNT_KEY, m_exeCount);
297  qDebug() << "exeCount set to: " << m_exeCount;
298 }
299 
300 void ApplicationSettings::notifyBarHiddenChanged()
301 {
302  qDebug() << "is bar hidden: " << m_isBarHidden;
303 }
304 
305 void ApplicationSettings::saveBaseFontSize()
306 {
307  updateValueInConfig(GENERAL_GROUP_KEY, BASE_FONT_SIZE_KEY, m_baseFontSize);
308 }
309 
310 void ApplicationSettings::saveActivityConfiguration(const QString &activity, const QVariantMap &data)
311 {
312  qDebug() << "save configuration for:" << activity;
313  QMapIterator<QString, QVariant> i(data);
314  while (i.hasNext()) {
315  i.next();
316  updateValueInConfig(activity, i.key(), i.value());
317  }
318 }
319 
320 QVariantMap ApplicationSettings::loadActivityConfiguration(const QString &activity)
321 {
322  qDebug() << "load configuration for:" << activity;
323  m_config.beginGroup(activity);
324  QStringList keys = m_config.childKeys();
325  QVariantMap data;
326  foreach(const QString &key, keys) {
327  data[key] = m_config.value(key);
328  }
329  m_config.endGroup();
330  return data;
331 }
332 
333 void ApplicationSettings::setFavorite(const QString &activity, bool favorite)
334 {
335  updateValueInConfig(FAVORITE_GROUP_KEY, activity, favorite);
336 }
337 
338 bool ApplicationSettings::isFavorite(const QString &activity)
339 {
340  m_config.beginGroup(FAVORITE_GROUP_KEY);
341  bool favorite = m_config.value(activity, false).toBool();
342  m_config.endGroup();
343  return favorite;
344 }
345 
346 template<class T> void ApplicationSettings::updateValueInConfig(const QString& group,
347  const QString& key, const T& value)
348 {
349  m_config.beginGroup(group);
350  m_config.setValue(key, value);
351  m_config.endGroup();
352  m_config.sync();
353 }
354 
355 QObject *ApplicationSettings::systeminfoProvider(QQmlEngine *engine,
356  QJSEngine *scriptEngine)
357 {
358  Q_UNUSED(engine)
359  Q_UNUSED(scriptEngine)
360 
361  ApplicationSettings* appSettings = getInstance();
362  return appSettings;
363 }
364 
365 void ApplicationSettings::init()
366 {
367  qmlRegisterSingletonType<ApplicationSettings>("GCompris", 1, 0,
368  "ApplicationSettings", systeminfoProvider);
369 }
ApplicationSettings::saveActivityConfiguration
Q_INVOKABLE void saveActivityConfiguration(const QString &activity, const QVariantMap &data)
Stores per-activity configuration data for activity.
Definition: ApplicationSettings.cpp:310
ApplicationSettings::loadActivityConfiguration
Q_INVOKABLE QVariantMap loadActivityConfiguration(const QString &activity)
Loads per-activity configuration data for activity.
Definition: ApplicationSettings.cpp:320
ApplicationInfo::isDownloadAllowed
bool isDownloadAllowed
Download allowed.
Definition: ApplicationInfo.h:137
ApplicationSettings::isAutomaticDownloadsEnabled
bool isAutomaticDownloadsEnabled
Whether downloads/updates of resource files should be done automatically, without user-interaction...
Definition: ApplicationSettings.h:129
ApplicationSettings
Singleton that contains GCompris' persistent settings.
Definition: ApplicationSettings.h:63
ApplicationInfo::isMobile
bool isMobile
Whether the application is currently running on a mobile platform.
Definition: ApplicationInfo.h:65
This file is part of the KDE documentation.
Documentation copyright © 1996-2015 The KDE developers.
Generated on Tue Jun 2 2015 21:47:47 by doxygen 1.8.9.1 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

GCompris-qt

Skip menu "GCompris-qt"
  • Main Page
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • File List
  • Modules

Class Picker

Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal