From b0cc3d1f5f85bc5e458e472b05e9d0c695040a8c Mon Sep 17 00:00:00 2001 From: erhard Date: Fri, 4 Feb 2011 21:24:55 +0000 Subject: [PATCH] OP-232 gcs configuration: Override configuration on comand line git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@2725 ebee16cc-31ac-478f-84a7-5cbb03baadba --- ground/openpilotgcs/src/app/main.cpp | 689 +++++++++--------- .../plugins/coreplugin/generalsettings.cpp | 33 +- .../src/plugins/coreplugin/generalsettings.h | 164 +++-- .../src/plugins/coreplugin/mainwindow.cpp | 2 + 4 files changed, 466 insertions(+), 422 deletions(-) diff --git a/ground/openpilotgcs/src/app/main.cpp b/ground/openpilotgcs/src/app/main.cpp index 09641e07a..11b054beb 100644 --- a/ground/openpilotgcs/src/app/main.cpp +++ b/ground/openpilotgcs/src/app/main.cpp @@ -1,332 +1,357 @@ -/** - ****************************************************************************** - * - * @file main.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Nokia Corporation (qt-info@nokia.com) Copyright (C) 2009. - * @brief - * @see The GNU Public License (GPL) Version 3 - * @defgroup - * @{ - * - *****************************************************************************/ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "qtsingleapplication.h" - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -enum { OptionIndent = 4, DescriptionIndent = 24 }; - -static const char *appNameC = "OpenPilot GCS"; -static const char *corePluginNameC = "Core"; -static const char *fixedOptionsC = -" [OPTION]... [FILE]...\n" -"Options:\n" -" -help Display this help\n" -" -version Display program version\n" -" -client Attempt to connect to already running instance\n"; - -static const char *HELP_OPTION1 = "-h"; -static const char *HELP_OPTION2 = "-help"; -static const char *HELP_OPTION3 = "/h"; -static const char *HELP_OPTION4 = "--help"; -static const char *VERSION_OPTION = "-version"; -static const char *CLIENT_OPTION = "-client"; - -typedef QList PluginSpecSet; - -// Helpers for displaying messages. Note that there is no console on Windows. -#ifdef Q_OS_WIN -// Format as
 HTML
