summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author therealmogminer@gmail.com <therealmogminer@gmail.com>2016-04-25 03:00:42 +0200
committer therealmogminer@gmail.com <therealmogminer@gmail.com>2016-04-26 12:39:05 +0200
commited3eb3838247b930f8eaafe656a671137099d580 (patch)
treeb16f0c1c1e61074194714b33062a81c9376f6fb8 /src
parent52f211941be8e8228592a34b488d434eed323457 (diff)
Fix preservation of settings when changing screen chain selection with multiple screens, nw
Diffstat (limited to 'src')
-rw-r--r--src/osd/modules/render/bgfx/chainmanager.cpp59
-rw-r--r--src/osd/modules/render/bgfx/chainmanager.h4
-rw-r--r--src/osd/modules/render/bgfx/slider.cpp7
-rw-r--r--src/osd/modules/render/bgfx/slider.h5
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__