From b8af9da6898bfcbc1d5c4f1009fc19e267fa5120 Mon Sep 17 00:00:00 2001 From: edouard Date: Mon, 27 Dec 2010 22:02:36 +0000 Subject: [PATCH] OP-227 Basic implementation of support of language override in the GCS. The new preference is in the Environment/General dialog. git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@2298 ebee16cc-31ac-478f-84a7-5cbb03baadba --- ground/src/app/main.cpp | 11 +++ ground/src/plugins/coreplugin/coreimpl.cpp | 4 +- ground/src/plugins/coreplugin/coreimpl.h | 2 +- .../plugins/coreplugin/generalsettings.cpp | 73 +++++++++++++++++++ .../src/plugins/coreplugin/generalsettings.h | 6 ++ .../src/plugins/coreplugin/generalsettings.ui | 55 ++++++++++---- ground/src/plugins/coreplugin/icore.cpp | 10 ++- ground/src/plugins/coreplugin/icore.h | 3 +- ground/src/plugins/coreplugin/mainwindow.cpp | 11 +++ ground/src/plugins/coreplugin/mainwindow.h | 4 +- 10 files changed, 160 insertions(+), 19 deletions(-) diff --git a/ground/src/app/main.cpp b/ground/src/app/main.cpp index d07007d8c..09641e07a 100644 --- a/ground/src/app/main.cpp +++ b/ground/src/app/main.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -212,6 +213,16 @@ int main(int argc, char **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)) { diff --git a/ground/src/plugins/coreplugin/coreimpl.cpp b/ground/src/plugins/coreplugin/coreimpl.cpp index b35a23c0a..9408aecb4 100644 --- a/ground/src/plugins/coreplugin/coreimpl.cpp +++ b/ground/src/plugins/coreplugin/coreimpl.cpp @@ -117,9 +117,9 @@ MimeDatabase *CoreImpl::mimeDatabase() const return m_mainwindow->mimeDatabase(); } -QSettings *CoreImpl::settings() const +QSettings *CoreImpl::settings(QSettings::Scope scope) const { - return m_mainwindow->settings(); + return m_mainwindow->settings(scope); } SettingsDatabase *CoreImpl::settingsDatabase() const diff --git a/ground/src/plugins/coreplugin/coreimpl.h b/ground/src/plugins/coreplugin/coreimpl.h index 295a8a883..9d9be2c7d 100644 --- a/ground/src/plugins/coreplugin/coreimpl.h +++ b/ground/src/plugins/coreplugin/coreimpl.h @@ -62,7 +62,7 @@ public: ModeManager *modeManager() const; MimeDatabase *mimeDatabase() const; - QSettings *settings() const; + QSettings *settings(QSettings::Scope scope = QSettings::UserScope) const; SettingsDatabase *settingsDatabase() const; void readMainSettings(QSettings* qs); void saveMainSettings(QSettings* qs); diff --git a/ground/src/plugins/coreplugin/generalsettings.cpp b/ground/src/plugins/coreplugin/generalsettings.cpp index 2ce00c51c..f50eacda8 100644 --- a/ground/src/plugins/coreplugin/generalsettings.cpp +++ b/ground/src/plugins/coreplugin/generalsettings.cpp @@ -33,6 +33,10 @@ #include #include #include +#include + +#include +#include #include "ui_generalsettings.h" @@ -64,12 +68,52 @@ QString GeneralSettings::trCategory() const return tr("Environment"); } +static bool hasQmFilesForLocale(const QString &locale, const QString &creatorTrPath) +{ + static const QString qtTrPath = QLibraryInfo::location(QLibraryInfo::TranslationsPath); + + const QString trFile = QLatin1String("qt_") + locale + QLatin1String(".qm"); + return QFile::exists(qtTrPath+'/'+trFile) || QFile::exists(creatorTrPath+'/'+trFile); +} + +void GeneralSettings::fillLanguageBox() const +{ + const QString currentLocale = language(); + + m_page->languageBox->addItem(tr(""), QString()); + // need to add this explicitly, since there is no qm file for English + m_page->languageBox->addItem(QLatin1String("English"), QLatin1String("C")); + if (currentLocale == QLatin1String("C")) + m_page->languageBox->setCurrentIndex(m_page->languageBox->count() - 1); + + const QString creatorTrPath = + Core::ICore::instance()->resourcePath() + QLatin1String("/translations"); + const QStringList languageFiles = QDir(creatorTrPath).entryList(QStringList(QLatin1String("qtcreator*.qm"))); + + Q_FOREACH(const QString &languageFile, languageFiles) + { + int start = languageFile.indexOf(QLatin1Char('_'))+1; + int end = languageFile.lastIndexOf(QLatin1Char('.')); + const QString locale = languageFile.mid(start, end-start); + // no need to show a language that creator will not load anyway + if (hasQmFilesForLocale(locale, creatorTrPath)) { + m_page->languageBox->addItem(QLocale::languageToString(QLocale(locale).language()), locale); + if (locale == currentLocale) + m_page->languageBox->setCurrentIndex(m_page->languageBox->count() - 1); + } + } +} + + QWidget *GeneralSettings::createPage(QWidget *parent) { m_page = new Ui::GeneralSettings(); QWidget *w = new QWidget(parent); m_page->setupUi(w); + QSettings* settings = Core::ICore::instance()->settings(); + fillLanguageBox(); + m_page->colorButton->setColor(StyleHelper::baseColor()); #ifdef Q_OS_UNIX m_page->terminalEdit->setText(ConsoleProcess::terminalEmulator(Core::ICore::instance()->settings())); @@ -95,12 +139,15 @@ QWidget *GeneralSettings::createPage(QWidget *parent) void GeneralSettings::apply() { + int currentIndex = m_page->languageBox->currentIndex(); + setLanguage(m_page->languageBox->itemData(currentIndex, Qt::UserRole).toString()); // Apply the new base color if accepted StyleHelper::setBaseColor(m_page->colorButton->color()); #ifdef Q_OS_UNIX ConsoleProcess::setTerminalEmulator(Core::ICore::instance()->settings(), m_page->terminalEdit->text()); #endif + } void GeneralSettings::finish() @@ -143,3 +190,29 @@ void GeneralSettings::showHelpForExternalEditor() mb->show(); #endif } + +void GeneralSettings::resetLanguage() +{ + // system language is default + m_page->languageBox->setCurrentIndex(0); +} + +QString GeneralSettings::language() const +{ + QSettings* settings = Core::ICore::instance()->settings(); + return settings->value(QLatin1String("General/OverrideLanguage")).toString(); +} + +void GeneralSettings::setLanguage(const QString &locale) +{ + QSettings* settings = Core::ICore::instance()->settings(); + if (settings->value(QLatin1String("General/OverrideLanguage")).toString() != 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.")); + } + if (locale.isEmpty()) + settings->remove(QLatin1String("General/OverrideLanguage")); + else + settings->setValue(QLatin1String("General/OverrideLanguage"), locale); +} diff --git a/ground/src/plugins/coreplugin/generalsettings.h b/ground/src/plugins/coreplugin/generalsettings.h index 8f8d7265a..37988d1cf 100644 --- a/ground/src/plugins/coreplugin/generalsettings.h +++ b/ground/src/plugins/coreplugin/generalsettings.h @@ -57,6 +57,7 @@ public: private slots: void resetInterfaceColor(); + void resetLanguage(); void resetExternalEditor(); void showHelpForExternalEditor(); #ifdef Q_OS_UNIX @@ -64,8 +65,13 @@ private slots: #endif private: + void fillLanguageBox() const; + QString language() const; + void setLanguage(const QString&); Ui::GeneralSettings *m_page; QPointer m_dialog; + QList m_codecs; + }; } // namespace Internal diff --git a/ground/src/plugins/coreplugin/generalsettings.ui b/ground/src/plugins/coreplugin/generalsettings.ui index c4cc2c252..f6b709f07 100644 --- a/ground/src/plugins/coreplugin/generalsettings.ui +++ b/ground/src/plugins/coreplugin/generalsettings.ui @@ -17,21 +17,21 @@ General settings - + Terminal: - + External editor: - + When files are externally modified: @@ -41,7 +41,7 @@ - + @@ -51,7 +51,7 @@ - + Reset to default @@ -60,15 +60,15 @@ R - + :/core/images/reset.png:/core/images/reset.png - + - + Reset to default @@ -77,12 +77,12 @@ R - + :/core/images/reset.png:/core/images/reset.png - + ? @@ -104,7 +104,7 @@ R - + :/core/images/reset.png:/core/images/reset.png @@ -144,7 +144,7 @@ - + @@ -194,6 +194,33 @@ + + + + Language: + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + @@ -219,6 +246,8 @@
utils/qtcolorbutton.h
- + + + diff --git a/ground/src/plugins/coreplugin/icore.cpp b/ground/src/plugins/coreplugin/icore.cpp index e6de9860d..8ee9eff71 100644 --- a/ground/src/plugins/coreplugin/icore.cpp +++ b/ground/src/plugins/coreplugin/icore.cpp @@ -174,12 +174,20 @@ */ /*! - \fn QSettings *ICore::settings() const + \fn QSettings *ICore::settings(QSettings::UserScope scope) const \brief Returns the application's main settings object. You can use it to retrieve or set application wide settings (in contrast to session or project specific settings). + If \a scope is QSettings::UserScope (the default), the + users settings will be read from the users settings, with + a fallback to global settings provided with Qt Creator. + + If \a scope is QSettings::SystemScope, only the system settings + shipped with the current version of Qt Creator will be read. This + functionality exists for internal purposes only. + \see settingsDatabase() */ diff --git a/ground/src/plugins/coreplugin/icore.h b/ground/src/plugins/coreplugin/icore.h index 3032f2bd8..6d3a4adbd 100644 --- a/ground/src/plugins/coreplugin/icore.h +++ b/ground/src/plugins/coreplugin/icore.h @@ -31,6 +31,7 @@ #include "core_global.h" #include +#include QT_BEGIN_NAMESPACE class QMainWindow; @@ -84,7 +85,7 @@ public: virtual UAVGadgetInstanceManager *uavGadgetInstanceManager() const = 0; virtual MimeDatabase *mimeDatabase() const = 0; - virtual QSettings *settings() const = 0; + virtual QSettings *settings(QSettings::Scope scope = QSettings::UserScope) const = 0; virtual SettingsDatabase *settingsDatabase() const = 0; virtual void readMainSettings(QSettings* qs) = 0; virtual void saveMainSettings(QSettings* qs) = 0; diff --git a/ground/src/plugins/coreplugin/mainwindow.cpp b/ground/src/plugins/coreplugin/mainwindow.cpp index e6bd57636..63c8a5e68 100644 --- a/ground/src/plugins/coreplugin/mainwindow.cpp +++ b/ground/src/plugins/coreplugin/mainwindow.cpp @@ -109,8 +109,11 @@ MainWindow::MainWindow() : m_uniqueIDManager(new UniqueIDManager()), m_globalContext(QList() << Constants::C_GLOBAL_ID), m_additionalContexts(m_globalContext), + // keep this in sync with main() in app/main.cpp m_settings(new QSettings(QSettings::IniFormat, QSettings::UserScope, QLatin1String("OpenPilot"), QLatin1String("OpenPilotGCS"), this)), + m_globalSettings(new QSettings(QSettings::IniFormat, QSettings::SystemScope, + QLatin1String("OpenPilot"), QLatin1String("OpenPilotGCS"), this)), m_settingsDatabase(new SettingsDatabase(QFileInfo(m_settings->fileName()).path(), QLatin1String("OpenPilotGCS"), this)), @@ -785,6 +788,14 @@ MessageManager *MainWindow::messageManager() const return m_messageManager; } +QSettings *MainWindow::settings(QSettings::Scope scope) const +{ + if (scope == QSettings::UserScope) + return m_settings; + else + return m_globalSettings; +} + VariableManager *MainWindow::variableManager() const { return m_variableManager; diff --git a/ground/src/plugins/coreplugin/mainwindow.h b/ground/src/plugins/coreplugin/mainwindow.h index d5fdc49b4..6f5c7ca7d 100644 --- a/ground/src/plugins/coreplugin/mainwindow.h +++ b/ground/src/plugins/coreplugin/mainwindow.h @@ -34,6 +34,7 @@ #include "eventfilteringmainwindow.h" #include +#include QT_BEGIN_NAMESPACE class QSettings; @@ -106,7 +107,7 @@ public: Core::ModeManager *modeManager() const; Core::MimeDatabase *mimeDatabase() const; - inline QSettings *settings() const { return m_settings; } + QSettings *settings(QSettings::Scope scope) const; inline SettingsDatabase *settingsDatabase() const { return m_settingsDatabase; } IContext * currentContextObject() const; QStatusBar *statusBar() const; @@ -170,6 +171,7 @@ private: QList m_globalContext; QList m_additionalContexts; QSettings *m_settings; + QSettings *m_globalSettings; SettingsDatabase *m_settingsDatabase; ActionManagerPrivate *m_actionManager; MessageManager *m_messageManager;