diff --git a/src/data/setting.h b/src/data/setting.h index 8a2ba7c0..2ecbd46c 100644 --- a/src/data/setting.h +++ b/src/data/setting.h @@ -34,42 +34,66 @@ public: using observer_handler = std::shared_ptr; template -class Observers { +class ObservableSetting : public Setting { int nextid = 1; std::unordered_map> observers; +protected: + T initial; + T value; public: - observer_handler observe(consumer callback) { + ObservableSetting(T value, setting_format format) + : Setting(format), initial(value), value(value) {} + + observer_handler observe(consumer callback, bool callOnStart=false) { const int id = nextid++; observers.emplace(id, callback); + if (callOnStart) { + callback(value); + } return std::shared_ptr(new int(id), [this](int* id) { observers.erase(*id); delete id; }); } + T get() const { + return value; + } + + T& operator*() { + return value; + } + void notify(T value) { for (auto& entry : observers) { entry.second(value); } } + + void set(T value) { + if (value == this->value) { + return; + } + this->value = value; + notify(value); + } + + virtual void resetToDefault() override { + set(initial); + } }; -class NumberSetting : public Setting { +class NumberSetting : public ObservableSetting { protected: - number_t initial; - number_t value; number_t min; number_t max; - Observers observers; public: NumberSetting( number_t value, number_t min=std::numeric_limits::min(), number_t max=std::numeric_limits::max(), setting_format format=setting_format::simple - ) : Setting(format), - initial(value), - value(value), + ) : ObservableSetting(value, format), min(min), max(max) {} @@ -82,14 +106,6 @@ public: return value; } - void set(number_t value) { - if (value == this->value) { - return; - } - this->value = value; - observers.notify(value); - } - number_t getMin() const { return min; } @@ -102,14 +118,6 @@ public: return (value - min) / (max - min); } - observer_handler observe(consumer callback) { - return observers.observe(callback); - } - - virtual void resetToDefault() override { - set(initial); - } - virtual std::string toString() const override; static inline NumberSetting createPercent(number_t def) { @@ -117,42 +125,21 @@ public: } }; -class IntegerSetting : public Setting { +class IntegerSetting : public ObservableSetting { protected: - integer_t initial; - integer_t value; integer_t min; integer_t max; - Observers observers; public: IntegerSetting( integer_t value, integer_t min=std::numeric_limits::min(), integer_t max=std::numeric_limits::max(), setting_format format=setting_format::simple - ) : Setting(format), - initial(value), - value(value), + ) : ObservableSetting(value, format), min(min), max(max) {} - integer_t& operator*() { - return value; - } - - integer_t get() const { - return value; - } - - void set(integer_t value) { - if (value == this->value) { - return; - } - this->value = value; - observers.notify(value); - } - integer_t getMin() const { return min; } @@ -165,62 +152,21 @@ public: return (value - min) / (max - min); } - observer_handler observe(consumer callback) { - return observers.observe(callback); - } - - virtual void resetToDefault() override { - set(initial); - } - virtual std::string toString() const override; }; -class FlagSetting : public Setting { -protected: - bool initial; - bool value; - Observers observers; +class FlagSetting : public ObservableSetting { public: FlagSetting( bool value, setting_format format=setting_format::simple - ) : Setting(format), - initial(value), - value(value) + ) : ObservableSetting(value, format) {} - bool& operator*() { - return value; - } - - bool get() const { - return value; - } - - void set(bool value) { - if (value == this->value) { - return; - } - this->value = value; - observers.notify(value); - } - void toggle() { set(!get()); } - observer_handler observe(consumer callback, bool callOnStart=false) { - if (callOnStart) { - callback(value); - } - return observers.observe(callback); - } - - virtual void resetToDefault() override { - set(initial); - } - virtual std::string toString() const override; }; diff --git a/src/engine.cpp b/src/engine.cpp index 2b07fe6b..306b4847 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -107,11 +107,11 @@ void Engine::updateHotkeys() { } void Engine::saveScreenshot() { - std::unique_ptr image(Window::takeScreenshot()); + auto image = Window::takeScreenshot(); image->flipY(); fs::path filename = paths->getScreenshotFile("png"); imageio::write(filename.string(), image.get()); - logger.info() << "saved screenshot as "+filename.u8string(); + logger.info() << "saved screenshot as " << filename.u8string(); } void Engine::mainloop() { diff --git a/src/window/Window.cpp b/src/window/Window.cpp index 3542cfe7..e604e6e3 100644 --- a/src/window/Window.cpp +++ b/src/window/Window.cpp @@ -312,11 +312,13 @@ DisplaySettings* Window::getSettings() { return settings; } -ImageData* Window::takeScreenshot() { - ubyte* data = new ubyte[width * height * 3]; +std::unique_ptr Window::takeScreenshot() { + auto data = std::make_unique(width * height * 3); glPixelStorei(GL_PACK_ALIGNMENT, 1); - glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, data); - return new ImageData(ImageFormat::rgb888, width, height, data); + glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, data.get()); + return std::make_unique( + ImageFormat::rgb888, width, height, data.release() + ); } const char* Window::getClipboardText() { diff --git a/src/window/Window.h b/src/window/Window.h index 8f68d78a..7eb9eb0f 100644 --- a/src/window/Window.h +++ b/src/window/Window.h @@ -5,7 +5,7 @@ #include #include - +#include #include class ImageData; @@ -58,7 +58,7 @@ public: return glm::vec2(width, height); } - static ImageData* takeScreenshot(); + static std::unique_ptr takeScreenshot(); }; #endif /* WINDOW_WINDOW_H_ */