32#include <QtCore/QApplicationStatic>
41 qCDebug(SettingsManagerLog) <<
this;
46 qCDebug(SettingsManagerLog) <<
this;
51 return _settingsManagerInstance();
112void SettingsManager::_loadSettingsFiles()
134 if (!settingsDir.exists()) {
135 qCWarning(SettingsManagerLog) <<
"Settings directory does not exist:" << settingsDir.absolutePath();
139 QStringList settingsFiles = settingsDir.entryList(QStringList() << QString(
"*.%1").arg(_appSettings->
settingsFileExtension), QDir::Files);
140 for (
const QString &fileName : settingsFiles) {
141 QFileInfo fileInfo(settingsDir, fileName);
142 if (!fileInfo.isFile())
continue;
145 qCDebug(SettingsManagerLog) <<
"Loading settings file:" << fileInfo.absoluteFilePath();
147 QJsonDocument jsonDoc;
150 qCWarning(SettingsManagerLog) <<
"Failed to load settings file:" << fileInfo.absoluteFilePath() <<
errorString;
154 QJsonObject jsonObject = jsonDoc.object();
159 qCWarning(SettingsManagerLog) <<
"Settings file failed validation:" << fileInfo.absoluteFilePath() <<
errorString;
166 static const QList<JsonParsing::KeyValidateInfo> keyInfoList = {
167 { kJsonGroupsObjectKey, QJsonValue::Object,
true },
170 qCWarning(SettingsManagerLog) <<
"Settings file incorrect format:" << fileInfo.absoluteFilePath() <<
errorString;
174 auto groupsObject = jsonObject[kJsonGroupsObjectKey].toObject();
175 for (
const QString &groupName : groupsObject.keys()) {
176 qCDebug(SettingsManagerLog) <<
" Loading settings group:" << groupName;
178 const QJsonValue &groupValue = groupsObject[groupName];
179 if (!groupValue.isObject()) {
180 qCWarning(SettingsManagerLog) <<
"Settings file incorrect format, group is not an object:" << fileInfo.absoluteFilePath()
185 auto groupObject = groupValue.toObject();
186 for (
const QString &settingName : groupObject.keys()) {
187 qCDebug(SettingsManagerLog) <<
" Loading settings:" << groupName << settingName;
189 if (!groupObject[settingName].isObject()) {
190 qCWarning(SettingsManagerLog) <<
"Settings file incorrect format, setting is not an object:" << fileInfo.absoluteFilePath()
191 << groupName << settingName;
196 QJsonObject metaDataObject = groupObject[settingName].toObject();
197 _settingsFileOverrides[groupName][settingName] = metaDataObject;
208 if (!settingsManager) {
209 qCWarning(SettingsManagerLog) <<
"SettingsManager instance not available";
215 const auto &groupOverrides = settingsManager->_settingsFileOverrides;
216 if (groupOverrides.contains(settingsGroup) && groupOverrides[settingsGroup].contains(metaData.
name())) {
217 QJsonObject settingOverrideJsonObject = groupOverrides[settingsGroup][metaData.
name()];
220 settingOverrideJsonObject[
"name"] = metaData.
name();
223 qCDebug(SettingsManagerLog) <<
"Applying settings file override for" << settingsGroup << metaData.
name();
227 QJsonObject factMetaDataJsonObject = settingOverrideJsonObject;
228 factMetaDataJsonObject.remove(kJsonVisibleKey);
229 factMetaDataJsonObject.remove(kJsonForceRawValueKey);
233 if (settingOverrideJsonObject.contains(kJsonForceRawValueKey) && settingOverrideJsonObject.contains(kJsonVisibleKey)) {
235 qCWarning(SettingsManagerLog) <<
"Ignoring settings file override which combines 'forceRawValue' and 'visible' keys:" << settingsGroup << metaData.
name();
236 }
else if (overrideMetaData->name() != metaData.
name()) {
239 qCWarning(SettingsManagerLog) <<
"Ignoring settings file override which failed validation:" << settingsGroup << metaData.
name();
242 for (
const QString &metaDataName : factMetaDataJsonObject.keys()) {
243 if (metaDataName == FactMetaData::_defaultValueJsonKey) {
244 qCDebug(SettingsManagerLog) <<
" Setting default to" << overrideMetaData->rawDefaultValue();
246 }
else if (metaDataName == FactMetaData::_minJsonKey) {
247 qCDebug(SettingsManagerLog) <<
" Setting min to" << overrideMetaData->rawMin();
248 metaData.
setRawMin(overrideMetaData->rawMin());
249 }
else if (metaDataName == FactMetaData::_maxJsonKey) {
250 qCDebug(SettingsManagerLog) <<
" Setting max to" << overrideMetaData->rawMax();
251 metaData.
setRawMax(overrideMetaData->rawMax());
252 }
else if (metaDataName == FactMetaData::_decimalPlacesJsonKey) {
253 qCDebug(SettingsManagerLog) <<
" Setting decimalPlaces to" << overrideMetaData->decimalPlaces();
255 }
else if (metaDataName == FactMetaData::_enumValuesJsonKey) {
256 qCDebug(SettingsManagerLog) <<
" Setting enumInfo to" << overrideMetaData->enumValues() << overrideMetaData->enumStrings();
257 metaData.
setEnumInfo(overrideMetaData->enumStrings(), overrideMetaData->enumValues());
258 }
else if (metaDataName == FactMetaData::_enumBitmaskArrayJsonKey) {
259 qCDebug(SettingsManagerLog) <<
" Setting bitmaskInfo to" << overrideMetaData->bitmaskValues() << overrideMetaData->bitmaskStrings();
260 metaData.
setBitmaskInfo(overrideMetaData->bitmaskStrings(), overrideMetaData->bitmaskValues());
261 }
else if (metaDataName == FactMetaData::_longDescriptionJsonKey) {
262 qCDebug(SettingsManagerLog) <<
" Setting longDesc to" << overrideMetaData->longDescription();
264 }
else if (metaDataName == FactMetaData::_shortDescriptionJsonKey) {
265 qCDebug(SettingsManagerLog) <<
" Setting shortDesc to" << overrideMetaData->shortDescription();
271 if (settingOverrideJsonObject.contains(kJsonForceRawValueKey)) {
272 qCDebug(SettingsManagerLog) <<
" Setting forceRawValue to" << settingOverrideJsonObject[kJsonForceRawValueKey];
273 metaData.
setRawDefaultValue(settingOverrideJsonObject[kJsonForceRawValueKey].toVariant());
276 if (settingOverrideJsonObject.contains(kJsonVisibleKey)) {
277 qCDebug(SettingsManagerLog) <<
" Setting visibility to" << settingOverrideJsonObject[kJsonVisibleKey].toBool();
278 userVisible = settingOverrideJsonObject[kJsonVisibleKey].toBool();
#define QGC_LOGGING_CATEGORY(name, categoryStr)
Q_APPLICATION_STATIC(SettingsManager, _settingsManagerInstance)
QString settingsSavePath()
static constexpr const char * settingsFileExtension
Settings for the experimental GeoView 2D/3D map engine (preview feature)
virtual void adjustSettingMetaData(const QString &settingsGroup, FactMetaData &metaData, bool &userVisible)
static QGCCorePlugin * instance()
Provides access to all app settings.
AutoConnectSettings * autoConnectSettings() const
Viewer3DSettings * viewer3DSettings() const
JoystickManagerSettings * joystickManagerSettings() const
MapsSettings * mapsSettings() const
FlightMapSettings * flightMapSettings() const
ADSBVehicleManagerSettings * adsbVehicleManagerSettings() const
PlanViewSettings * planViewSettings() const
UnitsSettings * unitsSettings() const
RTKSettings * rtkSettings() const
LogViewerSettings * logViewerSettings() const
BatteryIndicatorSettings * batteryIndicatorSettings() const
FirmwareUpgradeSettings * firmwareUpgradeSettings() const
FlightModeSettings * flightModeSettings() const
static SettingsManager * instance()
APMMavlinkStreamRateSettings * apmMavlinkStreamRateSettings() const
LogManagerSettings * logManagerSettings() const
VideoSettings * videoSettings() const
static void adjustSettingMetaData(const QString &settingsGroup, FactMetaData &metaData, bool &userVisible)
AppSettings * appSettings() const
OfflineMapsSettings * offlineMapsSettings() const
RemoteIDSettings * remoteIDSettings() const
GeoViewSettings * geoViewSettings() const
MavlinkActionsSettings * mavlinkActionsSettings() const
FlyViewSettings * flyViewSettings() const
GimbalControllerSettings * gimbalControllerSettings() const
MavlinkSettings * mavlinkSettings() const
NTRIPSettings * ntripSettings() const
bool validateInternalQGCJsonFile(const QJsonObject &jsonObject, const QString &expectedFileType, int minSupportedVersion, int maxSupportedVersion, int &version, QString &errorString)
bool validateKeys(const QJsonObject &jsonObject, const QList< KeyValidateInfo > &keyInfo, QString &errorString)
Validates that all required keys are present and that listed keys have the expected type.
bool isJsonFile(const QByteArray &bytes, QJsonDocument &jsonDoc, QString &errorString)
Determines whether an in-memory byte buffer contains parseable JSON content.