5#ifndef QGC_NO_ARDUPILOT_DIALECT
33#include <QtCore/QApplicationStatic>
42 qCDebug(SettingsManagerLog) <<
this;
47 qCDebug(SettingsManagerLog) <<
this;
52 return _settingsManagerInstance();
83#ifndef QGC_NO_ARDUPILOT_DIALECT
89#ifndef QGC_NO_ARDUPILOT_DIALECT
115void SettingsManager::_loadSettingsFiles()
137 if (!settingsDir.exists()) {
138 qCWarning(SettingsManagerLog) <<
"Settings directory does not exist:" << settingsDir.absolutePath();
142 QStringList settingsFiles = settingsDir.entryList(QStringList() << QString(
"*.%1").arg(_appSettings->
settingsFileExtension), QDir::Files);
143 for (
const QString &fileName : settingsFiles) {
144 QFileInfo fileInfo(settingsDir, fileName);
145 if (!fileInfo.isFile())
continue;
148 qCDebug(SettingsManagerLog) <<
"Loading settings file:" << fileInfo.absoluteFilePath();
150 QJsonDocument jsonDoc;
153 qCWarning(SettingsManagerLog) <<
"Failed to load settings file:" << fileInfo.absoluteFilePath() <<
errorString;
157 QJsonObject jsonObject = jsonDoc.object();
162 qCWarning(SettingsManagerLog) <<
"Settings file failed validation:" << fileInfo.absoluteFilePath() <<
errorString;
169 static const QList<JsonParsing::KeyValidateInfo> keyInfoList = {
170 { kJsonGroupsObjectKey, QJsonValue::Object,
true },
173 qCWarning(SettingsManagerLog) <<
"Settings file incorrect format:" << fileInfo.absoluteFilePath() <<
errorString;
177 auto groupsObject = jsonObject[kJsonGroupsObjectKey].toObject();
178 for (
const QString &groupName : groupsObject.keys()) {
179 qCDebug(SettingsManagerLog) <<
" Loading settings group:" << groupName;
181 const QJsonValue &groupValue = groupsObject[groupName];
182 if (!groupValue.isObject()) {
183 qCWarning(SettingsManagerLog) <<
"Settings file incorrect format, group is not an object:" << fileInfo.absoluteFilePath()
188 auto groupObject = groupValue.toObject();
189 for (
const QString &settingName : groupObject.keys()) {
190 qCDebug(SettingsManagerLog) <<
" Loading settings:" << groupName << settingName;
192 if (!groupObject[settingName].isObject()) {
193 qCWarning(SettingsManagerLog) <<
"Settings file incorrect format, setting is not an object:" << fileInfo.absoluteFilePath()
194 << groupName << settingName;
199 QJsonObject metaDataObject = groupObject[settingName].toObject();
200 _settingsFileOverrides[groupName][settingName] = metaDataObject;
211 if (!settingsManager) {
212 qCWarning(SettingsManagerLog) <<
"SettingsManager instance not available";
218 const auto &groupOverrides = settingsManager->_settingsFileOverrides;
219 if (groupOverrides.contains(settingsGroup) && groupOverrides[settingsGroup].contains(metaData.
name())) {
220 QJsonObject settingOverrideJsonObject = groupOverrides[settingsGroup][metaData.
name()];
223 settingOverrideJsonObject[
"name"] = metaData.
name();
226 qCDebug(SettingsManagerLog) <<
"Applying settings file override for" << settingsGroup << metaData.
name();
231 for (
const QString &metaDataName : settingOverrideJsonObject.keys()) {
232 if (metaDataName == kJsonVisibleKey) {
233 qCDebug(SettingsManagerLog) <<
" Setting visibility to" << settingOverrideJsonObject[kJsonVisibleKey].toBool();
234 userVisible = settingOverrideJsonObject[kJsonVisibleKey].toBool();
235 }
else if (metaDataName == kJsonForceRawValueKey) {
236 qCDebug(SettingsManagerLog) <<
" Setting forceRawValue to" << settingOverrideJsonObject[kJsonForceRawValueKey];
237 metaData.
setRawDefaultValue(settingOverrideJsonObject[kJsonForceRawValueKey].toVariant());
239 }
else if (metaDataName == FactMetaData::_defaultValueJsonKey) {
240 qCDebug(SettingsManagerLog) <<
" Setting default to" << overrideMetaData->rawDefaultValue();
242 }
else if (metaDataName == FactMetaData::_minJsonKey) {
243 qCDebug(SettingsManagerLog) <<
" Setting min to" << overrideMetaData->rawMin();
244 metaData.
setRawMin(overrideMetaData->rawMin());
245 }
else if (metaDataName == FactMetaData::_maxJsonKey) {
246 qCDebug(SettingsManagerLog) <<
" Setting max to" << overrideMetaData->rawMax();
247 metaData.
setRawMax(overrideMetaData->rawMax());
248 }
else if (metaDataName == FactMetaData::_decimalPlacesJsonKey) {
249 qCDebug(SettingsManagerLog) <<
" Setting decimalPlaces to" << overrideMetaData->decimalPlaces();
251 }
else if (metaDataName == FactMetaData::_enumValuesJsonKey) {
252 qCDebug(SettingsManagerLog) <<
" Setting enumInfo to" << overrideMetaData->enumValues() << overrideMetaData->enumStrings();
253 metaData.
setEnumInfo(overrideMetaData->enumStrings(), overrideMetaData->enumValues());
254 }
else if (metaDataName == FactMetaData::_enumBitmaskArrayJsonKey) {
255 qCDebug(SettingsManagerLog) <<
" Setting bitmaskInfo to" << overrideMetaData->bitmaskValues() << overrideMetaData->bitmaskStrings();
256 metaData.
setBitmaskInfo(overrideMetaData->bitmaskStrings(), overrideMetaData->bitmaskValues());
257 }
else if (metaDataName == FactMetaData::_longDescriptionJsonKey) {
258 qCDebug(SettingsManagerLog) <<
" Setting longDesc to" << overrideMetaData->longDescription();
260 }
else if (metaDataName == FactMetaData::_shortDescriptionJsonKey) {
261 qCDebug(SettingsManagerLog) <<
" Setting shortDesc to" << overrideMetaData->shortDescription();
#define QGC_LOGGING_CATEGORY(name, categoryStr)
Q_APPLICATION_STATIC(SettingsManager, _settingsManagerInstance)
QString settingsSavePath()
static constexpr const char * settingsFileExtension
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
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.