summaryrefslogtreecommitdiffstatshomepage
path: root/src/frontend
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2021-11-23 11:19:29 +1100
committer Vas Crabb <vas@vastheman.com>2021-11-23 11:19:29 +1100
commit5668590fcb00bd3ef01d9e061dc196c3949b0043 (patch)
treec569400d081ac04960e5577f5b932cf0c82026ce /src/frontend
parent8077a9e633f73b31bba0aad1c36575c46b4ab47d (diff)
-frontend: Fixed crashes switching between favourites and other filters.
* Also made the system and software selection menus a bit less eager to reselect the first item. -docs: Bumped documentation version to 0.238.
Diffstat (limited to 'src/frontend')
-rw-r--r--src/frontend/mame/ui/selgame.cpp12
-rw-r--r--src/frontend/mame/ui/selmenu.cpp25
-rw-r--r--src/frontend/mame/ui/selsoft.cpp2
3 files changed, 26 insertions, 13 deletions
diff --git a/src/frontend/mame/ui/selgame.cpp b/src/frontend/mame/ui/selgame.cpp
index e555bdfc15b..f6b5f6cb2a7 100644
--- a/src/frontend/mame/ui/selgame.cpp
+++ b/src/frontend/mame/ui/selgame.cpp
@@ -341,6 +341,8 @@ void menu_select_game::populate(float &customtop, float &custombottom)
if (!isfavorite())
{
+ if (m_populated_favorites)
+ m_prev_selected = nullptr;
m_populated_favorites = false;
m_displaylist.clear();
machine_filter const *const flt(m_persistent_data.filter_data().get_current_filter());
@@ -399,6 +401,8 @@ void menu_select_game::populate(float &customtop, float &custombottom)
else
{
// populate favorites list
+ if (!m_populated_favorites)
+ m_prev_selected = nullptr;
m_populated_favorites = true;
m_search.clear();
mame_machine_manager::instance()->favorite().apply_sorted(
@@ -412,8 +416,8 @@ void menu_select_game::populate(float &customtop, float &custombottom)
bool cloneof = strcmp(info.driver->parent, "0");
if (cloneof)
{
- int cx = driver_list::find(info.driver->parent);
- if (cx != -1 && ((driver_list::driver(cx).flags & machine_flags::IS_BIOS_ROOT) != 0))
+ int const cx = driver_list::find(info.driver->parent);
+ if ((0 <= cx) && ((driver_list::driver(cx).flags & machine_flags::IS_BIOS_ROOT) != 0))
cloneof = false;
}
@@ -1036,7 +1040,7 @@ void menu_select_game::get_selection(ui_software_info const *&software, ui_syste
if (m_populated_favorites)
{
software = reinterpret_cast<ui_software_info const *>(get_selection_ptr());
- system = &m_persistent_data.systems()[driver_list::find(software->driver->name)];
+ system = software ? &m_persistent_data.systems()[driver_list::find(software->driver->name)] : nullptr;
}
else
{
@@ -1100,7 +1104,7 @@ void menu_select_game::filter_selected()
}
}
m_persistent_data.filter_data().set_current_filter_type(new_type);
- reset(reset_options::SELECT_FIRST);
+ reset(reset_options::REMEMBER_REF);
});
}
}
diff --git a/src/frontend/mame/ui/selmenu.cpp b/src/frontend/mame/ui/selmenu.cpp
index fc20bc0c9ee..1b393edc91a 100644
--- a/src/frontend/mame/ui/selmenu.cpp
+++ b/src/frontend/mame/ui/selmenu.cpp
@@ -1419,7 +1419,6 @@ void menu_select_launch::handle_keys(uint32_t flags, int &iptkey)
}
else if (m_focus == focused_menu::LEFT)
{
- m_prev_selected = nullptr;
filter_selected();
}
return;
@@ -1774,7 +1773,6 @@ void menu_select_launch::handle_events(uint32_t flags, event &ev)
}
else if (hover() >= HOVER_FILTER_FIRST && hover() <= HOVER_FILTER_LAST)
{
- m_prev_selected = nullptr;
m_filter_highlight = hover() - HOVER_FILTER_FIRST;
filter_selected();
stop = true;
@@ -1953,18 +1951,29 @@ void menu_select_launch::draw(uint32_t flags)
// make sure the selection
if (m_available_items < m_visible_lines)
m_visible_lines = m_available_items;
- if (top_line < 0 || is_first_selected())
+ int selection;
+ if (selected_index() < m_available_items)
+ {
+ selection = selected_index();
+ }
+ else
+ {
+ selection = 0;
+ while ((m_available_items > selection) && (item(selection).ref() != m_prev_selected))
+ ++selection;
+ }
+ if (top_line < 0 || !selection)
{
top_line = 0;
}
- else if (selected_index() < m_available_items)
+ else if (selection < m_available_items)
{
- if (selected_index() >= (top_line + m_visible_lines))
- top_line = selected_index() - (m_visible_lines / 2);
+ if ((selection >= (top_line + m_visible_lines)) || (selection <= top_line))
+ top_line = (std::max)(selection - (m_visible_lines / 2), 0);
if ((top_line + m_visible_lines) >= m_available_items)
top_line = m_available_items - m_visible_lines;
- else if (selected_index() >= (top_line + m_visible_lines - 2))
- top_line = selected_index() - m_visible_lines + ((selected_index() == (m_available_items - 1)) ? 1: 2);
+ else if (selection >= (top_line + m_visible_lines - 2))
+ top_line = selection - m_visible_lines + ((selection == (m_available_items - 1)) ? 1: 2);
}
// determine effective positions taking into account the hilighting arrows
diff --git a/src/frontend/mame/ui/selsoft.cpp b/src/frontend/mame/ui/selsoft.cpp
index 25baf9fe32c..c5c32303e93 100644
--- a/src/frontend/mame/ui/selsoft.cpp
+++ b/src/frontend/mame/ui/selsoft.cpp
@@ -741,7 +741,7 @@ void menu_select_software::filter_selected()
}
}
m_data->set_filter_type(new_type);
- reset(reset_options::SELECT_FIRST);
+ reset(reset_options::REMEMBER_REF);
});
}
}