예제 #1
0
/**
 * Display data in table, each cell contains one entry from the
 * data vector. Allows vertical scrolling if the data does not fit.
 * Data is displayed using fold_and_print_from, which allows coloring!
 * @param columns Number of columns, can be 1. Make sure each entry
 * of the data vector fits into one cell.
 * @param title The title text, displayed on top.
 * @param w The window to draw this in, the whole widow is used.
 */
void display_table(WINDOW *w, const std::string &title, int columns,
                   const std::vector<std::string> &data)
{
    const int width = getmaxx(w) - 2; // -2 for border
    const int rows = getmaxy(w) - 2 - 1; // -2 for border, -1 for title
    const int col_width = width / columns;
    int offset = 0;

    const int title_length = utf8_width(title.c_str());
    while(true) {
        werase(w);
        draw_border(w);
        mvwprintz(w, 1, (width - title_length) / 2, c_white, "%s", title.c_str());
        for(int i = 0; i < rows * columns; i++) {
            if(i + offset * columns >= data.size()) {
                break;
            }
            const int x = 2 + (i % columns) * col_width;
            const int y = (i / columns) + 2;
            fold_and_print_from(w, y, x, col_width, 0, c_white, data[i + offset * columns]);
        }
        draw_scrollbar(w, offset, rows, data.size() / 3, 2, 0);
        wrefresh(w);
        int ch = getch();
        if (ch == KEY_DOWN && ((offset + 1) * columns) < data.size()) {
            offset++;
        } else if(ch == KEY_UP && offset > 0) {
            offset--;
        } else if(ch == ' ' || ch == '\n' || ch == KEY_ESCAPE) {
            break;
        }
    }
}
예제 #2
0
int fold_and_print_from(WINDOW *w, int begin_y, int begin_x, int width, int begin_line,
                        nc_color base_color, const char *mes, ...)
{
    va_list ap;
    va_start(ap, mes);
    const std::string text = vstring_format(mes, ap);
    va_end(ap);
    return fold_and_print_from(w, begin_y, begin_x, width, begin_line, base_color, text);
}
예제 #3
0
void game::extended_description( const tripoint &p )
{
    const int left = 0;
    const int right = TERMX;
    const int top = 3;
    const int bottom = TERMY;
    const int width = right - left;
    const int height = bottom - top;
    catacurses::window w_head = catacurses::newwin( top, TERMX, 0, 0 );
    catacurses::window w_main = catacurses::newwin( height, width, top, left );
    // @todo: De-hardcode
    std::string header_message = _( "\
c to describe creatures, f to describe furniture, t to describe terrain, Esc/Enter to close." );
    mvwprintz( w_head, 0, 0, c_white, header_message.c_str() );

    // Set up line drawings
    for( int i = 0; i < TERMX; i++ ) {
        mvwputch( w_head, top - 1, i, c_white, LINE_OXOX );
    }

    wrefresh( w_head );
    // Default to critter (if any), furniture (if any), then terrain.
    description_target cur_target = description_target::terrain;
    if( seen_critter( *this, p ) != nullptr ) {
        cur_target = description_target::creature;
    } else if( g->m.has_furn( p ) ) {
        cur_target = description_target::furniture;
    }
    int ch = 'c';
    do {
        std::string desc;
        // Allow looking at invisible tiles - player may want to examine hallucinations etc.
        switch( cur_target ) {
            case description_target::creature: {
                const Creature *critter = seen_critter( *this, p );
                if( critter != nullptr ) {
                    desc = critter->extended_description();
                } else {
                    desc = _( "You do not see any creature here." );
                }
            }
            break;
            case description_target::furniture:
                if( !u.sees( p ) || !m.has_furn( p ) ) {
                    desc = _( "You do not see any furniture here." );
                } else {
                    const furn_id fid = m.furn( p );
                    desc = fid.obj().extended_description();
                }
                break;
            case description_target::terrain:
                if( !u.sees( p ) ) {
                    desc = _( "You can't see the terrain here." );
                } else {
                    const ter_id tid = m.ter( p );
                    desc = tid.obj().extended_description();
                }
                break;
        }

        std::string signage = m.get_signage( p );
        if( !signage.empty() ) {
            desc += u.has_trait( trait_ILLITERATE ) ? string_format( _( "\nSign: ???" ) ) : string_format(
                        _( "\nSign: %s" ), signage.c_str() );
        }

        werase( w_main );
        fold_and_print_from( w_main, 0, 0, width, 0, c_light_gray, desc );
        wrefresh( w_main );
        // TODO: use input context
        ch = inp_mngr.get_input_event().get_first_input();
        switch( ch ) {
            case 'c':
                cur_target = description_target::creature;
                break;
            case 'f':
                cur_target = description_target::furniture;
                break;
            case 't':
                cur_target = description_target::terrain;
                break;
        }

    } while( ch != KEY_ESCAPE && ch != '\n' );
}