From 60b2ccdb9fee66abda583102efdf39dfc111e840 Mon Sep 17 00:00:00 2001 From: dankan1890 Date: Wed, 14 Sep 2016 00:19:56 +0200 Subject: [PATCH] A better solution for sorting of the favorites list. (nw) --- src/frontend/mame/ui/inifile.cpp | 47 ++++++++++++++++--------------- src/frontend/mame/ui/inifile.h | 4 +-- src/frontend/mame/ui/miscmenu.cpp | 11 ++++++-- src/frontend/mame/ui/selgame.cpp | 24 ++++++---------- 4 files changed, 44 insertions(+), 42 deletions(-) diff --git a/src/frontend/mame/ui/inifile.cpp b/src/frontend/mame/ui/inifile.cpp index e1bf2604733..ed2e760840a 100644 --- a/src/frontend/mame/ui/inifile.cpp +++ b/src/frontend/mame/ui/inifile.cpp @@ -150,7 +150,6 @@ favorite_manager::favorite_manager(running_machine &machine, ui_options &moption : m_machine(machine) , m_options(moptions) { - m_current = -1; parse_favorite(); } @@ -160,7 +159,7 @@ favorite_manager::favorite_manager(running_machine &machine, ui_options &moption void favorite_manager::add_favorite_game(const game_driver *driver) { - m_list.emplace_back(driver->name, driver->description, "", "", "", 0, "", driver, "", "", "", 1, "", "", "", true); + m_list.emplace(driver->description, ui_software_info{ driver->name, driver->description, "", "", "", 0, "", driver, "", "", "", 1, "", "", "", true }); save_favorite_games(); } @@ -170,7 +169,7 @@ void favorite_manager::add_favorite_game(const game_driver *driver) void favorite_manager::add_favorite_game(ui_software_info &swinfo) { - m_list.push_back(swinfo); + m_list.emplace(swinfo.longname, swinfo); save_favorite_games(); } @@ -229,7 +228,7 @@ void favorite_manager::add_favorite_game() tmpmatches.devicetype = strensure(image.image_type_name()); tmpmatches.available = true; software_avail = true; - m_list.push_back(tmpmatches); + m_list.emplace(tmpmatches.longname, tmpmatches); save_favorite_games(); } } @@ -244,7 +243,13 @@ void favorite_manager::add_favorite_game() void favorite_manager::remove_favorite_game(ui_software_info &swinfo) { - m_list.erase(std::remove(m_list.begin(), m_list.end(), swinfo), m_list.end()); + for (auto e = m_list.begin(); e != m_list.end(); ++e) + if (e->second == swinfo) + { + m_list.erase(e); + break; + } + m_current = m_list.begin(); save_favorite_games(); } @@ -254,7 +259,8 @@ void favorite_manager::remove_favorite_game(ui_software_info &swinfo) void favorite_manager::remove_favorite_game() { - m_list.erase(m_list.begin() + m_current); + m_list.erase(m_current); + m_current = m_list.begin(); save_favorite_games(); } @@ -275,9 +281,9 @@ bool favorite_manager::isgame_favorite() if (image.exists() && swinfo != nullptr) { image_loaded = true; - for (size_t current = 0; current < m_list.size(); current++) - if (m_list[current].shortname == swinfo->shortname() && - m_list[current].listname == image.software_list_name()) + for (auto current = m_list.begin(); current != m_list.end(); ++current) + if (current->second.shortname == swinfo->shortname() && + current->second.listname == image.software_list_name()) { m_current = current; return true; @@ -288,7 +294,7 @@ bool favorite_manager::isgame_favorite() if (!image_loaded) return isgame_favorite(&machine().system()); - m_current = -1; + m_current = m_list.begin(); return false; } @@ -298,14 +304,12 @@ bool favorite_manager::isgame_favorite() bool favorite_manager::isgame_favorite(const game_driver *driver) { - for (size_t x = 0; x < m_list.size(); x++) - if (m_list[x].driver == driver && m_list[x].shortname == driver->name) + for (auto current = m_list.begin(); current != m_list.end(); ++current) + if (current->second.driver == driver && current->second.shortname == driver->name) { - m_current = x; + m_current = current; return true; } - - m_current = -1; return false; } @@ -315,14 +319,12 @@ bool favorite_manager::isgame_favorite(const game_driver *driver) bool favorite_manager::isgame_favorite(ui_software_info const &swinfo) { - for (size_t x = 0; x < m_list.size(); x++) - if (m_list[x] == swinfo) + for (auto current = m_list.begin(); current != m_list.end(); ++current) + if (current->second == swinfo) { - m_current = x; + m_current = current; return true; } - - m_current = -1; return false; } @@ -378,7 +380,7 @@ void favorite_manager::parse_favorite() tmpmatches.devicetype = chartrimcarriage(readbuf); file.gets(readbuf, 1024); tmpmatches.available = atoi(readbuf); - m_list.push_back(tmpmatches); + m_list.emplace(tmpmatches.longname, tmpmatches); } file.close(); } @@ -404,8 +406,9 @@ void favorite_manager::save_favorite_games() // generate the favorite INI std::ostringstream text; text << "[ROOT_FOLDER]\n[Favorite]\n\n"; - for (auto & elem : m_list) + for (auto & e : m_list) { + auto elem = e.second; text << elem.shortname << '\n'; text << elem.longname << '\n'; text << elem.parentname << '\n'; diff --git a/src/frontend/mame/ui/inifile.h b/src/frontend/mame/ui/inifile.h index f8da04145a7..56559736b3a 100644 --- a/src/frontend/mame/ui/inifile.h +++ b/src/frontend/mame/ui/inifile.h @@ -84,7 +84,7 @@ public: favorite_manager(running_machine &machine, ui_options &moptions); // favorite indices - std::vector m_list; + std::multimap m_list; // getters running_machine &machine() const { return m_machine; } @@ -110,7 +110,7 @@ private: const char *favorite_filename = "favorites.ini"; // current - int m_current; + std::multimap::iterator m_current; // parse file ui_favorite void parse_favorite(); diff --git a/src/frontend/mame/ui/miscmenu.cpp b/src/frontend/mame/ui/miscmenu.cpp index 3902908aadc..296b5a4be05 100644 --- a/src/frontend/mame/ui/miscmenu.cpp +++ b/src/frontend/mame/ui/miscmenu.cpp @@ -691,7 +691,7 @@ menu_machine_configure::menu_machine_configure(mame_ui_manager &mui, render_cont menu_machine_configure::~menu_machine_configure() { - if (m_fav_reset && main_filters::actual == FILTER_FAVORITE) + if (m_fav_reset) reset_topmost(reset_options::SELECT_FIRST); } @@ -729,8 +729,13 @@ void menu_machine_configure::handle() break; case DELFAV: mame_machine_manager::instance()->favorite().remove_favorite_game(); - m_fav_reset = true; - reset(reset_options::REMEMBER_POSITION); + if (main_filters::actual == FILTER_FAVORITE) + { + m_fav_reset = true; + menu::stack_pop(); + } + else + reset(reset_options::REMEMBER_POSITION); break; case CONTROLLER: if (menu_event->iptkey == IPT_UI_SELECT) diff --git a/src/frontend/mame/ui/selgame.cpp b/src/frontend/mame/ui/selgame.cpp index 1e8712a4f59..43fbf912d25 100644 --- a/src/frontend/mame/ui/selgame.cpp +++ b/src/frontend/mame/ui/selgame.cpp @@ -555,37 +555,31 @@ void menu_select_game::populate() m_search[0] = '\0'; int curitem = 0; - // sort favorites list by longname (description) - std::multimap sorted; - for (auto & e : mame_machine_manager::instance()->favorite().m_list) - sorted.emplace(e.longname, &e); - // iterate over entries - for (auto & favmap : sorted) + for (auto & favmap : mame_machine_manager::instance()->favorite().m_list) { - auto &mfavorite = *favmap.second; auto flags = flags_ui | FLAG_UI_FAVORITE; - if (mfavorite.startempty == 1) + if (favmap.second.startempty == 1) { - if (old_item_selected == -1 && mfavorite.shortname == reselect_last::driver) + if (old_item_selected == -1 && favmap.second.shortname == reselect_last::driver) old_item_selected = curitem; - bool cloneof = strcmp(mfavorite.driver->parent, "0"); + bool cloneof = strcmp(favmap.second.driver->parent, "0"); if (cloneof) { - int cx = driver_list::find(mfavorite.driver->parent); + int cx = driver_list::find(favmap.second.driver->parent); if (cx != -1 && ((driver_list::driver(cx).flags & MACHINE_IS_BIOS_ROOT) != 0)) cloneof = false; } - item_append(mfavorite.longname, "", (cloneof) ? (flags | FLAG_INVERT) : flags, (void *)&mfavorite); + item_append(favmap.second.longname, "", (cloneof) ? (flags | FLAG_INVERT) : flags, (void *)&favmap.second); } else { - if (old_item_selected == -1 && mfavorite.shortname == reselect_last::driver) + if (old_item_selected == -1 && favmap.second.shortname == reselect_last::driver) old_item_selected = curitem; - item_append(mfavorite.longname, mfavorite.devicetype, - mfavorite.parentname.empty() ? flags : (FLAG_INVERT | flags), (void *)&mfavorite); + item_append(favmap.second.longname, favmap.second.devicetype, + favmap.second.parentname.empty() ? flags : (FLAG_INVERT | flags), (void *)&favmap.second); } curitem++; }