From e456b7714313bccb2b574b648761b791a848358e Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 1 Apr 2024 20:16:45 +0300 Subject: [PATCH] ugly, refactor required --- res/layouts/pages/settings-audio.xml | 23 +++++++++++++++ res/layouts/pages/settings-audio.xml.lua | 37 ++++++++++++++++++++++++ src/data/setting.cpp | 2 +- src/files/settings_io.cpp | 9 ++++++ src/files/settings_io.h | 1 + src/frontend/menu/menu.cpp | 1 + src/frontend/menu/menu_settings.cpp | 35 +--------------------- src/logic/scripting/lua/libcore.cpp | 8 +++++ 8 files changed, 81 insertions(+), 35 deletions(-) create mode 100644 res/layouts/pages/settings-audio.xml create mode 100644 res/layouts/pages/settings-audio.xml.lua diff --git a/res/layouts/pages/settings-audio.xml b/res/layouts/pages/settings-audio.xml new file mode 100644 index 00000000..27fd4097 --- /dev/null +++ b/res/layouts/pages/settings-audio.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + diff --git a/res/layouts/pages/settings-audio.xml.lua b/res/layouts/pages/settings-audio.xml.lua new file mode 100644 index 00000000..dd09fefc --- /dev/null +++ b/res/layouts/pages/settings-audio.xml.lua @@ -0,0 +1,37 @@ +function on_open() + on_master_change() + on_regular_change() + on_ui_change() + on_ambient_change() + on_music_change() +end + +function on_volume_change(setting, label, name, val) + if val ~= nil then + core.set_setting(setting, val) + end + label.text = ( + gui.str(name, "settings")..": ".. + core.str_setting(setting) + ) +end + +function on_master_change(val) + on_volume_change("audio.volume-master", document.l_master, "Master Volume", val) +end + +function on_regular_change(val) + on_volume_change("audio.volume-regular", document.l_regular, "Regular Sounds", val) +end + +function on_ui_change(val) + on_volume_change("audio.volume-ui", document.l_ui, "UI Sounds", val) +end + +function on_ambient_change(val) + on_volume_change("audio.volume-ambient", document.l_ambient, "Ambient", val) +end + +function on_music_change(val) + on_volume_change("audio.volume-music", document.l_music, "Music", val) +end diff --git a/src/data/setting.cpp b/src/data/setting.cpp index d4c78d39..ea68d769 100644 --- a/src/data/setting.cpp +++ b/src/data/setting.cpp @@ -7,7 +7,7 @@ std::string NumberSetting::toString() const { case setting_format::simple: return util::to_string(value); case setting_format::percent: - return std::to_string(static_cast(value * 100)) + "%"; + return std::to_string(static_cast(round(value * 100))) + "%"; default: return "invalid format"; } diff --git a/src/files/settings_io.cpp b/src/files/settings_io.cpp index a5960ec1..82b6a93d 100644 --- a/src/files/settings_io.cpp +++ b/src/files/settings_io.cpp @@ -32,6 +32,15 @@ dynamic::Value SettingsHandler::getValue(const std::string& name) const { } } +std::string SettingsHandler::toString(const std::string& name) const { + auto found = map.find(name); + if (found == map.end()) { + throw std::runtime_error("setting '"+name+"' does not exist"); + } + auto setting = found->second; + return setting->toString(); +} + void SettingsHandler::setValue(const std::string& name, dynamic::Value value) { auto found = map.find(name); if (found == map.end()) { diff --git a/src/files/settings_io.h b/src/files/settings_io.h index b46f6396..ec0230f6 100644 --- a/src/files/settings_io.h +++ b/src/files/settings_io.h @@ -17,6 +17,7 @@ public: dynamic::Value getValue(const std::string& name) const; void setValue(const std::string& name, dynamic::Value value); + std::string toString(const std::string& name) const; }; extern std::string write_controls(); diff --git a/src/frontend/menu/menu.cpp b/src/frontend/menu/menu.cpp index 18f8fce4..401619dd 100644 --- a/src/frontend/menu/menu.cpp +++ b/src/frontend/menu/menu.cpp @@ -271,4 +271,5 @@ void menus::refresh_menus(Engine* engine) { create_world_generators_panel(engine); add_page_loader(engine, "main"); load_page(engine, "404"); + add_page_loader(engine, "settings-audio"); } diff --git a/src/frontend/menu/menu_settings.cpp b/src/frontend/menu/menu_settings.cpp index 37e1104e..3ed2ec73 100644 --- a/src/frontend/menu/menu_settings.cpp +++ b/src/frontend/menu/menu_settings.cpp @@ -12,39 +12,6 @@ using namespace gui; -static void create_volume_trackbar( - std::shared_ptr panel, - const std::wstring& name, - NumberSetting* field -) { - panel->add(menus::create_label([=]() { - return langs::get(name, L"settings")+L": " + - util::str2wstr_utf8(field->toString()); - })); - - auto trackbar = std::make_shared(0.0, 1.0, 1.0, 0.01, 5); - trackbar->setSupplier([=]() { - return field->get(); - }); - trackbar->setConsumer([=](double value) { - field->set(value); - }); - panel->add(trackbar); -} - -void create_audio_settings_panel(Engine* engine) { - auto menu = engine->getGUI()->getMenu(); - auto panel = menus::create_page(engine, "settings-audio", 400, 0.0f, 1); - - auto& settings = engine->getSettings().audio; - create_volume_trackbar(panel, L"Master Volume", &settings.volumeMaster); - create_volume_trackbar(panel, L"Regular Sounds", &settings.volumeRegular); - create_volume_trackbar(panel, L"UI Sounds", &settings.volumeUI); - create_volume_trackbar(panel, L"Ambient", &settings.volumeAmbient); - create_volume_trackbar(panel, L"Music", &settings.volumeMusic); - panel->add(guiutil::backButton(menu)); -} - static void create_controls_panel(Engine* engine) { auto menu = engine->getGUI()->getMenu(); auto panel = menus::create_page(engine, "controls", 400, 0.0f, 1); @@ -88,7 +55,7 @@ static void create_controls_panel(Engine* engine) { } void menus::create_settings_panel(Engine* engine) { - create_audio_settings_panel(engine); + //create_audio_settings_panel(engine); create_controls_panel(engine); auto menu = engine->getGUI()->getMenu(); diff --git a/src/logic/scripting/lua/libcore.cpp b/src/logic/scripting/lua/libcore.cpp index 9872d47b..11648ff0 100644 --- a/src/logic/scripting/lua/libcore.cpp +++ b/src/logic/scripting/lua/libcore.cpp @@ -84,6 +84,13 @@ static int l_set_setting(lua_State* L) { return 0; } +static int l_str_setting(lua_State* L) { + auto name = lua_tostring(L, 1); + const auto string = scripting::engine->getSettingsHandler().toString(name); + scripting::state->pushstring(string); + return 1; +} + static int l_quit(lua_State* L) { Window::setShouldClose(true); return 0; @@ -97,6 +104,7 @@ const luaL_Reg corelib [] = { {"get_bindings", lua_wrap_errors}, {"get_setting", lua_wrap_errors}, {"set_setting", lua_wrap_errors}, + {"str_setting", lua_wrap_errors}, {"quit", lua_wrap_errors}, {NULL, NULL} };