void tlobby_main::update_gamelist() { SCOPE_LB; gamelistbox_->clear(); gamelist_id_at_row_.clear(); lobby_info_.make_games_vector(); int select_row = -1; for(unsigned i = 0; i < lobby_info_.games().size(); ++i) { const game_info& game = *lobby_info_.games()[i]; if(game.id == selected_game_id_) { select_row = i; } gamelist_id_at_row_.push_back(game.id); LOG_LB << "Adding game to listbox (1)" << game.id << "\n"; tgrid* grid = &gamelistbox_->add_row(make_game_row_data(game)); adjust_game_row_contents(game, gamelistbox_->get_item_count() - 1, grid); } if(select_row >= 0 && select_row != gamelistbox_->get_selected_row()) { gamelistbox_->select_row(select_row); } update_selected_game(); gamelist_dirty_ = false; last_gamelist_update_ = SDL_GetTicks(); lobby_info_.sync_games_display_status(); lobby_info_.apply_game_filter(); update_gamelist_header(); gamelistbox_->set_row_shown(lobby_info_.games_visibility()); }
void tlobby_main::update_gamelist_filter() { DBG_LB << "tlobby_main::update_gamelist_filter\n"; lobby_info_.apply_game_filter(); DBG_LB << "Games in lobby_info: " << lobby_info_.games().size() << ", games in listbox: " << gamelistbox_->get_item_count() << "\n"; assert(lobby_info_.games().size() == gamelistbox_->get_item_count()); gamelistbox_->set_row_shown(lobby_info_.games_visibility()); update_gamelist_header(); }
void tlobby_main::update_gamelist_diff() { SCOPE_LB; lobby_info_.make_games_vector(); int select_row = -1; unsigned list_i = 0; int list_rows_deleted = 0; std::vector<int> next_gamelist_id_at_row; for(unsigned i = 0; i < lobby_info_.games().size(); ++i) { const game_info& game = *lobby_info_.games()[i]; if(game.display_status == game_info::NEW) { LOG_LB << "Adding game to listbox " << game.id << "\n"; if(list_i != gamelistbox_->get_item_count()) { gamelistbox_->add_row(make_game_row_data(game), list_i); DBG_LB << "Added a game listbox row not at the end" << list_i << " " << gamelistbox_->get_item_count() << "\n"; list_rows_deleted--; } else { gamelistbox_->add_row(make_game_row_data(game)); } tgrid* grid = gamelistbox_->get_row_grid(gamelistbox_->get_item_count() - 1); adjust_game_row_contents(game, gamelistbox_->get_item_count() - 1, grid); list_i++; next_gamelist_id_at_row.push_back(game.id); } else { if(list_i >= gamelistbox_->get_item_count()) { ERR_LB << "Ran out of listbox items -- triggering a full " "refresh\n"; wesnothd_connection_.send_data(config("refresh_lobby")); return; } if(list_i + list_rows_deleted >= gamelist_id_at_row_.size()) { ERR_LB << "gamelist_id_at_row_ overflow! " << list_i << " + " << list_rows_deleted << " >= " << gamelist_id_at_row_.size() << " -- triggering a full refresh\n"; wesnothd_connection_.send_data(config("refresh_lobby")); return; } int listbox_game_id = gamelist_id_at_row_[list_i + list_rows_deleted]; if(game.id != listbox_game_id) { ERR_LB << "Listbox game id does not match expected id " << listbox_game_id << " " << game.id << " (row " << list_i << ")\n"; wesnothd_connection_.send_data(config("refresh_lobby")); return; } if(game.display_status == game_info::UPDATED) { LOG_LB << "Modifying game in listbox " << game.id << " (row " << list_i << ")\n"; tgrid* grid = gamelistbox_->get_row_grid(list_i); modify_grid_with_data(grid, make_game_row_data(game)); adjust_game_row_contents(game, list_i, grid); ++list_i; next_gamelist_id_at_row.push_back(game.id); } else if(game.display_status == game_info::DELETED) { LOG_LB << "Deleting game from listbox " << game.id << " (row " << list_i << ")\n"; gamelistbox_->remove_row(list_i); ++list_rows_deleted; } else { // clean LOG_LB << "Clean game in listbox " << game.id << " (row " << list_i << ")\n"; next_gamelist_id_at_row.push_back(game.id); ++list_i; } } } for(unsigned i = 0; i < next_gamelist_id_at_row.size(); ++i) { if(next_gamelist_id_at_row[i] == selected_game_id_) { select_row = i; } } next_gamelist_id_at_row.swap(gamelist_id_at_row_); if(select_row >= static_cast<int>(gamelistbox_->get_item_count())) { ERR_LB << "Would select a row beyond the listbox" << select_row << " " << gamelistbox_->get_item_count() << "\n"; select_row = gamelistbox_->get_item_count() - 1; } if(select_row >= 0 && select_row != gamelistbox_->get_selected_row()) { gamelistbox_->select_row(select_row); } update_selected_game(); gamelist_dirty_ = false; last_gamelist_update_ = SDL_GetTicks(); lobby_info_.sync_games_display_status(); lobby_info_.apply_game_filter(); update_gamelist_header(); gamelistbox_->set_row_shown(lobby_info_.games_visibility()); }