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 );
    }
}
Пример #2
0
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 );
    }
}
Пример #3
0
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 ) );
        }
    }
}
Пример #4
0
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 ) );
    }
}