Make OSDs return ui_menu_item lists, not slider_state lists

This commit is contained in:
therealmogminer@gmail.com 2016-04-10 19:22:13 +02:00
parent d4670d8488
commit dd9c9a0fb3
17 changed files with 125 additions and 66 deletions

View File

@ -51,8 +51,9 @@
#include <math.h>
#include <mutex>
#include "emucore.h"
#include "bitmap.h"
#include "emu.h"
//#include "bitmap.h"
//#include "screen.h"
//**************************************************************************
// CONSTANTS

View File

@ -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
};

View File

@ -140,36 +140,47 @@ void ui_menu_sliders::populate()
std::string tempstring;
/* add UI sliders */
std::vector<slider_state *> ui_sliders = machine().ui().get_slider_list();
for (slider_state* slider : ui_sliders)
std::vector<ui_menu_item> 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<slider_state *>(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<slider_state *> osd_sliders = machine().osd().get_slider_list();
for (slider_state* slider : osd_sliders)
std::vector<ui_menu_item> 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<slider_state *>(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;

View File

@ -118,7 +118,7 @@ std::string ui_manager::messagebox_poptext;
rgb_t ui_manager::messagebox_backcolor;
// slider info
std::vector<slider_state *> ui_manager::slider_list;
std::vector<ui_menu_item> 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_state *>(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<slider_state *>& ui_manager::get_slider_list(void)
std::vector<ui_menu_item>& 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<slider_state *> ui_manager::slider_init(running_machine &machine)
std::vector<ui_menu_item> ui_manager::slider_init(running_machine &machine)
{
std::vector<slider_state *> sliders;
@ -2040,7 +2040,19 @@ std::vector<slider_state *> ui_manager::slider_init(running_machine &machine)
}
#endif
return sliders;
std::vector<ui_menu_item> 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;
}

View File

@ -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_state *> slider_init(running_machine &machine);
std::vector<ui_menu_item> 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<slider_state *>& get_slider_list(void);
std::vector<ui_menu_item>& 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_state *> slider_list;
static std::vector<ui_menu_item> slider_list;
static slider_state *slider_current;
// text generators

View File

@ -537,7 +537,7 @@ void osd_common_t::customize_input_type_list(simple_list<input_type_entry> &type
// list of OS-dependent slider values.
//-------------------------------------------------
std::vector<slider_state*> osd_common_t::get_slider_list()
std::vector<ui_menu_item> osd_common_t::get_slider_list()
{
return m_sliders;
}

View File

@ -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<input_type_entry> &typelist) override;
// video overridables
virtual std::vector<slider_state *> get_slider_list() override;
virtual std::vector<ui_menu_item> 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<slider_state *> m_sliders;
std::vector<ui_menu_item> m_sliders;
private:
std::vector<const char *> m_video_names;

View File

@ -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<slider_state*> get_slider_list() { return m_sliders; }
virtual std::vector<ui_menu_item> 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<slider_state*> m_sliders;
std::vector<ui_menu_item> m_sliders;
private:
osd_window *m_window;

View File

@ -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<slider_state*> chain_manager::get_slider_list()
std::vector<ui_menu_item> chain_manager::get_slider_list()
{
std::vector<slider_state*> sliders;
std::vector<ui_menu_item> sliders;
if (!needs_sliders())
{
@ -441,12 +448,29 @@ std::vector<slider_state*> chain_manager::get_slider_list()
std::vector<bgfx_slider*> 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);
}
}

View File

@ -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<slider_state*> get_slider_list();
std::vector<ui_menu_item> get_slider_list();
private:
void load_chains();
@ -69,7 +69,7 @@ private:
uint32_t m_screen_count;
std::vector<std::string> m_available_chains;
std::vector<bgfx_chain*> m_screen_chains;
std::vector<slider_state*> m_selection_sliders;
std::vector<ui_menu_item> m_selection_sliders;
std::vector<int32_t> m_current_chain;
static const uint32_t CHAIN_NONE;

View File

@ -400,7 +400,7 @@ void shaders::end_avi_recording()
// shaders::toggle
//============================================================
void shaders::toggle(std::vector<slider_state*>& sliders)
void shaders::toggle(std::vector<ui_menu_item>& 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<slider_state*>& sliders)
int shaders::create_resources(bool reset, std::vector<ui_menu_item>& sliders)
{
if (!master_enable || !d3dintf->post_fx_available)
{
@ -1003,7 +1003,7 @@ int shaders::create_resources(bool reset, std::vector<slider_state*>& sliders)
initialized = true;
std::vector<slider_state*> my_sliders = init_slider_list();
std::vector<ui_menu_item> 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<slider_state*> shaders::init_slider_list()
std::vector<ui_menu_item> shaders::init_slider_list()
{
std::vector<slider_state*> sliders;
std::vector<ui_menu_item> sliders;
for (slider* slider : internal_sliders)
{
@ -2502,7 +2502,16 @@ std::vector<slider_state*> 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);
}
}
}

View File

@ -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<slider_state*>& sliders);
void toggle(std::vector<ui_menu_item>& 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<slider_state*>& sliders);
int create_resources(bool reset, std::vector<ui_menu_item>& sliders);
void delete_resources(bool reset);
// slider-related functions
std::vector<slider_state*> init_slider_list();
std::vector<ui_menu_item> init_slider_list();
void *get_slider_option(int id, int index = 0);
private:

View File

@ -1118,7 +1118,7 @@ void renderer_bgfx::allocate_buffer(render_primitive *prim, UINT32 blend, bgfx::
}
}
std::vector<slider_state*> renderer_bgfx::get_slider_list()
std::vector<ui_menu_item> renderer_bgfx::get_slider_list()
{
m_sliders_dirty = false;
return m_chains->get_slider_list();

View File

@ -42,7 +42,7 @@ public:
virtual int create() override;
virtual int draw(const int update) override;
virtual std::vector<slider_state*> get_slider_list() override;
virtual std::vector<ui_menu_item> get_slider_list() override;
virtual void set_sliders_dirty() override;
#ifdef OSD_SDL

View File

@ -17,6 +17,7 @@
#include "osdcore.h"
#include "unicode.h"
#include "cliopts.h"
#include "ui/menu.h"
#include <memory>
#include <string>
@ -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<input_type_entry> &typelist) = 0;
// video overridables
virtual std::vector<slider_state *> get_slider_list() = 0;
virtual std::vector<ui_menu_item> get_slider_list() = 0;
// font interface
virtual osd_font::ptr font_alloc() = 0;

View File

@ -140,9 +140,6 @@ public:
virtual void init(running_machine &machine) override;
virtual void update(bool skip_redraw) override;
// video overridables
// virtual std::vector<slider_state *> get_slider_list() override;
// input overridables
virtual void customize_input_type_list(simple_list<input_type_entry> &typelist) override;

View File

@ -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<slider_state*> window_sliders = window->m_renderer->get_slider_list();
std::vector<ui_menu_item> window_sliders = window->m_renderer->get_slider_list();
m_sliders.insert(m_sliders.end(), window_sliders.begin(), window_sliders.end());
}
}