mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
More UI cleanup:
* Got rid of more UI globals. * Cache more metrics in system/software selection menus. * Don't lose a BDF font specified on the command line when changing font size via the UI. * For win32 debugger, behave as though most recent history item was just entered when restoring session state.
This commit is contained in:
parent
6215cdca45
commit
f8480ce3f6
@ -78,6 +78,7 @@ menu_custom_ui::menu_custom_ui(mame_ui_manager &mui, render_container &container
|
||||
, m_handler(std::move(handler))
|
||||
, m_currlang(0)
|
||||
, m_currsysnames(0)
|
||||
, m_currpanels(ui().options().hide_panels())
|
||||
{
|
||||
set_process_flags(PROCESS_LR_REPEAT);
|
||||
set_heading(_("Customize UI"));
|
||||
@ -92,7 +93,7 @@ menu_custom_ui::menu_custom_ui(mame_ui_manager &mui, render_container &container
|
||||
|
||||
void menu_custom_ui::menu_dismissed()
|
||||
{
|
||||
ui().options().set_value(OPTION_HIDE_PANELS, ui_globals::panels_status, OPTION_PRIORITY_CMDLINE);
|
||||
ui().options().set_value(OPTION_HIDE_PANELS, m_currpanels, OPTION_PRIORITY_CMDLINE);
|
||||
|
||||
machine().options().set_value(OPTION_LANGUAGE, m_currlang ? m_languages[m_currlang] : "", OPTION_PRIORITY_CMDLINE);
|
||||
load_translation(machine().options());
|
||||
@ -178,23 +179,23 @@ void menu_custom_ui::handle(event const *ev)
|
||||
if ((ev->iptkey == IPT_UI_LEFT) || (ev->iptkey == IPT_UI_RIGHT) || (ev->iptkey == IPT_UI_CLEAR))
|
||||
{
|
||||
if (ev->iptkey == IPT_UI_LEFT)
|
||||
--ui_globals::panels_status;
|
||||
--m_currpanels;
|
||||
else if (ev->iptkey == IPT_UI_RIGHT)
|
||||
++ui_globals::panels_status;
|
||||
++m_currpanels;
|
||||
else
|
||||
ui_globals::panels_status = 0;
|
||||
ev->item->set_subtext(_(HIDE_STATUS[ui_globals::panels_status]));
|
||||
ev->item->set_flags(get_arrow_flags<uint16_t>(0, HIDE_BOTH, ui_globals::panels_status));
|
||||
m_currpanels = 0;
|
||||
ev->item->set_subtext(_(HIDE_STATUS[m_currpanels]));
|
||||
ev->item->set_flags(get_arrow_flags<uint16_t>(0, HIDE_BOTH, m_currpanels));
|
||||
}
|
||||
else if (ev->iptkey == IPT_UI_SELECT)
|
||||
{
|
||||
std::vector<std::string> s_sel(std::size(HIDE_STATUS));
|
||||
std::transform(std::begin(HIDE_STATUS), std::end(HIDE_STATUS), s_sel.begin(), [](auto &s) { return _(s); });
|
||||
menu::stack_push<menu_selector>(
|
||||
ui(), container(), _("Show Side Panels"), std::move(s_sel), ui_globals::panels_status,
|
||||
[item = ev->item] (int selection)
|
||||
ui(), container(), _("Show Side Panels"), std::move(s_sel), m_currpanels,
|
||||
[this, item = ev->item] (int selection)
|
||||
{
|
||||
ui_globals::panels_status = selection;
|
||||
m_currpanels = selection;
|
||||
item->set_subtext(_(HIDE_STATUS[selection]));
|
||||
item->set_flags(get_arrow_flags<uint16_t>(0, HIDE_BOTH, selection));
|
||||
});
|
||||
@ -220,8 +221,8 @@ void menu_custom_ui::populate(float &customtop, float &custombottom)
|
||||
arrow_flags = get_arrow_flags<std::size_t>(0, m_sysnames.size() - 1, m_currsysnames);
|
||||
item_append(_("System Names"), m_sysnames[m_currsysnames], arrow_flags, (void *)(uintptr_t)SYSNAMES_MENU);
|
||||
|
||||
arrow_flags = get_arrow_flags<uint16_t>(0, HIDE_BOTH, ui_globals::panels_status);
|
||||
item_append(_("Show Side Panels"), _(HIDE_STATUS[ui_globals::panels_status]), arrow_flags, (void *)(uintptr_t)HIDE_MENU);
|
||||
arrow_flags = get_arrow_flags<uint16_t>(0, HIDE_BOTH, m_currpanels);
|
||||
item_append(_("Show Side Panels"), _(HIDE_STATUS[m_currpanels]), arrow_flags, (void *)(uintptr_t)HIDE_MENU);
|
||||
|
||||
item_append(menu_item_type::SEPARATOR);
|
||||
}
|
||||
@ -328,6 +329,7 @@ menu_font_ui::menu_font_ui(mame_ui_manager &mui, render_container &container, st
|
||||
, m_info_min(parse_number<float>(mui.options().get_entry(OPTION_INFOS_SIZE)->minimum()))
|
||||
, m_info_max(parse_number<float>(mui.options().get_entry(OPTION_INFOS_SIZE)->maximum()))
|
||||
, m_info_size(mui.options().infos_size())
|
||||
, m_face_changed(false)
|
||||
, m_changed(false)
|
||||
, m_actual(0U)
|
||||
{
|
||||
@ -374,17 +376,20 @@ void menu_font_ui::menu_dismissed()
|
||||
{
|
||||
ui_options &moptions = ui().options();
|
||||
|
||||
std::string name(m_fonts[m_actual].first);
|
||||
#ifdef UI_WINDOWS
|
||||
if (name != "default")
|
||||
if (m_face_changed)
|
||||
{
|
||||
if (m_italic)
|
||||
name.insert(0, "[I]");
|
||||
if (m_bold)
|
||||
name.insert(0, "[B]");
|
||||
}
|
||||
std::string name(m_fonts[m_actual].first);
|
||||
#ifdef UI_WINDOWS
|
||||
if (name != "default")
|
||||
{
|
||||
if (m_italic)
|
||||
name.insert(0, "[I]");
|
||||
if (m_bold)
|
||||
name.insert(0, "[B]");
|
||||
}
|
||||
#endif
|
||||
machine().options().set_value(OPTION_UI_FONT, name, OPTION_PRIORITY_CMDLINE);
|
||||
machine().options().set_value(OPTION_UI_FONT, name, OPTION_PRIORITY_CMDLINE);
|
||||
}
|
||||
moptions.set_value(OPTION_INFOS_SIZE, m_info_size, OPTION_PRIORITY_CMDLINE);
|
||||
moptions.set_value(OPTION_FONT_ROWS, m_font_size, OPTION_PRIORITY_CMDLINE);
|
||||
|
||||
@ -440,6 +445,7 @@ void menu_font_ui::handle(event const *ev)
|
||||
case MUI_FNT:
|
||||
if ((ev->iptkey == IPT_UI_LEFT) || (ev->iptkey == IPT_UI_RIGHT) || (ev->iptkey == IPT_UI_CLEAR))
|
||||
{
|
||||
m_face_changed = true;
|
||||
m_changed = true;
|
||||
if (ev->iptkey == IPT_UI_LEFT)
|
||||
--m_actual;
|
||||
@ -459,6 +465,7 @@ void menu_font_ui::handle(event const *ev)
|
||||
ui(), container(), _("UI Font"), std::move(display_names), m_actual,
|
||||
[this] (int selection)
|
||||
{
|
||||
m_face_changed = true;
|
||||
m_changed = true;
|
||||
m_actual = selection;
|
||||
reset(reset_options::REMEMBER_REF);
|
||||
@ -471,6 +478,7 @@ void menu_font_ui::handle(event const *ev)
|
||||
case MUI_ITALIC:
|
||||
if ((ev->iptkey == IPT_UI_LEFT) || (ev->iptkey == IPT_UI_RIGHT) || (ev->iptkey == IPT_UI_SELECT) || (ev->iptkey == IPT_UI_CLEAR))
|
||||
{
|
||||
m_face_changed = true;
|
||||
m_changed = true;
|
||||
bool &val = ((uintptr_t)ev->itemref == MUI_BOLD) ? m_bold : m_italic;
|
||||
if (ev->iptkey == IPT_UI_CLEAR)
|
||||
|
@ -44,6 +44,7 @@ private:
|
||||
std::vector<std::string> m_sysnames;
|
||||
std::size_t m_currlang;
|
||||
std::size_t m_currsysnames;
|
||||
u8 m_currpanels;
|
||||
};
|
||||
|
||||
//-------------------------------------------------
|
||||
@ -71,6 +72,7 @@ private:
|
||||
int m_font_size;
|
||||
float const m_info_min, m_info_max;
|
||||
float m_info_size;
|
||||
bool m_face_changed;
|
||||
bool m_changed;
|
||||
|
||||
std::uint16_t m_actual;
|
||||
|
@ -112,7 +112,6 @@ menu_select_game::menu_select_game(mame_ui_manager &mui, render_container &conta
|
||||
set_right_image(moptions.system_right_image());
|
||||
|
||||
ui_globals::curdats_view = 0;
|
||||
ui_globals::panels_status = moptions.hide_panels();
|
||||
ui_globals::curdats_total = 1;
|
||||
}
|
||||
|
||||
@ -145,6 +144,8 @@ void menu_select_game::recompute_metrics(uint32_t width, uint32_t height, float
|
||||
|
||||
void menu_select_game::menu_activated()
|
||||
{
|
||||
menu_select_launch::menu_activated();
|
||||
|
||||
// if I have to load datfile, perform a hard reset
|
||||
if (ui_globals::reset)
|
||||
{
|
||||
@ -155,11 +156,6 @@ void menu_select_game::menu_activated()
|
||||
ui_globals::reset = false;
|
||||
machine().schedule_hard_reset();
|
||||
stack_reset();
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
menu_select_launch::menu_activated();
|
||||
}
|
||||
}
|
||||
|
||||
@ -185,7 +181,6 @@ void menu_select_game::menu_deactivated()
|
||||
std::string const filter(m_persistent_data.filter_data().get_config_string());
|
||||
|
||||
ui_options &mopt = ui().options();
|
||||
mopt.set_value(OPTION_HIDE_PANELS, ui_globals::panels_status, OPTION_PRIORITY_CMDLINE);
|
||||
mopt.set_value(OPTION_LAST_USED_MACHINE, last_driver, OPTION_PRIORITY_CMDLINE);
|
||||
mopt.set_value(OPTION_LAST_USED_FILTER, filter, OPTION_PRIORITY_CMDLINE);
|
||||
mopt.set_value(OPTION_SYSTEM_RIGHT_PANEL, right_panel_config_string(), OPTION_PRIORITY_CMDLINE);
|
||||
@ -481,10 +476,7 @@ void menu_select_game::populate(float &customtop, float &custombottom)
|
||||
if (old_item_selected != -1)
|
||||
{
|
||||
set_selected_index(old_item_selected);
|
||||
if (ui_globals::visible_main_lines == 0)
|
||||
top_line = (selected_index() != 0) ? selected_index() - 1 : 0;
|
||||
else
|
||||
top_line = selected_index() - (ui_globals::visible_main_lines / 2);
|
||||
centre_selection();
|
||||
|
||||
if (reselect_last::software().empty())
|
||||
reselect_last::reset();
|
||||
|
@ -164,8 +164,6 @@ void load_driver_image(bitmap_argb32 &bitmap, emu_file &file, game_driver const
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
constexpr std::size_t menu_select_launch::MAX_VISIBLE_SEARCH; // stupid non-inline semantics
|
||||
|
||||
|
||||
class menu_select_launch::software_parts : public menu
|
||||
{
|
||||
@ -254,6 +252,10 @@ void menu_select_launch::reselect_last::set_software(game_driver const &driver,
|
||||
}
|
||||
|
||||
|
||||
inline bool menu_select_launch::show_left_panel() const { return !(m_panels_status & HIDE_LEFT_PANEL); }
|
||||
inline bool menu_select_launch::show_right_panel() const { return !(m_panels_status & HIDE_RIGHT_PANEL); }
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// ctor
|
||||
//-------------------------------------------------
|
||||
@ -500,12 +502,19 @@ menu_select_launch::menu_select_launch(mame_ui_manager &mui, render_container &c
|
||||
, m_items_list()
|
||||
, m_info_buffer()
|
||||
, m_info_layout()
|
||||
, m_icon_width(0)
|
||||
, m_icon_height(0)
|
||||
, m_divider_width(0.0F)
|
||||
, m_divider_arrow_width(0.0F)
|
||||
, m_divider_arrow_height(0.0F)
|
||||
, m_info_line_height(0.0F)
|
||||
, m_cache(mui.get_session_data<menu_select_launch, cache_wrapper>(machine()))
|
||||
, m_is_swlist(is_swlist)
|
||||
, m_focus(focused_menu::MAIN)
|
||||
, m_pressed(false)
|
||||
, m_repeat(0)
|
||||
, m_right_visible_lines(0)
|
||||
, m_panels_status(SHOW_PANELS)
|
||||
, m_right_panel(RP_FIRST)
|
||||
, m_has_icons(false)
|
||||
, m_switch_image(false)
|
||||
@ -619,6 +628,23 @@ void menu_select_launch::recompute_metrics(uint32_t width, uint32_t height, floa
|
||||
{
|
||||
menu::recompute_metrics(width, height, aspect);
|
||||
|
||||
// calculate icon size in pixels
|
||||
render_target const &target(machine().render().ui_target());
|
||||
bool const rotated((target.orientation() & ORIENTATION_SWAP_XY) != 0);
|
||||
m_icon_width = int((rotated ? height : width) * line_height() * aspect);
|
||||
m_icon_height = int((rotated ? width : height) * line_height());
|
||||
|
||||
// force info text to be laid out again
|
||||
m_info_layout = std::nullopt;
|
||||
|
||||
// calculate size of dividers between panes
|
||||
m_divider_width = 2.0F * lr_border();
|
||||
m_divider_arrow_width = 0.4F * m_divider_width;
|
||||
m_divider_arrow_height = 2.0F * tb_border();
|
||||
|
||||
// calculate info text size
|
||||
m_info_line_height = ui().get_line_height(ui().options().infos_size());
|
||||
|
||||
// force right panel images to be redrawn
|
||||
m_cache.set_snapx_driver(nullptr);
|
||||
m_cache.set_snapx_software(nullptr);
|
||||
@ -756,6 +782,18 @@ void menu_select_launch::custom_render(void *selectedref, float top, float botto
|
||||
}
|
||||
|
||||
|
||||
void menu_select_launch::menu_activated()
|
||||
{
|
||||
m_panels_status = ui().options().hide_panels();
|
||||
}
|
||||
|
||||
|
||||
void menu_select_launch::menu_deactivated()
|
||||
{
|
||||
ui().options().set_value(OPTION_HIDE_PANELS, m_panels_status, OPTION_PRIORITY_CMDLINE);
|
||||
}
|
||||
|
||||
|
||||
void menu_select_launch::rotate_focus(int dir)
|
||||
{
|
||||
switch (get_focus())
|
||||
@ -763,30 +801,30 @@ void menu_select_launch::rotate_focus(int dir)
|
||||
case focused_menu::MAIN:
|
||||
if (selected_index() > m_available_items)
|
||||
{
|
||||
if ((0 > dir) || (ui_globals::panels_status == HIDE_BOTH))
|
||||
if ((0 > dir) || (m_panels_status == HIDE_BOTH))
|
||||
select_prev();
|
||||
else if (ui_globals::panels_status == HIDE_LEFT_PANEL)
|
||||
else if (m_panels_status == HIDE_LEFT_PANEL)
|
||||
set_focus(focused_menu::RIGHTTOP);
|
||||
else
|
||||
set_focus(focused_menu::LEFT);
|
||||
}
|
||||
else if (m_skip_main_items || (ui_globals::panels_status != HIDE_BOTH))
|
||||
else if (m_skip_main_items || (m_panels_status != HIDE_BOTH))
|
||||
{
|
||||
m_prev_selected = get_selection_ref();
|
||||
if (0 < dir)
|
||||
{
|
||||
if (m_skip_main_items)
|
||||
set_selected_index(m_available_items + 1);
|
||||
else if (ui_globals::panels_status == HIDE_LEFT_PANEL)
|
||||
else if (m_panels_status == HIDE_LEFT_PANEL)
|
||||
set_focus(focused_menu::RIGHTTOP);
|
||||
else
|
||||
set_focus(focused_menu::LEFT);
|
||||
}
|
||||
else if (ui_globals::panels_status == HIDE_RIGHT_PANEL)
|
||||
else if (m_panels_status == HIDE_RIGHT_PANEL)
|
||||
{
|
||||
set_focus(focused_menu::LEFT);
|
||||
}
|
||||
else if (ui_globals::panels_status != HIDE_BOTH)
|
||||
else if (m_panels_status != HIDE_BOTH)
|
||||
{
|
||||
set_focus(focused_menu::RIGHTBOTTOM);
|
||||
}
|
||||
@ -806,7 +844,7 @@ void menu_select_launch::rotate_focus(int dir)
|
||||
else
|
||||
select_prev();
|
||||
}
|
||||
else if (ui_globals::panels_status != HIDE_RIGHT_PANEL)
|
||||
else if (m_panels_status != HIDE_RIGHT_PANEL)
|
||||
{
|
||||
set_focus(focused_menu::RIGHTTOP);
|
||||
}
|
||||
@ -822,7 +860,7 @@ void menu_select_launch::rotate_focus(int dir)
|
||||
{
|
||||
set_focus(focused_menu::RIGHTBOTTOM);
|
||||
}
|
||||
else if (ui_globals::panels_status != HIDE_LEFT_PANEL)
|
||||
else if (m_panels_status != HIDE_LEFT_PANEL)
|
||||
{
|
||||
set_focus(focused_menu::LEFT);
|
||||
}
|
||||
@ -957,13 +995,12 @@ float menu_select_launch::draw_left_panel(
|
||||
std::map<typename Filter::type, typename Filter::ptr> const &filters,
|
||||
float x1, float y1, float x2, float y2)
|
||||
{
|
||||
if ((ui_globals::panels_status != SHOW_PANELS) && (ui_globals::panels_status != HIDE_RIGHT_PANEL))
|
||||
if (!show_left_panel())
|
||||
return draw_collapsed_left_panel(x1, y1, x2, y2);
|
||||
|
||||
// calculate line height
|
||||
float const target_height(ui().get_line_height(ui().options().infos_size()));
|
||||
float const sc(y2 - y1 - (2.0F * tb_border()));
|
||||
float line_height_max(target_height);
|
||||
float line_height_max(m_info_line_height);
|
||||
if ((Filter::COUNT * line_height_max) > sc)
|
||||
{
|
||||
float const lm(sc / Filter::COUNT);
|
||||
@ -972,12 +1009,12 @@ float menu_select_launch::draw_left_panel(
|
||||
|
||||
// calculate horizontal offset for unadorned names
|
||||
std::string tmp(convert_command_glyph("_# "));
|
||||
float const text_sign = ui().get_string_width(tmp, target_height);
|
||||
float const text_sign = ui().get_string_width(tmp, m_info_line_height);
|
||||
|
||||
// get the maximum width of a filter name
|
||||
float left_width(0.0F);
|
||||
for (typename Filter::type x = Filter::FIRST; Filter::COUNT > x; ++x)
|
||||
left_width = std::max(ui().get_string_width(Filter::display_name(x), target_height) + text_sign, left_width);
|
||||
left_width = std::max(ui().get_string_width(Filter::display_name(x), m_info_line_height) + text_sign, left_width);
|
||||
left_width = std::min(left_width, 0.25F);
|
||||
|
||||
// outline the box and inset by the border width
|
||||
@ -1037,22 +1074,20 @@ float menu_select_launch::draw_left_panel(
|
||||
text_layout::text_justify::LEFT, text_layout::word_wrapping::TRUNCATE,
|
||||
mame_ui_manager::NORMAL, fgcolor, bgcolor,
|
||||
nullptr, nullptr,
|
||||
target_height);
|
||||
m_info_line_height);
|
||||
y1 += line_height_max;
|
||||
}
|
||||
|
||||
x1 = x2 + lr_border();
|
||||
x2 = x1 + 2.0F * lr_border();
|
||||
x2 = x1 + m_divider_width;
|
||||
y1 = origy1;
|
||||
y2 = origy2;
|
||||
float const space = x2 - x1;
|
||||
float const lr_arrow_width = 0.4F * space;
|
||||
|
||||
// set left-right arrows dimension
|
||||
float const ar_x0 = 0.5F * (x2 + x1 - lr_arrow_width);
|
||||
float const ar_y0 = 0.5F * (y2 + y1) - tb_border();
|
||||
float const ar_x1 = ar_x0 + lr_arrow_width;
|
||||
float const ar_y1 = ar_y0 + 2.0F * tb_border();
|
||||
float const ar_x0 = 0.5F * (x2 + x1 - m_divider_arrow_width);
|
||||
float const ar_y0 = 0.5F * (y2 + y1 - m_divider_arrow_height);
|
||||
float const ar_x1 = ar_x0 + m_divider_arrow_width;
|
||||
float const ar_y1 = ar_y0 + m_divider_arrow_height;
|
||||
|
||||
ui().draw_outlined_box(container(), x1, y1, x2, y2, rgb_t(0xef, 0x12, 0x47, 0x7b));
|
||||
|
||||
@ -1162,19 +1197,9 @@ bool menu_select_launch::scale_icon(bitmap_argb32 &&src, texture_and_bitmap &dst
|
||||
assert(dst.texture);
|
||||
if (src.valid())
|
||||
{
|
||||
// calculate available space for the icon in pixels
|
||||
float const height(line_height());
|
||||
float const width(height * container().manager().ui_aspect(&container()));
|
||||
render_target const &target(machine().render().ui_target());
|
||||
u32 const dst_height(target.height());
|
||||
u32 const dst_width(target.width());
|
||||
bool const rotated((target.orientation() & ORIENTATION_SWAP_XY) != 0);
|
||||
int const max_height(int((rotated ? dst_width : dst_height) * height));
|
||||
int const max_width(int((rotated ? dst_height : dst_width) * width));
|
||||
|
||||
// reduce the source bitmap if it's too big
|
||||
bitmap_argb32 tmp;
|
||||
float const ratio((std::min)({ float(max_height) / src.height(), float(max_width) / src.width(), 1.0F }));
|
||||
float const ratio((std::min)({ float(m_icon_height) / src.height(), float(m_icon_width) / src.width(), 1.0F }));
|
||||
if (1.0F > ratio)
|
||||
{
|
||||
float const pix_height(std::ceil(src.height() * ratio));
|
||||
@ -1188,7 +1213,7 @@ bool menu_select_launch::scale_icon(bitmap_argb32 &&src, texture_and_bitmap &dst
|
||||
}
|
||||
|
||||
// copy into the destination
|
||||
dst.bitmap.allocate(max_width, max_height);
|
||||
dst.bitmap.allocate(m_icon_width, m_icon_height);
|
||||
for (int y = 0; tmp.height() > y; ++y)
|
||||
for (int x = 0; tmp.width() > x; ++x)
|
||||
dst.bitmap.pix(y, x) = tmp.pix(y, x);
|
||||
@ -1450,10 +1475,6 @@ void menu_select_launch::handle_keys(u32 flags, int &iptkey)
|
||||
// validate the current selection
|
||||
validate_selection(1);
|
||||
|
||||
// swallow left/right keys if they are not appropriate
|
||||
bool const leftclose = (ui_globals::panels_status == HIDE_BOTH || ui_globals::panels_status == HIDE_LEFT_PANEL);
|
||||
bool const rightclose = (ui_globals::panels_status == HIDE_BOTH || ui_globals::panels_status == HIDE_RIGHT_PANEL);
|
||||
|
||||
// accept left/right keys as-is with repeat
|
||||
if (exclusive_input_pressed(iptkey, IPT_UI_LEFT, (flags & PROCESS_LR_REPEAT) ? 6 : 0))
|
||||
{
|
||||
@ -1469,6 +1490,7 @@ void menu_select_launch::handle_keys(u32 flags, int &iptkey)
|
||||
}
|
||||
}
|
||||
|
||||
// swallow left/right keys if they are not appropriate
|
||||
if (exclusive_input_pressed(iptkey, IPT_UI_RIGHT, (flags & PROCESS_LR_REPEAT) ? 6 : 0))
|
||||
{
|
||||
if (m_focus == focused_menu::RIGHTTOP)
|
||||
@ -1486,11 +1508,11 @@ void menu_select_launch::handle_keys(u32 flags, int &iptkey)
|
||||
// up backs up by one item
|
||||
if (exclusive_input_pressed(iptkey, IPT_UI_UP, 6))
|
||||
{
|
||||
if (!leftclose && m_focus == focused_menu::LEFT)
|
||||
if (show_left_panel() && m_focus == focused_menu::LEFT)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if (!rightclose && ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM)))
|
||||
else if (show_right_panel() && ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM)))
|
||||
{
|
||||
m_topline_datsview--;
|
||||
return;
|
||||
@ -1509,11 +1531,11 @@ void menu_select_launch::handle_keys(u32 flags, int &iptkey)
|
||||
// down advances by one item
|
||||
if (exclusive_input_pressed(iptkey, IPT_UI_DOWN, 6))
|
||||
{
|
||||
if (!leftclose && m_focus == focused_menu::LEFT)
|
||||
if (show_left_panel() && m_focus == focused_menu::LEFT)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if (!rightclose && ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM)))
|
||||
else if (show_right_panel() && ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM)))
|
||||
{
|
||||
m_topline_datsview++;
|
||||
return;
|
||||
@ -1532,7 +1554,7 @@ void menu_select_launch::handle_keys(u32 flags, int &iptkey)
|
||||
if (exclusive_input_pressed(iptkey, IPT_UI_PAGE_UP, 6))
|
||||
{
|
||||
// Infos
|
||||
if (!rightclose && ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM)))
|
||||
if (show_right_panel() && ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM)))
|
||||
{
|
||||
m_topline_datsview -= m_right_visible_lines - 3;
|
||||
return;
|
||||
@ -1550,7 +1572,7 @@ void menu_select_launch::handle_keys(u32 flags, int &iptkey)
|
||||
if (exclusive_input_pressed(iptkey, IPT_UI_PAGE_DOWN, 6))
|
||||
{
|
||||
// Infos
|
||||
if (!rightclose && ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM)))
|
||||
if (show_right_panel() && ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM)))
|
||||
{
|
||||
m_topline_datsview += m_right_visible_lines - 3;
|
||||
return;
|
||||
@ -1567,11 +1589,11 @@ void menu_select_launch::handle_keys(u32 flags, int &iptkey)
|
||||
// home goes to the start
|
||||
if (exclusive_input_pressed(iptkey, IPT_UI_HOME, 0))
|
||||
{
|
||||
if (!leftclose && m_focus == focused_menu::LEFT)
|
||||
if (show_left_panel() && m_focus == focused_menu::LEFT)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if (!rightclose && ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM)))
|
||||
else if (show_right_panel() && ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM)))
|
||||
{
|
||||
m_topline_datsview = 0;
|
||||
return;
|
||||
@ -1584,11 +1606,11 @@ void menu_select_launch::handle_keys(u32 flags, int &iptkey)
|
||||
// end goes to the last
|
||||
if (exclusive_input_pressed(iptkey, IPT_UI_END, 0))
|
||||
{
|
||||
if (!leftclose && m_focus == focused_menu::LEFT)
|
||||
if (show_left_panel() && m_focus == focused_menu::LEFT)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if (!rightclose && ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM)))
|
||||
else if (show_right_panel() && ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM)))
|
||||
{
|
||||
m_topline_datsview = m_total_lines;
|
||||
return;
|
||||
@ -1723,14 +1745,7 @@ void menu_select_launch::handle_events(u32 flags, event &ev)
|
||||
select_prev();
|
||||
}
|
||||
|
||||
if (ui_globals::panels_status == HIDE_LEFT_PANEL)
|
||||
ui_globals::panels_status = SHOW_PANELS;
|
||||
else if (ui_globals::panels_status == HIDE_BOTH)
|
||||
ui_globals::panels_status = HIDE_RIGHT_PANEL;
|
||||
else if (ui_globals::panels_status == SHOW_PANELS)
|
||||
ui_globals::panels_status = HIDE_LEFT_PANEL;
|
||||
else if (ui_globals::panels_status == HIDE_RIGHT_PANEL)
|
||||
ui_globals::panels_status = HIDE_BOTH;
|
||||
m_panels_status ^= HIDE_LEFT_PANEL;
|
||||
}
|
||||
else if (hover() == HOVER_RPANEL_ARROW)
|
||||
{
|
||||
@ -1740,14 +1755,7 @@ void menu_select_launch::handle_events(u32 flags, event &ev)
|
||||
select_prev();
|
||||
}
|
||||
|
||||
if (ui_globals::panels_status == HIDE_RIGHT_PANEL)
|
||||
ui_globals::panels_status = SHOW_PANELS;
|
||||
else if (ui_globals::panels_status == HIDE_BOTH)
|
||||
ui_globals::panels_status = HIDE_LEFT_PANEL;
|
||||
else if (ui_globals::panels_status == SHOW_PANELS)
|
||||
ui_globals::panels_status = HIDE_RIGHT_PANEL;
|
||||
else if (ui_globals::panels_status == HIDE_LEFT_PANEL)
|
||||
ui_globals::panels_status = HIDE_BOTH;
|
||||
m_panels_status ^= HIDE_RIGHT_PANEL;
|
||||
}
|
||||
else if (hover() == HOVER_B_FAV)
|
||||
{
|
||||
@ -1903,7 +1911,7 @@ void menu_select_launch::draw(u32 flags)
|
||||
{
|
||||
bool noinput = (flags & PROCESS_NOINPUT);
|
||||
float const icon_offset = m_has_icons ? (1.5f * ud_arrow_width()) : 0.0f;
|
||||
float right_panel_size = (ui_globals::panels_status == HIDE_BOTH || ui_globals::panels_status == HIDE_RIGHT_PANEL) ? 2.0f * lr_border() : 0.3f;
|
||||
float right_panel_size = show_right_panel() ? 0.3f : m_divider_width;
|
||||
float visible_width = 1.0f - 4.0f * lr_border();
|
||||
float primary_left = (1.0f - visible_width) * 0.5f;
|
||||
float primary_width = visible_width;
|
||||
@ -1926,11 +1934,6 @@ void menu_select_launch::draw(u32 flags)
|
||||
m_visible_lines = int(std::trunc(visible_main_menu_height / line_height()));
|
||||
visible_main_menu_height = float(m_visible_lines) * line_height();
|
||||
|
||||
if (!m_is_swlist)
|
||||
ui_globals::visible_main_lines = m_visible_lines;
|
||||
else
|
||||
ui_globals::visible_sw_lines = m_visible_lines;
|
||||
|
||||
// compute top/left of inner menu area by centering
|
||||
float visible_left = primary_left;
|
||||
float visible_top = (1.0f - (visible_main_menu_height + visible_extra_menu_height)) * 0.5f;
|
||||
@ -2193,16 +2196,13 @@ void menu_select_launch::draw(u32 flags)
|
||||
|
||||
void menu_select_launch::draw_right_panel(float origx1, float origy1, float origx2, float origy2)
|
||||
{
|
||||
bool const hide((ui_globals::panels_status == HIDE_RIGHT_PANEL) || (ui_globals::panels_status == HIDE_BOTH));
|
||||
float const x2(hide ? origx2 : (origx1 + 2.0F * lr_border()));
|
||||
float const space(x2 - origx1);
|
||||
float const lr_arrow_width(0.4F * space);
|
||||
float const x2(!show_right_panel() ? origx2 : (origx1 + m_divider_width));
|
||||
|
||||
// set left-right arrows dimension
|
||||
float const ar_x0(0.5F * (x2 + origx1 - lr_arrow_width));
|
||||
float const ar_y0(0.5F * (origy2 + origy1) - tb_border());
|
||||
float const ar_x1(ar_x0 + lr_arrow_width);
|
||||
float const ar_y1(ar_y0 + 2.0F * tb_border());
|
||||
float const ar_x0(0.5F * (x2 + origx1 - m_divider_arrow_width));
|
||||
float const ar_y0(0.5F * (origy2 + origy1 - m_divider_arrow_height));
|
||||
float const ar_x1(ar_x0 + m_divider_arrow_width);
|
||||
float const ar_y1(ar_y0 + m_divider_arrow_height);
|
||||
|
||||
ui().draw_outlined_box(container(), origx1, origy1, origx2, origy2, rgb_t(0xef, 0x12, 0x47, 0x7b));
|
||||
|
||||
@ -2213,19 +2213,20 @@ void menu_select_launch::draw_right_panel(float origx1, float origy1, float orig
|
||||
set_hover(HOVER_RPANEL_ARROW);
|
||||
}
|
||||
|
||||
if (hide)
|
||||
if (!show_right_panel())
|
||||
{
|
||||
draw_arrow(ar_x0, ar_y0, ar_x1, ar_y1, fgcolor, ROT90 ^ ORIENTATION_FLIP_X);
|
||||
return;
|
||||
}
|
||||
|
||||
draw_arrow(ar_x0, ar_y0, ar_x1, ar_y1, fgcolor, ROT90);
|
||||
origy1 = draw_right_box_title(x2, origy1, origx2, origy2);
|
||||
|
||||
if (m_right_panel == RP_IMAGES)
|
||||
arts_render(x2, origy1, origx2, origy2);
|
||||
else
|
||||
infos_render(x2, origy1, origx2, origy2);
|
||||
{
|
||||
draw_arrow(ar_x0, ar_y0, ar_x1, ar_y1, fgcolor, ROT90);
|
||||
origy1 = draw_right_box_title(x2, origy1, origx2, origy2);
|
||||
|
||||
if (m_right_panel == RP_IMAGES)
|
||||
arts_render(x2, origy1, origx2, origy2);
|
||||
else
|
||||
infos_render(x2, origy1, origx2, origy2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -2702,14 +2703,11 @@ bool menu_select_launch::has_multiple_bios(game_driver const &driver, s_bios &bi
|
||||
|
||||
float menu_select_launch::draw_collapsed_left_panel(float x1, float y1, float x2, float y2)
|
||||
{
|
||||
float const space = x2 - x1;
|
||||
float const lr_arrow_width = 0.4F * space;
|
||||
|
||||
// set left-right arrows dimension
|
||||
float const ar_x0 = 0.5F * (x2 + x1 - lr_arrow_width);
|
||||
float const ar_y0 = 0.5f * (y2 + y1) - tb_border();
|
||||
float const ar_x1 = ar_x0 + lr_arrow_width;
|
||||
float const ar_y1 = ar_y0 + 2.0F * tb_border();
|
||||
float const ar_x0 = 0.5F * (x2 + x1 - m_divider_arrow_width);
|
||||
float const ar_y0 = 0.5F * (y2 + y1 - m_divider_arrow_height);
|
||||
float const ar_x1 = ar_x0 + m_divider_arrow_width;
|
||||
float const ar_y1 = ar_y0 + m_divider_arrow_height;
|
||||
|
||||
ui().draw_outlined_box(container(), x1, y1, x2, y2, rgb_t(0xef, 0x12, 0x47, 0x7b)); // FIXME: magic numbers in colour?
|
||||
|
||||
@ -2865,13 +2863,12 @@ void menu_select_launch::infos_render(float origx1, float origy1, float origx2,
|
||||
mame_ui_manager::NORMAL, fgcolor, bgcolor, nullptr, nullptr,
|
||||
line_height() * tmp_size);
|
||||
|
||||
float const info_line_height = ui().get_line_height(ui().options().infos_size());
|
||||
sc = origx2 - origx1 - (2.0f * gutter_width);
|
||||
if (!m_info_layout || (m_info_layout->width() != sc))
|
||||
{
|
||||
m_info_layout.emplace(
|
||||
*ui().get_font(),
|
||||
machine().render().ui_aspect(&container()) * info_line_height, info_line_height,
|
||||
machine().render().ui_aspect(&container()) * m_info_line_height, m_info_line_height,
|
||||
sc,
|
||||
text_layout::text_justify::LEFT, text_layout::word_wrapping::WORD);
|
||||
menu_dats_view::add_info_text(*m_info_layout, m_info_buffer, ui().colors().text_color());
|
||||
@ -2880,7 +2877,7 @@ void menu_select_launch::infos_render(float origx1, float origy1, float origx2,
|
||||
|
||||
draw_common_arrow(origx1, origy1, origx2, origy2, m_info_view, 0, total - 1, title_size);
|
||||
|
||||
m_right_visible_lines = floor((origy2 - oy1) / info_line_height);
|
||||
m_right_visible_lines = floor((origy2 - oy1) / m_info_line_height);
|
||||
if (m_total_lines < m_right_visible_lines)
|
||||
m_right_visible_lines = m_total_lines;
|
||||
if (m_topline_datsview < 0)
|
||||
@ -2897,14 +2894,14 @@ void menu_select_launch::infos_render(float origx1, float origy1, float origx2,
|
||||
set_hover(HOVER_INFO_TEXT);
|
||||
|
||||
if (up_arrow)
|
||||
draw_info_arrow(0, origx1, origx2, oy1, info_line_height, info_line_height * aspect);
|
||||
draw_info_arrow(0, origx1, origx2, oy1, m_info_line_height, m_info_line_height * aspect);
|
||||
if (down_arrow)
|
||||
draw_info_arrow(1, origx1, origx2, oy1 + (float(m_right_visible_lines - 1) * info_line_height), info_line_height, info_line_height * aspect);
|
||||
draw_info_arrow(1, origx1, origx2, oy1 + (float(m_right_visible_lines - 1) * m_info_line_height), m_info_line_height, m_info_line_height * aspect);
|
||||
|
||||
m_info_layout->emit(
|
||||
container(),
|
||||
m_topline_datsview ? (m_topline_datsview + 1) : 0, r_visible_lines,
|
||||
origx1 + gutter_width, oy1 + (m_topline_datsview ? info_line_height : 0.0f));
|
||||
origx1 + gutter_width, oy1 + (m_topline_datsview ? m_info_line_height : 0.0f));
|
||||
}
|
||||
|
||||
|
||||
|
@ -39,8 +39,8 @@ public:
|
||||
virtual ~menu_select_launch() override;
|
||||
|
||||
protected:
|
||||
static constexpr std::size_t MAX_ICONS_RENDER = 128;
|
||||
static constexpr std::size_t MAX_VISIBLE_SEARCH = 200;
|
||||
static inline constexpr std::size_t MAX_ICONS_RENDER = 128;
|
||||
static inline constexpr std::size_t MAX_VISIBLE_SEARCH = 200;
|
||||
|
||||
// tab navigation
|
||||
enum class focused_menu
|
||||
@ -128,6 +128,8 @@ protected:
|
||||
|
||||
virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override;
|
||||
virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override;
|
||||
virtual void menu_activated() override;
|
||||
virtual void menu_deactivated() override;
|
||||
|
||||
// handlers
|
||||
virtual void inkey_export() = 0;
|
||||
@ -314,6 +316,9 @@ private:
|
||||
static bool has_multiple_bios(ui_software_info const &swinfo, s_bios &biosname);
|
||||
static bool has_multiple_bios(game_driver const &driver, s_bios &biosname);
|
||||
|
||||
bool show_left_panel() const;
|
||||
bool show_right_panel() const;
|
||||
|
||||
bool m_ui_error;
|
||||
std::string m_error_text;
|
||||
|
||||
@ -324,6 +329,13 @@ private:
|
||||
std::string m_info_buffer;
|
||||
std::optional<text_layout> m_info_layout;
|
||||
|
||||
int m_icon_width;
|
||||
int m_icon_height;
|
||||
float m_divider_width;
|
||||
float m_divider_arrow_width;
|
||||
float m_divider_arrow_height;
|
||||
float m_info_line_height;
|
||||
|
||||
cache &m_cache;
|
||||
bool m_is_swlist;
|
||||
focused_menu m_focus;
|
||||
@ -332,6 +344,7 @@ private:
|
||||
|
||||
int m_right_visible_lines; // right box lines
|
||||
|
||||
u8 m_panels_status;
|
||||
u8 m_right_panel;
|
||||
bool m_has_icons;
|
||||
bool m_switch_image;
|
||||
|
@ -613,7 +613,7 @@ void menu_select_software::populate(float &customtop, float &custombottom)
|
||||
if (old_software != -1)
|
||||
{
|
||||
set_selected_index(old_software);
|
||||
top_line = selected_index() - (ui_globals::visible_sw_lines / 2);
|
||||
centre_selection();
|
||||
}
|
||||
|
||||
reselect_last::reset();
|
||||
|
@ -1956,9 +1956,6 @@ uint8_t ui_globals::cur_sw_dats_total = 0;
|
||||
uint8_t ui_globals::curdats_total = 0;
|
||||
uint8_t ui_globals::cur_sw_dats_view = 0;
|
||||
bool ui_globals::reset = false;
|
||||
int ui_globals::visible_main_lines = 0;
|
||||
int ui_globals::visible_sw_lines = 0;
|
||||
uint16_t ui_globals::panels_status = 0;
|
||||
|
||||
char* chartrimcarriage(char str[])
|
||||
{
|
||||
|
@ -399,9 +399,7 @@ enum
|
||||
struct ui_globals
|
||||
{
|
||||
static uint8_t curdats_view, curdats_total, cur_sw_dats_view, cur_sw_dats_total;
|
||||
static bool default_image, reset;
|
||||
static int visible_main_lines, visible_sw_lines;
|
||||
static uint16_t panels_status;
|
||||
static bool reset;
|
||||
};
|
||||
|
||||
// GLOBAL FUNCTIONS
|
||||
|
@ -112,7 +112,6 @@ void editwin_info::draw_contents(HDC dc)
|
||||
void editwin_info::restore_configuration_from_node(util::xml::data_node const &node)
|
||||
{
|
||||
m_history.clear();
|
||||
m_last_history = 0;
|
||||
util::xml::data_node const *const hist = node.get_child(NODE_WINDOW_HISTORY);
|
||||
if (hist)
|
||||
{
|
||||
@ -128,6 +127,10 @@ void editwin_info::restore_configuration_from_node(util::xml::data_node const &n
|
||||
item = item->get_next_sibling(NODE_HISTORY_ITEM);
|
||||
}
|
||||
}
|
||||
if (m_history.empty())
|
||||
m_last_history = 0;
|
||||
else
|
||||
m_last_history = m_history.size() - 1;
|
||||
|
||||
debugwin_info::restore_configuration_from_node(node);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user