diff options
| author | 2016-04-25 03:00:42 +0200 | |
|---|---|---|
| committer | 2016-04-26 12:39:05 +0200 | |
| commit | ed3eb3838247b930f8eaafe656a671137099d580 (patch) | |
| tree | b16f0c1c1e61074194714b33062a81c9376f6fb8 | |
| parent | 52f211941be8e8228592a34b488d434eed323457 (diff) | |
Fix preservation of settings when changing screen chain selection with multiple screens, nw
| -rw-r--r-- | src/osd/modules/render/bgfx/chainmanager.cpp | 59 | ||||
| -rw-r--r-- | src/osd/modules/render/bgfx/chainmanager.h | 4 | ||||
| -rw-r--r-- | src/osd/modules/render/bgfx/slider.cpp | 7 | ||||
| -rw-r--r-- | src/osd/modules/render/bgfx/slider.h | 5 |
4 files changed, 74 insertions, 1 deletions
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<std::vector<float>> 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<std::vector<float>>& 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<bgfx_slider*> chain_sliders = chain->sliders(); + for (size_t slider = 0; slider < chain_sliders.size(); slider++) + { + chain_sliders[slider]->import(settings[index][slider]); + } + } +} + +std::vector<std::vector<float>> chain_manager::slider_settings() +{ + std::vector<std::vector<float>> 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<float>()); + + bgfx_chain* chain = m_screen_chains[index]; + if (chain == nullptr) + { + continue; + } + + std::vector<bgfx_slider*> chain_sliders = chain->sliders(); + for (bgfx_slider* slider : chain_sliders) + { + curr[index].push_back(slider->value()); + } + } + + return curr; +} + std::vector<ui_menu_item> chain_manager::get_slider_list() { std::vector<ui_menu_item> 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<ui_menu_item> get_slider_list(); + std::vector<std::vector<float>> slider_settings(); + + // Setters + void restore_slider_settings(int32_t id, std::vector<std::vector<float>>& 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<std::string> m_strings; float m_value; slider_state* m_slider_state; + running_machine&m_machine; }; #endif // __DRAWBGFX_SLIDER__ |
