예제 #1
0
/**
 *  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());
}
예제 #2
0
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();
        }
    }
}
예제 #3
0
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);
    }
}