[colobot] 233/377: Add language switcher to the settings UI, closes #506
Didier Raboud
odyx at moszumanska.debian.org
Wed Mar 30 13:34:20 UTC 2016
This is an automated email from the git hooks/post-receive script.
odyx pushed a commit to branch debian/master
in repository colobot.
commit 40352be5cc36f598fde0f8d22b15ba9495c80bfd
Author: krzys-h <krzys_h at interia.pl>
Date: Sun Jan 24 16:03:24 2016 +0100
Add language switcher to the settings UI, closes #506
---
src/CMakeLists.txt | 1 +
src/app/app.cpp | 148 +++++++++++-------------------------
src/app/app.h | 1 -
src/app/controller.cpp | 12 +--
src/app/controller.h | 4 +-
src/common/event.cpp | 1 +
src/common/event.h | 1 +
src/common/language.cpp | 54 +++++++++++++
src/common/language.h | 7 +-
src/common/settings.cpp | 29 +++++++
src/common/settings.h | 6 ++
src/level/robotmain.cpp | 19 +----
src/level/robotmain.h | 3 -
src/ui/screen/screen_setup_game.cpp | 36 ++++++++-
14 files changed, 181 insertions(+), 141 deletions(-)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 5386509..35809a4 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -87,6 +87,7 @@ set(BASE_SOURCES
common/event.cpp
common/image.cpp
common/key.cpp
+ common/language.cpp
common/logger.cpp
common/misc.cpp
common/pathman.cpp
diff --git a/src/app/app.cpp b/src/app/app.cpp
index 0a82f32..0b47cd3 100644
--- a/src/app/app.cpp
+++ b/src/app/app.cpp
@@ -245,7 +245,6 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
OPT_RUNSCENE,
OPT_SCENETEST,
OPT_LOGLEVEL,
- OPT_LANGUAGE,
OPT_LANGDIR,
OPT_DATADIR,
OPT_SAVEDIR,
@@ -262,7 +261,6 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
{ "runscene", required_argument, nullptr, OPT_RUNSCENE },
{ "scenetest", no_argument, nullptr, OPT_SCENETEST },
{ "loglevel", required_argument, nullptr, OPT_LOGLEVEL },
- { "language", required_argument, nullptr, OPT_LANGUAGE },
{ "langdir", required_argument, nullptr, OPT_LANGDIR },
{ "datadir", required_argument, nullptr, OPT_DATADIR },
{ "savedir", required_argument, nullptr, OPT_SAVEDIR },
@@ -306,7 +304,6 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
GetLogger()->Message(" -runscene sceneNNN run given scene on start\n");
GetLogger()->Message(" -scenetest win every mission right after it's loaded\n");
GetLogger()->Message(" -loglevel level set log level to level (one of: trace, debug, info, warn, error, none)\n");
- GetLogger()->Message(" -language lang set language (one of: en, de, fr, pl, ru)\n");
GetLogger()->Message(" -langdir path set custom language directory path\n");
GetLogger()->Message(" -datadir path set custom data directory path\n");
GetLogger()->Message(" -savedir path set custom save directory path (must be writable)\n");
@@ -371,19 +368,6 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
GetLogger()->SetLogLevel(logLevel);
break;
}
- case OPT_LANGUAGE:
- {
- Language language;
- if (! ParseLanguage(optarg, language))
- {
- GetLogger()->Error("Invalid language: '%s'\n", optarg);
- return PARSE_ARGS_FAIL;
- }
-
- GetLogger()->Info("Using language %s\n", optarg);
- m_language = language;
- break;
- }
case OPT_DATADIR:
{
m_pathManager->SetDataPath(optarg);
@@ -440,7 +424,6 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
bool CApplication::Create()
{
std::string path;
- bool defaultValues = false;
GetLogger()->Info("Creating CApplication\n");
@@ -454,27 +437,10 @@ bool CApplication::Create()
if (!GetConfigFile().Init())
{
- GetLogger()->Warn("Config not found. Default values will be used!\n");
- defaultValues = true;
+ GetLogger()->Warn("Config could not be loaded. Default values will be used!\n");
}
- if (GetConfigFile().GetStringProperty("Language", "Lang", path))
- {
- Language language;
- if (ParseLanguage(path, language))
- {
- m_language = language;
- GetLogger()->Info("Setting language '%s' from ini file\n", path.c_str());
- }
- else
- {
- GetLogger()->Error("Invalid language '%s' in ini file\n", path.c_str());
- }
- }
-
- SetLanguage(m_language);
-
- //Create the sound instance.
+ // Create the sound instance.
#ifdef OPENAL_SOUND
if (!m_headless)
{
@@ -647,7 +613,7 @@ bool CApplication::Create()
m_eventQueue = MakeUnique<CEventQueue>();
// Create the robot application.
- m_controller = MakeUnique<CController>(this, !defaultValues);
+ m_controller = MakeUnique<CController>();
if (m_runSceneCategory == LevelCategory::Max)
m_controller->StartApp();
@@ -1599,76 +1565,26 @@ char CApplication::GetLanguageChar() const
return langChar;
}
-bool CApplication::ParseLanguage(const std::string& str, Language& language)
-{
- if (str == "en")
- {
- language = LANGUAGE_ENGLISH;
- return true;
- }
- else if (str == "de")
- {
- language = LANGUAGE_GERMAN;
- return true;
- }
- else if (str == "fr")
- {
- language = LANGUAGE_FRENCH;
- return true;
- }
- else if (str == "pl")
- {
- language = LANGUAGE_POLISH;
- return true;
- }
- else if (str == "ru")
- {
- language = LANGUAGE_RUSSIAN;
- return true;
- }
-
- return false;
-}
-
void CApplication::SetLanguage(Language language)
{
m_language = language;
/* Gettext initialization */
- std::string locale = "";
- switch (m_language)
+ static char envLang[50] = { 0 };
+ if (envLang[0] == 0)
{
- default:
- case LANGUAGE_ENV:
- locale = "";
- break;
-
- case LANGUAGE_ENGLISH:
- locale = "en_US.utf8";
- break;
-
- case LANGUAGE_GERMAN:
- locale = "de_DE.utf8";
- break;
-
- case LANGUAGE_FRENCH:
- locale = "fr_FR.utf8";
- break;
-
- case LANGUAGE_POLISH:
- locale = "pl_PL.utf8";
- break;
-
- case LANGUAGE_RUSSIAN:
- locale = "ru_RU.utf8";
- break;
+ // Get this only at the first call, since this code modifies it
+ const char* currentEnvLang = gl_locale_name(LC_MESSAGES, "LC_MESSAGES");
+ if (currentEnvLang != nullptr)
+ {
+ strcpy(envLang, currentEnvLang);
+ }
}
- if (locale.empty())
+ if (language == LANGUAGE_ENV)
{
- const char* envLang = gl_locale_name(LC_MESSAGES, "LC_MESSAGES");
- if (envLang == nullptr)
+ if (envLang[0] == 0)
{
GetLogger()->Error("Failed to get language from environment, setting default language\n");
m_language = LANGUAGE_ENGLISH;
@@ -1704,15 +1620,41 @@ void CApplication::SetLanguage(Language language)
}
}
}
- else
+
+ std::string locale = "";
+ switch (m_language)
{
- std::string langStr = "LANGUAGE=";
- langStr += locale;
- strcpy(m_languageLocale, langStr.c_str());
- putenv(m_languageLocale);
- GetLogger()->Trace("SetLanguage: Set LANGUAGE=%s in environment\n", locale.c_str());
+ default:
+ locale = "";
+ break;
+
+ case LANGUAGE_ENGLISH:
+ locale = "en_US.utf8";
+ break;
+
+ case LANGUAGE_GERMAN:
+ locale = "de_DE.utf8";
+ break;
+
+ case LANGUAGE_FRENCH:
+ locale = "fr_FR.utf8";
+ break;
+
+ case LANGUAGE_POLISH:
+ locale = "pl_PL.utf8";
+ break;
+
+ case LANGUAGE_RUSSIAN:
+ locale = "ru_RU.utf8";
+ break;
}
+ std::string langStr = "LANGUAGE=";
+ langStr += locale;
+ strcpy(m_languageLocale, langStr.c_str());
+ putenv(m_languageLocale);
+ GetLogger()->Trace("SetLanguage: Set LANGUAGE=%s in environment\n", locale.c_str());
+
char* defaultLocale = setlocale(LC_ALL, ""); // Load system locale
GetLogger()->Debug("Default system locale: %s\n", defaultLocale);
setlocale(LC_NUMERIC, "C"); // Force numeric locale to "C" (fixes decimal point problems)
diff --git a/src/app/app.h b/src/app/app.h
index 962bf30..d8f985e 100644
--- a/src/app/app.h
+++ b/src/app/app.h
@@ -290,7 +290,6 @@ public:
Language GetLanguage() const;
char GetLanguageChar() const;
void SetLanguage(Language language);
- static bool ParseLanguage(const std::string& str, Language& language);
//@}
//! Management of sleep in main loop (lowers CPU usage)
diff --git a/src/app/controller.cpp b/src/app/controller.cpp
index 520e925..0e2f8f0 100644
--- a/src/app/controller.cpp
+++ b/src/app/controller.cpp
@@ -26,25 +26,15 @@
-CController::CController(CApplication* app, bool configLoaded)
- : m_app(app)
+CController::CController()
{
m_main = MakeUnique<CRobotMain>();
- if (configLoaded)
- m_main->LoadConfigFile();
- else
- m_main->CreateConfigFile();
}
CController::~CController()
{
}
-CApplication* CController::GetApplication()
-{
- return m_app;
-}
-
CRobotMain* CController::GetRobotMain()
{
return m_main.get();
diff --git a/src/app/controller.h b/src/app/controller.h
index c061d22..985bae3 100644
--- a/src/app/controller.h
+++ b/src/app/controller.h
@@ -40,11 +40,9 @@ struct Event;
class CController
{
public:
- CController(CApplication* app, bool configLoaded = true);
+ CController();
~CController();
- //! Return CApplication instance
- CApplication* GetApplication();
//! Return CRobotMain instance
CRobotMain* GetRobotMain();
diff --git a/src/common/event.cpp b/src/common/event.cpp
index 1684ad5..6e5398d 100644
--- a/src/common/event.cpp
+++ b/src/common/event.cpp
@@ -227,6 +227,7 @@ void InitializeEventTypeTexts()
EVENT_TYPE_TEXT[EVENT_INTERFACE_SHADOW_MAPPING] = "EVENT_INTERFACE_SHADOW_MAPPING";
EVENT_TYPE_TEXT[EVENT_INTERFACE_SHADOW_MAPPING_QUALITY] = "EVENT_INTERFACE_SHADOW_MAPPING_QUALITY";
EVENT_TYPE_TEXT[EVENT_INTERFACE_SHADOW_MAPPING_BUFFER] = "EVENT_INTERFACE_SHADOW_MAPPING_BUFFER";
+ EVENT_TYPE_TEXT[EVENT_INTERFACE_LANGUAGE] = "EVENT_INTERFACE_LANGUAGE";
EVENT_TYPE_TEXT[EVENT_INTERFACE_KINFO1] = "EVENT_INTERFACE_KINFO1";
EVENT_TYPE_TEXT[EVENT_INTERFACE_KINFO2] = "EVENT_INTERFACE_KINFO2";
diff --git a/src/common/event.h b/src/common/event.h
index 88fd282..e458dfd 100644
--- a/src/common/event.h
+++ b/src/common/event.h
@@ -255,6 +255,7 @@ enum EventType
EVENT_INTERFACE_SHADOW_MAPPING = 787,
EVENT_INTERFACE_SHADOW_MAPPING_QUALITY = 788,
EVENT_INTERFACE_SHADOW_MAPPING_BUFFER = 789,
+ EVENT_INTERFACE_LANGUAGE = 790,
EVENT_INTERFACE_KINFO1 = 500,
EVENT_INTERFACE_KINFO2 = 501,
diff --git a/src/common/language.cpp b/src/common/language.cpp
new file mode 100644
index 0000000..94a8e48
--- /dev/null
+++ b/src/common/language.cpp
@@ -0,0 +1,54 @@
+/*
+ * This file is part of the Colobot: Gold Edition source code
+ * Copyright (C) 2001-2016, Daniel Roux, EPSITEC SA & TerranovaTeam
+ * http://epsitec.ch; http://colobot.info; http://github.com/colobot
+ *
+ * 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, see http://gnu.org/licenses
+ */
+
+#include "common/language.h"
+
+#include <map>
+
+const std::map<Language, std::string> LANGUAGE_MAP = {
+ { LANGUAGE_ENGLISH, "en" },
+ { LANGUAGE_GERMAN, "de" },
+ { LANGUAGE_FRENCH, "fr" },
+ { LANGUAGE_POLISH, "pl" },
+ { LANGUAGE_RUSSIAN, "ru" }
+};
+
+bool ParseLanguage(const std::string& str, Language& language)
+{
+ for (auto it = LANGUAGE_MAP.begin(); it != LANGUAGE_MAP.end(); ++it)
+ {
+ if (it->second == str)
+ {
+ language = it->first;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool LanguageToString(const Language& language, std::string& str)
+{
+ if (LANGUAGE_MAP.count(language) > 0)
+ {
+ str = LANGUAGE_MAP.at(language);
+ return true;
+ }
+ return false;
+}
\ No newline at end of file
diff --git a/src/common/language.h b/src/common/language.h
index 42f213a..b0988c5 100644
--- a/src/common/language.h
+++ b/src/common/language.h
@@ -1,6 +1,6 @@
/*
* This file is part of the Colobot: Gold Edition source code
- * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam
+ * Copyright (C) 2001-2016, Daniel Roux, EPSITEC SA & TerranovaTeam
* http://epsitec.ch; http://colobot.info; http://github.com/colobot
*
* This program is free software: you can redistribute it and/or modify
@@ -19,6 +19,8 @@
#pragma once
+#include <string>
+
/**
* \enum Language
* \brief Application language
@@ -32,3 +34,6 @@ enum Language
LANGUAGE_POLISH = 3,
LANGUAGE_RUSSIAN = 4
};
+
+bool ParseLanguage(const std::string& str, Language& language);
+bool LanguageToString(const Language& language, std::string& str);
\ No newline at end of file
diff --git a/src/common/settings.cpp b/src/common/settings.cpp
index ed2677c..e845c33 100644
--- a/src/common/settings.cpp
+++ b/src/common/settings.cpp
@@ -23,6 +23,7 @@
#include "app/input.h"
#include "common/config_file.h"
+#include "common/logger.h"
#include "graphics/engine/camera.h"
#include "graphics/engine/engine.h"
@@ -49,6 +50,8 @@ CSettings::CSettings()
m_IODim = Math::Point(320.0f/640.0f, (121.0f+18.0f*8)/480.0f);
m_IOPos.x = (1.0f-m_IODim.x)/2.0f; // in the middle
m_IOPos.y = (1.0f-m_IODim.y)/2.0f;
+
+ m_language = LANGUAGE_ENV;
}
void CSettings::SaveResolutionSettings(const Gfx::DeviceConfig& config)
@@ -120,6 +123,9 @@ void CSettings::SaveSettings()
GetConfigFile().SetFloatProperty("Edit", "IODimX", m_IODim.x);
GetConfigFile().SetFloatProperty("Edit", "IODimY", m_IODim.y);
+ std::string lang = "";
+ LanguageToString(m_language, lang);
+ GetConfigFile().SetStringProperty("Language", "Lang", lang);
GetConfigFile().Save();
}
@@ -135,6 +141,7 @@ void CSettings::LoadSettings()
int iValue = 0;
float fValue = 0.0f;
bool bValue = false;
+ std::string sValue = "";
GetConfigFile().GetBoolProperty("Setup", "Tooltips", m_tooltips);
GetConfigFile().GetBoolProperty("Setup", "InterfaceGlint", m_interfaceGlint);
@@ -269,6 +276,17 @@ void CSettings::LoadSettings()
GetConfigFile().GetFloatProperty("Edit", "IOPosY", m_IOPos.y);
GetConfigFile().GetFloatProperty("Edit", "IODimX", m_IODim.x);
GetConfigFile().GetFloatProperty("Edit", "IODimY", m_IODim.y);
+
+ m_language = LANGUAGE_ENV;
+ if (GetConfigFile().GetStringProperty("Language", "Lang", sValue))
+ {
+ if (!sValue.empty() && !ParseLanguage(sValue, m_language))
+ {
+ GetLogger()->Error("Failed to parse language '%s' from config file. Default language will be used.\n",
+ sValue.c_str());
+ }
+ }
+ app->SetLanguage(m_language);
}
void CSettings::SetTooltips(bool tooltips)
@@ -392,3 +410,14 @@ Math::Point CSettings::GetIODim()
{
return m_IODim;
}
+
+void CSettings::SetLanguage(Language language)
+{
+ m_language = language;
+ CApplication::GetInstancePointer()->SetLanguage(m_language);
+}
+
+Language CSettings::GetLanguage()
+{
+ return m_language;
+}
diff --git a/src/common/settings.h b/src/common/settings.h
index a6006e4..018f9af 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -19,6 +19,7 @@
#pragma once
+#include "common/language.h"
#include "common/singleton.h"
#include "math/point.h"
@@ -80,6 +81,9 @@ public:
Math::Point GetIODim();
//@}
+ void SetLanguage(Language language);
+ Language GetLanguage();
+
protected:
bool m_tooltips;
bool m_interfaceGlint;
@@ -94,4 +98,6 @@ protected:
bool m_IOPublic;
Math::Point m_IOPos;
Math::Point m_IODim;
+
+ Language m_language;
};
diff --git a/src/level/robotmain.cpp b/src/level/robotmain.cpp
index 09c6c97..2bedfaf 100644
--- a/src/level/robotmain.cpp
+++ b/src/level/robotmain.cpp
@@ -262,6 +262,10 @@ CRobotMain::CRobotMain()
m_engine->SetTracePrecision(1.0f);
+ m_settings->LoadSettings();
+ m_settings->SaveSettings();
+ m_settings->SaveResolutionSettings(m_app->GetVideoConfig());
+
SelectPlayer(CPlayerProfile::GetLastName());
CScriptFunctions::Init();
@@ -321,21 +325,6 @@ void CRobotMain::ReloadAllTextures()
}
}
-
-//! Creates the file colobot.ini at the first time
-void CRobotMain::CreateConfigFile()
-{
- m_settings->SaveSettings();
- m_settings->SaveResolutionSettings(m_app->GetVideoConfig());
-
- GetConfigFile().Save();
-}
-
-void CRobotMain::LoadConfigFile()
-{
- m_settings->LoadSettings();
-}
-
std::string PhaseToString(Phase phase)
{
if (phase == PHASE_WELCOME1) return "PHASE_WELCOME1";
diff --git a/src/level/robotmain.h b/src/level/robotmain.h
index 7fce814..fe7e40e 100644
--- a/src/level/robotmain.h
+++ b/src/level/robotmain.h
@@ -160,9 +160,6 @@ public:
Ui::CDisplayText* GetDisplayText();
CPauseManager* GetPauseManager();
- void CreateConfigFile();
- void LoadConfigFile();
-
void ResetAfterVideoConfigChanged();
void ReloadAllTextures();
diff --git a/src/ui/screen/screen_setup_game.cpp b/src/ui/screen/screen_setup_game.cpp
index db5e154..5e3994a 100644
--- a/src/ui/screen/screen_setup_game.cpp
+++ b/src/ui/screen/screen_setup_game.cpp
@@ -31,6 +31,7 @@
#include "ui/controls/check.h"
#include "ui/controls/interface.h"
#include "ui/controls/label.h"
+#include "ui/controls/list.h"
#include "ui/controls/slider.h"
#include "ui/controls/window.h"
@@ -52,6 +53,7 @@ void CScreenSetupGame::CreateInterface()
CLabel* pl;
CCheck* pc;
CSlider* psl;
+ CList* pli;
Math::Point pos, ddim;
std::string name;
@@ -131,6 +133,19 @@ void CScreenSetupGame::CreateInterface()
pos.y -= 0.048f;
pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_EDITVALUE);
pc->SetState(STATE_SHADOW);
+ pos.y -= 0.048f;
+
+ ddim.y = dim.y*3.0f;
+ pos.y -= ddim.y;
+ pli = pw->CreateList(pos, ddim, 0, EVENT_INTERFACE_LANGUAGE);
+ pli->SetState(STATE_SHADOW);
+ // TODO: Add something like GetSupportedLanguages() and GetLanguageFriendlyName() for this
+ pli->SetItemName(1+LANGUAGE_ENV, "[System default]");
+ pli->SetItemName(1+LANGUAGE_ENGLISH, "English");
+ pli->SetItemName(1+LANGUAGE_FRENCH, "French");
+ pli->SetItemName(1+LANGUAGE_GERMAN, "German");
+ pli->SetItemName(1+LANGUAGE_POLISH, "Polish");
+ pli->SetItemName(1+LANGUAGE_RUSSIAN, "Russian");
UpdateSetupButtons();
}
@@ -227,11 +242,8 @@ bool CScreenSetupGame::EventProcess(const Event &event)
break;
case EVENT_INTERFACE_AUTOSAVE_INTERVAL:
- ChangeSetupButtons();
- UpdateSetupButtons();
- break;
-
case EVENT_INTERFACE_AUTOSAVE_SLOTS:
+ case EVENT_INTERFACE_LANGUAGE:
ChangeSetupButtons();
UpdateSetupButtons();
break;
@@ -249,6 +261,7 @@ void CScreenSetupGame::UpdateSetupButtons()
CWindow* pw;
CCheck* pc;
CSlider* ps;
+ CList* pli;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5));
if ( pw == nullptr ) return;
@@ -345,6 +358,12 @@ void CScreenSetupGame::UpdateSetupButtons()
ps->SetState(STATE_ENABLE, m_main->GetAutosave());
ps->SetVisibleValue(m_main->GetAutosaveSlots());
}
+
+ pli = static_cast<CList*>(pw->SearchControl(EVENT_INTERFACE_LANGUAGE));
+ if ( pli != nullptr )
+ {
+ pli->SetSelect(1+m_settings->GetLanguage());
+ }
}
// Updates the engine function of the buttons after the setup phase.
@@ -353,6 +372,7 @@ void CScreenSetupGame::ChangeSetupButtons()
{
CWindow* pw;
CSlider* ps;
+ CList* pli;
float value;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5));
@@ -371,6 +391,14 @@ void CScreenSetupGame::ChangeSetupButtons()
value = ps->GetVisibleValue();
m_main->SetAutosaveSlots(static_cast<int>(round(value)));
}
+
+ pli = static_cast<CList*>(pw->SearchControl(EVENT_INTERFACE_LANGUAGE));
+ if ( pli != nullptr )
+ {
+ m_settings->SetLanguage(static_cast<Language>(pli->GetSelect()-1));
+ // TODO: A really ugly way to apply the change immediately
+ m_main->ChangePhase(m_main->GetPhase());
+ }
}
} // namespace Ui
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git
More information about the Pkg-games-commits
mailing list