From ed3eb3838247b930f8eaafe656a671137099d580 Mon Sep 17 00:00:00 2001 From: "therealmogminer@gmail.com" Date: Mon, 25 Apr 2016 03:00:42 +0200 Subject: Fix preservation of settings when changing screen chain selection with multiple screens, nw --- src/osd/modules/render/bgfx/chainmanager.cpp | 59 ++++++++++++++++++++++++++++ src/osd/modules/render/bgfx/chainmanager.h | 4 ++ src/osd/modules/render/bgfx/slider.cpp | 7 ++++ src/osd/modules/render/bgfx/slider.h | 5 ++- 4 files changed, 74 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/osd/modules/render/bgfx/chainmanager.cpp b/src/osd/modules/render/bgfx/chainmanager.cpp index 70d678d1f2b..1d88f63afe4 100644 --- a/src/osd/modules/render/bgfx/chainmanager.cpp +++ b/src/osd/modules/render/bgfx/chainmanager.cpp @@ -368,7 +368,9 @@ int32_t chain_manager::chain_changed(int32_t id, std::string *str, int32_t newva { m_current_chain[id] = newval; + std::vector> settings = slider_settings(); reload_chains(); + restore_slider_settings(id, settings); m_slider_notifier.set_sliders_dirty(); } @@ -459,6 +461,63 @@ bool chain_manager::needs_sliders() return m_screen_count > 0 && m_available_chains.size() > 1; } +void chain_manager::restore_slider_settings(int32_t id, std::vector>& settings) +{ + if (!needs_sliders()) + { + return; + } + + for (size_t index = 0; index < m_screen_chains.size() && index < m_screen_count; index++) + { + if (index == id) + { + continue; + } + + bgfx_chain* chain = m_screen_chains[index]; + if (chain == nullptr) + { + continue; + } + + std::vector chain_sliders = chain->sliders(); + for (size_t slider = 0; slider < chain_sliders.size(); slider++) + { + chain_sliders[slider]->import(settings[index][slider]); + } + } +} + +std::vector> chain_manager::slider_settings() +{ + std::vector> curr; + + if (!needs_sliders()) + { + return curr; + } + + for (size_t index = 0; index < m_screen_chains.size() && index < m_screen_count; index++) + { + curr.push_back(std::vector()); + + bgfx_chain* chain = m_screen_chains[index]; + if (chain == nullptr) + { + continue; + } + + std::vector chain_sliders = chain->sliders(); + for (bgfx_slider* slider : chain_sliders) + { + curr[index].push_back(slider->value()); + } + } + + return curr; +} + std::vector chain_manager::get_slider_list() { std::vector sliders; diff --git a/src/osd/modules/render/bgfx/chainmanager.h b/src/osd/modules/render/bgfx/chainmanager.h index 022fe6e3b2e..0907cd27f57 100644 --- a/src/osd/modules/render/bgfx/chainmanager.h +++ b/src/osd/modules/render/bgfx/chainmanager.h @@ -65,6 +65,10 @@ public: bgfx_chain* load_chain(std::string name, uint32_t screen_index); bool has_applicable_chain(uint32_t screen); std::vector get_slider_list(); + std::vector> slider_settings(); + + // Setters + void restore_slider_settings(int32_t id, std::vector>& settings); private: void load_chains(); diff --git a/src/osd/modules/render/bgfx/slider.cpp b/src/osd/modules/render/bgfx/slider.cpp index 77ac69e08dc..29d7fd0f821 100644 --- a/src/osd/modules/render/bgfx/slider.cpp +++ b/src/osd/modules/render/bgfx/slider.cpp @@ -18,6 +18,7 @@ bgfx_slider::bgfx_slider(running_machine &machine, std::string name, float min, , m_screen_type(screen) , m_format(format) , m_description(description) + , m_machine(machine) { m_min = min; m_default = def; @@ -45,6 +46,12 @@ static INT32 update_trampoline(running_machine &machine, void *arg, int /*id*/, return 0; } +void bgfx_slider::import(float val) +{ + m_value = val; + update_trampoline(m_machine, this, m_slider_state->id, nullptr, int32_t(floor(m_value / m_step + 0.5f))); +} + slider_state* bgfx_slider::create_core_slider(running_machine& machine) { int size = sizeof(slider_state) + m_description.length(); diff --git a/src/osd/modules/render/bgfx/slider.h b/src/osd/modules/render/bgfx/slider.h index c1d1865218d..059b895ad8f 100644 --- a/src/osd/modules/render/bgfx/slider.h +++ b/src/osd/modules/render/bgfx/slider.h @@ -55,9 +55,11 @@ public: float uniform_value() const { return float(m_value); } slider_state* core_slider() const { return m_slider_state; } size_t size() const { return get_size_for_type(m_type); } - static size_t get_size_for_type(slider_type type); + // Setters + void import(float val); + protected: slider_state* create_core_slider(running_machine &machine); int32_t as_int() const { return int32_t(floor(m_value / m_step + 0.5f)); } @@ -74,6 +76,7 @@ protected: std::vector m_strings; float m_value; slider_state* m_slider_state; + running_machine&m_machine; }; #endif // __DRAWBGFX_SLIDER__ -- cgit v1.2.3