summaryrefslogtreecommitdiffstatshomepage
path: root/src/frontend
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2021-11-13 02:49:51 +1100
committer Vas Crabb <vas@vastheman.com>2021-11-13 02:49:51 +1100
commit839192e7694158e8e35c039313b167d219f08de2 (patch)
treed65cb47c42bed17d7a846a6e5105b301767b698e /src/frontend
parent1364bd571e7a2f27a6f49b0d1cd37c03fa795539 (diff)
-osd/windows: Fixed stupid potential deadlock on exit.
-frontend: Some changes to menu item class that will make it possbile to reduce the number of menu rebuilds.
Diffstat (limited to 'src/frontend')
-rw-r--r--src/frontend/mame/ui/confswitch.cpp8
-rw-r--r--src/frontend/mame/ui/custui.cpp4
-rw-r--r--src/frontend/mame/ui/dirmenu.cpp18
-rw-r--r--src/frontend/mame/ui/menu.cpp89
-rw-r--r--src/frontend/mame/ui/menu.h6
-rw-r--r--src/frontend/mame/ui/menuitem.h32
-rw-r--r--src/frontend/mame/ui/selgame.cpp2
-rw-r--r--src/frontend/mame/ui/selmenu.cpp24
-rw-r--r--src/frontend/mame/ui/selmenu.h2
-rw-r--r--src/frontend/mame/ui/selsoft.cpp2
-rw-r--r--src/frontend/mame/ui/sliders.cpp8
-rw-r--r--src/frontend/mame/ui/state.cpp2
-rw-r--r--src/frontend/mame/ui/textbox.cpp2
-rw-r--r--src/frontend/mame/ui/ui.cpp19
-rw-r--r--src/frontend/mame/ui/ui.h1
-rw-r--r--src/frontend/mame/ui/videoopt.cpp2
16 files changed, 113 insertions, 108 deletions
diff --git a/src/frontend/mame/ui/confswitch.cpp b/src/frontend/mame/ui/confswitch.cpp
index 1e89cb48d58..aeed0024b69 100644
--- a/src/frontend/mame/ui/confswitch.cpp
+++ b/src/frontend/mame/ui/confswitch.cpp
@@ -222,10 +222,10 @@ void menu_confswitch::handle(event const *ev)
{
if (!found_break)
{
- if (!item(--current).ref)
+ if (!item(--current).ref())
found_break = true;
}
- else if (!item(current - 1).ref)
+ else if (!item(current - 1).ref())
{
set_selected_index(current);
set_top_line(current - 1);
@@ -245,9 +245,9 @@ void menu_confswitch::handle(event const *ev)
auto current = selected_index();
while (item_count() > ++current)
{
- if (!item(current).ref)
+ if (!item(current).ref())
{
- if ((item_count() > (current + 1)) && (uintptr_t(item(current + 1).ref) != 1))
+ if ((item_count() > (current + 1)) && (uintptr_t(item(current + 1).ref()) != 1))
{
set_selected_index(current + 1);
set_top_line(current);
diff --git a/src/frontend/mame/ui/custui.cpp b/src/frontend/mame/ui/custui.cpp
index 982ec8bde39..89d06ba74d6 100644
--- a/src/frontend/mame/ui/custui.cpp
+++ b/src/frontend/mame/ui/custui.cpp
@@ -559,7 +559,7 @@ void menu_colors_ui::handle(event const *ev)
{
if ((uintptr_t)ev->itemref != MUI_RESTORE)
{
- menu::stack_push<menu_rgb_ui>(ui(), container(), &m_color_table[(uintptr_t)ev->itemref].color, selected_item().text);
+ menu::stack_push<menu_rgb_ui>(ui(), container(), &m_color_table[(uintptr_t)ev->itemref].color, selected_item().text());
}
else
{
@@ -1080,7 +1080,7 @@ void menu_palette_sel::handle(event const *ev)
{
if (ev->iptkey == IPT_UI_SELECT)
{
- m_original = rgb_t(uint32_t(strtoul(selected_item().subtext.c_str(), nullptr, 16)));
+ m_original = rgb_t(uint32_t(strtoul(selected_item().subtext().c_str(), nullptr, 16)));
reset_parent(reset_options::SELECT_FIRST);
stack_pop();
}
diff --git a/src/frontend/mame/ui/dirmenu.cpp b/src/frontend/mame/ui/dirmenu.cpp
index 9a6b3c09b8d..3b92204ae3e 100644
--- a/src/frontend/mame/ui/dirmenu.cpp
+++ b/src/frontend/mame/ui/dirmenu.cpp
@@ -253,7 +253,7 @@ void menu_add_change_folder::handle(event const *ev)
const menu_item &pitem = item(index);
// go up to the parent path
- if (pitem.text == "..")
+ if (pitem.text() == "..")
{
size_t first_sep = m_current_path.find_first_of(PATH_SEPARATOR[0]);
size_t last_sep = m_current_path.find_last_of(PATH_SEPARATOR[0]);
@@ -263,15 +263,15 @@ void menu_add_change_folder::handle(event const *ev)
else
{
// if isn't a drive, appends the directory
- if (pitem.subtext != "[DRIVE]")
+ if (pitem.subtext() != "[DRIVE]")
{
if (m_current_path[m_current_path.length() - 1] == PATH_SEPARATOR[0])
- m_current_path.append(pitem.text);
+ m_current_path.append(pitem.text());
else
- m_current_path.append(PATH_SEPARATOR).append(pitem.text);
+ m_current_path.append(PATH_SEPARATOR).append(pitem.text());
}
else
- m_current_path = pitem.text;
+ m_current_path = pitem.text();
}
// reset the char buffer also in this case
@@ -331,12 +331,12 @@ void menu_add_change_folder::handle(event const *ev)
// from current item to the end
for (entry = cur_selected; entry < item_count(); entry++)
- if (item(entry).ref != nullptr && !m_search.empty())
+ if (item(entry).ref() && !m_search.empty())
{
int match = 0;
for (int i = 0; i < m_search.size() + 1; i++)
{
- if (core_strnicmp(item(entry).text.c_str(), m_search.data(), i) == 0)
+ if (core_strnicmp(item(entry).text().c_str(), m_search.data(), i) == 0)
match = i;
}
@@ -350,12 +350,12 @@ void menu_add_change_folder::handle(event const *ev)
// and from the first item to current one
for (entry = 0; entry < cur_selected; entry++)
{
- if (item(entry).ref != nullptr && !m_search.empty())
+ if (item(entry).ref() && !m_search.empty())
{
int match = 0;
for (int i = 0; i < m_search.size() + 1; i++)
{
- if (core_strnicmp(item(entry).text.c_str(), m_search.data(), i) == 0)
+ if (core_strnicmp(item(entry).text().c_str(), m_search.data(), i) == 0)
match = i;
}
diff --git a/src/frontend/mame/ui/menu.cpp b/src/frontend/mame/ui/menu.cpp
index 525e378dca6..4313a956643 100644
--- a/src/frontend/mame/ui/menu.cpp
+++ b/src/frontend/mame/ui/menu.cpp
@@ -321,12 +321,9 @@ void menu::item_append(menu_item_type type, uint32_t flags)
void menu::item_append(std::string &&text, std::string &&subtext, uint32_t flags, void *ref, menu_item_type type)
{
// allocate a new item and populate it
- menu_item pitem;
- pitem.text = std::move(text);
- pitem.subtext = std::move(subtext);
- pitem.flags = flags;
- pitem.ref = ref;
- pitem.type = type;
+ menu_item pitem(type, ref, flags);
+ pitem.set_text(std::move(text));
+ pitem.set_subtext(std::move(subtext));
// append to array
auto index = m_items.size();
@@ -336,10 +333,12 @@ void menu::item_append(std::string &&text, std::string &&subtext, uint32_t flags
--index;
}
else
+ {
m_items.emplace_back(std::move(pitem));
+ }
// update the selection if we need to
- if (m_resetpos == index || (m_resetref != nullptr && m_resetref == ref))
+ if ((m_resetpos == index) || (m_resetref && (m_resetref == ref)))
m_selected = index;
if (m_resetpos == (m_items.size() - 1))
m_selected = m_items.size() - 1;
@@ -406,7 +405,7 @@ const menu::event *menu::process()
if ((m_event.iptkey != IPT_INVALID) && selection_valid())
{
m_event.itemref = get_selection_ref();
- m_event.type = m_items[m_selected].type;
+ m_event.type = m_items[m_selected].type();
return &m_event;
}
else
@@ -426,7 +425,7 @@ void menu::set_selection(void *selected_itemref)
m_selected = -1;
for (int itemnum = 0; itemnum < m_items.size(); itemnum++)
{
- if (m_items[itemnum].ref == selected_itemref)
+ if (m_items[itemnum].ref() == selected_itemref)
{
m_selected = itemnum;
break;
@@ -476,11 +475,11 @@ void menu::draw(uint32_t flags)
for (auto const &pitem : m_items)
{
// compute width of left hand side
- float total_width = gutter_width + ui().get_string_width(pitem.text) + gutter_width;
+ float total_width = gutter_width + ui().get_string_width(pitem.text()) + gutter_width;
// add in width of right hand side
- if (!pitem.subtext.empty())
- total_width += 2.0f * gutter_width + ui().get_string_width(pitem.subtext);
+ if (!pitem.subtext().empty())
+ total_width += 2.0f * gutter_width + ui().get_string_width(pitem.subtext());
// track the maximum
if (total_width > visible_width)
@@ -556,7 +555,7 @@ void menu::draw(uint32_t flags)
{
auto const itemnum = top_line + linenum;
menu_item const &pitem = m_items[itemnum];
- std::string_view const itemtext = pitem.text;
+ std::string_view const itemtext = pitem.text();
rgb_t fgcolor = ui().colors().text_color();
rgb_t bgcolor = ui().colors().text_bg_color();
rgb_t fgcolor2 = ui().colors().subitem_color();
@@ -601,33 +600,33 @@ void menu::draw(uint32_t flags)
{
// if we're on the top line, display the up arrow
draw_arrow(
- 0.5f * (x1 + x2) - 0.5f * ud_arrow_width,
- line_y0 + 0.25f * line_height,
- 0.5f * (x1 + x2) + 0.5f * ud_arrow_width,
- line_y0 + 0.75f * line_height,
- fgcolor,
- ROT0);
+ 0.5f * (x1 + x2) - 0.5f * ud_arrow_width,
+ line_y0 + 0.25f * line_height,
+ 0.5f * (x1 + x2) + 0.5f * ud_arrow_width,
+ line_y0 + 0.75f * line_height,
+ fgcolor,
+ ROT0);
}
else if (downarrow)
{
// if we're on the bottom line, display the down arrow
draw_arrow(
- 0.5f * (x1 + x2) - 0.5f * ud_arrow_width,
- line_y0 + 0.25f * line_height,
- 0.5f * (x1 + x2) + 0.5f * ud_arrow_width,
- line_y0 + 0.75f * line_height,
- fgcolor,
- ROT0 ^ ORIENTATION_FLIP_Y);
+ 0.5f * (x1 + x2) - 0.5f * ud_arrow_width,
+ line_y0 + 0.25f * line_height,
+ 0.5f * (x1 + x2) + 0.5f * ud_arrow_width,
+ line_y0 + 0.75f * line_height,
+ fgcolor,
+ ROT0 ^ ORIENTATION_FLIP_Y);
}
- else if (pitem.type == menu_item_type::SEPARATOR)
+ else if (pitem.type() == menu_item_type::SEPARATOR)
{
// if we're just a divider, draw a line
container().add_line(visible_left, line_y0 + 0.5f * line_height, visible_left + visible_width, line_y0 + 0.5f * line_height, UI_LINE_WIDTH, ui().colors().border_color(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
}
- else if (pitem.subtext.empty())
+ else if (pitem.subtext().empty())
{
// if we don't have a subitem, just draw the string centered
- if (pitem.flags & FLAG_UI_HEADING)
+ if (pitem.flags() & FLAG_UI_HEADING)
{
float heading_width = ui().get_string_width(itemtext);
container().add_line(visible_left, line_y0 + 0.5f * line_height, visible_left + ((visible_width - heading_width) / 2) - lr_border, line_y0 + 0.5f * line_height, UI_LINE_WIDTH, ui().colors().border_color(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
@@ -644,7 +643,7 @@ void menu::draw(uint32_t flags)
else
{
// otherwise, draw the item on the left and the subitem text on the right
- bool const subitem_invert(pitem.flags & FLAG_INVERT);
+ bool const subitem_invert(pitem.flags() & FLAG_INVERT);
float item_width, subitem_width;
// draw the left-side text
@@ -656,9 +655,9 @@ void menu::draw(uint32_t flags)
mame_ui_manager::NORMAL, fgcolor, bgcolor,
&item_width, nullptr);
- if (pitem.flags & FLAG_COLOR_BOX)
+ if (pitem.flags() & FLAG_COLOR_BOX)
{
- rgb_t color = rgb_t((uint32_t)strtoul(pitem.subtext.c_str(), nullptr, 16));
+ rgb_t color = rgb_t((uint32_t)strtoul(pitem.subtext().c_str(), nullptr, 16));
// give 2 spaces worth of padding
subitem_width = ui().get_string_width("FF00FF00");
@@ -671,7 +670,7 @@ void menu::draw(uint32_t flags)
}
else
{
- std::string_view subitem_text(pitem.subtext);
+ std::string_view subitem_text(pitem.subtext());
// give 2 spaces worth of padding
item_width += 2.0f * gutter_width;
@@ -685,13 +684,13 @@ void menu::draw(uint32_t flags)
}
// customize subitem text color
- if (!core_stricmp(pitem.subtext.c_str(), _("On")))
+ if (!core_stricmp(pitem.subtext().c_str(), _("On")))
fgcolor2 = rgb_t(0x00,0xff,0x00);
- if (!core_stricmp(pitem.subtext.c_str(), _("Off")))
+ if (!core_stricmp(pitem.subtext().c_str(), _("Off")))
fgcolor2 = rgb_t(0xff,0x00,0x00);
- if (!core_stricmp(pitem.subtext.c_str(), _("Auto")))
+ if (!core_stricmp(pitem.subtext().c_str(), _("Auto")))
fgcolor2 = rgb_t(0xff,0xff,0x00);
// draw the subitem right-justified
@@ -705,7 +704,7 @@ void menu::draw(uint32_t flags)
}
// apply arrows
- if (is_selected(itemnum) && (pitem.flags & FLAG_LEFT_ARROW))
+ if (is_selected(itemnum) && (pitem.flags() & FLAG_LEFT_ARROW))
{
float const l = effective_left + effective_width - subitem_width - gutter_width;
float const r = l + lr_arrow_width;
@@ -716,14 +715,14 @@ void menu::draw(uint32_t flags)
if (mouse_in_rect(l, line_y0 + 0.1f * line_height, r, line_y0 + 0.9f * line_height))
m_hover = HOVER_UI_LEFT;
}
- if (is_selected(itemnum) && (pitem.flags & FLAG_RIGHT_ARROW))
+ if (is_selected(itemnum) && (pitem.flags() & FLAG_RIGHT_ARROW))
{
float const r = effective_left + effective_width + gutter_width;
float const l = r - lr_arrow_width;
draw_arrow(
- l, line_y0 + 0.1f * line_height, r, line_y0 + 0.9f * line_height,
- fgcolor,
- ROT90);
+ l, line_y0 + 0.1f * line_height, r, line_y0 + 0.9f * line_height,
+ fgcolor,
+ ROT90);
if (mouse_in_rect(l, line_y0 + 0.1f * line_height, r, line_y0 + 0.9f * line_height))
m_hover = HOVER_UI_RIGHT;
}
@@ -735,7 +734,7 @@ void menu::draw(uint32_t flags)
if (selected_subitem_too_big)
{
menu_item const &pitem = selected_item();
- bool const subitem_invert(pitem.flags & FLAG_INVERT);
+ bool const subitem_invert(pitem.flags() & FLAG_INVERT);
auto const linenum = m_selected - top_line;
float const line_y = visible_top + (float)linenum * line_height;
float target_width, target_height;
@@ -743,7 +742,7 @@ void menu::draw(uint32_t flags)
// compute the multi-line target width/height
ui().draw_text_full(
container(),
- pitem.subtext,
+ pitem.subtext(),
0, 0, visible_width * 0.75f,
text_layout::text_justify::RIGHT, text_layout::word_wrapping::WORD,
mame_ui_manager::NONE, rgb_t::white(), rgb_t::black(),
@@ -764,7 +763,7 @@ void menu::draw(uint32_t flags)
ui().draw_text_full(
container(),
- pitem.subtext,
+ pitem.subtext(),
target_x, target_y, target_width,
text_layout::text_justify::RIGHT, text_layout::word_wrapping::WORD,
mame_ui_manager::NORMAL, ui().colors().selected_color(), ui().colors().selected_bg_color(),
@@ -1006,8 +1005,8 @@ void menu::handle_keys(uint32_t flags, int &iptkey)
validate_selection(1);
// swallow left/right keys if they are not appropriate
- bool const ignoreleft = !(flags & PROCESS_LR_ALWAYS) && !(selected_item().flags & FLAG_LEFT_ARROW);
- bool const ignoreright = !(flags & PROCESS_LR_ALWAYS) && !(selected_item().flags & FLAG_RIGHT_ARROW);
+ bool const ignoreleft = !(flags & PROCESS_LR_ALWAYS) && !(selected_item().flags() & FLAG_LEFT_ARROW);
+ bool const ignoreright = !(flags & PROCESS_LR_ALWAYS) && !(selected_item().flags() & FLAG_RIGHT_ARROW);
// accept left/right/prev/next keys as-is with repeat if appropriate
if (!ignoreleft && exclusive_input_pressed(iptkey, IPT_UI_LEFT, (flags & PROCESS_LR_REPEAT) ? 6 : 0))
diff --git a/src/frontend/mame/ui/menu.h b/src/frontend/mame/ui/menu.h
index e5904f2f347..a6e6c25d174 100644
--- a/src/frontend/mame/ui/menu.h
+++ b/src/frontend/mame/ui/menu.h
@@ -54,7 +54,7 @@ public:
void item_append(const std::string &text, const std::string &subtext, uint32_t flags, void *ref, menu_item_type type = menu_item_type::UNKNOWN) { item_append(std::string(text), std::string(subtext), flags, ref, type); }
void item_append(std::string &&text, uint32_t flags, void *ref, menu_item_type type = menu_item_type::UNKNOWN) { item_append(text, std::string(), flags, ref, type); }
void item_append(std::string &&text, std::string &&subtext, uint32_t flags, void *ref, menu_item_type type = menu_item_type::UNKNOWN);
- void item_append(menu_item item) { item_append(item.text, item.subtext, item.flags, item.ref, item.type); }
+ void item_append(menu_item item) { item_append(item.text(), item.subtext(), item.flags(), item.ref(), item.type()); }
void item_append(menu_item_type type, uint32_t flags = 0);
void item_append_on_off(const std::string &text, bool state, uint32_t flags, void *ref, menu_item_type type = menu_item_type::UNKNOWN);
@@ -150,7 +150,7 @@ protected:
int item_count() const { return m_items.size(); }
// retrieves the ref of the currently selected menu item or nullptr
- void *get_selection_ref() const { return selection_valid() ? m_items[m_selected].ref : nullptr; }
+ void *get_selection_ref() const { return selection_valid() ? m_items[m_selected].ref() : nullptr; }
menu_item &selected_item() { return m_items[m_selected]; }
menu_item const &selected_item() const { return m_items[m_selected]; }
@@ -279,7 +279,7 @@ protected:
static bool is_selectable(menu_item const &item)
{
- return (!(item.flags & menu::FLAG_DISABLE) && (item.type != menu_item_type::SEPARATOR));
+ return (!(item.flags() & menu::FLAG_DISABLE) && (item.type() != menu_item_type::SEPARATOR));
}
// get arrows status
diff --git a/src/frontend/mame/ui/menuitem.h b/src/frontend/mame/ui/menuitem.h
index 4900e78485b..d92e4153ee4 100644
--- a/src/frontend/mame/ui/menuitem.h
+++ b/src/frontend/mame/ui/menuitem.h
@@ -15,6 +15,11 @@
#pragma once
+#include <cstdint>
+#include <string>
+#include <utility>
+
+
namespace ui {
// special menu item for separators
@@ -31,17 +36,32 @@ enum class menu_item_type
class menu_item
{
public:
- menu_item() = default;
menu_item(menu_item const &) = default;
menu_item(menu_item &&) = default;
menu_item &operator=(menu_item const &) = default;
menu_item &operator=(menu_item &&) = default;
- std::string text;
- std::string subtext;
- uint32_t flags;
- void *ref;
- menu_item_type type; // item type (eventually will go away when itemref is proper ui_menu_item class rather than void*)
+ menu_item(menu_item_type t = menu_item_type::UNKNOWN, void *r = nullptr, uint32_t f = 0) : m_ref(r), m_flags(f), m_type(t)
+ { }
+
+ std::string const &text() const noexcept { return m_text; }
+ std::string const &subtext() const noexcept { return m_subtext; }
+ void *ref() const noexcept { return m_ref; }
+ uint32_t flags() const noexcept { return m_flags; }
+ unsigned generation() const noexcept { return m_generation; }
+ menu_item_type type() const noexcept { return m_type; }
+
+ template <typename... T> void set_text(T &&... args) { m_text.assign(std::forward<T>(args)...); ++m_generation; }
+ template <typename... T> void set_subtext(T &&... args) { m_subtext.assign(std::forward<T>(args)...); ++m_generation; }
+ void set_flags(uint32_t f) noexcept { m_flags = f; ++m_generation; }
+
+private:
+ std::string m_text;
+ std::string m_subtext;
+ void *m_ref;
+ uint32_t m_flags;
+ unsigned m_generation = 0;
+ menu_item_type m_type;
};
} // namespace ui
diff --git a/src/frontend/mame/ui/selgame.cpp b/src/frontend/mame/ui/selgame.cpp
index 315722922d2..e555bdfc15b 100644
--- a/src/frontend/mame/ui/selgame.cpp
+++ b/src/frontend/mame/ui/selgame.cpp
@@ -167,7 +167,7 @@ void menu_select_game::menu_activated()
void menu_select_game::handle(event const *ev)
{
if (!m_prev_selected)
- m_prev_selected = item(0).ref;
+ m_prev_selected = item(0).ref();
// if I have to select software, force software list submenu
if (reselect_last::get())
diff --git a/src/frontend/mame/ui/selmenu.cpp b/src/frontend/mame/ui/selmenu.cpp
index b299c7e4167..fc20bc0c9ee 100644
--- a/src/frontend/mame/ui/selmenu.cpp
+++ b/src/frontend/mame/ui/selmenu.cpp
@@ -1980,7 +1980,7 @@ void menu_select_launch::draw(uint32_t flags)
float line_y = visible_top + (float(linenum) * line_height);
int itemnum = top_line + linenum;
const menu_item &pitem = item(itemnum);
- const std::string_view itemtext = pitem.text;
+ const std::string_view itemtext = pitem.text();
rgb_t fgcolor = ui().colors().text_color();
rgb_t bgcolor = ui().colors().text_bg_color();
rgb_t fgcolor3 = ui().colors().clone_color();
@@ -2012,7 +2012,7 @@ void menu_select_launch::draw(uint32_t flags)
bgcolor = ui().colors().mouseover_bg_color();
highlight(line_x0, line_y0, line_x1, line_y1, bgcolor);
}
- else if (pitem.ref == m_prev_selected)
+ else if (pitem.ref() == m_prev_selected)
{
fgcolor = fgcolor3 = ui().options().mouseover_color();
bgcolor = ui().colors().mouseover_bg_color();
@@ -2038,18 +2038,18 @@ void menu_select_launch::draw(uint32_t flags)
if (hover() == itemnum)
set_hover(HOVER_ARROW_DOWN);
}
- else if (pitem.type == menu_item_type::SEPARATOR)
+ else if (pitem.type() == menu_item_type::SEPARATOR)
{
// if we're just a divider, draw a line
container().add_line(visible_left, line_y + 0.5f * line_height, visible_left + visible_width, line_y + 0.5f * line_height,
UI_LINE_WIDTH, ui().colors().text_color(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
}
- else if (pitem.subtext.empty())
+ else if (pitem.subtext().empty())
{
// draw the item centered
- int const item_invert = pitem.flags & FLAG_INVERT;
+ int const item_invert = pitem.flags() & FLAG_INVERT;
if (m_has_icons)
- draw_icon(linenum, item(itemnum).ref, effective_left, line_y);
+ draw_icon(linenum, item(itemnum).ref(), effective_left, line_y);
ui().draw_text_full(
container(),
itemtext,
@@ -2060,15 +2060,15 @@ void menu_select_launch::draw(uint32_t flags)
}
else
{
- int const item_invert = pitem.flags & FLAG_INVERT;
- std::string_view const subitem_text = pitem.subtext;
+ int const item_invert = pitem.flags() & FLAG_INVERT;
+ std::string_view const subitem_text = pitem.subtext();
float item_width, subitem_width;
// compute right space for subitem
ui().draw_text_full(
container(),
subitem_text,
- effective_left + icon_offset, line_y, ui().get_string_width(pitem.subtext),
+ effective_left + icon_offset, line_y, ui().get_string_width(pitem.subtext()),
text_layout::text_justify::RIGHT, text_layout::word_wrapping::NEVER,
mame_ui_manager::NONE, item_invert ? fgcolor3 : fgcolor, bgcolor,
&subitem_width, nullptr);
@@ -2076,7 +2076,7 @@ void menu_select_launch::draw(uint32_t flags)
// draw the item left-justified
if (m_has_icons)
- draw_icon(linenum, item(itemnum).ref, effective_left, line_y);
+ draw_icon(linenum, item(itemnum).ref(), effective_left, line_y);
ui().draw_text_full(
container(),
itemtext,
@@ -2099,7 +2099,7 @@ void menu_select_launch::draw(uint32_t flags)
for (size_t count = m_available_items; count < item_count(); count++)
{
const menu_item &pitem = item(count);
- const std::string_view itemtext = pitem.text;
+ const std::string_view itemtext = pitem.text();
float line_x0 = x1 + 0.5f * UI_LINE_WIDTH;
float line_y0 = line;
float line_x1 = x2 - 0.5f * UI_LINE_WIDTH;
@@ -2126,7 +2126,7 @@ void menu_select_launch::draw(uint32_t flags)
highlight(line_x0, line_y0, line_x1, line_y1, bgcolor);
}
- if (pitem.type == menu_item_type::SEPARATOR)
+ if (pitem.type() == menu_item_type::SEPARATOR)
{
container().add_line(
visible_left, line + 0.5f * line_height,
diff --git a/src/frontend/mame/ui/selmenu.h b/src/frontend/mame/ui/selmenu.h
index 12da4d2b1f9..6568ca14a44 100644
--- a/src/frontend/mame/ui/selmenu.h
+++ b/src/frontend/mame/ui/selmenu.h
@@ -257,7 +257,7 @@ private:
{
for (int x = 0; x < item_count(); ++x)
{
- if (item(x).ref == m_prev_selected)
+ if (item(x).ref() == m_prev_selected)
{
set_selected_index(x);
break;
diff --git a/src/frontend/mame/ui/selsoft.cpp b/src/frontend/mame/ui/selsoft.cpp
index e129b1c064e..25baf9fe32c 100644
--- a/src/frontend/mame/ui/selsoft.cpp
+++ b/src/frontend/mame/ui/selsoft.cpp
@@ -397,7 +397,7 @@ menu_select_software::~menu_select_software()
void menu_select_software::handle(event const *ev)
{
if (m_prev_selected == nullptr)
- m_prev_selected = item(0).ref;
+ m_prev_selected = item(0).ref();
// FIXME: everything above here used run before events were processed
diff --git a/src/frontend/mame/ui/sliders.cpp b/src/frontend/mame/ui/sliders.cpp
index 4dbb69baa1a..f17a0bf9781 100644
--- a/src/frontend/mame/ui/sliders.cpp
+++ b/src/frontend/mame/ui/sliders.cpp
@@ -160,9 +160,9 @@ void menu_sliders::populate(float &customtop, float &custombottom)
std::vector<menu_item> ui_sliders = ui().get_slider_list();
for (const menu_item &item : ui_sliders)
{
- if (item.type == menu_item_type::SLIDER)
+ if (item.type() == menu_item_type::SLIDER)
{
- slider_state *const slider = reinterpret_cast<slider_state *>(item.ref);
+ slider_state *const slider = reinterpret_cast<slider_state *>(item.ref());
bool display(true);
#if 0
// FIXME: this test should be reimplemented in a dedicated menu
@@ -192,9 +192,9 @@ void menu_sliders::populate(float &customtop, float &custombottom)
std::vector<menu_item> osd_sliders = machine().osd().get_slider_list();
for (const menu_item &item : osd_sliders)
{
- if (item.type == menu_item_type::SLIDER)
+ if (item.type() == menu_item_type::SLIDER)
{
- slider_state* slider = reinterpret_cast<slider_state *>(item.ref);
+ slider_state* slider = reinterpret_cast<slider_state *>(item.ref());
int32_t curval = slider->update(&tempstring, SLIDER_NOCHANGE);
uint32_t flags = 0;
if (curval > slider->minval)
diff --git a/src/frontend/mame/ui/state.cpp b/src/frontend/mame/ui/state.cpp
index afd02a3b08d..4bda4d473ba 100644
--- a/src/frontend/mame/ui/state.cpp
+++ b/src/frontend/mame/ui/state.cpp
@@ -420,7 +420,7 @@ void menu_load_save_state_base::custom_render(void *selectedref, float top, floa
text[count++] = m_footer;
// provide a prompt to delete if a state is selected
- if (selected_item().ref)
+ if (selected_item().ref())
{
if (m_delete_prompt.empty())
m_delete_prompt = util::string_format(_("Press %1$s to delete"), machine().input().seq_name(machine().ioport().type_seq(IPT_UI_CLEAR)));
diff --git a/src/frontend/mame/ui/textbox.cpp b/src/frontend/mame/ui/textbox.cpp
index 9761491bf78..71de239b35f 100644
--- a/src/frontend/mame/ui/textbox.cpp
+++ b/src/frontend/mame/ui/textbox.cpp
@@ -141,7 +141,7 @@ void menu_textbox::draw(uint32_t flags)
// get width required to draw the sole menu item
menu_item const &pitem = item(0);
- std::string_view const itemtext = pitem.text;
+ std::string_view const itemtext = pitem.text();
float const itemwidth = gutter_width + ui().get_string_width(itemtext) + gutter_width;
float const draw_width = std::min(maximum_width, std::max(itemwidth, m_desired_width));
diff --git a/src/frontend/mame/ui/ui.cpp b/src/frontend/mame/ui/ui.cpp
index f44bf05af6f..663354420d2 100644
--- a/src/frontend/mame/ui/ui.cpp
+++ b/src/frontend/mame/ui/ui.cpp
@@ -117,7 +117,6 @@ std::string mame_ui_manager::messagebox_poptext;
// slider info
std::vector<ui::menu_item> mame_ui_manager::slider_list;
-slider_state *mame_ui_manager::slider_current;
/***************************************************************************
@@ -345,14 +344,6 @@ void mame_ui_manager::initialize(running_machine &machine)
// initialize the on-screen display system
slider_list = slider_init(machine);
- if (slider_list.size() > 0)
- {
- slider_current = reinterpret_cast<slider_state *>(slider_list[0].ref);
- }
- else
- {
- slider_current = nullptr;
- }
// if no test switch found, assign its input sequence to a service mode DIP
if (!m_machine_info->has_test_switch() && m_machine_info->has_dips())
@@ -1605,13 +1596,9 @@ std::vector<ui::menu_item> mame_ui_manager::slider_init(running_machine &machine
std::vector<ui::menu_item> items;
for (auto &slider : m_sliders)
{
- ui::menu_item item;
- item.text = slider->description;
- item.subtext = "";
- item.flags = 0;
- item.ref = slider.get();
- item.type = ui::menu_item_type::SLIDER;
- items.push_back(item);
+ ui::menu_item item(ui::menu_item_type::SLIDER, slider.get());
+ item.set_text(slider->description);
+ items.emplace_back(std::move(item));
}
return items;
diff --git a/src/frontend/mame/ui/ui.h b/src/frontend/mame/ui/ui.h
index 272fb0ae810..e155a261871 100644
--- a/src/frontend/mame/ui/ui.h
+++ b/src/frontend/mame/ui/ui.h
@@ -262,7 +262,6 @@ private:
static std::string messagebox_poptext;
static std::vector<ui::menu_item> slider_list;
- static slider_state *slider_current;
// UI handlers
uint32_t handler_ingame(render_container &container);
diff --git a/src/frontend/mame/ui/videoopt.cpp b/src/frontend/mame/ui/videoopt.cpp
index 60d2b25c66b..e677993dec2 100644
--- a/src/frontend/mame/ui/videoopt.cpp
+++ b/src/frontend/mame/ui/videoopt.cpp
@@ -75,7 +75,7 @@ void menu_video_targets::handle(event const *ev)
menu::stack_push<menu_video_options>(
ui(),
container(),
- std::string(selected_item().text),
+ std::string(selected_item().text()),
*target,
&machine().video().snapshot_target() == target);
}