diff --git a/Machines/Utility/ROMCatalogue.cpp b/Machines/Utility/ROMCatalogue.cpp index 2466491c8..0982c5735 100644 --- a/Machines/Utility/ROMCatalogue.cpp +++ b/Machines/Utility/ROMCatalogue.cpp @@ -10,7 +10,9 @@ #include #include +#include #include +#include #include using namespace ROM; @@ -288,6 +290,49 @@ std::string Description::description(int flags) const { return output.str(); } +std::wstring Request::description(int description_flags, wchar_t bullet_point) { + std::wstringstream output; + std::wstring_convert> wstring_converter; + + visit( + [&output, description_flags, bullet_point, &wstring_converter] (ROM::Request::LineItem item, ROM::Request::ListType type, int indentation_level, const ROM::Description *description, bool is_optional, size_t remaining) { + if(indentation_level) { + output << std::endl; + for(int c = 0; c < indentation_level; c++) output << '\t'; + output << bullet_point << ' '; + } + + switch(item) { + case ROM::Request::LineItem::NewList: + switch(type) { + default: + case ROM::Request::ListType::All: output << "all of:"; break; + case ROM::Request::ListType::Any: output << "any of:"; break; + } + break; + + case ROM::Request::LineItem::Description: + if(is_optional) output << "optionally, "; + + output << wstring_converter.from_bytes(description->description(description_flags)); + + if(remaining) { + output << ";"; + if(remaining == 1) { + output << ((type == ROM::Request::ListType::All) ? " and" : " or"); + } + } else { + output << "."; + } + break; + } + } + ); + + return output.str(); +} + + Description::Description(Name name) { switch(name) { default: assert(false); break; diff --git a/Machines/Utility/ROMCatalogue.hpp b/Machines/Utility/ROMCatalogue.hpp index 2df582024..d995e397c 100644 --- a/Machines/Utility/ROMCatalogue.hpp +++ b/Machines/Utility/ROMCatalogue.hpp @@ -213,6 +213,10 @@ struct Request { const std::function &add_item ) const; + /// @returns a full bullet-pointed list of the requirements of this request, including + /// appropriate conjuntives. + std::wstring description(int description_flags, wchar_t bullet_point); + private: struct Node { enum class Type { diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal Kiosk.xcscheme b/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal Kiosk.xcscheme index 2787530a5..131430afb 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal Kiosk.xcscheme +++ b/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal Kiosk.xcscheme @@ -125,7 +125,7 @@ isEnabled = "NO"> diff --git a/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm b/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm index fc1573573..3b641ddae 100644 --- a/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm +++ b/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm @@ -31,6 +31,8 @@ #include #include +#include +#include @interface CSMachine() - (void)speaker:(Outputs::Speaker::Speaker *)speaker didCompleteSamples:(const int16_t *)samples length:(int)length; @@ -113,28 +115,9 @@ struct ActivityObserver: public Activity::Observer { ROM::Request missing_roms; _machine.reset(Machine::MachineForTargets(_analyser.targets, CSROMFetcher(&missing_roms), error)); if(!_machine) { - // TODO. - [missingROMs appendFormat:@"Who told you?"]; -/* for(const auto &missing_rom : missing_roms) { - CSMissingROM *rom = [[CSMissingROM alloc] init]; - - // Copy/convert the primitive fields. - rom.machineName = @(missing_rom.machine_name.c_str()); - rom.fileName = @(missing_rom.file_name.c_str()); - rom.descriptiveName = missing_rom.descriptive_name.empty() ? nil : @(missing_rom.descriptive_name.c_str()); - rom.size = missing_rom.size; - - // Convert the CRC list. - NSMutableArray *crc32s = [[NSMutableArray alloc] initWithCapacity:missing_rom.crc32s.size()]; - for(const auto &crc : missing_rom.crc32s) { - [crc32s addObject:@(crc)]; - } - rom.crc32s = crc32s; - - // Add to the missing list. - [missingROMs addObject:rom]; - }*/ - + std::wstring_convert> wstring_converter; + const std::wstring description = missing_roms.description(0, L'•'); + [missingROMs appendString:[NSString stringWithUTF8String:wstring_converter.to_bytes(description).c_str()]]; return nil; } diff --git a/OSBindings/SDL/main.cpp b/OSBindings/SDL/main.cpp index 259699147..e78118884 100644 --- a/OSBindings/SDL/main.cpp +++ b/OSBindings/SDL/main.cpp @@ -776,41 +776,8 @@ int main(int argc, char *argv[]) { std::cerr << "Could not find system ROMs; please install to /usr/local/share/CLK/ or /usr/share/CLK/, or provide a --rompath, e.g. --rompath=~/ROMs." << std::endl; std::cerr << "Needed — but didn't find — "; - missing_roms.visit( - [] (ROM::Request::LineItem item, ROM::Request::ListType type, int indentation_level, const ROM::Description *description, bool is_optional, size_t remaining) { - if(indentation_level) { - std::cerr << std::endl; - for(int c = 0; c < indentation_level; c++) std::cerr << '\t'; - std::cerr << "* "; - } - - switch(item) { - case ROM::Request::LineItem::NewList: - switch(type) { - default: - case ROM::Request::ListType::All: std::cerr << "all of:"; break; - case ROM::Request::ListType::Any: std::cerr << "any of:"; break; - } - break; - - case ROM::Request::LineItem::Description: - if(is_optional) std::cerr << "optionally, "; - - using DescriptionFlag = ROM::Description::DescriptionFlag; - std::cerr << description->description(DescriptionFlag::Filename | DescriptionFlag::CRC); - - if(remaining) { - std::cerr << ";"; - if(remaining == 1) { - std::cerr << ((type == ROM::Request::ListType::All) ? " and" : " or"); - } - } else { - std::cerr << "."; - } - break; - } - } - ); + using DescriptionFlag = ROM::Description::DescriptionFlag; + std::wcerr << missing_roms.description(DescriptionFlag::Filename | DescriptionFlag::CRC, L'*'); std::cerr << std::endl << std::endl << "Searched unsuccessfully: "; bool is_first = true;