inventory_selector::inventory_selector( player &u, item_filter filter ) : columns() , active_column_index( 0 ) , dropping() , ctxt("INVENTORY") , w_inv( newwin( TERMY, TERMX, VIEW_OFFSET_Y, VIEW_OFFSET_X ) ) , navigation( navigation_mode::ITEM ) , weapon_cat("WEAPON", _("WEAPON HELD"), 0) , worn_cat("ITEMS WORN", _("ITEMS WORN"), 0) , u(u) { ctxt.register_action("DOWN", _("Next item")); ctxt.register_action("UP", _("Previous item")); ctxt.register_action("RIGHT", _("Confirm")); ctxt.register_action("LEFT", _("Switch inventory/worn")); ctxt.register_action("CONFIRM", _("Mark selected item")); ctxt.register_action("QUIT", _("Cancel")); ctxt.register_action("CATEGORY_SELECTION"); ctxt.register_action("NEXT_TAB", _("Page down")); ctxt.register_action("PREV_TAB", _("Page up")); ctxt.register_action("HOME", _("Home")); ctxt.register_action("END", _("End")); ctxt.register_action("HELP_KEYBINDINGS"); ctxt.register_action("ANY_INPUT"); // For invlets std::unique_ptr<inventory_column> first_column( new inventory_column() ); std::unique_ptr<inventory_column> second_column( new inventory_column() ); first_column->add_entries( u.inv.indexed_slice_filter_by( filter ) ); if( !first_column->empty() ) { insert_column( columns.end(), first_column ); } if( u.is_armed() && filter( u.weapon ) ) { second_column->add_entry( inventory_entry( &u.weapon, -1, &weapon_cat ) ); } size_t i = 0; for( const auto &it : u.worn ) { if( filter( it ) ) { second_column->add_entry( inventory_entry( &it, player::worn_position_to_index( i ), &worn_cat ) ); } ++i; } if( !second_column->empty() ) { insert_column( columns.end(), second_column ); } }
void inventory_column::prepare_paging( size_t new_entries_per_page ) { if( new_entries_per_page != 0 ) { // Keep default otherwise entries_per_page = new_entries_per_page; } const auto new_end = std::remove_if( entries.begin(), entries.end(), []( const inventory_entry &entry ) { return !entry.is_item(); } ); entries.erase( new_end, entries.end() ); const item_category *current_category = nullptr; for( size_t i = 0; i < entries.size(); ++i ) { if( entries[i].get_category_ptr() == current_category && i % entries_per_page != 0 ) { continue; } current_category = entries[i].get_category_ptr(); const inventory_entry insertion = ( i % entries_per_page == entries_per_page - 1 ) ? inventory_entry() // the last item on the page must not be a category : inventory_entry( current_category ); // the first item on the page must be a category entries.insert( entries.begin() + i, insertion ); } }
void inventory_selector::add_custom_items( const std::list<item>::const_iterator &from, const std::list<item>::const_iterator &to, const std::string &title, const std::function<std::shared_ptr<item_location>( item * )> &locator ) { const auto &stacks = restack_items( from, to ); for( const auto &stack : stacks ) { const auto &location = locator( stack.front() ); if( filter( *location ) ) { const std::string name = trim( string_format( _( "%s %s" ), to_upper_case( title ).c_str(), direction_suffix( u.pos(), location->position() ).c_str() ) ); if( categories.empty() || categories.back().id != name ) { categories.emplace_back( name, name, INT_MIN + int( categories.size() ) ); } if( custom_column == nullptr ) { custom_column.reset( new inventory_column() ); } const long invlet = ( cur_custom_invlet <= max_custom_invlet ) ? cur_custom_invlet++ : '\0'; custom_column->add_entry( inventory_entry( location, stack.size(), &categories.back(), c_unset, invlet ) ); } } }
inventory_selector::inventory_selector( player &u, const std::string &title, const item_location_filter &filter ) : u(u) , ctxt( "INVENTORY" ) , title( title ) , filter( filter ) , w_inv( newwin( TERMY, TERMX, VIEW_OFFSET_Y, VIEW_OFFSET_X ) ) , columns() , active_column_index( 0 ) , navigation( navigation_mode::ITEM ) { ctxt.register_action("DOWN", _("Next item")); ctxt.register_action("UP", _("Previous item")); ctxt.register_action("RIGHT", _("Confirm")); ctxt.register_action("LEFT", _("Switch inventory/worn")); ctxt.register_action("CONFIRM", _("Mark selected item")); ctxt.register_action("QUIT", _("Cancel")); ctxt.register_action("CATEGORY_SELECTION"); ctxt.register_action("NEXT_TAB", _("Page down")); ctxt.register_action("PREV_TAB", _("Page up")); ctxt.register_action("HOME", _("Home")); ctxt.register_action("END", _("End")); ctxt.register_action("HELP_KEYBINDINGS"); ctxt.register_action("ANY_INPUT"); // For invlets std::unique_ptr<inventory_column> first_column( new inventory_column() ); std::unique_ptr<inventory_column> second_column( new inventory_column() ); for( size_t i = 0; i < u.inv.size(); ++i ) { const auto &stack = u.inv.const_stack( i ); const auto location = std::make_shared<item_location>( u, const_cast<item *>( &stack.front() ) ); if( filter( *location ) ) { first_column->add_entry( inventory_entry( location, stack.size() ) ); } } if( !first_column->empty() ) { insert_column( columns.end(), first_column ); } if( u.is_armed() ) { categories.emplace_back( "WEAPON", _( "WEAPON HELD" ), 0 ); const auto location = std::make_shared<item_location>( u, &u.weapon ); if( filter( *location ) ) { second_column->add_entry( inventory_entry( location, &categories.back(), c_ltblue ) ); } } if( !u.worn.empty() ) { categories.emplace_back( "ITEMS WORN", _( "ITEMS WORN" ), 0 ); for( auto &it : u.worn ) { const auto location = std::make_shared<item_location>( u, &it ); if( filter( *location ) ) { second_column->add_entry( inventory_entry( location, &categories.back(), c_cyan ) ); } } } if( !second_column->empty() ) { insert_column( columns.end(), second_column ); } }
void inventory_column::add_entries( const indexed_invslice &slice, const item_category *def_cat ) { for( const auto &scit : slice ) { add_entry( inventory_entry( scit, def_cat ) ); } }