diff --git a/src/emu/render.h b/src/emu/render.h index 68bc65a0072..6092a37b45a 100644 --- a/src/emu/render.h +++ b/src/emu/render.h @@ -51,8 +51,9 @@ #include #include -#include "emucore.h" -#include "bitmap.h" +#include "emu.h" +//#include "bitmap.h" +//#include "screen.h" //************************************************************************** // CONSTANTS diff --git a/src/emu/ui/menu.h b/src/emu/ui/menu.h index 80584673344..a07bcd1c519 100644 --- a/src/emu/ui/menu.h +++ b/src/emu/ui/menu.h @@ -57,7 +57,8 @@ enum ui_menu_reset_options enum class ui_menu_item_type { UI_MENU_ITEM_TYPE_UNKNOWN, - UI_MENU_ITEM_TYPE_SLIDER + UI_MENU_ITEM_TYPE_SLIDER, + UI_MENU_ITEM_TYPE_SEPARATOR }; diff --git a/src/emu/ui/sliders.cpp b/src/emu/ui/sliders.cpp index 0960cf364b6..20cb435233a 100644 --- a/src/emu/ui/sliders.cpp +++ b/src/emu/ui/sliders.cpp @@ -140,36 +140,47 @@ void ui_menu_sliders::populate() std::string tempstring; /* add UI sliders */ - std::vector ui_sliders = machine().ui().get_slider_list(); - for (slider_state* slider : ui_sliders) + std::vector ui_sliders = machine().ui().get_slider_list(); + for (ui_menu_item item : ui_sliders) { - INT32 curval = (*slider->update)(machine(), slider->arg, slider->id, &tempstring, SLIDER_NOCHANGE); - UINT32 flags = 0; - if (curval > slider->minval) - flags |= MENU_FLAG_LEFT_ARROW; - if (curval < slider->maxval) - flags |= MENU_FLAG_RIGHT_ARROW; - item_append(slider->description, tempstring.c_str(), flags, (void *)slider, ui_menu_item_type::UI_MENU_ITEM_TYPE_SLIDER); + if (item.type == ui_menu_item_type::UI_MENU_ITEM_TYPE_SLIDER) + { + slider_state* slider = reinterpret_cast(item.ref); + INT32 curval = (*slider->update)(machine(), slider->arg, slider->id, &tempstring, SLIDER_NOCHANGE); + UINT32 flags = 0; + if (curval > slider->minval) + flags |= MENU_FLAG_LEFT_ARROW; + if (curval < slider->maxval) + flags |= MENU_FLAG_RIGHT_ARROW; + item_append(slider->description, tempstring.c_str(), flags, (void *)slider, ui_menu_item_type::UI_MENU_ITEM_TYPE_SLIDER); + } + else + { + item_append(item); + } } item_append(MENU_SEPARATOR_ITEM, nullptr, 0, nullptr); /* add OSD options */ - std::vector osd_sliders = machine().osd().get_slider_list(); - for (slider_state* slider : osd_sliders) + std::vector osd_sliders = machine().osd().get_slider_list(); + for (ui_menu_item item : osd_sliders) { - if (slider == nullptr) - { - item_append(MENU_SEPARATOR_ITEM, nullptr, 0, nullptr); - continue; - } - INT32 curval = (*slider->update)(machine(), slider->arg, slider->id, &tempstring, SLIDER_NOCHANGE); - UINT32 flags = 0; - if (curval > slider->minval) - flags |= MENU_FLAG_LEFT_ARROW; - if (curval < slider->maxval) - flags |= MENU_FLAG_RIGHT_ARROW; - item_append(slider->description, tempstring.c_str(), flags, (void *)slider, ui_menu_item_type::UI_MENU_ITEM_TYPE_SLIDER); + if (item.type == ui_menu_item_type::UI_MENU_ITEM_TYPE_SLIDER) + { + slider_state* slider = reinterpret_cast(item.ref); + INT32 curval = (*slider->update)(machine(), slider->arg, slider->id, &tempstring, SLIDER_NOCHANGE); + UINT32 flags = 0; + if (curval > slider->minval) + flags |= MENU_FLAG_LEFT_ARROW; + if (curval < slider->maxval) + flags |= MENU_FLAG_RIGHT_ARROW; + item_append(slider->description, tempstring.c_str(), flags, (void *)slider, ui_menu_item_type::UI_MENU_ITEM_TYPE_SLIDER); + } + else + { + item_append(item); + } } custombottom = 2.0f * machine().ui().get_line_height() + 2.0f * UI_BOX_TB_BORDER; diff --git a/src/emu/ui/ui.cpp b/src/emu/ui/ui.cpp index 2645e6c1b6f..b8ad5ee7f9c 100644 --- a/src/emu/ui/ui.cpp +++ b/src/emu/ui/ui.cpp @@ -118,7 +118,7 @@ std::string ui_manager::messagebox_poptext; rgb_t ui_manager::messagebox_backcolor; // slider info -std::vector ui_manager::slider_list; +std::vector ui_manager::slider_list; slider_state *ui_manager::slider_current; @@ -340,7 +340,7 @@ void ui_manager::initialize(running_machine &machine) slider_list = slider_init(machine); if (slider_list.size() > 0) { - slider_current = slider_list[0]; + slider_current = reinterpret_cast(slider_list[0].ref); } else { @@ -1873,7 +1873,7 @@ UINT32 ui_manager::handler_confirm_quit(running_machine &machine, render_contain // ui_get_slider_list - get the list of sliders //------------------------------------------------- -std::vector& ui_manager::get_slider_list(void) +std::vector& ui_manager::get_slider_list(void) { return slider_list; } @@ -1906,7 +1906,7 @@ static slider_state *slider_alloc(running_machine &machine, const char *title, I // controls //---------------------------------------------------------- -std::vector ui_manager::slider_init(running_machine &machine) +std::vector ui_manager::slider_init(running_machine &machine) { std::vector sliders; @@ -2040,7 +2040,19 @@ std::vector ui_manager::slider_init(running_machine &machine) } #endif - return sliders; + std::vector items; + for (slider_state *slider : sliders) + { + ui_menu_item item; + item.text = slider->description; + item.subtext = ""; + item.flags = 0; + item.ref = slider; + item.type = ui_menu_item_type::UI_MENU_ITEM_TYPE_SLIDER; + items.push_back(item); + } + + return items; } diff --git a/src/emu/ui/ui.h b/src/emu/ui/ui.h index eaef943cade..9af361c8cc5 100644 --- a/src/emu/ui/ui.h +++ b/src/emu/ui/ui.h @@ -18,6 +18,8 @@ #include "render.h" #include "moptions.h" +class ui_menu_item; + /*************************************************************************** CONSTANTS ***************************************************************************/ @@ -130,7 +132,7 @@ public: // methods void initialize(running_machine &machine); - std::vector slider_init(running_machine &machine); + std::vector slider_init(running_machine &machine); UINT32 set_handler(ui_callback callback, UINT32 param); void display_startup_screens(bool first_time); void set_startup_text(const char *text, bool force); @@ -169,7 +171,7 @@ public: std::string &game_info_astring(std::string &str); // slider controls - std::vector& get_slider_list(void); + std::vector& get_slider_list(void); // other void process_natural_keyboard(); @@ -212,7 +214,7 @@ private: static std::string messagebox_poptext; static rgb_t messagebox_backcolor; - static std::vector slider_list; + static std::vector slider_list; static slider_state *slider_current; // text generators diff --git a/src/osd/modules/lib/osdobj_common.cpp b/src/osd/modules/lib/osdobj_common.cpp index 568b68e57c2..32f1a6047ac 100644 --- a/src/osd/modules/lib/osdobj_common.cpp +++ b/src/osd/modules/lib/osdobj_common.cpp @@ -537,7 +537,7 @@ void osd_common_t::customize_input_type_list(simple_list &type // list of OS-dependent slider values. //------------------------------------------------- -std::vector osd_common_t::get_slider_list() +std::vector osd_common_t::get_slider_list() { return m_sliders; } diff --git a/src/osd/modules/lib/osdobj_common.h b/src/osd/modules/lib/osdobj_common.h index d07702ee814..cd83ba61e7b 100644 --- a/src/osd/modules/lib/osdobj_common.h +++ b/src/osd/modules/lib/osdobj_common.h @@ -24,6 +24,8 @@ #include "modules/output/output_module.h" #include "cliopts.h" +class ui_menu_item; + //============================================================ // Defines //============================================================ @@ -189,7 +191,7 @@ public: virtual void customize_input_type_list(simple_list &typelist) override; // video overridables - virtual std::vector get_slider_list() override; + virtual std::vector get_slider_list() override; // command option overrides virtual bool execute_command(const char *command) override; @@ -279,7 +281,7 @@ protected: input_module* m_lightgun_input; input_module* m_joystick_input; output_module* m_output; - std::vector m_sliders; + std::vector m_sliders; private: std::vector m_video_names; diff --git a/src/osd/modules/osdwindow.h b/src/osd/modules/osdwindow.h index 3543273e031..60d2cccc700 100644 --- a/src/osd/modules/osdwindow.h +++ b/src/osd/modules/osdwindow.h @@ -11,6 +11,7 @@ #include "emu.h" #include "ui/ui.h" +#include "ui/menu.h" #include "osdhelper.h" // standard windows headers @@ -197,7 +198,7 @@ public: virtual int create() = 0; virtual render_primitive_list *get_primitives() = 0; - virtual std::vector get_slider_list() { return m_sliders; } + virtual std::vector get_slider_list() { return m_sliders; } virtual int draw(const int update) = 0; virtual int xy_to_render_target(const int x, const int y, int *xt, int *yt) { return 0; }; virtual void save() { }; @@ -213,7 +214,7 @@ protected: /* Internal flags */ static const int FI_CHANGED = 0x010000; bool m_sliders_dirty; - std::vector m_sliders; + std::vector m_sliders; private: osd_window *m_window; diff --git a/src/osd/modules/render/bgfx/chainmanager.cpp b/src/osd/modules/render/bgfx/chainmanager.cpp index c15aa84d1cd..5eaf6fc1378 100644 --- a/src/osd/modules/render/bgfx/chainmanager.cpp +++ b/src/osd/modules/render/bgfx/chainmanager.cpp @@ -10,6 +10,9 @@ //============================================================ #include "emu.h" +#include "ui/ui.h" +#include "ui/menu.h" + #include "osdcore.h" #include "modules/osdwindow.h" @@ -29,8 +32,6 @@ #include "target.h" #include "slider.h" -#include "ui/ui.h" - #include "sliderdirtynotifier.h" using namespace rapidjson; @@ -367,7 +368,13 @@ void chain_manager::create_selection_slider(uint32_t screen_index) state->id = screen_index; strcpy(state->description, description.c_str()); - m_selection_sliders.push_back(state); + ui_menu_item item; + item.text = state->description; + item.subtext = ""; + item.flags = 0; + item.ref = state; + item.type = ui_menu_item_type::UI_MENU_ITEM_TYPE_SLIDER; + m_selection_sliders.push_back(item); } uint32_t chain_manager::handle_screen_chains(uint32_t view, render_primitive *starting_prim, osd_window& window) @@ -419,9 +426,9 @@ bool chain_manager::needs_sliders() return m_screen_count > 0 && m_available_chains.size() > 1; } -std::vector chain_manager::get_slider_list() +std::vector chain_manager::get_slider_list() { - std::vector sliders; + std::vector sliders; if (!needs_sliders()) { @@ -441,12 +448,29 @@ std::vector chain_manager::get_slider_list() std::vector chain_sliders = chain->sliders(); for (bgfx_slider* slider : chain_sliders) { - sliders.push_back(slider->core_slider()); + slider_state* core_slider = slider->core_slider(); + + ui_menu_item item; + item.text = core_slider->description; + item.subtext = ""; + item.flags = 0; + item.ref = core_slider; + item.type = ui_menu_item_type::UI_MENU_ITEM_TYPE_SLIDER; + m_selection_sliders.push_back(item); + + sliders.push_back(item); } if (chain_sliders.size() > 0) { - sliders.push_back(nullptr); + ui_menu_item item; + item.text = MENU_SEPARATOR_ITEM; + item.subtext = ""; + item.flags = 0; + item.ref = nullptr; + item.type = ui_menu_item_type::UI_MENU_ITEM_TYPE_SEPARATOR; + + sliders.push_back(item); } } diff --git a/src/osd/modules/render/bgfx/chainmanager.h b/src/osd/modules/render/bgfx/chainmanager.h index fa2808f0242..7d8d0c16eb3 100644 --- a/src/osd/modules/render/bgfx/chainmanager.h +++ b/src/osd/modules/render/bgfx/chainmanager.h @@ -41,7 +41,7 @@ public: bgfx_chain* screen_chain(uint32_t screen); 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 get_slider_list(); private: void load_chains(); @@ -69,7 +69,7 @@ private: uint32_t m_screen_count; std::vector m_available_chains; std::vector m_screen_chains; - std::vector m_selection_sliders; + std::vector m_selection_sliders; std::vector m_current_chain; static const uint32_t CHAIN_NONE; diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp index b753bdf1842..4cf8c96a164 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.cpp +++ b/src/osd/modules/render/d3d/d3dhlsl.cpp @@ -400,7 +400,7 @@ void shaders::end_avi_recording() // shaders::toggle //============================================================ -void shaders::toggle(std::vector& sliders) +void shaders::toggle(std::vector& sliders) { if (master_enable) { @@ -827,7 +827,7 @@ void shaders::init_fsfx_quad(void *vertbuf) // shaders::create_resources //============================================================ -int shaders::create_resources(bool reset, std::vector& sliders) +int shaders::create_resources(bool reset, std::vector& sliders) { if (!master_enable || !d3dintf->post_fx_available) { @@ -1003,7 +1003,7 @@ int shaders::create_resources(bool reset, std::vector& sliders) initialized = true; - std::vector my_sliders = init_slider_list(); + std::vector my_sliders = init_slider_list(); sliders.insert(sliders.end(), my_sliders.begin(), my_sliders.end()); return 0; @@ -2447,9 +2447,9 @@ void *shaders::get_slider_option(int id, int index) return nullptr; } -std::vector shaders::init_slider_list() +std::vector shaders::init_slider_list() { - std::vector sliders; + std::vector sliders; for (slider* slider : internal_sliders) { @@ -2502,7 +2502,16 @@ std::vector shaders::init_slider_list() default: break; } - sliders.push_back(slider_alloc(*machine, desc->id, name.c_str(), desc->minval, desc->defval, desc->maxval, desc->step, slider_update_trampoline, slider_arg)); + + slider_state* core_slider = slider_alloc(*machine, desc->id, name.c_str(), desc->minval, desc->defval, desc->maxval, desc->step, slider_update_trampoline, slider_arg); + + ui_menu_item item; + item.text = core_slider->description; + item.subtext = ""; + item.flags = 0; + item.ref = core_slider; + item.type = ui_menu_item_type::UI_MENU_ITEM_TYPE_SLIDER; + sliders.push_back(item); } } } diff --git a/src/osd/modules/render/d3d/d3dhlsl.h b/src/osd/modules/render/d3d/d3dhlsl.h index b4ae929c2dc..e5e6ad600b7 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.h +++ b/src/osd/modules/render/d3d/d3dhlsl.h @@ -303,7 +303,7 @@ public: void init(d3d_base *d3dintf, running_machine *machine, renderer_d3d9 *renderer); bool enabled() { return master_enable; } - void toggle(std::vector& sliders); + void toggle(std::vector& sliders); bool vector_enabled() { return master_enable && vector_enable; } d3d_render_target* get_vector_target(render_primitive *prim); @@ -338,11 +338,11 @@ public: void remove_render_target(int source_width, int source_height, UINT32 screen_index, UINT32 page_index); void remove_render_target(d3d_render_target *rt); - int create_resources(bool reset, std::vector& sliders); + int create_resources(bool reset, std::vector& sliders); void delete_resources(bool reset); // slider-related functions - std::vector init_slider_list(); + std::vector init_slider_list(); void *get_slider_option(int id, int index = 0); private: diff --git a/src/osd/modules/render/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp index 43c39ad10c9..32f45515a08 100644 --- a/src/osd/modules/render/drawbgfx.cpp +++ b/src/osd/modules/render/drawbgfx.cpp @@ -1118,7 +1118,7 @@ void renderer_bgfx::allocate_buffer(render_primitive *prim, UINT32 blend, bgfx:: } } -std::vector renderer_bgfx::get_slider_list() +std::vector renderer_bgfx::get_slider_list() { m_sliders_dirty = false; return m_chains->get_slider_list(); diff --git a/src/osd/modules/render/drawbgfx.h b/src/osd/modules/render/drawbgfx.h index 0107789b6e8..d48bb5914e6 100644 --- a/src/osd/modules/render/drawbgfx.h +++ b/src/osd/modules/render/drawbgfx.h @@ -42,7 +42,7 @@ public: virtual int create() override; virtual int draw(const int update) override; - virtual std::vector get_slider_list() override; + virtual std::vector get_slider_list() override; virtual void set_sliders_dirty() override; #ifdef OSD_SDL diff --git a/src/osd/osdepend.h b/src/osd/osdepend.h index 2ae7ab9001b..661160cb271 100644 --- a/src/osd/osdepend.h +++ b/src/osd/osdepend.h @@ -17,6 +17,7 @@ #include "osdcore.h" #include "unicode.h" #include "cliopts.h" +#include "ui/menu.h" #include #include @@ -56,8 +57,6 @@ public: // ======================> osd_interface -struct slider_state; - // description of the currently-running machine class osd_interface { @@ -80,7 +79,7 @@ public: virtual void customize_input_type_list(simple_list &typelist) = 0; // video overridables - virtual std::vector get_slider_list() = 0; + virtual std::vector get_slider_list() = 0; // font interface virtual osd_font::ptr font_alloc() = 0; diff --git a/src/osd/sdl/osdsdl.h b/src/osd/sdl/osdsdl.h index 4d3a960f8b9..d3ce734b4d2 100644 --- a/src/osd/sdl/osdsdl.h +++ b/src/osd/sdl/osdsdl.h @@ -140,9 +140,6 @@ public: virtual void init(running_machine &machine) override; virtual void update(bool skip_redraw) override; - // video overridables - // virtual std::vector get_slider_list() override; - // input overridables virtual void customize_input_type_list(simple_list &typelist) override; diff --git a/src/osd/windows/window.cpp b/src/osd/windows/window.cpp index 206155f5e37..0e30da1b93d 100644 --- a/src/osd/windows/window.cpp +++ b/src/osd/windows/window.cpp @@ -277,7 +277,7 @@ void windows_osd_interface::build_slider_list() for (win_window_info *window = win_window_list; window != nullptr; window = window->m_next) { // take the sliders of the first window - std::vector window_sliders = window->m_renderer->get_slider_list(); + std::vector window_sliders = window->m_renderer->get_slider_list(); m_sliders.insert(m_sliders.end(), window_sliders.begin(), window_sliders.end()); } }