13#include <QtCore/QStandardPaths>
15#include <QtCore/QSettings>
18QList<QLocale::Language> AppSettings::_rgReleaseLanguages = {
29QList<QLocale::Language> AppSettings::_rgPartialLanguages = {
33AppSettings::LanguageInfo_t AppSettings::_rgLanguageInfo[] = {
34 { QLocale::AnyLanguage,
"System" },
35 { QLocale::Azerbaijani,
"Azerbaijani (Azerbaijani)" },
36 { QLocale::Bulgarian,
"български (Bulgarian)" },
37 { QLocale::Chinese,
"中文 (Chinese)" },
38 { QLocale::Dutch,
"Nederlands (Dutch)" },
39 { QLocale::English,
"English" },
40 { QLocale::Finnish,
"Suomi (Finnish)" },
41 { QLocale::French,
"Français (French)" },
42 { QLocale::German,
"Deutsche (German)" },
43 { QLocale::Greek,
"Ελληνικά (Greek)" },
44 { QLocale::Hebrew,
"עברית (Hebrew)" },
45 { QLocale::Italian,
"Italiano (Italian)" },
46 { QLocale::Japanese,
"日本語 (Japanese)" },
47 { QLocale::Korean,
"한국어 (Korean)" },
48 { QLocale::NorwegianBokmal,
"Norsk (Norwegian)" },
49 { QLocale::Polish,
"Polskie (Polish)" },
50 { QLocale::Portuguese,
"Português (Portuguese)" },
51 { QLocale::Russian,
"Pусский (Russian)" },
52 { QLocale::Spanish,
"Español (Spanish)" },
53 { QLocale::Swedish,
"Svenska (Swedish)" },
54 { QLocale::Turkish,
"Türk (Turkish)" }
63 SettingsFact* savePathFact = qobject_cast<SettingsFact*>(savePath());
64 QString appName = QCoreApplication::applicationName();
65#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
67 bool userHasModifiedSavePath =
false;
69 bool userHasModifiedSavePath = !savePathFact->rawValue().toString().isEmpty() || !_nameToMetaDataMap[savePathName]->rawDefaultValue().toString().isEmpty();
72 if (!userHasModifiedSavePath) {
73#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
76 QDir rootDir = QDir(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation));
77 savePathFact->setRawValue(rootDir.absolutePath());
81 if (!androidDontSaveToSDCard()->rawValue().toBool()) {
83 qDebug() <<
"AndroidInterface::getSDCardPath();" << rootDirPath;
84 if (rootDirPath.isEmpty() || !QDir(rootDirPath).exists()) {
86 qDebug() <<
"Save to SD card specified for application data. But no SD card present or permissions not granted. Using internal storage.";
87 }
else if (!QFileInfo(rootDirPath).isWritable()) {
89 QGC::showAppMessage(AppSettings::tr(
"Save to SD card specified for application data. But SD card is write protected. Using internal storage."));
93 if (rootDirPath.isEmpty()) {
94 rootDirPath = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
96 savePathFact->setRawValue(QDir(rootDirPath).filePath(appName));
98 savePathFact->setUserVisible(
false);
102 rootDir = QDir(QStandardPaths::writableLocation(QStandardPaths::TempLocation));
104 rootDir = QDir(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation));
106 savePathFact->setRawValue(rootDir.filePath(appName));
113 _checkSavePathDirectories();
117 if (value.toUInt() != 0) {
118 offlineEditingFirmwareClass()->setRawValue(value);
122 if (value.toUInt() != 0) {
123 offlineEditingVehicleClass()->setRawValue(value);
175 if (!_indoorPaletteFact) {
176 _indoorPaletteFact = _createSettingsFact(indoorPaletteName);
179 return _indoorPaletteFact;
184 if (!_qLocaleLanguageFact) {
185 _qLocaleLanguageFact = _createSettingsFact(qLocaleLanguageName);
188 FactMetaData* metaData = _qLocaleLanguageFact->metaData();
189 QStringList rgEnumStrings;
190 QVariantList rgEnumValues;
193 rgEnumStrings.append(_rgLanguageInfo[0].languageName);
194 rgEnumValues.append(_rgLanguageInfo[0].languageId);
196 for (
const auto& languageInfo: _rgLanguageInfo) {
197 if (_rgReleaseLanguages.contains(languageInfo.languageId)) {
198 rgEnumStrings.append(languageInfo.languageName);
199 rgEnumValues.append(languageInfo.languageId);
202 for (
const auto& languageInfo: _rgLanguageInfo) {
203 if (_rgPartialLanguages.contains(languageInfo.languageId)) {
204 rgEnumStrings.append(QString(languageInfo.languageName) + AppSettings::tr(
" (Partial)"));
205 rgEnumValues.append(languageInfo.languageId);
208#ifdef QGC_DAILY_BUILD
210 for (
const auto& languageInfo: _rgLanguageInfo) {
211 if (!_rgReleaseLanguages.contains(languageInfo.languageId) && !_rgPartialLanguages.contains(languageInfo.languageId)) {
212 rgEnumStrings.append(QString(languageInfo.languageName) + AppSettings::tr(
" (Test Only)"));
213 rgEnumValues.append(languageInfo.languageId);
219 rgEnumStrings.append(AppSettings::tr(
"Pseudo Localization (Test Only)"));
220 rgEnumValues.append(QLocale::Esperanto);
222 metaData->
setEnumInfo(rgEnumStrings, rgEnumValues);
224 if (_qLocaleLanguageFact->enumIndex() == -1) {
225 _qLocaleLanguageFact->setRawValue(QLocale::AnyLanguage);
228 return _qLocaleLanguageFact;
231void AppSettings::_qLocaleLanguageChanged()
236void AppSettings::_checkSavePathDirectories(
void)
238 const QString savePath = this->savePath()->rawValue().toString();
253QString AppSettings::_childSavePath(
const char* directory)
255 const QString rootPath = savePath()->rawValue().toString();
256 if (rootPath.isEmpty()) {
260 const QDir rootDir(rootPath);
261 if (!rootDir.exists()) {
265 return rootDir.filePath(directory);
268void AppSettings::_indoorPaletteChanged(
void)
322 QStringList strIdList = firstRunPromptIds.toString().split(
",", Qt::SkipEmptyParts);
324 for (
const QString& strId: strIdList) {
325 rgIds.append(strId.toInt());
333 for (
int id: rgIds) {
334 strList.append(QString::number(
id));
336 return QVariant(strList.join(
","));
342 if (!rgIds.contains(
id)) {
353QLocale::Language AppSettings::_qLocaleLanguageEarlyAccess(
void)
358 QLocale::Language localeLanguage =
static_cast<QLocale::Language
>(settings.value(qLocaleLanguageName).toInt());
359 for (
auto& languageInfo: _rgLanguageInfo) {
360 if (languageInfo.languageId == localeLanguage) {
361 return localeLanguage;
366 if (localeLanguage == QLocale::Esperanto) {
367 return localeLanguage;
371 localeLanguage = QLocale::AnyLanguage;
372 settings.setValue(qLocaleLanguageName, localeLanguage);
374 return localeLanguage;
#define DECLARE_SETTINGSFACT_NO_FUNC(CLASS, NAME)
#define DECLARE_SETTINGSFACT(CLASS, NAME)
#define DECLARE_SETTINGGROUP(NAME, GROUP)
static QVariant firstRunPromptsIdsListToVariant(const QList< int > &rgIds)
QString telemetrySavePath()
static constexpr const char * settingsDirectory
QString parameterSavePath()
static constexpr const char * photoDirectory
static constexpr const char * telemetryDirectory
Q_INVOKABLE void firstRunPromptIdsMarkIdAsShown(int id)
static constexpr const char * logDirectory
QString settingsSavePath()
static constexpr const char * videoDirectory
static QList< int > firstRunPromptsIdsVariantToList(const QVariant &firstRunPromptIds)
static constexpr const char * missionDirectory
static constexpr const char * mavlinkActionsDirectory
QString missionSavePath()
static constexpr const char * crashDirectory
QString mavlinkActionsSavePath()
static constexpr const char * parameterDirectory
void rawValueChanged(const QVariant &value)
QGCPalette is used in QML ui to expose color properties for the QGC palette.
static void setGlobalTheme(Theme newTheme)
A SettingsFact is Fact which holds a QSettings value.
bool ensureDirectoryExists(const QString &path)
QString joinPath(const QString &dir, const QString &name)
void showAppMessage(const QString &message, const QString &title)
Modal application message. Queued if the UI isn't ready yet.