4#ifndef QGC_NO_ARDUPILOT_DIALECT
33#include <QtCore/QApplicationStatic>
34#include <QtQml/qqml.h>
43 qCDebug(SettingsManagerLog) <<
this;
46SettingsManager::~SettingsManager()
48 qCDebug(SettingsManagerLog) <<
this;
53 return _settingsManagerInstance();
56void SettingsManager::registerQmlTypes()
58 (void) qmlRegisterUncreatableType<SettingsManager>(
"QGroundControl.SettingsManager", 1, 0,
"SettingsManager",
"Reference only");
59 (void) qmlRegisterUncreatableType<NTRIPSettings>(
"QGroundControl", 1, 0,
"NTRIPSettings",
"Reference only");
63void SettingsManager::init()
90#ifndef QGC_NO_ARDUPILOT_DIALECT
96#ifndef QGC_NO_ARDUPILOT_DIALECT
99AppSettings *SettingsManager::appSettings()
const {
return _appSettings; }
100AutoConnectSettings *SettingsManager::autoConnectSettings()
const {
return _autoConnectSettings; }
102BrandImageSettings *SettingsManager::brandImageSettings()
const {
return _brandImageSettings; }
103MavlinkActionsSettings *SettingsManager::mavlinkActionsSettings()
const {
return _mavlinkActionsSettings; }
105FlightMapSettings *SettingsManager::flightMapSettings()
const {
return _flightMapSettings; }
106FlightModeSettings *SettingsManager::flightModeSettings()
const {
return _flightModeSettings; }
107FlyViewSettings *SettingsManager::flyViewSettings()
const {
return _flyViewSettings; }
109MapsSettings *SettingsManager::mapsSettings()
const {
return _mapsSettings; }
110OfflineMapsSettings *SettingsManager::offlineMapsSettings()
const {
return _offlineMapsSettings; }
111PlanViewSettings *SettingsManager::planViewSettings()
const {
return _planViewSettings; }
112RemoteIDSettings *SettingsManager::remoteIDSettings()
const {
return _remoteIDSettings; }
113RTKSettings *SettingsManager::rtkSettings()
const {
return _rtkSettings; }
114UnitsSettings *SettingsManager::unitsSettings()
const {
return _unitsSettings; }
115NTRIPSettings *SettingsManager::ntripSettings()
const {
return _ntripSettings; }
116VideoSettings *SettingsManager::videoSettings()
const {
return _videoSettings; }
117MavlinkSettings *SettingsManager::mavlinkSettings()
const {
return _mavlinkSettings; }
119Viewer3DSettings *SettingsManager::viewer3DSettings()
const {
return _viewer3DSettings; }
121void SettingsManager::_loadSettingsFiles()
143 if (!settingsDir.exists()) {
144 qCWarning(SettingsManagerLog) <<
"Settings directory does not exist:" << settingsDir.absolutePath();
148 QStringList settingsFiles = settingsDir.entryList(QStringList() << QString(
"*.%1").arg(_appSettings->
settingsFileExtension), QDir::Files);
149 for (
const QString &fileName : settingsFiles) {
150 QFileInfo fileInfo(settingsDir, fileName);
151 if (!fileInfo.isFile())
continue;
154 qCDebug(SettingsManagerLog) <<
"Loading settings file:" << fileInfo.absoluteFilePath();
156 QJsonDocument jsonDoc;
159 qCWarning(SettingsManagerLog) <<
"Failed to load settings file:" << fileInfo.absoluteFilePath() <<
errorString;
163 QJsonObject jsonObject = jsonDoc.object();
168 qCWarning(SettingsManagerLog) <<
"Settings file failed validation:" << fileInfo.absoluteFilePath() <<
errorString;
175 static const QList<JsonHelper::KeyValidateInfo> keyInfoList = {
176 { kJsonGroupsObjectKey, QJsonValue::Object,
true },
179 qCWarning(SettingsManagerLog) <<
"Settings file incorrect format:" << fileInfo.absoluteFilePath() <<
errorString;
183 auto groupsObject = jsonObject[kJsonGroupsObjectKey].toObject();
184 for (
const QString &groupName : groupsObject.keys()) {
185 qCDebug(SettingsManagerLog) <<
" Loading settings group:" << groupName;
187 const QJsonValue &groupValue = groupsObject[groupName];
188 if (!groupValue.isObject()) {
189 qCWarning(SettingsManagerLog) <<
"Settings file incorrect format, group is not an object:" << fileInfo.absoluteFilePath()
194 auto groupObject = groupValue.toObject();
195 for (
const QString &settingName : groupObject.keys()) {
196 qCDebug(SettingsManagerLog) <<
" Loading settings:" << groupName << settingName;
198 if (!groupObject[settingName].isObject()) {
199 qCWarning(SettingsManagerLog) <<
"Settings file incorrect format, setting is not an object:" << fileInfo.absoluteFilePath()
200 << groupName << settingName;
205 QJsonObject metaDataObject = groupObject[settingName].toObject();
206 _settingsFileOverrides[groupName][settingName] = metaDataObject;
212void SettingsManager::adjustSettingMetaData(
const QString &settingsGroup,
FactMetaData &metaData,
bool &visible)
217 if (!settingsManager) {
218 qCWarning(SettingsManagerLog) <<
"SettingsManager instance not available";
222 if (!
qgcApp()->runningUnitTests()) {
224 const auto &groupOverrides = settingsManager->_settingsFileOverrides;
225 if (groupOverrides.contains(settingsGroup) && groupOverrides[settingsGroup].contains(metaData.
name())) {
226 QJsonObject settingOverrideJsonObject = groupOverrides[settingsGroup][metaData.
name()];
229 settingOverrideJsonObject[
"name"] = metaData.
name();
232 qCDebug(SettingsManagerLog) <<
"Applying settings file override for" << settingsGroup << metaData.
name();
237 for (
const QString &metaDataName : settingOverrideJsonObject.keys()) {
238 if (metaDataName == kJsonVisibleKey) {
239 qCDebug(SettingsManagerLog) <<
" Setting visibility to" << settingOverrideJsonObject[kJsonVisibleKey].toBool();
240 visible = settingOverrideJsonObject[kJsonVisibleKey].toBool();
241 }
else if (metaDataName == kJsonForceRawValueKey) {
242 qCDebug(SettingsManagerLog) <<
" Setting forceRawValue to" << settingOverrideJsonObject[kJsonForceRawValueKey];
243 metaData.
setRawDefaultValue(settingOverrideJsonObject[kJsonForceRawValueKey].toVariant());
245 }
else if (metaDataName == FactMetaData::_defaultValueJsonKey) {
246 qCDebug(SettingsManagerLog) <<
" Setting default to" << overrideMetaData->rawDefaultValue();
248 }
else if (metaDataName == FactMetaData::_minJsonKey) {
249 qCDebug(SettingsManagerLog) <<
" Setting min to" << overrideMetaData->rawMin();
250 metaData.
setRawMin(overrideMetaData->rawMin());
251 }
else if (metaDataName == FactMetaData::_maxJsonKey) {
252 qCDebug(SettingsManagerLog) <<
" Setting max to" << overrideMetaData->rawMax();
253 metaData.
setRawMax(overrideMetaData->rawMax());
254 }
else if (metaDataName == FactMetaData::_decimalPlacesJsonKey) {
255 qCDebug(SettingsManagerLog) <<
" Setting decimalPlaces to" << overrideMetaData->decimalPlaces();
257 }
else if (metaDataName == FactMetaData::_enumValuesJsonKey) {
258 qCDebug(SettingsManagerLog) <<
" Setting enumInfo to" << overrideMetaData->enumValues() << overrideMetaData->enumStrings();
259 metaData.
setEnumInfo(overrideMetaData->enumStrings(), overrideMetaData->enumValues());
260 }
else if (metaDataName == FactMetaData::_enumBitmaskArrayJsonKey) {
261 qCDebug(SettingsManagerLog) <<
" Setting bitmaskInfo to" << overrideMetaData->bitmaskValues() << overrideMetaData->bitmaskStrings();
262 metaData.
setBitmaskInfo(overrideMetaData->bitmaskStrings(), overrideMetaData->bitmaskValues());
263 }
else if (metaDataName == FactMetaData::_longDescriptionJsonKey) {
264 qCDebug(SettingsManagerLog) <<
" Setting longDesc to" << overrideMetaData->longDescription();
266 }
else if (metaDataName == FactMetaData::_shortDescriptionJsonKey) {
267 qCDebug(SettingsManagerLog) <<
" Setting shortDesc to" << overrideMetaData->shortDescription();
275 QGCCorePlugin::instance()->adjustSettingMetaData(settingsGroup, metaData, visible);
#define QGC_LOGGING_CATEGORY(name, categoryStr)
Q_APPLICATION_STATIC(SettingsManager, _settingsManagerInstance)
QString settingsSavePath()
static constexpr const char * settingsFileExtension
Simple branding. Allows to define icon to use on main toolbar.
Provides access to all app settings.
bool validateKeys(const QJsonObject &jsonObject, const QList< KeyValidateInfo > &keyInfo, QString &errorString)
bool validateInternalQGCJsonFile(const QJsonObject &jsonObject, const QString &expectedFileType, int minSupportedVersion, int maxSupportedVersion, int &version, QString &errorString)
returned error string if validation fails
bool isJsonFile(const QByteArray &bytes, QJsonDocument &jsonDoc, QString &errorString)
Determines whether an in-memory byte buffer contains parseable JSON content.