void FeDisplayEditMenu::get_options( FeConfigContext &ctx ) { ctx.set_style( FeConfigContext::EditList, "Display Edit" ); if ( m_display ) { ctx.add_optl( Opt::EDIT, "Name", m_display->get_info( FeDisplayInfo::Name ), "_help_display_name" ); ctx.add_optl( Opt::LIST, "Layout", m_display->get_info( FeDisplayInfo::Layout ), "_help_display_layout" ); std::vector<std::string> layouts; ctx.fe_settings.get_layouts_list( layouts ); ctx.back_opt().append_vlist( layouts ); ctx.add_optl( Opt::LIST, "Collection/Rom List", m_display->get_info( FeDisplayInfo::Romlist ), "_help_display_romlist" ); std::vector<std::string> romlists; ctx.fe_settings.get_romlists_list( romlists ); ctx.back_opt().append_vlist( romlists ); std::vector<std::string> bool_opts( 2 ); ctx.fe_settings.get_resource( "Yes", bool_opts[0] ); ctx.fe_settings.get_resource( "No", bool_opts[1] ); ctx.add_optl( Opt::LIST, "Show in Cycle", m_display->show_in_cycle() ? bool_opts[0] : bool_opts[1], "_help_display_in_cycle" ); ctx.back_opt().append_vlist( bool_opts ); ctx.add_optl( Opt::LIST, "Show in Menu", m_display->show_in_menu() ? bool_opts[0] : bool_opts[1], "_help_display_in_menu" ); ctx.back_opt().append_vlist( bool_opts ); FeFilter *f = m_display->get_filter( -1 ); std::string filter_desc; if ( f->get_rule_count() < 1 ) ctx.fe_settings.get_resource( "Empty", filter_desc ); else ctx.fe_settings.get_resource( "$1 Rule(s)", as_str(f->get_rule_count()), filter_desc ); ctx.add_optl( Opt::SUBMENU, "Global Filter", filter_desc, "_help_display_global_filter" ); ctx.back_opt().opaque = 9; std::vector<std::string> filters; m_display->get_filters_list( filters ); int i=0; for ( std::vector<std::string>::iterator itr=filters.begin(); itr != filters.end(); ++itr ) { ctx.add_optl( Opt::SUBMENU, "Filter", (*itr), "_help_display_filter" ); ctx.back_opt().opaque = 100 + i; i++; } ctx.add_optl( Opt::SUBMENU, "Add Filter", "", "_help_display_add_filter" ); ctx.back_opt().opaque = 1; ctx.add_optl( Opt::SUBMENU, "Layout Options", "", "_help_display_layout_options" ); ctx.back_opt().opaque = 2; ctx.add_optl( Opt::EXIT, "Delete this Display", "", "_help_display_delete" ); ctx.back_opt().opaque = 3; } FeBaseConfigMenu::get_options( ctx ); }
bool FeSettings::build_romlist( const std::vector< FeImportTask > &task_list, const std::string &output_name, FeFilter &filter, bool full ) { FeRomInfoListType total_romlist; std::string best_name, list_name, path; for ( std::vector<FeImportTask>::const_iterator itr=task_list.begin(); itr < task_list.end(); ++itr ) { if ( (*itr).task_type == FeImportTask::BuildRomlist ) { // Build romlist task std::cout << "*** Generating Collection/Rom List" << std::endl; FeEmulatorInfo *emu = m_rl.get_emulator( (*itr).emulator_name ); if ( emu == NULL ) { std::cout << "Error: Invalid -build-rom-list target: " << (*itr).emulator_name << std::endl; } else { FeRomInfoListType romlist; best_name = emu->get_info( FeEmulatorInfo::Name ); FeImporterContext ctx( *emu, romlist ); build_basic_romlist( ctx ); apply_xml_import( ctx ); apply_import_extras( ctx ); apply_emulator_name( best_name, romlist ); total_romlist.splice( total_romlist.end(), romlist ); } } else if ( (*itr).task_type == FeImportTask::ImportRomlist ) { // import romlist from file task std::cout << "*** Importing Collection/Rom List" << std::endl; FeRomInfoListType romlist; std::string emu_name; if ( (*itr).emulator_name.empty() ) { // deduce the emulator name from the filename provided size_t my_start = (*itr).file_name.find_last_of( "\\/" ); if ( my_start == std::string::npos ) // if there is no / we start at the beginning my_start = 0; else my_start += 1; size_t my_end = (*itr).file_name.find_last_of( "." ); if ( my_end != std::string::npos ) emu_name = (*itr).file_name.substr( my_start, my_end - my_start ); } else emu_name = (*itr).emulator_name; best_name = emu_name; if ( tail_compare( (*itr).file_name, ".txt" ) ) { // Attract-Mode format list // FeRomList temp_list( m_config_path ); temp_list.load_from_file( (*itr).file_name, ";" ); FeRomInfoListType &entries = temp_list.get_list(); for ( FeRomInfoListType::iterator itr = entries.begin(); itr != entries.end(); ++itr ) romlist.push_back( *itr ); } else if ( tail_compare( (*itr).file_name, ".lst" ) ) { // Mamewah/Wahcade! format list // import_mamewah( (*itr).file_name, emu_name, romlist ); } else if ( tail_compare( (*itr).file_name, ".xml" ) ) { // HyperSpin format list // FeHyperSpinXMLParser my_parser( romlist ); if ( my_parser.parse( (*itr).file_name ) ) apply_emulator_name( emu_name, romlist ); } else { std::cerr << "Error: Unsupported --import-rom-list file: " << (*itr).file_name << std::endl; } std::cout << "[Import " << (*itr).file_name << "] - Imported " << romlist.size() << " entries." << std::endl; FeEmulatorInfo *emu = m_rl.get_emulator( emu_name ); if ( emu == NULL ) { std::cout << "Warning: The emulator specified with --import-rom-list was not found: " << emu_name << std::endl; } else { FeImporterContext ctx( *emu, romlist ); apply_import_extras( ctx ); } total_romlist.splice( total_romlist.end(), romlist ); } else // scrape artwork { FeEmulatorInfo *emu = m_rl.get_emulator( (*itr).emulator_name ); if ( emu == NULL ) return false; std::cout << "*** Scraping artwork for: " << (*itr).emulator_name << std::endl; FeRomInfoListType romlist; std::string fn = get_config_dir() + FE_ROMLIST_SUBDIR + (*itr).emulator_name + FE_ROMLIST_FILE_EXTENSION; FeImporterContext ctx( *emu, romlist ); if ( file_exists( fn ) ) { FeRomList loader( get_config_dir() ); loader.load_from_file( fn, ";" ); ctx.romlist.swap( loader.get_list() ); } else { build_basic_romlist( ctx ); apply_xml_import( ctx ); } ctx.scrape_art = true; confirm_directory( get_config_dir(), FE_SCRAPER_SUBDIR ); // do the mamedb scraper first (which only does anything for mame) followed // by the more general thegamesdb scraper. mamedb_scraper( ctx ); thegamesdb_scraper( ctx ); std::cout << "*** Scraping done." << std::endl; } } // return now if all we did was scrape artwork if ( total_romlist.empty() ) return true; total_romlist.sort( FeRomListSorter() ); // strip duplicate entries std::cout << " - Removing any duplicate entries..." << std::endl; total_romlist.unique(); // Apply the specified filter if ( filter.get_rule_count() > 0 ) { std::cout << " - Applying filter..." << std::endl; filter.init(); FeRomInfoListType::iterator last_it=total_romlist.begin(); for ( FeRomInfoListType::iterator it=total_romlist.begin(); it!=total_romlist.end(); ) { if ( filter.apply_filter( *it ) ) { if ( last_it != it ) it = total_romlist.erase( last_it, it ); else ++it; last_it = it; } else ++it; } if ( last_it != total_romlist.end() ) total_romlist.erase( last_it, total_romlist.end() ); } if ( task_list.size() > 1 ) best_name = "multi"; path = get_config_dir(); confirm_directory( path, FE_ROMLIST_SUBDIR ); path += FE_ROMLIST_SUBDIR; // if we weren't given a specific output name, then we come up with a name // that doesn't exist already // if ( output_name.empty() ) get_available_filename( path, best_name, FE_ROMLIST_FILE_EXTENSION, list_name ); else list_name = path + output_name + FE_ROMLIST_FILE_EXTENSION; write_romlist( list_name, total_romlist ); return true; }