std::vector<std::string> requirement_data::get_folded_list( int width, const inventory &crafting_inv, const std::vector< std::vector<T> > &objs, int batch ) const { // hack: ensure 'cached' availability is up to date can_make_with_inventory( crafting_inv ); std::vector<std::string> out_buffer; for( const auto &comp_list : objs ) { const bool has_one = any_marked_available( comp_list ); std::ostringstream buffer; for( auto a = comp_list.begin(); a != comp_list.end(); ++a ) { if( a != comp_list.begin() ) { buffer << "<color_white> " << _( "OR" ) << "</color> "; } const std::string col = a->get_color( has_one, crafting_inv, batch ); buffer << "<color_" << col << ">" << a->to_string( batch ) << "</color>"; } std::vector<std::string> folded = foldstring( buffer.str(), width - 2 ); for( size_t i = 0; i < folded.size(); i++ ) { if( i == 0 ) { out_buffer.push_back( std::string( "> " ).append( folded[i] ) ); } else { out_buffer.push_back( std::string( " " ).append( folded[i] ) ); } } } return out_buffer; }
std::vector<std::string> requirement_data::get_folded_list( int width, const inventory &crafting_inv, const std::vector< std::vector<T> > &objs, int batch, std::string hilite ) const { // hack: ensure 'cached' availability is up to date can_make_with_inventory( crafting_inv ); std::vector<std::string> out_buffer; for( const auto &comp_list : objs ) { const bool has_one = any_marked_available( comp_list ); std::ostringstream buffer; std::vector<std::string> buffer_has; bool already_has; for( auto a = comp_list.begin(); a != comp_list.end(); ++a ) { already_has = false; for( auto cont : buffer_has ) { if( cont == a->to_string( batch ) + a->get_color( has_one, crafting_inv, batch ) ) { already_has = true; break; } } if( already_has ) { continue; } if( a != comp_list.begin() ) { buffer << "<color_white> " << _( "OR" ) << "</color> "; } const std::string col = a->get_color( has_one, crafting_inv, batch ); if( !hilite.empty() && lcmatch( a->to_string( batch ), hilite ) ) { buffer << get_tag_from_color( yellow_background( color_from_string( col ) ) ); } else { buffer << "<color_" << col << ">"; } buffer << a->to_string( batch ) << "</color>" << "</color>"; buffer_has.push_back( a->to_string( batch ) + a->get_color( has_one, crafting_inv, batch ) ); } std::vector<std::string> folded = foldstring( buffer.str(), width - 2 ); for( size_t i = 0; i < folded.size(); i++ ) { if( i == 0 ) { out_buffer.push_back( std::string( "> " ).append( folded[i] ) ); } else { out_buffer.push_back( std::string( " " ).append( folded[i] ) ); } } } return out_buffer; }
int requirements::print_list( WINDOW *w, int ypos, int xpos, int width, nc_color col, const inventory &crafting_inv, const std::vector< std::vector<T> > &objs ) { const int oldy = ypos; for( const auto & comp_list : objs ) { const bool has_one = any_marked_available( comp_list ); std::ostringstream buffer; for( auto a = comp_list.begin(); a != comp_list.end(); ++a ) { if( a != comp_list.begin() ) { buffer << "<color_white> " << _( "OR" ) << "</color> "; } const std::string col = a->get_color( has_one, crafting_inv ); buffer << "<color_" << col << ">" << a->to_string() << "</color>"; } mvwprintz( w, ypos, xpos, col, "> " ); ypos += fold_and_print( w, ypos, xpos + 2, width - 2, col, buffer.str() ); } return ypos - oldy; }
std::string requirements::print_missing_objs(const std::string &header, const std::vector< std::vector<T> > &objs) { std::ostringstream buffer; for( const auto & list : objs ) { if( any_marked_available( list ) ) { continue; } if( !buffer.str().empty() ) { buffer << "\n" << _("and "); } for( auto it = list.begin(); it != list.end(); ++it ) { if( it != list.begin() ) { buffer << _(" or "); } buffer << it->to_string(); } } if (buffer.str().empty()) { return std::string(); } return header + "\n" + buffer.str() + "\n"; }