5#ifndef QGC_NO_ARDUPILOT_DIALECT
31#include <QtCore/QApplicationStatic>
40 qCDebug(SettingsManagerLog) <<
this;
45 qCDebug(SettingsManagerLog) <<
this;
50 return _settingsManagerInstance();
79#ifndef QGC_NO_ARDUPILOT_DIALECT
85#ifndef QGC_NO_ARDUPILOT_DIALECT
109void SettingsManager::_loadSettingsFiles()
131 if (!settingsDir.exists()) {
132 qCWarning(SettingsManagerLog) <<
"Settings directory does not exist:" << settingsDir.absolutePath();
136 QStringList settingsFiles = settingsDir.entryList(QStringList() << QString(
"*.%1").arg(_appSettings->
settingsFileExtension), QDir::Files);
137 for (
const QString &fileName : settingsFiles) {
138 QFileInfo fileInfo(settingsDir, fileName);
139 if (!fileInfo.isFile())
continue;
142 qCDebug(SettingsManagerLog) <<
"Loading settings file:" << fileInfo.absoluteFilePath();
144 QJsonDocument jsonDoc;
147 qCWarning(SettingsManagerLog) <<
"Failed to load settings file:" << fileInfo.absoluteFilePath() <<
errorString;
151 QJsonObject jsonObject = jsonDoc.object();
156 qCWarning(SettingsManagerLog) <<
"Settings file failed validation:" << fileInfo.absoluteFilePath() <<
errorString;
163 static const QList<JsonParsing::KeyValidateInfo> keyInfoList = {
164 { kJsonGroupsObjectKey, QJsonValue::Object,
true },
167 qCWarning(SettingsManagerLog) <<
"Settings file incorrect format:" << fileInfo.absoluteFilePath() <<
errorString;
171 auto groupsObject = jsonObject[kJsonGroupsObjectKey].toObject();
172 for (
const QString &groupName : groupsObject.keys()) {
173 qCDebug(SettingsManagerLog) <<
" Loading settings group:" << groupName;
175 const QJsonValue &groupValue = groupsObject[groupName];
176 if (!groupValue.isObject()) {
177 qCWarning(SettingsManagerLog) <<
"Settings file incorrect format, group is not an object:" << fileInfo.absoluteFilePath()
182 auto groupObject = groupValue.toObject();
183 for (
const QString &settingName : groupObject.keys()) {
184 qCDebug(SettingsManagerLog) <<
" Loading settings:" << groupName << settingName;
186 if (!groupObject[settingName].isObject()) {
187 qCWarning(SettingsManagerLog) <<
"Settings file incorrect format, setting is not an object:" << fileInfo.absoluteFilePath()
188 << groupName << settingName;
193 QJsonObject metaDataObject = groupObject[settingName].toObject();
194 _settingsFileOverrides[groupName][settingName] = metaDataObject;
205 if (!settingsManager) {
206 qCWarning(SettingsManagerLog) <<
"SettingsManager instance not available";
212 const auto &groupOverrides = settingsManager->_settingsFileOverrides;
213 if (groupOverrides.contains(settingsGroup) && groupOverrides[settingsGroup].contains(metaData.
name())) {
214 QJsonObject settingOverrideJsonObject = groupOverrides[settingsGroup][metaData.
name()];
217 settingOverrideJsonObject[
"name"] = metaData.
name();
220 qCDebug(SettingsManagerLog) <<
"Applying settings file override for" << settingsGroup << metaData.
name();
225 for (
const QString &metaDataName : settingOverrideJsonObject.keys()) {
226 if (metaDataName == kJsonVisibleKey) {
227 qCDebug(SettingsManagerLog) <<
" Setting visibility to" << settingOverrideJsonObject[kJsonVisibleKey].toBool();
228 userVisible = settingOverrideJsonObject[kJsonVisibleKey].toBool();
229 }
else if (metaDataName == kJsonForceRawValueKey) {
230 qCDebug(SettingsManagerLog) <<
" Setting forceRawValue to" << settingOverrideJsonObject[kJsonForceRawValueKey];
231 metaData.
setRawDefaultValue(settingOverrideJsonObject[kJsonForceRawValueKey].toVariant());
233 }
else if (metaDataName == FactMetaData::_defaultValueJsonKey) {
234 qCDebug(SettingsManagerLog) <<
" Setting default to" << overrideMetaData->rawDefaultValue();
236 }
else if (metaDataName == FactMetaData::_minJsonKey) {
237 qCDebug(SettingsManagerLog) <<
" Setting min to" << overrideMetaData->rawMin();
238 metaData.
setRawMin(overrideMetaData->rawMin());
239 }
else if (metaDataName == FactMetaData::_maxJsonKey) {
240 qCDebug(SettingsManagerLog) <<
" Setting max to" << overrideMetaData->rawMax();
241 metaData.
setRawMax(overrideMetaData->rawMax());
242 }
else if (metaDataName == FactMetaData::_decimalPlacesJsonKey) {
243 qCDebug(SettingsManagerLog) <<
" Setting decimalPlaces to" << overrideMetaData->decimalPlaces();
245 }
else if (metaDataName == FactMetaData::_enumValuesJsonKey) {
246 qCDebug(SettingsManagerLog) <<
" Setting enumInfo to" << overrideMetaData->enumValues() << overrideMetaData->enumStrings();
247 metaData.
setEnumInfo(overrideMetaData->enumStrings(), overrideMetaData->enumValues());
248 }
else if (metaDataName == FactMetaData::_enumBitmaskArrayJsonKey) {
249 qCDebug(SettingsManagerLog) <<
" Setting bitmaskInfo to" << overrideMetaData->bitmaskValues() << overrideMetaData->bitmaskStrings();
250 metaData.
setBitmaskInfo(overrideMetaData->bitmaskStrings(), overrideMetaData->bitmaskValues());
251 }
else if (metaDataName == FactMetaData::_longDescriptionJsonKey) {
252 qCDebug(SettingsManagerLog) <<
" Setting longDesc to" << overrideMetaData->longDescription();
254 }
else if (metaDataName == FactMetaData::_shortDescriptionJsonKey) {
255 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
BatteryIndicatorSettings * batteryIndicatorSettings() const
FirmwareUpgradeSettings * firmwareUpgradeSettings() const
FlightModeSettings * flightModeSettings() const
static SettingsManager * instance()
APMMavlinkStreamRateSettings * apmMavlinkStreamRateSettings() 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.