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}
};