wiRedPanda
Logic Circuit Simulator
Loading...
Searching...
No Matches
Settings.cpp
Go to the documentation of this file.
1// Copyright 2015 - 2026, GIBIS-UNIFESP and the wiRedPanda contributors
2// SPDX-License-Identifier: GPL-3.0-or-later
3
4#include "App/Core/Settings.h"
5
7
8QSettings *Settings::settingsInstance()
9{
10 if (!Settings::settings) {
11#ifdef Q_OS_WASM
12 // On WebAssembly, NativeFormat maps directly to browser localStorage,
13 // providing persistent storage across sessions without filesystem sync.
14 Settings::settings = new QSettings(QSettings::NativeFormat, QSettings::UserScope, "GIBIS-UNIFESP", "wiRedPanda");
15#else
16 // IniFormat produces a human-readable text file rather than the platform registry
17 // (Windows) or plist (macOS), making it easy to inspect and version-control settings.
18 // UserScope stores the file in the user's home/config directory so that multiple
19 // system users don't share the same preference file.
20 Settings::settings = new QSettings(QSettings::IniFormat, QSettings::UserScope, "GIBIS-UNIFESP", "wiRedPanda");
21#endif
22 }
23 return Settings::settings;
24}
25
27{
28 return settingsInstance()->fileName();
29}
30
31QVariant Settings::value(const QString &key)
32{
33 return settingsInstance()->value(key);
34}
35
36void Settings::setValue(const QString &key, const QVariant &value)
37{
38 settingsInstance()->setValue(key, value);
39}
40
41// --- Typed accessors ---
42
43// Window state
44
46{
47 return value("MainWindow/geometry").toByteArray();
48}
49
50void Settings::setMainWindowGeometry(const QByteArray &geometry)
51{
52 setValue("MainWindow/geometry", geometry);
53}
54
56{
57 return value("MainWindow/windowState").toByteArray();
58}
59
60void Settings::setMainWindowState(const QByteArray &state)
61{
62 setValue("MainWindow/windowState", state);
63}
64
66{
67 return value("MainWindow/splitter/geometry").toByteArray();
68}
69
70void Settings::setSplitterGeometry(const QByteArray &geometry)
71{
72 setValue("MainWindow/splitter/geometry", geometry);
73}
74
76{
77 return value("MainWindow/splitter/state").toByteArray();
78}
79
80void Settings::setSplitterState(const QByteArray &state)
81{
82 setValue("MainWindow/splitter/state", state);
83}
84
86{
87 return value("beWavedDolphin/geometry").toByteArray();
88}
89
90void Settings::setDolphinGeometry(const QByteArray &geometry)
91{
92 setValue("beWavedDolphin/geometry", geometry);
93}
94
95// UI preferences
96
98{
99 return value("fastMode").toBool();
100}
101
102void Settings::setFastMode(bool enabled)
103{
104 setValue("fastMode", enabled);
105}
106
108{
109 // Default to labels-visible: the beginner audience benefits from readable toolbar
110 // buttons. Power users can turn labels off via View → Labels under icons.
111 const QVariant saved = value("labelsUnderIcons");
112 return saved.isValid() ? saved.toBool() : true;
113}
114
116{
117 setValue("labelsUnderIcons", enabled);
118}
119
121{
122 return value("icPreviewDisabled").toBool();
123}
124
126{
127 setValue("icPreviewDisabled", disabled);
128}
129
131{
132 return value("updateChecksDisabled").toBool();
133}
134
136{
137 setValue("updateChecksDisabled", disabled);
138}
139
140// Language
141
143{
144 return value("language").toString();
145}
146
147void Settings::setLanguage(const QString &lang)
148{
149 setValue("language", lang);
150}
151
152// Theme
153
155{
156 const QVariant v = value("theme");
157 if (!v.isValid()) {
158 return Theme::System;
159 }
160 const int saved = v.toInt();
161 if (saved >= 0 && saved <= static_cast<int>(Theme::System)) {
162 return static_cast<Theme>(saved);
163 }
164 return Theme::System;
165}
166
168{
169 setValue("theme", static_cast<int>(theme));
170}
171
172// Recent files
173
175{
176 return value("recentFileList").toStringList();
177}
178
179void Settings::setRecentFiles(const QStringList &files)
180{
181 setValue("recentFileList", files);
182}
183
184// Autosave
185
187{
188 return value("autosaveFile").toStringList();
189}
190
191void Settings::setAutosaveFiles(const QStringList &files)
192{
193 setValue("autosaveFile", files);
194}
195
197{
198 return value("hideV4Warning").toBool();
199}
200
202{
203 if (hide) {
204 setValue("hideV4Warning", "true");
205 } else {
206 settingsInstance()->remove("hideV4Warning");
207 }
208}
209
211{
212 return value("updateCheck/lastCheckDate").toString();
213}
214
215void Settings::setUpdateCheckLastDate(const QString &date)
216{
217 setValue("updateCheck/lastCheckDate", date);
218}
219
221{
222 return value("updateCheck/skippedVersion").toString();
223}
224
225void Settings::setUpdateCheckSkippedVersion(const QString &version)
226{
227 setValue("updateCheck/skippedVersion", version);
228}
229
230// Exercise progress
231
233{
234 return value("exercises/completed").toStringList();
235}
236
237void Settings::setCompletedExercises(const QStringList &ids)
238{
239 setValue("exercises/completed", ids);
240}
241
242int Settings::exerciseProgress(const QString &exerciseId)
243{
244 const QVariant v = value(QStringLiteral("exercises/progress/") + exerciseId);
245 return v.isValid() ? v.toInt() : -1;
246}
247
248void Settings::setExerciseProgress(const QString &exerciseId, int step)
249{
250 setValue(QStringLiteral("exercises/progress/") + exerciseId, step);
251}
252
253// Tour progress
254
256{
257 return value("tours/completed").toStringList();
258}
259
260void Settings::setCompletedTours(const QStringList &ids)
261{
262 setValue("tours/completed", ids);
263}
264
265int Settings::tourProgress(const QString &tourId)
266{
267 const QVariant v = value(QStringLiteral("tours/progress/") + tourId);
268 return v.isValid() ? v.toInt() : -1;
269}
270
271void Settings::setTourProgress(const QString &tourId, int step)
272{
273 setValue(QStringLiteral("tours/progress/") + tourId, step);
274}
275
277{
278 return value("tours/welcomeShown").toBool();
279}
280
282{
283 setValue("tours/welcomeShown", shown);
284}
285
286// Minimap preferences
288{
289 const QVariant v = value("minimap/visible");
290 if (!v.isValid())
291 return true; // default visible
292 return v.toBool();
293}
294
296{
297 setValue("minimap/visible", visible);
298}
299
301{
302 return value("minimap/geometry").toRect();
303}
304
305void Settings::setMinimapGeometry(const QRect &geometry)
306{
307 setValue("minimap/geometry", geometry);
308}
Typed wrappers around QSettings for all application preferences.
Theme management types and singleton ThemeManager.
Theme
Enumeration of available application themes.
static bool hideV4Warning()
Definition Settings.cpp:196
static QByteArray splitterState()
Definition Settings.cpp:75
static QByteArray splitterGeometry()
Definition Settings.cpp:65
static void setMainWindowState(const QByteArray &state)
Definition Settings.cpp:60
static QString updateCheckLastDate()
Definition Settings.cpp:210
static int exerciseProgress(const QString &exerciseId)
Returns -1 if no record.
Definition Settings.cpp:242
static void setUpdateCheckSkippedVersion(const QString &version)
Definition Settings.cpp:225
static void setCompletedTours(const QStringList &ids)
Definition Settings.cpp:260
static void setMinimapGeometry(const QRect &geometry)
Definition Settings.cpp:305
static void setMinimapVisible(bool visible)
Definition Settings.cpp:295
static void setSplitterGeometry(const QByteArray &geometry)
Definition Settings.cpp:70
static void setMainWindowGeometry(const QByteArray &geometry)
Definition Settings.cpp:50
static bool updateChecksDisabled()
Global opt-out of update checks (for offline/managed installs); default false (enabled).
Definition Settings.cpp:130
static QString updateCheckSkippedVersion()
Definition Settings.cpp:220
static void setCompletedExercises(const QStringList &ids)
Definition Settings.cpp:237
static QByteArray dolphinGeometry()
Definition Settings.cpp:85
static QStringList autosaveFiles()
Definition Settings.cpp:186
static bool minimapVisible()
Definition Settings.cpp:287
static void setAutosaveFiles(const QStringList &files)
Definition Settings.cpp:191
static void setIcPreviewDisabled(bool disabled)
Definition Settings.cpp:125
static bool labelsUnderIcons()
Definition Settings.cpp:107
static QString fileName()
Returns the path to the settings file on disk.
Definition Settings.cpp:26
static bool welcomeTourShown()
Definition Settings.cpp:276
static void setDolphinGeometry(const QByteArray &geometry)
Definition Settings.cpp:90
static Theme theme()
Definition Settings.cpp:154
static QByteArray mainWindowState()
Definition Settings.cpp:55
static int tourProgress(const QString &tourId)
Returns -1 if no record.
Definition Settings.cpp:265
static void setUpdateCheckLastDate(const QString &date)
Definition Settings.cpp:215
static void setSplitterState(const QByteArray &state)
Definition Settings.cpp:80
static QStringList recentFiles()
Definition Settings.cpp:174
static void setWelcomeTourShown(bool shown)
Definition Settings.cpp:281
static void setTourProgress(const QString &tourId, int step)
Definition Settings.cpp:271
static QByteArray mainWindowGeometry()
Definition Settings.cpp:45
static void setLanguage(const QString &lang)
Definition Settings.cpp:147
static QRect minimapGeometry()
Definition Settings.cpp:300
static void setExerciseProgress(const QString &exerciseId, int step)
Definition Settings.cpp:248
static void setHideV4Warning(bool hide)
Definition Settings.cpp:201
static bool fastMode()
Definition Settings.cpp:97
static void setUpdateChecksDisabled(bool disabled)
Definition Settings.cpp:135
static QString language()
Definition Settings.cpp:142
static void setFastMode(bool enabled)
Definition Settings.cpp:102
static void setRecentFiles(const QStringList &files)
Definition Settings.cpp:179
static QStringList completedExercises()
Definition Settings.cpp:232
static bool icPreviewDisabled()
Definition Settings.cpp:120
static void setTheme(Theme theme)
Definition Settings.cpp:167
static QStringList completedTours()
Definition Settings.cpp:255
static void setLabelsUnderIcons(bool enabled)
Definition Settings.cpp:115