std::string main_menu::handle_input_timeout( input_context &ctxt ) { inp_mngr.set_timeout( 125 ); std::string action = ctxt.handle_input(); if( action == "TIMEOUT" ) { init_windows(); } inp_mngr.reset_timeout(); return action; }
std::list<std::pair<int, int>> inventory_selector::execute_multidrop( const std::string &title ) { insert_selection_column( "ITEMS TO DROP", _( "ITEMS TO DROP" ) ); prepare_columns( true ); int count = 0; while( true ) { display( title, SM_MULTIDROP ); const std::string action = ctxt.handle_input(); const long ch = ctxt.get_raw_input().get_first_input(); auto entry = find_entry_by_invlet( ch ); if( ch >= '0' && ch <= '9' ) { count = std::min( count, INT_MAX / 10 - 10 ); count *= 10; count += ch - '0'; } else if( entry != nullptr ) { set_drop_count( *entry, count ); count = 0; } else if( action == "RIGHT" ) { for( const auto &entry : get_active_column().get_all_selected() ) { set_drop_count( *entry, count ); } count = 0; } else if( action == "CONFIRM" ) { break; } else if( action == "QUIT" ) { return std::list<std::pair<int, int> >(); } else { on_action( action ); count = 0; } } std::list<std::pair<int, int>> dropped_pos_and_qty; for( auto drop_pair : dropping ) { dropped_pos_and_qty.push_back( std::make_pair( drop_pair.first, drop_pair.second ) ); } return dropped_pos_and_qty; }
int inventory_selector::execute_pick( const std::string &title ) { prepare_columns( false ); while( true ) { display( title, SM_PICK ); const std::string action = ctxt.handle_input(); const long ch = ctxt.get_raw_input().get_first_input(); const auto entry = find_entry_by_invlet( ch ); if( entry != nullptr ) { return entry->item_pos; } else if ( action == "CONFIRM" || action == "RIGHT" ) { return get_active_column().get_selected().item_pos; } else if ( action == "QUIT" ) { return INT_MIN; } else { on_action( action ); } } }
item_location inventory_selector::execute_pick_map( const std::string &title, std::unordered_map<item *, item_location> &opts ) { prepare_columns( false ); while( true ) { display( title, SM_PICK ); const std::string action = ctxt.handle_input(); const long ch = ctxt.get_raw_input().get_first_input(); const auto entry = find_entry_by_invlet( ch ); if( entry != nullptr ) { item *it = const_cast<item *>( entry->it ); const auto iter = opts.find( it ); return ( iter != opts.end() ) ? std::move( iter->second ) : item_location( u, it ); } else if( action == "QUIT" ) { return item_location(); } else if( action == "RIGHT" || action == "CONFIRM" ) { const auto selected = get_active_column().get_selected(); const auto it = const_cast<item *>( selected.it ); // Item in inventory if( selected.item_pos != INT_MIN ) { return item_location( u, it ); } // Item on ground or in vehicle auto iter = opts.find( it ); if( iter != opts.end() ) { return std::move( iter->second ); } return item_location(); } else { on_action( action ); } } }
void inventory_selector::execute_compare( const std::string &title ) { insert_selection_column( "ITEMS TO COMPARE", _( "ITEMS TO COMPARE" ) ); prepare_columns( true ); std::vector<inventory_entry *> compared; const auto toggle_entry = [ this, &compared ]( inventory_entry *entry ) { const auto iter = std::find( compared.begin(), compared.end(), entry ); entry->chosen_count = ( iter == compared.end() ) ? 1 : 0; if( entry->chosen_count != 0 ) { compared.push_back( entry ); } else { compared.erase( iter ); } on_change( *entry ); }; while(true) { display( title, SM_COMPARE ); const std::string action = ctxt.handle_input(); const long ch = ctxt.get_raw_input().get_first_input(); const auto entry = find_entry_by_invlet( ch ); if( entry != nullptr ) { toggle_entry( entry ); } else if(action == "RIGHT") { const auto selection( get_active_column().get_all_selected() ); for( auto &entry : selection ) { if( entry->chosen_count == 0 || selection.size() == 1 ) { toggle_entry( entry ); if( compared.size() == 2 ) { break; } } } } else if( action == "QUIT" ) { break; } else { on_action( action ); } if( compared.size() == 2 ) { const item *first_item = compared.back()->it; const item *second_item = compared.front()->it; std::vector<iteminfo> vItemLastCh, vItemCh; std::string sItemLastCh, sItemCh, sItemTn; first_item->info( true, vItemCh ); sItemCh = first_item->tname(); sItemTn = first_item->type_name(); second_item->info(true, vItemLastCh); sItemLastCh = second_item->tname(); int iScrollPos = 0; int iScrollPosLast = 0; int ch = ( int ) ' '; do { draw_item_info( 0, ( TERMX - VIEW_OFFSET_X * 2 ) / 2, 0, TERMY - VIEW_OFFSET_Y * 2, sItemLastCh, sItemTn, vItemLastCh, vItemCh, iScrollPosLast, true ); //without getch() ch = draw_item_info( ( TERMX - VIEW_OFFSET_X * 2) / 2, (TERMX - VIEW_OFFSET_X * 2 ) / 2, 0, TERMY - VIEW_OFFSET_Y * 2, sItemCh, sItemTn, vItemCh, vItemLastCh, iScrollPos ); if( ch == KEY_PPAGE ) { iScrollPos--; iScrollPosLast--; } else if( ch == KEY_NPAGE ) { iScrollPos++; iScrollPosLast++; } } while ( ch == KEY_PPAGE || ch == KEY_NPAGE ); toggle_entry( compared.back() ); } } }