-static inline void toHtml(QString &t)
-{
-    t.replace(QLatin1Char('&'), QLatin1String("&"));
-    t.replace(QLatin1Char('<'), QLatin1String("<"));
-    t.replace(QLatin1Char('>'), QLatin1String(">"));
-    t.insert(0, QLatin1String("
"));
-    t.append(QLatin1String("
")); -} - -static void displayHelpText(QString t) // No console on Windows. -{ - toHtml(t); - QMessageBox::information(0, QLatin1String(appNameC), t); -} - -static void displayError(const QString &t) // No console on Windows. -{ - QMessageBox::critical(0, QLatin1String(appNameC), t); -} - -#else - -static void displayHelpText(const QString &t) -{ - qWarning("%s", qPrintable(t)); -} - -static void displayError(const QString &t) -{ - qCritical("%s", qPrintable(t)); -} - -#endif - -static void printVersion(const ExtensionSystem::PluginSpec *coreplugin, - const ExtensionSystem::PluginManager &pm) -{ - QString version; - QTextStream str(&version); - str << '\n' << appNameC << ' ' << coreplugin->version()<< " based on Qt " << qVersion() << "\n\n"; - pm.formatPluginVersions(str); - str << '\n' << coreplugin->copyright() << '\n'; - displayHelpText(version); -} - -static void printHelp(const QString &a0, const ExtensionSystem::PluginManager &pm) -{ - QString help; - QTextStream str(&help); - str << "Usage: " << a0 << fixedOptionsC; - ExtensionSystem::PluginManager::formatOptions(str, OptionIndent, DescriptionIndent); - pm.formatPluginOptions(str, OptionIndent, DescriptionIndent); - displayHelpText(help); -} - -static inline QString msgCoreLoadFailure(const QString &why) -{ - return QCoreApplication::translate("Application", "Failed to load core: %1").arg(why); -} - -static inline QString msgSendArgumentFailed() -{ - return QCoreApplication::translate("Application", "Unable to send command line arguments to the already running instance. It appears to be not responding."); -} - -// Prepare a remote argument: If it is a relative file, add the current directory -// since the the central instance might be running in a different directory. - -static inline QString prepareRemoteArgument(const QString &a) -{ - QFileInfo fi(a); - if (!fi.exists()) - return a; - if (fi.isRelative()) - return fi.absoluteFilePath(); - return a; -} - -// Send the arguments to an already running instance of OpenPilot GCS -static bool sendArguments(SharedTools::QtSingleApplication &app, const QStringList &arguments) -{ - if (!arguments.empty()) { - // Send off arguments - const QStringList::const_iterator acend = arguments.constEnd(); - for (QStringList::const_iterator it = arguments.constBegin(); it != acend; ++it) { - if (!app.sendMessage(prepareRemoteArgument(*it))) { - displayError(msgSendArgumentFailed()); - return false; - } - } - } - // Special empty argument means: Show and raise (the slot just needs to be triggered) - if (!app.sendMessage(QString())) { - displayError(msgSendArgumentFailed()); - return false; - } - return true; -} - -static inline QStringList getPluginPaths() -{ - QStringList rc; - // Figure out root: Up one from 'bin' - QDir rootDir = QApplication::applicationDirPath(); - rootDir.cdUp(); - const QString rootDirPath = rootDir.canonicalPath(); - // 1) "plugins" (Win/Linux) - QString pluginPath = rootDirPath; - pluginPath += QLatin1Char('/'); - pluginPath += QLatin1String(GCS_LIBRARY_BASENAME); - pluginPath += QLatin1Char('/'); - pluginPath += QLatin1String("openpilotgcs"); - pluginPath += QLatin1Char('/'); - pluginPath += QLatin1String("plugins"); - rc.push_back(pluginPath); - // 2) "PlugIns" (OS X) - pluginPath = rootDirPath; - pluginPath += QLatin1Char('/'); - pluginPath += QLatin1String("PlugIns"); - rc.push_back(pluginPath); - return rc; -} - -#ifdef Q_OS_MAC -# define SHARE_PATH "/../Resources" -#else -# define SHARE_PATH "/../share/openpilotgcs" -#endif - -int main(int argc, char **argv) -{ -#ifdef Q_OS_MAC - // increase the number of file that can be opened in OpenPilot GCS - struct rlimit rl; - getrlimit(RLIMIT_NOFILE, &rl); - rl.rlim_cur = rl.rlim_max; - setrlimit(RLIMIT_NOFILE, &rl); -#endif - - SharedTools::QtSingleApplication app((QLatin1String(appNameC)), argc, argv); - - QTranslator translator; - QTranslator qtTranslator; - QString locale = QLocale::system().name(); - - // Must be done before any QSettings class is created - QSettings::setPath(QSettings::IniFormat, QSettings::SystemScope, - QCoreApplication::applicationDirPath()+QLatin1String(SHARE_PATH)); - // keep this in sync with the MainWindow ctor in coreplugin/mainwindow.cpp - const QSettings settings(QSettings::IniFormat, QSettings::UserScope, - QLatin1String("OpenPilot"), QLatin1String("OpenPilotGCS")); - locale = settings.value("General/OverrideLanguage", locale).toString(); - - - const QString &creatorTrPath = QCoreApplication::applicationDirPath() - + QLatin1String(SHARE_PATH "/translations"); - if (translator.load(QLatin1String("openpilotgcs_") + locale, creatorTrPath)) { - const QString &qtTrPath = QLibraryInfo::location(QLibraryInfo::TranslationsPath); - const QString &qtTrFile = QLatin1String("qt_") + locale; - // Binary installer puts Qt tr files into creatorTrPath - if (qtTranslator.load(qtTrFile, qtTrPath) || qtTranslator.load(qtTrFile, creatorTrPath)) { - app.installTranslator(&translator); - app.installTranslator(&qtTranslator); - app.setProperty("qtc_locale", locale); - } else { - translator.load(QString()); // unload() - } - } - - // Load - ExtensionSystem::PluginManager pluginManager; - pluginManager.setFileExtension(QLatin1String("pluginspec")); - - const QStringList pluginPaths = getPluginPaths(); - pluginManager.setPluginPaths(pluginPaths); - - const QStringList arguments = app.arguments(); - QMap foundAppOptions; - if (arguments.size() > 1) { - QMap appOptions; - appOptions.insert(QLatin1String(HELP_OPTION1), false); - appOptions.insert(QLatin1String(HELP_OPTION2), false); - appOptions.insert(QLatin1String(HELP_OPTION3), false); - appOptions.insert(QLatin1String(HELP_OPTION4), false); - appOptions.insert(QLatin1String(VERSION_OPTION), false); - appOptions.insert(QLatin1String(CLIENT_OPTION), false); - QString errorMessage; - if (!pluginManager.parseOptions(arguments, - appOptions, - &foundAppOptions, - &errorMessage)) { - displayError(errorMessage); - printHelp(QFileInfo(app.applicationFilePath()).baseName(), pluginManager); - return -1; - } - } - - const PluginSpecSet plugins = pluginManager.plugins(); - ExtensionSystem::PluginSpec *coreplugin = 0; - foreach (ExtensionSystem::PluginSpec *spec, plugins) { - if (spec->name() == QLatin1String(corePluginNameC)) { - coreplugin = spec; - break; - } - } - if (!coreplugin) { - QString nativePaths = QDir::toNativeSeparators(pluginPaths.join(QLatin1String(","))); - const QString reason = QCoreApplication::translate("Application", "Could not find 'Core.pluginspec' in %1").arg(nativePaths); - displayError(msgCoreLoadFailure(reason)); - return 1; - } - if (coreplugin->hasError()) { - displayError(msgCoreLoadFailure(coreplugin->errorString())); - return 1; - } - if (foundAppOptions.contains(QLatin1String(VERSION_OPTION))) { - printVersion(coreplugin, pluginManager); - return 0; - } - if (foundAppOptions.contains(QLatin1String(HELP_OPTION1)) - || foundAppOptions.contains(QLatin1String(HELP_OPTION2)) - || foundAppOptions.contains(QLatin1String(HELP_OPTION3)) - || foundAppOptions.contains(QLatin1String(HELP_OPTION4))) { - printHelp(QFileInfo(app.applicationFilePath()).baseName(), pluginManager); - return 0; - } - - const bool isFirstInstance = !app.isRunning(); - if (!isFirstInstance && foundAppOptions.contains(QLatin1String(CLIENT_OPTION))) - return sendArguments(app, pluginManager.arguments()) ? 0 : -1; - - pluginManager.loadPlugins(); - if (coreplugin->hasError()) { - displayError(msgCoreLoadFailure(coreplugin->errorString())); - return 1; - } - { - QStringList errors; - foreach (ExtensionSystem::PluginSpec *p, pluginManager.plugins()) - if (p->hasError()) - errors.append(p->errorString()); - if (!errors.isEmpty()) - QMessageBox::warning(0, - QCoreApplication::translate("Application", "OpenPilot GCS - Plugin loader messages"), - errors.join(QString::fromLatin1("\n\n"))); - } - - if (isFirstInstance) { - // Set up lock and remote arguments for the first instance only. - // Silently fallback to unconnected instances for any subsequent - // instances. - app.initialize(); - QObject::connect(&app, SIGNAL(messageReceived(QString)), coreplugin->plugin(), SLOT(remoteArgument(QString))); - } - QObject::connect(&app, SIGNAL(fileOpenRequest(QString)), coreplugin->plugin(), SLOT(remoteArgument(QString))); - - // Do this after the event loop has started - QTimer::singleShot(100, &pluginManager, SLOT(startTests())); - return app.exec(); -} - +/** + ****************************************************************************** + * + * @file main.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * Parts by Nokia Corporation (qt-info@nokia.com) Copyright (C) 2009. + * @brief + * @see The GNU Public License (GPL) Version 3 + * @defgroup + * @{ + * + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "qtsingleapplication.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +enum { OptionIndent = 4, DescriptionIndent = 24 }; + +static const char *appNameC = "OpenPilot GCS"; +static const char *corePluginNameC = "Core"; +static const char *fixedOptionsC = +" [OPTION]... [FILE]...\n" +"Options:\n" +" -help Display this help\n" +" -version Display program version\n" +" -client Attempt to connect to already running instance\n" +" -D key=value Override preference e.g: -D General/OverrideLanguage=de\n"; + +static const char *HELP_OPTION1 = "-h"; +static const char *HELP_OPTION2 = "-help"; +static const char *HELP_OPTION3 = "/h"; +static const char *HELP_OPTION4 = "--help"; +static const char *VERSION_OPTION = "-version"; +static const char *CLIENT_OPTION = "-client"; +static const char *SETTING_OPTION = "-D"; + +typedef QList PluginSpecSet; + +// Helpers for displaying messages. Note that there is no console on Windows. +#ifdef Q_OS_WIN +// Format as
 HTML
+static inline void toHtml(QString &t)
+{
+    t.replace(QLatin1Char('&'), QLatin1String("&"));
+    t.replace(QLatin1Char('<'), QLatin1String("<"));
+    t.replace(QLatin1Char('>'), QLatin1String(">"));
+    t.insert(0, QLatin1String("
"));
+    t.append(QLatin1String("
")); +} + +static void displayHelpText(QString t) // No console on Windows. +{ + toHtml(t); + QMessageBox::information(0, QLatin1String(appNameC), t); +} + +static void displayError(const QString &t) // No console on Windows. +{ + QMessageBox::critical(0, QLatin1String(appNameC), t); +} + +#else + +static void displayHelpText(const QString &t) +{ + qWarning("%s", qPrintable(t)); +} + +static void displayError(const QString &t) +{ + qCritical("%s", qPrintable(t)); +} + +#endif + +static void printVersion(const ExtensionSystem::PluginSpec *coreplugin, + const ExtensionSystem::PluginManager &pm) +{ + QString version; + QTextStream str(&version); + str << '\n' << appNameC << ' ' << coreplugin->version()<< " based on Qt " << qVersion() << "\n\n"; + pm.formatPluginVersions(str); + str << '\n' << coreplugin->copyright() << '\n'; + displayHelpText(version); +} + +static void printHelp(const QString &a0, const ExtensionSystem::PluginManager &pm) +{ + QString help; + QTextStream str(&help); + str << "Usage: " << a0 << fixedOptionsC; + ExtensionSystem::PluginManager::formatOptions(str, OptionIndent, DescriptionIndent); + pm.formatPluginOptions(str, OptionIndent, DescriptionIndent); + displayHelpText(help); +} + +static inline QString msgCoreLoadFailure(const QString &why) +{ + return QCoreApplication::translate("Application", "Failed to load core: %1").arg(why); +} + +static inline QString msgSendArgumentFailed() +{ + return QCoreApplication::translate("Application", "Unable to send command line arguments to the already running instance. It appears to be not responding."); +} + +// Prepare a remote argument: If it is a relative file, add the current directory +// since the the central instance might be running in a different directory. + +static inline QString prepareRemoteArgument(const QString &a) +{ + QFileInfo fi(a); + if (!fi.exists()) + return a; + if (fi.isRelative()) + return fi.absoluteFilePath(); + return a; +} + +// Send the arguments to an already running instance of OpenPilot GCS +static bool sendArguments(SharedTools::QtSingleApplication &app, const QStringList &arguments) +{ + if (!arguments.empty()) { + // Send off arguments + const QStringList::const_iterator acend = arguments.constEnd(); + for (QStringList::const_iterator it = arguments.constBegin(); it != acend; ++it) { + if (!app.sendMessage(prepareRemoteArgument(*it))) { + displayError(msgSendArgumentFailed()); + return false; + } + } + } + // Special empty argument means: Show and raise (the slot just needs to be triggered) + if (!app.sendMessage(QString())) { + displayError(msgSendArgumentFailed()); + return false; + } + return true; +} + +static inline QStringList getPluginPaths() +{ + QStringList rc; + // Figure out root: Up one from 'bin' + QDir rootDir = QApplication::applicationDirPath(); + rootDir.cdUp(); + const QString rootDirPath = rootDir.canonicalPath(); + // 1) "plugins" (Win/Linux) + QString pluginPath = rootDirPath; + pluginPath += QLatin1Char('/'); + pluginPath += QLatin1String(GCS_LIBRARY_BASENAME); + pluginPath += QLatin1Char('/'); + pluginPath += QLatin1String("openpilotgcs"); + pluginPath += QLatin1Char('/'); + pluginPath += QLatin1String("plugins"); + rc.push_back(pluginPath); + // 2) "PlugIns" (OS X) + pluginPath = rootDirPath; + pluginPath += QLatin1Char('/'); + pluginPath += QLatin1String("PlugIns"); + rc.push_back(pluginPath); + return rc; +} + +#ifdef Q_OS_MAC +# define SHARE_PATH "/../Resources" +#else +# define SHARE_PATH "/../share/openpilotgcs" +#endif + +static void overrideSettings(QSettings &settings, int argc, char **argv){ + + QMap settingOptions; + // Options like -DMy/setting=test + QRegExp rx("([^=]+)=(.*)"); + + int i = 0; + while( i < argc ){ + if ( QString("-D").compare(QString(argv[i++])) == 0 ){ + if ( rx.indexIn(argv[i]) > -1 ){ + settingOptions.insert(rx.cap(1), rx.cap(2)); + } + } + } + QList keys = settingOptions.keys(); + foreach ( QString key, keys ){ + settings.setValue(key, settingOptions.value(key)); + } + settings.sync(); +} + +int main(int argc, char **argv) +{ +#ifdef Q_OS_MAC + // increase the number of file that can be opened in OpenPilot GCS + struct rlimit rl; + getrlimit(RLIMIT_NOFILE, &rl); + rl.rlim_cur = rl.rlim_max; + setrlimit(RLIMIT_NOFILE, &rl); +#endif + + SharedTools::QtSingleApplication app((QLatin1String(appNameC)), argc, argv); + + QString locale = QLocale::system().name(); + + // Must be done before any QSettings class is created + QSettings::setPath(QSettings::IniFormat, QSettings::SystemScope, + QCoreApplication::applicationDirPath()+QLatin1String(SHARE_PATH)); + // keep this in sync with the MainWindow ctor in coreplugin/mainwindow.cpp + QSettings settings(QSettings::IniFormat, QSettings::UserScope, + QLatin1String("OpenPilot"), QLatin1String("OpenPilotGCS")); + + overrideSettings(settings, argc, argv); + locale = settings.value("General/OverrideLanguage", locale).toString(); + + QTranslator translator; + QTranslator qtTranslator; + + const QString &creatorTrPath = QCoreApplication::applicationDirPath() + + QLatin1String(SHARE_PATH "/translations"); + if (translator.load(QLatin1String("openpilotgcs_") + locale, creatorTrPath)) { + const QString &qtTrPath = QLibraryInfo::location(QLibraryInfo::TranslationsPath); + const QString &qtTrFile = QLatin1String("qt_") + locale; + // Binary installer puts Qt tr files into creatorTrPath + if (qtTranslator.load(qtTrFile, qtTrPath) || qtTranslator.load(qtTrFile, creatorTrPath)) { + QCoreApplication::installTranslator(&translator); + QCoreApplication::installTranslator(&qtTranslator); + } else { + translator.load(QString()); // unload() + } + } + app.setProperty("qtc_locale", locale); // Do we need this? + + // Load + ExtensionSystem::PluginManager pluginManager; + pluginManager.setFileExtension(QLatin1String("pluginspec")); + + const QStringList pluginPaths = getPluginPaths(); + pluginManager.setPluginPaths(pluginPaths); + + const QStringList arguments = app.arguments(); + QMap foundAppOptions; + if (arguments.size() > 1) { + QMap appOptions; + appOptions.insert(QLatin1String(HELP_OPTION1), false); + appOptions.insert(QLatin1String(HELP_OPTION2), false); + appOptions.insert(QLatin1String(HELP_OPTION3), false); + appOptions.insert(QLatin1String(HELP_OPTION4), false); + appOptions.insert(QLatin1String(VERSION_OPTION), false); + appOptions.insert(QLatin1String(CLIENT_OPTION), false); + appOptions.insert(QLatin1String(SETTING_OPTION), true); + QString errorMessage; + if (!pluginManager.parseOptions(arguments, + appOptions, + &foundAppOptions, + &errorMessage)) { + displayError(errorMessage); + printHelp(QFileInfo(app.applicationFilePath()).baseName(), pluginManager); + return -1; + } + } + + const PluginSpecSet plugins = pluginManager.plugins(); + ExtensionSystem::PluginSpec *coreplugin = 0; + foreach (ExtensionSystem::PluginSpec *spec, plugins) { + if (spec->name() == QLatin1String(corePluginNameC)) { + coreplugin = spec; + break; + } + } + if (!coreplugin) { + QString nativePaths = QDir::toNativeSeparators(pluginPaths.join(QLatin1String(","))); + const QString reason = QCoreApplication::translate("Application", "Could not find 'Core.pluginspec' in %1").arg(nativePaths); + displayError(msgCoreLoadFailure(reason)); + return 1; + } + if (coreplugin->hasError()) { + displayError(msgCoreLoadFailure(coreplugin->errorString())); + return 1; + } + if (foundAppOptions.contains(QLatin1String(VERSION_OPTION))) { + printVersion(coreplugin, pluginManager); + return 0; + } + if (foundAppOptions.contains(QLatin1String(HELP_OPTION1)) + || foundAppOptions.contains(QLatin1String(HELP_OPTION2)) + || foundAppOptions.contains(QLatin1String(HELP_OPTION3)) + || foundAppOptions.contains(QLatin1String(HELP_OPTION4))) { + printHelp(QFileInfo(app.applicationFilePath()).baseName(), pluginManager); + return 0; + } + + const bool isFirstInstance = !app.isRunning(); + if (!isFirstInstance && foundAppOptions.contains(QLatin1String(CLIENT_OPTION))) + return sendArguments(app, pluginManager.arguments()) ? 0 : -1; + + pluginManager.loadPlugins(); + if (coreplugin->hasError()) { + displayError(msgCoreLoadFailure(coreplugin->errorString())); + return 1; + } + { + QStringList errors; + foreach (ExtensionSystem::PluginSpec *p, pluginManager.plugins()) + if (p->hasError()) + errors.append(p->errorString()); + if (!errors.isEmpty()) + QMessageBox::warning(0, + QCoreApplication::translate("Application", "OpenPilot GCS - Plugin loader messages"), + errors.join(QString::fromLatin1("\n\n"))); + } + + if (isFirstInstance) { + // Set up lock and remote arguments for the first instance only. + // Silently fallback to unconnected instances for any subsequent + // instances. + app.initialize(); + QObject::connect(&app, SIGNAL(messageReceived(QString)), coreplugin->plugin(), SLOT(remoteArgument(QString))); + } + QObject::connect(&app, SIGNAL(fileOpenRequest(QString)), coreplugin->plugin(), SLOT(remoteArgument(QString))); + + // Do this after the event loop has started + QTimer::singleShot(100, &pluginManager, SLOT(startTests())); + return app.exec(); +} diff --git a/ground/openpilotgcs/src/plugins/coreplugin/generalsettings.cpp b/ground/openpilotgcs/src/plugins/coreplugin/generalsettings.cpp index beaf81cbb..4a0095197 100644 --- a/ground/openpilotgcs/src/plugins/coreplugin/generalsettings.cpp +++ b/ground/openpilotgcs/src/plugins/coreplugin/generalsettings.cpp @@ -111,8 +111,6 @@ QWidget *GeneralSettings::createPage(QWidget *parent) QWidget *w = new QWidget(parent); m_page->setupUi(w); - /* TODO: Clean this: settings not used, Core::ICore::instance()->settings() shouldn't be used, since not externally configurable */ - QSettings* settings = Core::ICore::instance()->settings(); fillLanguageBox(); m_page->colorButton->setColor(StyleHelper::baseColor()); @@ -156,6 +154,26 @@ void GeneralSettings::finish() delete m_page; } +void GeneralSettings::readSettings(QSettings* qs) +{ + qs->beginGroup(QLatin1String("General")); + m_language = qs->value(QLatin1String("OverrideLanguage"),QLocale::system().name()).toString(); + qs->endGroup(); + +} + +void GeneralSettings::saveSettings(QSettings* qs) +{ + qs->beginGroup(QLatin1String("General")); + + if (m_language.isEmpty()) + qs->remove(QLatin1String("OverrideLanguage")); + else + qs->setValue(QLatin1String("OverrideLanguage"), m_language); + + qs->endGroup(); +} + void GeneralSettings::resetInterfaceColor() { m_page->colorButton->setColor(0x666666); @@ -200,20 +218,15 @@ void GeneralSettings::resetLanguage() QString GeneralSettings::language() const { - QSettings* settings = Core::ICore::instance()->settings(); - return settings->value(QLatin1String("General/OverrideLanguage")).toString(); + return m_language; } void GeneralSettings::setLanguage(const QString &locale) { - QSettings* settings = Core::ICore::instance()->settings(); - if (settings->value(QLatin1String("General/OverrideLanguage")).toString() != locale) + if (m_language != locale) { QMessageBox::information((QWidget*)Core::ICore::instance()->mainWindow(), tr("Restart required"), tr("The language change will take effect after a restart of the OpenPilot GCS.")); + m_language = locale; } - if (locale.isEmpty()) - settings->remove(QLatin1String("General/OverrideLanguage")); - else - settings->setValue(QLatin1String("General/OverrideLanguage"), locale); } diff --git a/ground/openpilotgcs/src/plugins/coreplugin/generalsettings.h b/ground/openpilotgcs/src/plugins/coreplugin/generalsettings.h index 37988d1cf..de82ec651 100644 --- a/ground/openpilotgcs/src/plugins/coreplugin/generalsettings.h +++ b/ground/openpilotgcs/src/plugins/coreplugin/generalsettings.h @@ -1,80 +1,84 @@ -/** - ****************************************************************************** - * - * @file generalsettings.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Nokia Corporation (qt-info@nokia.com) Copyright (C) 2009. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup CorePlugin Core Plugin - * @{ - * @brief The Core GCS plugin - *****************************************************************************/ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef GENERALSETTINGS_H -#define GENERALSETTINGS_H - -#include -#include -#include - -namespace Core { -namespace Internal { - -namespace Ui { - class GeneralSettings; -} - -class GeneralSettings : public IOptionsPage -{ - Q_OBJECT - -public: - GeneralSettings(); - - QString id() const; - QString trName() const; - QString category() const; - QString trCategory() const; - QWidget* createPage(QWidget *parent); - void apply(); - void finish(); - -private slots: - void resetInterfaceColor(); - void resetLanguage(); - void resetExternalEditor(); - void showHelpForExternalEditor(); -#ifdef Q_OS_UNIX - void resetTerminal(); -#endif - -private: - void fillLanguageBox() const; - QString language() const; - void setLanguage(const QString&); - Ui::GeneralSettings *m_page; - QPointer m_dialog; - QList m_codecs; - -}; - -} // namespace Internal -} // namespace Core - -#endif // GENERALSETTINGS_H +/** + ****************************************************************************** + * + * @file generalsettings.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * Parts by Nokia Corporation (qt-info@nokia.com) Copyright (C) 2009. + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup CorePlugin Core Plugin + * @{ + * @brief The Core GCS plugin + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef GENERALSETTINGS_H +#define GENERALSETTINGS_H + +#include +#include +#include +#include + +namespace Core { +namespace Internal { + +namespace Ui { + class GeneralSettings; +} + +class GeneralSettings : public IOptionsPage +{ + Q_OBJECT + +public: + GeneralSettings(); + + QString id() const; + QString trName() const; + QString category() const; + QString trCategory() const; + QWidget* createPage(QWidget *parent); + void apply(); + void finish(); + void readSettings(QSettings* qs); + void saveSettings(QSettings* qs); + +private slots: + void resetInterfaceColor(); + void resetLanguage(); + void resetExternalEditor(); + void showHelpForExternalEditor(); +#ifdef Q_OS_UNIX + void resetTerminal(); +#endif + +private: + void fillLanguageBox() const; + QString language() const; + void setLanguage(const QString&); + Ui::GeneralSettings *m_page; + QString m_language; + QPointer m_dialog; + QList m_codecs; + +}; + +} // namespace Internal +} // namespace Core + +#endif // GENERALSETTINGS_H diff --git a/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp b/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp index f82433ae0..6db5d9c25 100644 --- a/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp +++ b/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp @@ -1009,6 +1009,7 @@ void MainWindow::readSettings(QSettings* qs) qs = m_settings; } + m_generalSettings->readSettings(qs); m_actionManager->readSettings(qs); qs->beginGroup(QLatin1String(settingsGroup)); @@ -1069,6 +1070,7 @@ void MainWindow::saveSettings(QSettings* qs) m_viewManager->saveSettings(qs); m_actionManager->saveSettings(qs); + m_generalSettings->saveSettings(qs); }