/** * Callbackfunktion zum Eintragen einer Replay-Zeile in der Tabelle. * * @param[in] filename Der Dateiname * @param[in] param Ein benutzerdefinierter Parameter * * @todo Noch korrekt dokumentieren (was wird da so übersprungen usw) * @todo Fehlerabfrage der freads!!! * * @author OLiver */ void iwPlayReplay::FillReplayTable(const std::string& filename, void* param) { Replay replay; // Datei laden if(!replay.LoadHeader(filename, false)) return; // Zeitstamp benutzen char datestring[64]; TIME.FormatTime(datestring, "%d.%m.%Y - %H:%i", &replay.save_time); // Spielernamen auslesen std::string tmp_players; unsigned char j = 0; for(unsigned char i = 0; i < replay.player_count; ++i) { // Was für ein State, wenn es nen KI Spieler oder ein normaler ist, muss das Zeug ausgelesen werden if(replay.players[i].ps == PS_OCCUPIED || replay.players[i].ps == PS_KI) { // und in unsere "Namensliste" hinzufügen (beim ersten Spieler muss kein Komma hin) if(j > 0) tmp_players += ", "; tmp_players += replay.players[i].name; ++j; } } // Dateiname noch rausextrahieren aus dem Pfad size_t pos = filename.find_last_of('/'); if(pos == std::string::npos) return; std::string extracted_filename = filename.substr(pos + 1); char gfl[50]; snprintf(gfl, 50, "%u", replay.last_gf); // Und das Zeug zur Tabelle hinzufügen static_cast<ctrlTable*>(param)->AddRow(0, extracted_filename.c_str(), datestring, tmp_players.c_str(), gfl, filename.c_str()); }
void iwPlayReplay::Msg_MsgBoxResult(const unsigned msgbox_id, const MsgboxResult mbr) { // Sollen alle Replays gelöscht werden? if(msgbox_id == 1 && mbr == MSR_YES) { std::vector<std::string> replays = GetReplays(); for(std::vector<std::string>::iterator it = replays.begin(); it != replays.end(); ++it) { boost::system::error_code ec; bfs::remove(*it, ec); } // Tabelle leeren GetCtrl<ctrlTable>(0)->DeleteAllItems(); } else if(msgbox_id == 3 && mbr == MSR_YES) { std::vector<std::string> replays = GetReplays(); for(std::vector<std::string>::iterator it = replays.begin(); it != replays.end(); ++it) { Replay replay; if(!replay.LoadHeader(*it)) { replay.StopRecording(); boost::system::error_code ec; bfs::remove(*it, ec); } } PopulateTable(); } else if(msgbox_id == 2 && mbr == MSR_YES) { ctrlTable* table = GetCtrl<ctrlTable>(0); if(table->GetSelection() < table->GetRowCount()) { boost::system::error_code ec; bfs::remove(table->GetItemText(table->GetSelection(), 4), ec); PopulateTable(); } } }
void iwPlayReplay::PopulateTable() { ctrlTable* table = GetCtrl<ctrlTable>(0); unsigned short sortCol = table->GetSortColumn(); if(sortCol == 0xFFFF) sortCol = 0; bool sortDir = table->GetSortDirection(); table->DeleteAllItems(); unsigned numInvalid = 0; std::vector<std::string> replays = GetReplays(); for(std::vector<std::string>::iterator it = replays.begin(); it != replays.end(); ++it) { Replay replay; // Datei laden if(!replay.LoadHeader(*it)) { numInvalid++; continue; } // Zeitstamp benutzen std::string dateStr = TIME.FormatTime("%d.%m.%Y - %H:%i", &replay.save_time); // Spielernamen auslesen std::string tmp_players; for(unsigned char i = 0; i < replay.GetPlayerCount(); ++i) { // Was für ein State, wenn es nen KI Spieler oder ein normaler ist, muss das Zeug ausgelesen werden const BasePlayerInfo& curPlayer = replay.GetPlayer(i); if(curPlayer.isUsed()) { // und in unsere "Namensliste" hinzufügen (beim ersten Spieler muss kein Komma hin) if(!tmp_players.empty()) tmp_players += ", "; tmp_players += curPlayer.name; } } // Dateiname noch rausextrahieren aus dem Pfad bfs::path path = *it; if(!path.has_filename()) continue; std::string fileName = path.filename().string(); std::string lastGF = helpers::toString(replay.lastGF_); // Und das Zeug zur Tabelle hinzufügen table->AddRow(0, fileName.c_str(), dateStr.c_str(), tmp_players.c_str(), lastGF.c_str(), it->c_str()); } // Erst einmal nach Dateiname sortieren table->SortRows(sortCol, &sortDir); ctrlTextButton* btDelInvalid = GetCtrl<ctrlTextButton>(5); if(numInvalid == 0) btDelInvalid->SetVisible(false); else { btDelInvalid->SetVisible(true); char text[255]; snprintf(text, 255, _("Delete Invalid (%u)"), numInvalid); btDelInvalid->SetText(text); } }