From e147e5ae97f4f3925bbc45453d5bad079fb9fc87 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sat, 19 Jan 2019 19:37:12 +1100 Subject: restore functionality of the "Add to Favorites" item on the main in-emulation menu --- src/emu/softlist_dev.cpp | 22 +++++------ src/frontend/mame/ui/inifile.cpp | 85 ++++++++++++++++++++++++++++++++++------ 2 files changed, 83 insertions(+), 24 deletions(-) diff --git a/src/emu/softlist_dev.cpp b/src/emu/softlist_dev.cpp index e1539523dcb..b96fd63b3fa 100644 --- a/src/emu/softlist_dev.cpp +++ b/src/emu/softlist_dev.cpp @@ -255,18 +255,16 @@ const software_info *software_list_device::find(const std::string &look_for) // find a match (will cause a parse if needed when calling get_info) const auto &info_list = get_info(); auto iter = std::find_if( - info_list.begin(), - info_list.end(), - [&](const software_info &info) - { - const char *shortname = info.shortname().c_str(); - return (iswild && core_strwildcmp(look_for.c_str(), shortname) == 0) - || core_stricmp(look_for.c_str(), shortname) == 0; - }); - - return iter != info_list.end() - ? &*iter - : nullptr; + info_list.begin(), + info_list.end(), + [&look_for, iswild] (const software_info &info) + { + const char *shortname = info.shortname().c_str(); + return (iswild && core_strwildcmp(look_for.c_str(), shortname) == 0) + || core_stricmp(look_for.c_str(), shortname) == 0; + }); + + return iter != info_list.end() ? &*iter : nullptr; } diff --git a/src/frontend/mame/ui/inifile.cpp b/src/frontend/mame/ui/inifile.cpp index 9a7f30087dc..b68be00122b 100644 --- a/src/frontend/mame/ui/inifile.cpp +++ b/src/frontend/mame/ui/inifile.cpp @@ -284,15 +284,67 @@ void favorite_manager::add_favorite_software(ui_software_info const &swinfo) void favorite_manager::add_favorite(running_machine &machine) { -#if 0 apply_running_machine( machine, - [this] (auto &&key, bool &done) + [this, &machine] (game_driver const &driver, device_image_interface *imagedev, software_info const *software, bool &done) { - add_impl(std::forward(key)); - done = true; + if (imagedev) + { + // creating this is fairly expensive, but we'll assume this usually succeeds + ui_software_info info; + software_part const *const part(imagedev->part_entry()); + assert(software); + assert(part); + + // start with simple stuff that can just be copied + info.shortname = software->shortname(); + info.longname = imagedev->longname(); + info.parentname = software->parentname(); + info.year = imagedev->year(); + info.publisher = imagedev->manufacturer(); + info.supported = imagedev->supported(); + info.part = part->name(); + info.driver = &driver; + info.listname = imagedev->software_list_name(); + info.interface = part->interface(); + info.instance = imagedev->instance_name(); + info.startempty = 0; + info.devicetype = strensure(imagedev->image_type_name()); + info.available = true; + + // look up the parent in the list if necessary (eugh, O(n) walk) + if (!info.parentname.empty()) + { + auto const listdev = software_list_device::find_by_name(machine.config(), info.listname); + assert(listdev); + for (software_info const &other : listdev->get_info()) + { + if (other.shortname() == info.parentname) + { + info.parentlongname = other.longname(); + break; + } + } + } + + // fill in with the first usage entry we find + for (feature_list_item const &feature : software->other_info()) + { + if (feature.name() == "usage") + { + info.usage = feature.value(); + break; + } + } + + // hooray for move semantics! + add_impl(std::move(info)); + } + else + { + add_impl(driver); + } }); -#endif } template void favorite_manager::add_impl(T &&key) @@ -335,10 +387,12 @@ bool favorite_manager::is_favorite(running_machine &machine) const bool result(false); apply_running_machine( machine, - [this, &result] (auto const &key, bool &done) + [this, &result] (game_driver const &driver, device_image_interface *imagedev, software_info const *software, bool &done) { assert(!result); - result = check_impl(key); + result = imagedev + ? check_impl(running_software_key(driver, imagedev->software_list_name(), software->shortname())) + : check_impl(driver); done = done || result; }); return result; @@ -371,7 +425,14 @@ void favorite_manager::remove_favorite_software(ui_software_info const &swinfo) void favorite_manager::remove_favorite(running_machine &machine) { - apply_running_machine(machine, [this] (auto const &key, bool &done) { done = remove_impl(key); }); + apply_running_machine( + machine, + [this] (game_driver const &driver, device_image_interface *imagedev, software_info const *software, bool &done) + { + done = imagedev + ? remove_impl(running_software_key(driver, imagedev->software_list_name(), software->shortname())) + : remove_impl(driver); + }); } template bool favorite_manager::remove_impl(T const &key) @@ -401,10 +462,10 @@ void favorite_manager::apply_running_machine(running_machine &machine, T &&actio { bool done(false); - // TODO: this should be changed - it interacts poorly with slotted arcade systems + // TODO: this should be changed - it interacts poorly with cartslots on arcade systems if ((machine.system().flags & machine_flags::MASK_TYPE) == machine_flags::TYPE_ARCADE) { - action(machine.system(), done); + action(machine.system(), nullptr, nullptr, done); } else { @@ -417,14 +478,14 @@ void favorite_manager::apply_running_machine(running_machine &machine, T &&actio assert(image_dev.software_list_name()); have_software = true; - action(running_software_key(machine.system(), image_dev.software_list_name(), sw->shortname()), done); + action(machine.system(), &image_dev, sw, done); if (done) return; } } if (!have_software) - action(machine.system(), done); + action(machine.system(), nullptr, nullptr, done); } } -- cgit v1.2.3