From 0ba1d1db35e4b8370d58bdbe0a009cc7d9f28466 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Mon, 15 Feb 2021 23:32:05 +1100 Subject: frontend/ui: Improved messages displayed when files are missing. * Only show things preventing launch in UI (not NO_DUMP, optional, etc.) * Don't show details like file lengths and checksums in UI * Actually do system audit when launching from favourites * Log the more detailed summary at info level --- src/frontend/mame/ui/selgame.cpp | 45 +++++++++++++++++----------- src/frontend/mame/ui/selmenu.cpp | 65 ++++++++++++++++++++++++++++++++++++---- src/frontend/mame/ui/selmenu.h | 11 +++++-- src/frontend/mame/ui/selsoft.cpp | 20 ++++--------- 4 files changed, 101 insertions(+), 40 deletions(-) diff --git a/src/frontend/mame/ui/selgame.cpp b/src/frontend/mame/ui/selgame.cpp index aa6abf66e1f..338f98c42d0 100644 --- a/src/frontend/mame/ui/selgame.cpp +++ b/src/frontend/mame/ui/selgame.cpp @@ -24,7 +24,6 @@ #include "luaengine.h" #include "mame.h" -#include "audit.h" #include "corestr.h" #include "drivenum.h" #include "emuopts.h" @@ -806,7 +805,7 @@ void menu_select_game::inkey_select(const event *menu_event) media_auditor::summary const summary = auditor.audit_media(AUDIT_VALIDATE_FAST); // if everything looks good, schedule the new driver - if (summary == media_auditor::CORRECT || summary == media_auditor::BEST_AVAILABLE || summary == media_auditor::NONE_NEEDED) + if (audit_passed(summary)) { if (!select_bios(*driver, false)) launch_system(*driver); @@ -814,7 +813,7 @@ void menu_select_game::inkey_select(const event *menu_event) else { // otherwise, display an error - set_error(reset_options::REMEMBER_REF, make_audit_fail_text(media_auditor::NOTFOUND != summary, auditor)); + set_error(reset_options::REMEMBER_REF, make_system_audit_fail_text(auditor, summary)); } } } @@ -878,7 +877,7 @@ void menu_select_game::inkey_select_favorite(const event *menu_event) media_auditor auditor(enumerator); media_auditor::summary const summary = auditor.audit_media(AUDIT_VALIDATE_FAST); - if (summary == media_auditor::CORRECT || summary == media_auditor::BEST_AVAILABLE || summary == media_auditor::NONE_NEEDED) + if (audit_passed(summary)) { // if everything looks good, schedule the new driver if (!select_bios(*ui_swinfo->driver, false)) @@ -890,29 +889,39 @@ void menu_select_game::inkey_select_favorite(const event *menu_event) else { // otherwise, display an error - set_error(reset_options::REMEMBER_REF, make_audit_fail_text(media_auditor::NOTFOUND != summary, auditor)); + set_error(reset_options::REMEMBER_REF, make_system_audit_fail_text(auditor, summary)); } } else { - // first validate + // first audit the system ROMs driver_enumerator drv(machine().options(), *ui_swinfo->driver); media_auditor auditor(drv); drv.next(); - software_list_device *swlist = software_list_device::find_by_name(*drv.config(), ui_swinfo->listname); - const software_info *swinfo = swlist->find(ui_swinfo->shortname); - - media_auditor::summary const summary = auditor.audit_software(*swlist, *swinfo, AUDIT_VALIDATE_FAST); - - if (summary == media_auditor::CORRECT || summary == media_auditor::BEST_AVAILABLE || summary == media_auditor::NONE_NEEDED) + media_auditor::summary const sysaudit = auditor.audit_media(AUDIT_VALIDATE_FAST); + if (!audit_passed(sysaudit)) { - if (!select_bios(*ui_swinfo, false) && !select_part(*swinfo, *ui_swinfo)) - launch_system(drv.driver(), *ui_swinfo, ui_swinfo->part); + set_error(reset_options::REMEMBER_REF, make_system_audit_fail_text(auditor, sysaudit)); } else { - // otherwise, display an error - set_error(reset_options::REMEMBER_POSITION, make_audit_fail_text(media_auditor::NOTFOUND != summary, auditor)); + // now audit the software + software_list_device *swlist = software_list_device::find_by_name(*drv.config(), ui_swinfo->listname); + const software_info *swinfo = swlist->find(ui_swinfo->shortname); + + media_auditor::summary const swaudit = auditor.audit_software(*swlist, *swinfo, AUDIT_VALIDATE_FAST); + + if (audit_passed(swaudit)) + { + reselect_last::reselect(true); + if (!select_bios(*ui_swinfo, false) && !select_part(*swinfo, *ui_swinfo)) + launch_system(drv.driver(), *ui_swinfo, ui_swinfo->part); + } + else + { + // otherwise, display an error + set_error(reset_options::REMEMBER_REF, make_software_audit_fail_text(auditor, swaudit)); + } } } } @@ -1190,14 +1199,14 @@ void menu_select_game::general_info(const game_driver *driver, std::string &buff media_auditor::summary summary_samples = auditor.audit_samples(); // if everything looks good, schedule the new driver - if (summary == media_auditor::CORRECT || summary == media_auditor::BEST_AVAILABLE || summary == media_auditor::NONE_NEEDED) + if (audit_passed(summary)) str << _("ROM Audit Result\tOK\n"); else str << _("ROM Audit Result\tBAD\n"); if (summary_samples == media_auditor::NONE_NEEDED) str << _("Samples Audit Result\tNone Needed\n"); - else if (summary_samples == media_auditor::CORRECT || summary_samples == media_auditor::BEST_AVAILABLE) + else if (audit_passed(summary_samples)) str << _("Samples Audit Result\tOK\n"); else str << _("Samples Audit Result\tBAD\n"); diff --git a/src/frontend/mame/ui/selmenu.cpp b/src/frontend/mame/ui/selmenu.cpp index 889a7601f3f..bb8b8227c01 100644 --- a/src/frontend/mame/ui/selmenu.cpp +++ b/src/frontend/mame/ui/selmenu.cpp @@ -2493,20 +2493,75 @@ void menu_select_launch::draw_snapx(float origx1, float origy1, float origx2, fl } -std::string menu_select_launch::make_audit_fail_text(bool found, media_auditor const &auditor) +std::string menu_select_launch::make_system_audit_fail_text(media_auditor const &auditor, media_auditor::summary summary) { std::ostringstream str; - str << _("The selected machine is missing one or more required ROM or CHD images. Please select a different machine.\n\n"); - if (found) + if (!auditor.records().empty()) { + str << "System media audit failed:\n"; auditor.summarize(nullptr, &str); - str << "\n"; + osd_printf_info(str.str()); + str.str(""); } - str << _("Press any key to continue."); + str << _("Required ROM/disk images for the selected system are missing or incorrect. Please select a different system.\n\n"); + make_audit_fail_text(str, auditor, summary); return str.str(); } +std::string menu_select_launch::make_software_audit_fail_text(media_auditor const &auditor, media_auditor::summary summary) +{ + std::ostringstream str; + if (!auditor.records().empty()) + { + str << "System media audit failed:\n"; + auditor.summarize(nullptr, &str); + osd_printf_info(str.str()); + str.str(""); + } + str << _("Required ROM/disk images for the selected software are missing or incorrect. Please select a different software item.\n\n"); + make_audit_fail_text(str, auditor, summary); + return str.str(); +} + + +void menu_select_launch::make_audit_fail_text(std::ostream &str, media_auditor const &auditor, media_auditor::summary summary) +{ + if ((media_auditor::NOTFOUND != summary) && !auditor.records().empty()) + { + char const *message = nullptr; + for (media_auditor::audit_record const &record : auditor.records()) + { + switch (record.substatus()) + { + case media_auditor::audit_substatus::FOUND_BAD_CHECKSUM: + message = _("incorrect checksum"); + break; + case media_auditor::audit_substatus::FOUND_WRONG_LENGTH: + message = _("incorrect length"); + break; + case media_auditor::audit_substatus::NOT_FOUND: + message = _("not found"); + break; + case media_auditor::audit_substatus::GOOD: + case media_auditor::audit_substatus::GOOD_NEEDS_REDUMP: + case media_auditor::audit_substatus::FOUND_NODUMP: + case media_auditor::audit_substatus::NOT_FOUND_NODUMP: + case media_auditor::audit_substatus::NOT_FOUND_OPTIONAL: + case media_auditor::audit_substatus::UNVERIFIED: + continue; + } + if (record.shared_device()) + util::stream_format(str, _("%1$s (%2$s) - %3$s\n"), record.name(), record.shared_device()->shortname(), message); + else + util::stream_format(str, _("%1$s - %2$s\n"), record.name(), message); + } + str << '\n'; + } + str << _("Press any key to continue."); +} + + //------------------------------------------------- // get bios count //------------------------------------------------- diff --git a/src/frontend/mame/ui/selmenu.h b/src/frontend/mame/ui/selmenu.h index 6cd7fe2cf8f..251df450e72 100644 --- a/src/frontend/mame/ui/selmenu.h +++ b/src/frontend/mame/ui/selmenu.h @@ -14,6 +14,8 @@ #include "ui/menu.h" +#include "audit.h" + #include "lrucache.h" #include @@ -22,7 +24,6 @@ #include -class media_auditor; struct ui_software_info; namespace ui { @@ -158,7 +159,12 @@ protected: return (uintptr_t(selected_ref) > skip_main_items) ? selected_ref : m_prev_selected; } - static std::string make_audit_fail_text(bool found, media_auditor const &auditor); + static std::string make_system_audit_fail_text(media_auditor const &auditor, media_auditor::summary summary); + static std::string make_software_audit_fail_text(media_auditor const &auditor, media_auditor::summary summary); + static constexpr bool audit_passed(media_auditor::summary summary) + { + return (media_auditor::CORRECT == summary) || (media_auditor::BEST_AVAILABLE == summary) || (media_auditor::NONE_NEEDED == summary); + } int m_available_items; int skip_main_items; @@ -293,6 +299,7 @@ private: // filter navigation virtual void filter_selected() = 0; + static void make_audit_fail_text(std::ostream &str, media_auditor const &auditor, media_auditor::summary summary); static void launch_system(mame_ui_manager &mui, game_driver const &driver, ui_software_info const *swinfo, std::string const *part, int const *bios); static bool select_part(mame_ui_manager &mui, render_container &container, software_info const &info, ui_software_info const &ui_info); static bool has_multiple_bios(ui_software_info const &swinfo, s_bios &biosname); diff --git a/src/frontend/mame/ui/selsoft.cpp b/src/frontend/mame/ui/selsoft.cpp index 4cb7d2b0ef3..17d2461b20c 100644 --- a/src/frontend/mame/ui/selsoft.cpp +++ b/src/frontend/mame/ui/selsoft.cpp @@ -16,7 +16,6 @@ #include "ui/inifile.h" #include "ui/selector.h" -#include "audit.h" #include "corestr.h" #include "drivenum.h" #include "emuopts.h" @@ -475,9 +474,9 @@ void menu_select_software::inkey_select(const event *menu_event) // audit the system ROMs first to see if we're going to work media_auditor::summary const sysaudit = auditor.audit_media(AUDIT_VALIDATE_FAST); - if (sysaudit != media_auditor::CORRECT && sysaudit != media_auditor::BEST_AVAILABLE && sysaudit != media_auditor::NONE_NEEDED) + if (!audit_passed(sysaudit)) { - set_error(reset_options::REMEMBER_REF, make_audit_fail_text(media_auditor::NOTFOUND != sysaudit, auditor)); + set_error(reset_options::REMEMBER_REF, make_system_audit_fail_text(auditor, sysaudit)); } else if (ui_swinfo->startempty == 1) { @@ -489,13 +488,12 @@ void menu_select_software::inkey_select(const event *menu_event) } else { - // first audit the software + // now audit the software software_list_device *swlist = software_list_device::find_by_name(*drivlist.config(), ui_swinfo->listname); const software_info *swinfo = swlist->find(ui_swinfo->shortname); - media_auditor::summary const swaudit = auditor.audit_software(*swlist, *swinfo, AUDIT_VALIDATE_FAST); - if (swaudit == media_auditor::CORRECT || swaudit == media_auditor::BEST_AVAILABLE || swaudit == media_auditor::NONE_NEEDED) + if (audit_passed(swaudit)) { if (!select_bios(*ui_swinfo, false) && !select_part(*swinfo, *ui_swinfo)) { @@ -506,15 +504,7 @@ void menu_select_software::inkey_select(const event *menu_event) else { // otherwise, display an error - std::ostringstream str; - str << _("The selected software is missing one or more required files. Please select a different software item.\n\n"); - if (media_auditor::NOTFOUND != swaudit) - { - auditor.summarize(nullptr, &str); - str << '\n'; - } - str << _("Press any key to continue."), - set_error(reset_options::REMEMBER_POSITION, str.str()); + set_error(reset_options::REMEMBER_REF, make_software_audit_fail_text(auditor, swaudit)); } } } -- cgit v1.2.3