Language settings menu

This commit is contained in:
MihailRis
2023-12-13 04:04:23 +03:00
parent e97eb441d5
commit 4de8759ea2
10 changed files with 104 additions and 33 deletions
+2 -1
View File
@@ -28,8 +28,9 @@ settings.Fog Curve=Кривая Тумана
settings.Backlight=Подсветка settings.Backlight=Подсветка
settings.V-Sync=Вертикальная Синхронизация settings.V-Sync=Вертикальная Синхронизация
FOV=Поле Зрения settings.FOV=Поле Зрения
settings.Mouse Sensitivity=Чувствительность Мыши settings.Mouse Sensitivity=Чувствительность Мыши
settings.Language=Язык
# Управление # Управление
movement.forward=Вперёд movement.forward=Вперёд
+7 -4
View File
@@ -34,6 +34,7 @@
using std::unique_ptr; using std::unique_ptr;
using std::shared_ptr; using std::shared_ptr;
using std::string; using std::string;
using std::vector;
using std::filesystem::path; using std::filesystem::path;
using glm::vec3; using glm::vec3;
using gui::GUI; using gui::GUI;
@@ -60,15 +61,13 @@ Engine::Engine(EngineSettings& settings, EnginePaths* paths, Content* content)
Audio::initialize(); Audio::initialize();
gui = new GUI(); gui = new GUI();
std::vector<const ContentPack*> packs;
auto resdir = paths->getResources(); auto resdir = paths->getResources();
auto base = std::make_unique<ContentPack>("base", resdir/path("content/base")); contentPacks.push_back(ContentPack("base", resdir/path("content/base")));
packs.push_back(base.get());
if (settings.ui.language == "auto") { if (settings.ui.language == "auto") {
settings.ui.language = platform::detect_locale(); settings.ui.language = platform::detect_locale();
} }
langs::setup(resdir, settings.ui.language, packs); langs::setup(resdir, settings.ui.language, contentPacks);
std::cout << "-- initializing finished" << std::endl; std::cout << "-- initializing finished" << std::endl;
} }
@@ -148,6 +147,10 @@ const Content* Engine::getContent() const {
return content; return content;
} }
vector<ContentPack>& Engine::getContentPacks() {
return contentPacks;
}
EnginePaths* Engine::getPaths() { EnginePaths* Engine::getPaths() {
return paths; return paths;
} }
+5
View File
@@ -3,10 +3,13 @@
#include <string> #include <string>
#include <memory> #include <memory>
#include <vector>
#include <stdexcept> #include <stdexcept>
#include "typedefs.h" #include "typedefs.h"
#include "settings.h" #include "settings.h"
#include "content/ContentPack.h"
class Assets; class Assets;
class Level; class Level;
class Screen; class Screen;
@@ -25,6 +28,7 @@ public:
class Engine { class Engine {
Assets* assets; Assets* assets;
std::shared_ptr<Screen> screen = nullptr; std::shared_ptr<Screen> screen = nullptr;
std::vector<ContentPack> contentPacks;
EngineSettings& settings; EngineSettings& settings;
Content* content; Content* content;
EnginePaths* paths; EnginePaths* paths;
@@ -48,6 +52,7 @@ public:
void setScreen(std::shared_ptr<Screen> screen); void setScreen(std::shared_ptr<Screen> screen);
EnginePaths* getPaths(); EnginePaths* getPaths();
const Content* getContent() const; const Content* getContent() const;
std::vector<ContentPack>& getContentPacks();
}; };
#endif // SRC_ENGINE_H_ #endif // SRC_ENGINE_H_
+15
View File
@@ -87,6 +87,13 @@ wstring Button::text() const {
return L""; return L"";
} }
Button* Button::textSupplier(wstringsupplier supplier) {
if (label) {
Label* label = (Label*)(this->label.get());
label->textSupplier(supplier);
}
return this;
}
void Button::drawBackground(Batch2D* batch, Assets* assets) { void Button::drawBackground(Batch2D* batch, Assets* assets) {
vec2 coord = calcCoord(); vec2 coord = calcCoord();
batch->texture(nullptr); batch->texture(nullptr);
@@ -112,6 +119,14 @@ Button* Button::listenAction(onaction action) {
return this; return this;
} }
void Button::textAlign(Align align) {
if (label) {
Label* label = (Label*)(this->label.get());
label->align(align);
refresh();
}
}
// ================================ TextBox =================================== // ================================ TextBox ===================================
TextBox::TextBox(wstring placeholder, vec4 padding) TextBox::TextBox(wstring placeholder, vec4 padding)
: Panel(vec2(200,32), padding, 0, false), : Panel(vec2(200,32), padding, 0, false),
+4
View File
@@ -57,8 +57,12 @@ namespace gui {
virtual void mouseRelease(GUI*, int x, int y) override; virtual void mouseRelease(GUI*, int x, int y) override;
virtual Button* listenAction(onaction action); virtual Button* listenAction(onaction action);
virtual void textAlign(Align align);
virtual void text(std::wstring text); virtual void text(std::wstring text);
virtual std::wstring text() const; virtual std::wstring text() const;
virtual Button* textSupplier(wstringsupplier supplier);
}; };
class TextBox : public Panel { class TextBox : public Panel {
+11 -7
View File
@@ -17,7 +17,7 @@ using std::filesystem::path;
namespace fs = std::filesystem; namespace fs = std::filesystem;
unique_ptr<langs::Lang> langs::current; unique_ptr<langs::Lang> langs::current;
vector<langs::LocaleInfo> langs::locales_info; unordered_map<string, langs::LocaleInfo> langs::locales_info;
langs::Lang::Lang(string locale) : locale(locale) { langs::Lang::Lang(string locale) : locale(locale) {
} }
@@ -34,6 +34,10 @@ void langs::Lang::put(const wstring& key, const wstring& text) {
map[key] = text; map[key] = text;
} }
const string& langs::Lang::getId() const {
return locale;
}
/* Language key-value txt files parser */ /* Language key-value txt files parser */
class Reader : public BasicParser { class Reader : public BasicParser {
void skipWhitespace() override { void skipWhitespace() override {
@@ -84,14 +88,14 @@ void langs::loadLocalesInfo(const path& resdir, string& fallback) {
} }
std::cout << "locale " << entry.first << " (" << name << ") added" << std::endl; std::cout << "locale " << entry.first << " (" << name << ") added" << std::endl;
langs::locales_info.push_back(LocaleInfo {entry.first, name}); langs::locales_info[entry.first] = LocaleInfo {entry.first, name};
} }
} }
} }
void langs::load(const path& resdir, void langs::load(const path& resdir,
const string& locale, const string& locale,
vector<const ContentPack*>& packs, const vector<ContentPack>& packs,
Lang& lang) { Lang& lang) {
path filename = path(TEXTS_FOLDER)/path(locale + LANG_FILE_EXT); path filename = path(TEXTS_FOLDER)/path(locale + LANG_FILE_EXT);
path core_file = resdir/filename; path core_file = resdir/filename;
@@ -101,11 +105,11 @@ void langs::load(const path& resdir,
reader.read(lang, ""); reader.read(lang, "");
} }
for (auto pack : packs) { for (auto pack : packs) {
path file = pack->getFolder()/filename; path file = pack.getFolder()/filename;
if (fs::is_regular_file(file)) { if (fs::is_regular_file(file)) {
string text = files::read_string(file); string text = files::read_string(file);
Reader reader(file.string(), text); Reader reader(file.string(), text);
reader.read(lang, pack->getId()+":"); reader.read(lang, pack.getId()+":");
} }
} }
} }
@@ -113,7 +117,7 @@ void langs::load(const path& resdir,
void langs::load(const path& resdir, void langs::load(const path& resdir,
const string& locale, const string& locale,
const string& fallback, const string& fallback,
vector<const ContentPack*>& packs) { const vector<ContentPack>& packs) {
unique_ptr<Lang> lang (new Lang(locale)); unique_ptr<Lang> lang (new Lang(locale));
load(resdir, fallback, packs, *lang.get()); load(resdir, fallback, packs, *lang.get());
load(resdir, locale, packs, *lang.get()); load(resdir, locale, packs, *lang.get());
@@ -122,7 +126,7 @@ void langs::load(const path& resdir,
void langs::setup(const path& resdir, void langs::setup(const path& resdir,
const string& locale, const string& locale,
vector<const ContentPack*>& packs) { const vector<ContentPack>& packs) {
string fallback = langs::FALLBACK_DEFAULT; string fallback = langs::FALLBACK_DEFAULT;
langs::loadLocalesInfo(resdir, fallback); langs::loadLocalesInfo(resdir, fallback);
langs::load(resdir, locale, fallback, packs); langs::load(resdir, locale, fallback, packs);
+7 -5
View File
@@ -7,7 +7,7 @@
#include <filesystem> #include <filesystem>
#include <unordered_map> #include <unordered_map>
class ContentPack; #include "../../content/ContentPack.h"
namespace langs { namespace langs {
const char LANG_FILE_EXT[] = ".txt"; const char LANG_FILE_EXT[] = ".txt";
@@ -32,6 +32,8 @@ namespace langs {
const std::wstring& get(const std::wstring& key) const; const std::wstring& get(const std::wstring& key) const;
void put(const std::wstring& key, const std::wstring& text); void put(const std::wstring& key, const std::wstring& text);
const std::string& getId() const;
}; };
struct LocaleInfo { struct LocaleInfo {
@@ -40,7 +42,7 @@ namespace langs {
}; };
extern std::unique_ptr<Lang> current; extern std::unique_ptr<Lang> current;
extern std::vector<LocaleInfo> locales_info; extern std::unordered_map<std::string, LocaleInfo> locales_info;
extern void loadLocalesInfo( extern void loadLocalesInfo(
const std::filesystem::path& resdir, const std::filesystem::path& resdir,
@@ -48,12 +50,12 @@ namespace langs {
extern void load(const std::filesystem::path& resdir, extern void load(const std::filesystem::path& resdir,
const std::string& locale, const std::string& locale,
std::vector<const ContentPack*>& packs, const std::vector<ContentPack>& packs,
Lang& lang); Lang& lang);
extern void load(const std::filesystem::path& resdir, extern void load(const std::filesystem::path& resdir,
const std::string& locale, const std::string& locale,
const std::string& fallback, const std::string& fallback,
std::vector<const ContentPack*>& packs); const std::vector<ContentPack>& packs);
extern const std::wstring& get(const std::wstring& key); extern const std::wstring& get(const std::wstring& key);
extern const std::wstring& get(const std::wstring& key, extern const std::wstring& get(const std::wstring& key,
@@ -61,7 +63,7 @@ namespace langs {
extern void setup(const std::filesystem::path& resdir, extern void setup(const std::filesystem::path& resdir,
const std::string& locale, const std::string& locale,
std::vector<const ContentPack*>& packs); const std::vector<ContentPack>& packs);
} }
#endif // FRONTEND_LOCALE_LANGS_H #endif // FRONTEND_LOCALE_LANGS_H
+51
View File
@@ -21,6 +21,7 @@
#include "../settings.h" #include "../settings.h"
#include "../content/Content.h" #include "../content/Content.h"
#include "../content/ContentLUT.h" #include "../content/ContentLUT.h"
#include "../content/ContentPack.h"
#include "gui/gui_util.h" #include "gui/gui_util.h"
#include "locale/langs.h" #include "locale/langs.h"
@@ -37,6 +38,12 @@ using std::filesystem::u8path;
using std::filesystem::directory_iterator; using std::filesystem::directory_iterator;
using namespace gui; using namespace gui;
Panel* create_main_menu_panel(Engine* engine, PagesControl* menu);
Panel* create_new_world_panel(Engine* engine, PagesControl* menu);
Panel* create_controls_panel(Engine* engine, PagesControl* menu);
Panel* create_settings_panel(Engine* engine, PagesControl* menu);
Panel* create_pause_panel(Engine* engine, PagesControl* menu);
Panel* create_languages_panel(Engine* engine, PagesControl* menu);
void show_content_missing(GUI* gui, const Content* content, ContentLUT* lut) { void show_content_missing(GUI* gui, const Content* content, ContentLUT* lut) {
PagesControl* menu = gui->getMenu(); PagesControl* menu = gui->getMenu();
@@ -91,6 +98,42 @@ void show_convert_request(GUI* gui, const Content* content, ContentLUT* lut,
}, L"", langs::get(L"Cancel")); }, L"", langs::get(L"Cancel"));
} }
void create_menus(Engine* engine, PagesControl* menu) {
menu->add("new-world", create_new_world_panel(engine, menu));
menu->add("settings", create_settings_panel(engine, menu));
menu->add("controls", create_controls_panel(engine, menu));
menu->add("pause", create_pause_panel(engine, menu));
menu->add("languages", create_languages_panel(engine, menu));
menu->add("main", create_main_menu_panel(engine, menu));
}
Panel* create_languages_panel(Engine* engine, PagesControl* menu) {
Panel* panel = new Panel(vec2(400, 200), vec4(5.0f), 1.0f);
panel->scrollable(true);
std::vector<string> locales;
for (auto& entry : langs::locales_info) {
locales.push_back(entry.first);
}
std::sort(locales.begin(), locales.end());
for (string& name : locales) {
auto& locale = langs::locales_info.at(name);
string& fullName = locale.name;
Button* button = new Button(util::str2wstr_utf8(fullName), vec4(10.f));
button->listenAction([=](GUI*) {
auto resdir = engine->getPaths()->getResources();
langs::setup(resdir, name, engine->getContentPacks());
engine->getSettings().ui.language = name;
create_menus(engine, menu);
menu->back();
});
panel->add(button);
}
panel->add(guiutil::backButton(menu));
panel->refresh();
return panel;
}
Panel* create_main_menu_panel(Engine* engine, PagesControl* menu) { Panel* create_main_menu_panel(Engine* engine, PagesControl* menu) {
EnginePaths* paths = engine->getPaths(); EnginePaths* paths = engine->getPaths();
@@ -384,6 +427,14 @@ Panel* create_settings_panel(Engine* engine, PagesControl* menu) {
panel->add(checkpanel); panel->add(checkpanel);
} }
{
string langName = langs::locales_info.at(langs::current->getId()).name;
panel->add(guiutil::gotoButton(
langs::get(L"Language", L"settings")+L": "+
util::str2wstr_utf8(langName),
"languages", menu));
}
panel->add(guiutil::gotoButton(langs::get(L"Controls", L"menu"), "controls", menu)); panel->add(guiutil::gotoButton(langs::get(L"Controls", L"menu"), "controls", menu));
panel->add(guiutil::backButton(menu)); panel->add(guiutil::backButton(menu));
panel->refresh(); panel->refresh();
+1 -6
View File
@@ -4,14 +4,9 @@
class Engine; class Engine;
namespace gui { namespace gui {
class Panel;
class PagesControl; class PagesControl;
} }
gui::Panel* create_main_menu_panel(Engine* engine, gui::PagesControl* menu); void create_menus(Engine* engine, gui::PagesControl* menu);
gui::Panel* create_new_world_panel(Engine* engine, gui::PagesControl* menu);
gui::Panel* create_controls_panel(Engine* engine, gui::PagesControl* menu);
gui::Panel* create_settings_panel(Engine* engine, gui::PagesControl* menu);
gui::Panel* create_pause_panel(Engine* engine, gui::PagesControl* menu);
#endif // FRONTEND_MENU_H_ #endif // FRONTEND_MENU_H_
+1 -10
View File
@@ -45,16 +45,7 @@ MenuScreen::MenuScreen(Engine* engine_) : Screen(engine_) {
auto menu = engine->getGUI()->getMenu(); auto menu = engine->getGUI()->getMenu();
// Create pages if not created yet // Create pages if not created yet
if (!menu->has("new-world")) create_menus(engine, menu);
menu->add("new-world", create_new_world_panel(engine, menu));
if (!menu->has("settings"))
menu->add("settings", create_settings_panel(engine, menu));
if (!menu->has("controls"))
menu->add("controls", create_controls_panel(engine, menu));
if (!menu->has("pause"))
menu->add("pause", create_pause_panel(engine, menu));
menu->add("main", create_main_menu_panel(engine, menu));
menu->reset(); menu->reset();
menu->set("main"); menu->set("main");