diff --git a/src/data/setting.cpp b/src/data/setting.cpp index 2b35dc78..07af28e2 100644 --- a/src/data/setting.cpp +++ b/src/data/setting.cpp @@ -2,13 +2,19 @@ #include "../util/stringutil.h" -std::string NumberSetting::toString() const { +template +std::string NumberSetting::toString() const { switch (getFormat()) { 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(value * 100)) + "%"; default: return "invalid format"; } } + +template class NumberSetting; +template class NumberSetting; +template class NumberSetting; +template class NumberSetting; diff --git a/src/data/setting.h b/src/data/setting.h index 6d3313fe..479fc563 100644 --- a/src/data/setting.h +++ b/src/data/setting.h @@ -7,29 +7,15 @@ enum class setting_format { simple, percent }; -template class Setting { protected: - T value; setting_format format; public: - Setting(T value, setting_format format) : value(value), format(format) { + Setting(setting_format format) : format(format) { } virtual ~Setting() {} - T& operator*() { - return value; - } - - virtual const T& get() const { - return value; - } - - virtual void set(const T& value) { - this->value = value; - } - virtual setting_format getFormat() const { return format; } @@ -37,33 +23,43 @@ public: virtual std::string toString() const = 0; }; -class NumberSetting : public Setting { +template +class NumberSetting : public Setting { protected: - double min; - double max; + T value; + T min; + T max; public: - NumberSetting(double value, double min, double max, setting_format format) - : Setting(value, format), min(min), max(max) {} + NumberSetting(T value, T min, T max, setting_format format) + : Setting(format), value(value), min(min), max(max) {} - double& operator*() { + T& operator*() { return value; } - double getMin() const { + T get() const { + return value; + } + + void set(T value) { + this->value = value; + } + + T getMin() const { return min; } - double getMax() const { + T getMax() const { return max; } - double getT() const { + T getT() const { return (value - min) / (max - min); } virtual std::string toString() const override; - static inline NumberSetting createPercent(double def) { + static inline NumberSetting createPercent(T def) { return NumberSetting(def, 0.0, 1.0, setting_format::percent); } }; diff --git a/src/engine.cpp b/src/engine.cpp index 75d8722a..420182f1 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -84,7 +84,10 @@ Engine::Engine(EngineSettings& settings, EnginePaths* paths) } gui = std::make_unique(); if (settings.ui.language == "auto") { - settings.ui.language = langs::locale_by_envlocale(platform::detect_locale(), paths->getResources()); + settings.ui.language = langs::locale_by_envlocale( + platform::detect_locale(), + paths->getResources() + ); } if (ENGINE_VERSION_INDEV) { menus::create_version_label(this); diff --git a/src/engine.h b/src/engine.h index 0082f8e6..419a9ecf 100644 --- a/src/engine.h +++ b/src/engine.h @@ -116,6 +116,7 @@ public: /// @brief Get current screen std::shared_ptr getScreen(); + /// @brief Enqueue function call to the end of current frame in draw thread void postRunnable(runnable callback); }; diff --git a/src/frontend/menu/menu_settings.cpp b/src/frontend/menu/menu_settings.cpp index 51acf1b0..49fadfa6 100644 --- a/src/frontend/menu/menu_settings.cpp +++ b/src/frontend/menu/menu_settings.cpp @@ -15,7 +15,7 @@ using namespace gui; static void create_volume_trackbar( std::shared_ptr panel, const std::wstring& name, - NumberSetting* field + NumberSetting* field ) { panel->add(menus::create_label([=]() { return langs::get(name, L"settings")+L": " + diff --git a/src/settings.h b/src/settings.h index b859f6a4..65d56f99 100644 --- a/src/settings.h +++ b/src/settings.h @@ -11,11 +11,11 @@ struct AudioSettings { /// @brief try to initialize AL backend bool enabled = true; - NumberSetting volumeMaster = NumberSetting::createPercent(1.0); - NumberSetting volumeRegular = NumberSetting::createPercent(1.0); - NumberSetting volumeUI = NumberSetting::createPercent(1.0); - NumberSetting volumeAmbient = NumberSetting::createPercent(1.0); - NumberSetting volumeMusic = NumberSetting::createPercent(1.0); + NumberSetting volumeMaster {1.0f, 0.0f, 1.0f, setting_format::percent}; + NumberSetting volumeRegular {1.0f, 0.0f, 1.0f, setting_format::percent}; + NumberSetting volumeUI {1.0f, 0.0f, 1.0f, setting_format::percent}; + NumberSetting volumeAmbient {1.0f, 0.0f, 1.0f, setting_format::percent}; + NumberSetting volumeMusic {1.0f, 0.0f, 1.0f, setting_format::percent}; }; struct DisplaySettings { diff --git a/src/voxel_engine.cpp b/src/voxel_engine.cpp index 1552dd0c..01a98561 100644 --- a/src/voxel_engine.cpp +++ b/src/voxel_engine.cpp @@ -20,40 +20,40 @@ namespace fs = std::filesystem; int main(int argc, char** argv) { - EnginePaths paths; - if (!parse_cmdline(argc, argv, paths)) - return EXIT_SUCCESS; + EnginePaths paths; + if (!parse_cmdline(argc, argv, paths)) + return EXIT_SUCCESS; - platform::configure_encoding(); + platform::configure_encoding(); fs::path userfiles = paths.getUserfiles(); - try { - EngineSettings settings; - std::unique_ptr wrapper (create_wrapper(settings)); + try { + EngineSettings settings; + std::unique_ptr wrapper (create_wrapper(settings)); - fs::path settings_file = userfiles/fs::path(SETTINGS_FILE); - fs::path controls_file = userfiles/fs::path(CONTROLS_FILE); - if (fs::is_regular_file(settings_file)) { - std::cout << "-- loading settings" << std::endl; - std::string text = files::read_string(settings_file); - toml::Reader reader(wrapper.get(), settings_file.string(), text); - reader.read(); - } + fs::path settings_file = userfiles/fs::path(SETTINGS_FILE); + fs::path controls_file = userfiles/fs::path(CONTROLS_FILE); + if (fs::is_regular_file(settings_file)) { + std::cout << "-- loading settings" << std::endl; + std::string text = files::read_string(settings_file); + toml::Reader reader(wrapper.get(), settings_file.string(), text); + reader.read(); + } corecontent::setup_bindings(); - Engine engine(settings, &paths); - if (fs::is_regular_file(controls_file)) { - std::cout << "-- loading controls" << std::endl; - std::string text = files::read_string(controls_file); - load_controls(controls_file.string(), text); - } - engine.mainloop(); - - std::cout << "-- saving settings" << std::endl; - files::write_string(settings_file, wrapper->write()); - files::write_string(controls_file, write_controls()); - } - catch (const initialize_error& err) { - std::cerr << "could not to initialize engine" << std::endl; - std::cerr << err.what() << std::endl; - } - return EXIT_SUCCESS; + Engine engine(settings, &paths); + if (fs::is_regular_file(controls_file)) { + std::cout << "-- loading controls" << std::endl; + std::string text = files::read_string(controls_file); + load_controls(controls_file.string(), text); + } + engine.mainloop(); + + std::cout << "-- saving settings" << std::endl; + files::write_string(settings_file, wrapper->write()); + files::write_string(controls_file, write_controls()); + } + catch (const initialize_error& err) { + std::cerr << "could not to initialize engine" << std::endl; + std::cerr << err.what() << std::endl; + } + return EXIT_SUCCESS; }